summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore8
-rw-r--r--PROGRESS.md284
-rw-r--r--README.md167
-rwxr-xr-xclean.sh15
-rw-r--r--src/etc/inc/auth.inc64
-rw-r--r--src/etc/inc/authgui.inc220
-rw-r--r--src/etc/inc/filter_log.inc34
-rw-r--r--src/etc/inc/globals.inc2
-rw-r--r--src/etc/inc/gmirror.inc58
-rw-r--r--src/etc/inc/openvpn.inc48
-rw-r--r--src/etc/inc/pfsense-utils.inc157
-rw-r--r--src/etc/inc/pkg-utils.inc12
-rw-r--r--src/etc/inc/service-utils.inc32
-rw-r--r--src/etc/inc/services.inc62
-rw-r--r--src/etc/inc/shaper.inc1908
-rw-r--r--src/etc/inc/simplepie/simplepie.inc15
-rw-r--r--src/etc/inc/upgrade_config.inc27
-rwxr-xr-xsrc/usr/local/www/bandwidth_by_ip.php14
-rw-r--r--src/usr/local/www/bootstrap/css/bootstrap-theme.min.css5
-rw-r--r--src/usr/local/www/bootstrap/css/bootstrap.min.css5
-rw-r--r--src/usr/local/www/bootstrap/css/pfSense.css150
-rw-r--r--src/usr/local/www/bootstrap/glyphicons/glyphicons-halflings.css582
-rw-r--r--src/usr/local/www/bootstrap/glyphicons/glyphicons-halflings.pngbin0 -> 12799 bytes
-rw-r--r--src/usr/local/www/bootstrap/js/bootstrap.min.js7
-rw-r--r--src/usr/local/www/carp_status.php232
-rw-r--r--src/usr/local/www/classes/Form.class.php126
-rw-r--r--src/usr/local/www/classes/Form/Button.class.php68
-rw-r--r--src/usr/local/www/classes/Form/Checkbox.class.php65
-rw-r--r--src/usr/local/www/classes/Form/Element.class.php94
-rw-r--r--src/usr/local/www/classes/Form/Group.class.php152
-rw-r--r--src/usr/local/www/classes/Form/Input.class.php200
-rw-r--r--src/usr/local/www/classes/Form/IpAddress.class.php76
-rw-r--r--src/usr/local/www/classes/Form/MultiCheckbox.class.php40
-rw-r--r--src/usr/local/www/classes/Form/MultiCheckboxGroup.class.php64
-rw-r--r--src/usr/local/www/classes/Form/Section.class.php82
-rw-r--r--src/usr/local/www/classes/Form/Select.class.php71
-rw-r--r--src/usr/local/www/classes/Form/StaticText.class.php45
-rw-r--r--src/usr/local/www/classes/Form/Textarea.class.php54
-rw-r--r--src/usr/local/www/classes/Modal.class.php67
-rw-r--r--src/usr/local/www/classes/maintable.inc206
-rw-r--r--src/usr/local/www/code-syntax-highlighter/SyntaxHighlighter.css166
-rw-r--r--src/usr/local/www/code-syntax-highlighter/gpl.txt340
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushCSharp.js30
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushCpp.js72
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushCss.js50
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushDelphi.js31
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushJScript.js22
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushJava.js26
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushPhp.js23
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushPython.js71
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushRuby.js26
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushSql.js40
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushVb.js29
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushXml.js61
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shCore.js589
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shCore.uncompressed.js636
-rw-r--r--src/usr/local/www/copyright-master.txt51
-rw-r--r--src/usr/local/www/crash_reporter.php136
-rw-r--r--src/usr/local/www/css/table.css46
-rw-r--r--src/usr/local/www/d3pie/d3.min.js5
-rw-r--r--src/usr/local/www/d3pie/d3pie.min.js9
-rw-r--r--src/usr/local/www/diag_arp.php175
-rw-r--r--src/usr/local/www/diag_authentication.php194
-rw-r--r--src/usr/local/www/diag_backup.php546
-rw-r--r--src/usr/local/www/diag_confbak.php128
-rwxr-xr-xsrc/usr/local/www/diag_defaults.php115
-rwxr-xr-x[-rw-r--r--]src/usr/local/www/diag_dns.php309
-rwxr-xr-xsrc/usr/local/www/diag_dump_states.php382
-rw-r--r--src/usr/local/www/diag_dump_states_sources.php279
-rw-r--r--src/usr/local/www/diag_gmirror.php445
-rw-r--r--src/usr/local/www/diag_ipsec.php831
-rw-r--r--src/usr/local/www/diag_ipsec_leases.php239
-rw-r--r--src/usr/local/www/diag_ipsec_sad.php222
-rw-r--r--src/usr/local/www/diag_ipsec_spd.php233
-rw-r--r--src/usr/local/www/diag_ipsec_xml.php79
-rw-r--r--src/usr/local/www/diag_limiter_info.php153
-rwxr-xr-xsrc/usr/local/www/diag_logs.php224
-rw-r--r--src/usr/local/www/diag_logs_auth.php112
-rw-r--r--src/usr/local/www/diag_logs_dhcp.php115
-rw-r--r--src/usr/local/www/diag_logs_filter.php686
-rwxr-xr-xsrc/usr/local/www/diag_logs_filter_dynamic.php280
-rw-r--r--src/usr/local/www/diag_logs_filter_summary.php353
-rwxr-xr-xsrc/usr/local/www/diag_logs_gateways.php147
-rw-r--r--src/usr/local/www/diag_logs_ipsec.php123
-rw-r--r--src/usr/local/www/diag_logs_ntpd.php110
-rw-r--r--src/usr/local/www/diag_logs_openvpn.php111
-rw-r--r--src/usr/local/www/diag_logs_ppp.php109
-rw-r--r--src/usr/local/www/diag_logs_relayd.php111
-rwxr-xr-xsrc/usr/local/www/diag_logs_resolver.php152
-rw-r--r--src/usr/local/www/diag_logs_routing.php123
-rw-r--r--src/usr/local/www/diag_logs_settings.php656
-rwxr-xr-xsrc/usr/local/www/diag_logs_vpn.php251
-rw-r--r--src/usr/local/www/diag_logs_wireless.php125
-rw-r--r--src/usr/local/www/diag_nanobsd.php413
-rw-r--r--src/usr/local/www/diag_ndp.php197
-rw-r--r--src/usr/local/www/diag_packet_capture.php550
-rw-r--r--src/usr/local/www/diag_patterns.php152
-rw-r--r--src/usr/local/www/diag_pf_info.php183
-rw-r--r--src/usr/local/www/diag_ping.php310
-rwxr-xr-xsrc/usr/local/www/diag_pkglogs.php155
-rw-r--r--src/usr/local/www/diag_resetstate.php219
-rw-r--r--src/usr/local/www/diag_routes.php355
-rw-r--r--src/usr/local/www/diag_smart.php722
-rw-r--r--src/usr/local/www/diag_sockets.php247
-rw-r--r--src/usr/local/www/diag_states_summary.php179
-rw-r--r--src/usr/local/www/diag_system_activity.php169
-rw-r--r--src/usr/local/www/diag_system_pftop.php276
-rw-r--r--src/usr/local/www/diag_tables.php290
-rw-r--r--src/usr/local/www/diag_testport.php454
-rw-r--r--src/usr/local/www/diag_traceroute.php307
-rw-r--r--src/usr/local/www/easyrule.php78
-rw-r--r--src/usr/local/www/edit.php272
-rw-r--r--src/usr/local/www/exec.php317
-rw-r--r--[-rwxr-xr-x]src/usr/local/www/fbegin.inc461
-rw-r--r--[-rwxr-xr-x]src/usr/local/www/fend.inc29
-rw-r--r--src/usr/local/www/firewall_aliases.php322
-rwxr-xr-xsrc/usr/local/www/firewall_aliases_edit.php699
-rwxr-xr-xsrc/usr/local/www/firewall_aliases_import.php198
-rw-r--r--src/usr/local/www/firewall_nat.php524
-rw-r--r--src/usr/local/www/firewall_nat_1to1.php351
-rw-r--r--src/usr/local/www/firewall_nat_1to1_edit.php719
-rw-r--r--src/usr/local/www/firewall_nat_edit.php1319
-rw-r--r--src/usr/local/www/firewall_nat_npt.php267
-rw-r--r--src/usr/local/www/firewall_nat_npt_edit.php348
-rw-r--r--src/usr/local/www/firewall_nat_out.php883
-rw-r--r--src/usr/local/www/firewall_nat_out_edit.php1050
-rw-r--r--src/usr/local/www/firewall_rules.php1239
-rw-r--r--src/usr/local/www/firewall_rules_edit.php2053
-rw-r--r--src/usr/local/www/firewall_schedule.php403
-rw-r--r--src/usr/local/www/firewall_schedule_edit.php1476
-rw-r--r--src/usr/local/www/firewall_shaper.php387
-rw-r--r--src/usr/local/www/firewall_shaper_layer7.php564
-rw-r--r--src/usr/local/www/firewall_shaper_queues.php203
-rw-r--r--src/usr/local/www/firewall_shaper_vinterface.php490
-rw-r--r--src/usr/local/www/firewall_shaper_wizards.php163
-rw-r--r--src/usr/local/www/firewall_virtual_ip.php314
-rw-r--r--src/usr/local/www/firewall_virtual_ip_edit.php605
-rwxr-xr-xsrc/usr/local/www/foot.inc27
-rw-r--r--src/usr/local/www/getserviceproviders.php76
-rw-r--r--src/usr/local/www/getstats.php75
-rwxr-xr-xsrc/usr/local/www/graph.php79
-rw-r--r--src/usr/local/www/graph_cpu.php82
-rwxr-xr-xsrc/usr/local/www/green_dot.jpgbin65 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/gui.css363
-rw-r--r--src/usr/local/www/guiconfig.inc482
-rwxr-xr-xsrc/usr/local/www/halt.php138
-rwxr-xr-xsrc/usr/local/www/head.inc551
-rw-r--r--src/usr/local/www/headjs.php186
-rw-r--r--src/usr/local/www/help.php60
-rw-r--r--src/usr/local/www/ifstats.php77
-rw-r--r--src/usr/local/www/index.php860
-rw-r--r--src/usr/local/www/interfaces.php3160
-rw-r--r--src/usr/local/www/interfaces_assign.php194
-rw-r--r--src/usr/local/www/interfaces_bridge.php160
-rw-r--r--src/usr/local/www/interfaces_bridge_edit.php723
-rw-r--r--src/usr/local/www/interfaces_gif.php130
-rw-r--r--src/usr/local/www/interfaces_gif_edit.php237
-rw-r--r--src/usr/local/www/interfaces_gre.php129
-rw-r--r--src/usr/local/www/interfaces_gre_edit.php229
-rw-r--r--src/usr/local/www/interfaces_groups.php167
-rw-r--r--src/usr/local/www/interfaces_groups_edit.php263
-rw-r--r--src/usr/local/www/interfaces_lagg.php127
-rw-r--r--src/usr/local/www/interfaces_lagg_edit.php258
-rw-r--r--src/usr/local/www/interfaces_ppps.php130
-rw-r--r--src/usr/local/www/interfaces_ppps_edit.php1168
-rw-r--r--src/usr/local/www/interfaces_qinq.php151
-rw-r--r--src/usr/local/www/interfaces_qinq_edit.php350
-rw-r--r--src/usr/local/www/interfaces_vlan.php122
-rw-r--r--src/usr/local/www/interfaces_vlan_edit.php145
-rw-r--r--src/usr/local/www/interfaces_wireless.php127
-rw-r--r--src/usr/local/www/interfaces_wireless_edit.php160
-rw-r--r--src/usr/local/www/javascript/autosuggest.js337
-rw-r--r--src/usr/local/www/javascript/base64.js142
-rw-r--r--src/usr/local/www/javascript/carp_status/carp_status.js5
-rw-r--r--src/usr/local/www/javascript/chosen/chosen-sprite.pngbin1866 -> 0 bytes
-rw-r--r--src/usr/local/www/javascript/chosen/chosen.css317
-rw-r--r--src/usr/local/www/javascript/chosen/chosen.jquery.js755
-rw-r--r--src/usr/local/www/javascript/chosen/chosen.jquery.min.js9
-rw-r--r--src/usr/local/www/javascript/chosen/chosen.proto.js765
-rw-r--r--src/usr/local/www/javascript/chosen/chosen.proto.min.js9
-rw-r--r--src/usr/local/www/javascript/chosen/coffee/chosen.jquery.coffee633
-rw-r--r--src/usr/local/www/javascript/chosen/coffee/chosen.proto.coffee629
-rw-r--r--src/usr/local/www/javascript/datepicker/css/datepicker.css178
-rw-r--r--src/usr/local/www/javascript/datepicker/js/blank.html6
-rw-r--r--src/usr/local/www/javascript/datepicker/js/datepicker.js1111
-rwxr-xr-xsrc/usr/local/www/javascript/datepicker/media/bg_header.jpgbin1792 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/datepicker/media/bullet1.gifbin55 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/datepicker/media/bullet2.gifbin262 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/datepicker/media/cal.gifbin127 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/datepicker/media/gradient-e5e5e5-ffffff.gifbin526 -> 0 bytes
-rw-r--r--src/usr/local/www/javascript/domTT/LICENSE202
-rw-r--r--src/usr/local/www/javascript/domTT/behaviour.js254
-rw-r--r--src/usr/local/www/javascript/domTT/domLib.js706
-rw-r--r--src/usr/local/www/javascript/domTT/domTT.js1132
-rw-r--r--src/usr/local/www/javascript/domTT/fadomatic.js180
-rw-r--r--src/usr/local/www/javascript/filter_log.js168
-rw-r--r--src/usr/local/www/javascript/firebug-lite.js1000
-rw-r--r--src/usr/local/www/javascript/firewall_nat_edit/autosuggest.js337
-rw-r--r--src/usr/local/www/javascript/firewall_nat_edit/disablekeys.js6
-rw-r--r--src/usr/local/www/javascript/firewall_nat_edit/firewall_nat_edit.js203
-rw-r--r--src/usr/local/www/javascript/firewall_nat_edit/suggestions.js33
-rw-r--r--src/usr/local/www/javascript/firewall_rules_edit/autosuggest.js337
-rw-r--r--src/usr/local/www/javascript/firewall_rules_edit/disablekeys.js6
-rw-r--r--src/usr/local/www/javascript/firewall_rules_edit/firewall_rules_edit.js237
-rw-r--r--src/usr/local/www/javascript/firewall_rules_edit/suggestions.js33
-rw-r--r--src/usr/local/www/javascript/firewall_shaper_edit/autosuggest.js337
-rw-r--r--src/usr/local/www/javascript/firewall_shaper_edit/disablekeys.js6
-rw-r--r--src/usr/local/www/javascript/firewall_shaper_edit/firewall_shaper_edit.js37
-rw-r--r--src/usr/local/www/javascript/firewall_shaper_edit/suggestions.js33
-rw-r--r--src/usr/local/www/javascript/global.js43
-rw-r--r--src/usr/local/www/javascript/index/ajax.js196
-rw-r--r--src/usr/local/www/javascript/interfaces_ppps_edit/ppps_edit.js253
-rw-r--r--src/usr/local/www/javascript/jquery-1.11.1.min.js4
-rw-r--r--src/usr/local/www/javascript/jquery-migrate-1.2.1.min.js2
-rw-r--r--src/usr/local/www/javascript/jquery-ui-timepicker-addon/css/jquery-ui-timepicker-addon.css7
-rw-r--r--src/usr/local/www/javascript/jquery-ui-timepicker-addon/js/jquery-ui-timepicker-addon.js1326
-rwxr-xr-xsrc/usr/local/www/javascript/jquery.ipv4v6ify.js140
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_18_b81900_40x40.pngbin260 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_20_666666_40x40.pngbin251 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.pngbin180 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.pngbin180 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_flat_10_000000_40x100.pngbin178 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.pngbin213 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.pngbin180 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f6f6f6_1x400.pngbin104 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.pngbin105 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_glass_100_fdf5ce_1x400.pngbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.pngbin109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.pngbin110 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_glass_65_ffffff_1x400.pngbin105 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_gloss-wave_35_f6a828_500x100.pngbin3762 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_100_eeeeee_1x100.pngbin90 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_75_ffe45c_1x100.pngbin129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.pngbin114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.pngbin96 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_222222_256x240.pngbin4369 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_228ef1_256x240.pngbin4369 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_3383bb_256x240.pngbin4369 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_454545_256x240.pngbin4369 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_70b2e1_256x240.pngbin4369 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_999999_256x240.pngbin4369 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_ef8c08_256x240.pngbin4369 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_fbc856_256x240.pngbin5355 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_ffd27a_256x240.pngbin4369 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_ffffff_256x240.pngbin4369 -> 0 bytes
-rw-r--r--src/usr/local/www/javascript/jquery/jquery-ui-1.11.1.min.js13
-rw-r--r--src/usr/local/www/javascript/load_balancer_pool_edit/pool.js191
-rw-r--r--src/usr/local/www/javascript/load_balancer_relay_protocol_edit/load_balancer_relay_protocol_edit.js56
-rw-r--r--src/usr/local/www/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/javascript/numericupdown/css/numericupdown.css40
-rwxr-xr-xsrc/usr/local/www/javascript/numericupdown/images/down.gifbin60 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/numericupdown/images/up.gifbin60 -> 0 bytes
-rw-r--r--src/usr/local/www/javascript/numericupdown/js/numericupdown.js287
-rw-r--r--src/usr/local/www/javascript/pi.js682
-rw-r--r--src/usr/local/www/javascript/row_helper.js97
-rw-r--r--src/usr/local/www/javascript/row_helper_dynamic.js98
-rw-r--r--src/usr/local/www/javascript/row_toggle.js66
-rw-r--r--src/usr/local/www/javascript/scriptaculous/builder.js136
-rw-r--r--src/usr/local/www/javascript/scriptaculous/controls.js965
-rw-r--r--src/usr/local/www/javascript/scriptaculous/dragdrop.js974
-rw-r--r--src/usr/local/www/javascript/scriptaculous/effects.js1123
-rw-r--r--src/usr/local/www/javascript/scriptaculous/prototype.js6079
-rw-r--r--src/usr/local/www/javascript/scriptaculous/scriptaculous.js68
-rw-r--r--src/usr/local/www/javascript/scriptaculous/slider.js275
-rw-r--r--src/usr/local/www/javascript/scriptaculous/sound.js59
-rw-r--r--src/usr/local/www/javascript/scriptaculous/unittest.js568
-rw-r--r--src/usr/local/www/javascript/sorttable.js584
-rw-r--r--src/usr/local/www/javascript/suggestions.js33
-rw-r--r--src/usr/local/www/javascript/ticker.js73
-rw-r--r--src/usr/local/www/javascript/wizard/autosuggest.js337
-rw-r--r--src/usr/local/www/javascript/wizard/disablekeys.js6
-rw-r--r--src/usr/local/www/javascript/wizard/suggestions.js33
-rw-r--r--src/usr/local/www/jquery/jquery-1.11.2.min.js4
-rw-r--r--src/usr/local/www/jquery/jquery-ui-1.11.2.min.js13
-rw-r--r--src/usr/local/www/jquery/pfSense.js242
-rw-r--r--src/usr/local/www/license.php203
-rw-r--r--src/usr/local/www/load_balancer_monitor.php114
-rw-r--r--src/usr/local/www/load_balancer_monitor_edit.php329
-rw-r--r--src/usr/local/www/load_balancer_pool.php142
-rw-r--r--src/usr/local/www/load_balancer_pool_edit.php494
-rw-r--r--src/usr/local/www/load_balancer_setting.php126
-rw-r--r--src/usr/local/www/logo-black.pngbin0 -> 8367 bytes
-rw-r--r--src/usr/local/www/logo.pngbin0 -> 4055 bytes
-rwxr-xr-xsrc/usr/local/www/logobig.jpgbin7540 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/niftycssCode.css21
-rwxr-xr-xsrc/usr/local/www/niftycssprintCode.css1
-rw-r--r--src/usr/local/www/pkg_mgr.php329
-rw-r--r--src/usr/local/www/pkg_mgr_install.php123
-rw-r--r--src/usr/local/www/pkg_mgr_installed.php304
-rw-r--r--src/usr/local/www/pkg_mgr_settings.php142
-rw-r--r--src/usr/local/www/protochart/ProtoChart.js2653
-rw-r--r--src/usr/local/www/protochart/excanvas-compressed.js19
-rw-r--r--src/usr/local/www/protochart/excanvas.js785
-rwxr-xr-xsrc/usr/local/www/reboot.php63
-rw-r--r--src/usr/local/www/services_captiveportal.php1571
-rw-r--r--src/usr/local/www/services_captiveportal_filemanager.php253
-rw-r--r--src/usr/local/www/services_captiveportal_hostname.php188
-rw-r--r--src/usr/local/www/services_captiveportal_hostname_edit.php157
-rw-r--r--src/usr/local/www/services_captiveportal_ip.php173
-rw-r--r--src/usr/local/www/services_captiveportal_ip_edit.php134
-rw-r--r--src/usr/local/www/services_captiveportal_mac.php155
-rw-r--r--src/usr/local/www/services_captiveportal_mac_edit.php187
-rw-r--r--src/usr/local/www/services_captiveportal_vouchers.php579
-rw-r--r--src/usr/local/www/services_captiveportal_vouchers_edit.php138
-rw-r--r--src/usr/local/www/services_captiveportal_zones_edit.php70
-rw-r--r--src/usr/local/www/services_dhcp_edit.php592
-rw-r--r--src/usr/local/www/services_dhcp_relay.php287
-rw-r--r--src/usr/local/www/services_dhcpv6.php1148
-rw-r--r--src/usr/local/www/services_dhcpv6_edit.php169
-rw-r--r--src/usr/local/www/services_dhcpv6_relay.php212
-rw-r--r--src/usr/local/www/services_dnsmasq.php636
-rw-r--r--src/usr/local/www/services_dnsmasq_domainoverride_edit.php198
-rw-r--r--src/usr/local/www/services_dnsmasq_edit.php283
-rw-r--r--src/usr/local/www/services_dyndns.php234
-rw-r--r--src/usr/local/www/services_dyndns_edit.php553
-rw-r--r--src/usr/local/www/services_igmpproxy.php147
-rw-r--r--src/usr/local/www/services_igmpproxy_edit.php337
-rw-r--r--src/usr/local/www/services_ntpd.php577
-rw-r--r--src/usr/local/www/services_ntpd_gps.php718
-rw-r--r--src/usr/local/www/services_ntpd_pps.php226
-rw-r--r--src/usr/local/www/services_rfc2136.php238
-rw-r--r--src/usr/local/www/services_rfc2136_edit.php305
-rw-r--r--src/usr/local/www/services_snmp.php439
-rw-r--r--src/usr/local/www/services_unbound.php685
-rw-r--r--src/usr/local/www/services_unbound_acls.php459
-rw-r--r--src/usr/local/www/services_unbound_advanced.php516
-rw-r--r--src/usr/local/www/services_unbound_domainoverride_edit.php105
-rw-r--r--src/usr/local/www/services_unbound_host_edit.php272
-rw-r--r--src/usr/local/www/services_wol.php190
-rw-r--r--src/usr/local/www/services_wol_edit.php105
-rw-r--r--src/usr/local/www/shortcuts/pgk_upnp.php (renamed from src/usr/local/www/shortcuts/pkg_upnp.inc)2
-rwxr-xr-xsrc/usr/local/www/status.php123
-rw-r--r--src/usr/local/www/status_captiveportal.php241
-rw-r--r--src/usr/local/www/status_captiveportal_expire.php93
-rw-r--r--src/usr/local/www/status_captiveportal_test.php88
-rw-r--r--src/usr/local/www/status_captiveportal_voucher_rolls.php144
-rw-r--r--src/usr/local/www/status_captiveportal_vouchers.php82
-rw-r--r--src/usr/local/www/status_dhcp_leases.php264
-rw-r--r--src/usr/local/www/status_dhcpv6_leases.php378
-rw-r--r--src/usr/local/www/status_filter_reload.php56
-rwxr-xr-xsrc/usr/local/www/status_gateway_groups.php217
-rw-r--r--src/usr/local/www/status_gateways.php217
-rw-r--r--src/usr/local/www/status_graph.php359
-rw-r--r--src/usr/local/www/status_graph_cpu.php21
-rw-r--r--src/usr/local/www/status_interfaces.php638
-rw-r--r--src/usr/local/www/status_lb_pool.php254
-rw-r--r--src/usr/local/www/status_lb_vs.php183
-rw-r--r--src/usr/local/www/status_ntpd.php266
-rw-r--r--src/usr/local/www/status_openvpn.php340
-rw-r--r--src/usr/local/www/status_rrd_graph.php783
-rw-r--r--src/usr/local/www/status_rrd_graph_settings.php285
-rwxr-xr-xsrc/usr/local/www/status_services.php102
-rw-r--r--src/usr/local/www/status_upnp.php118
-rw-r--r--src/usr/local/www/status_wireless.php238
-rw-r--r--src/usr/local/www/system.php377
-rw-r--r--src/usr/local/www/system_advanced_admin.php624
-rw-r--r--src/usr/local/www/system_advanced_firewall.php757
-rw-r--r--src/usr/local/www/system_advanced_misc.php740
-rw-r--r--src/usr/local/www/system_advanced_network.php291
-rw-r--r--src/usr/local/www/system_advanced_notifications.php416
-rw-r--r--src/usr/local/www/system_advanced_sysctl.php271
-rw-r--r--src/usr/local/www/system_authservers.php889
-rw-r--r--src/usr/local/www/system_camanager.php697
-rw-r--r--src/usr/local/www/system_certmanager.php1313
-rw-r--r--src/usr/local/www/system_crlmanager.php755
-rw-r--r--src/usr/local/www/system_firmware.php262
-rwxr-xr-xsrc/usr/local/www/system_firmware_auto.php169
-rw-r--r--src/usr/local/www/system_firmware_check.php169
-rw-r--r--src/usr/local/www/system_firmware_restorefullbackup.php249
-rw-r--r--src/usr/local/www/system_firmware_settings.php358
-rw-r--r--src/usr/local/www/system_gateway_groups.php192
-rw-r--r--src/usr/local/www/system_gateway_groups_edit.php378
-rw-r--r--src/usr/local/www/system_gateways.php297
-rw-r--r--src/usr/local/www/system_gateways_edit.php653
-rw-r--r--src/usr/local/www/system_groupmanager.php530
-rw-r--r--src/usr/local/www/system_groupmanager_addprivs.php155
-rwxr-xr-xsrc/usr/local/www/system_hasync.php513
-rw-r--r--src/usr/local/www/system_routes.php240
-rw-r--r--src/usr/local/www/system_routes_edit.php267
-rw-r--r--src/usr/local/www/system_usermanager.php1013
-rw-r--r--src/usr/local/www/system_usermanager_addprivs.php174
-rw-r--r--src/usr/local/www/system_usermanager_passwordmg.php73
-rw-r--r--src/usr/local/www/system_usermanager_settings.php141
-rwxr-xr-xsrc/usr/local/www/system_usermanager_settings_test.php53
-rw-r--r--src/usr/local/www/themes/_corporate/all.css1209
-rw-r--r--src/usr/local/www/themes/_corporate/bottom-loader.js10
-rw-r--r--src/usr/local/www/themes/_corporate/graphlink.css43
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/alert_bgr.gifbin3415 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/footer.gifbin5630 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/header.gifbin16536 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/help.pngbin324 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/horizontal.gifbin460 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/favicon.icobin1406 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_3g.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_3g_inactive.gifbin200 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_advanced.gifbin306 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_advanced_s.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_alert.gifbin1015 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_alias_host.gifbin348 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_alias_net.gifbin331 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_alias_port.gifbin346 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_alias_url.gifbin314 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_alias_url_reload.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_block.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_block_add.gifbin192 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_block_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_cablenic.gifbin91 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_cal.gifbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_cal_mo.gifbin1060 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_carp.gifbin352 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_carp_d.gifbin357 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_chain.pngbin161 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_check.gifbin1291 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_clock_green.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_clock_grey.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_clock_red.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_close.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_configure.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_down.gifbin1114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_down_d.gifbin689 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_down_mo.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_e.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_e_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_error.gifbin1312 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_exclam.gifbin1274 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_flag_de.pngbin114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_flag_en.pngbin618 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_flag_es.pngbin281 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_flag_pt_BR.pngbin502 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_cert.pngbin1528 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_file.pngbin687 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_group.pngbin748 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_host.pngbin513 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_imp.pngbin644 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_mail.pngbin371 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_pwd.pngbin620 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_search.pngbin593 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_time.pngbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_unknown.pngbin487 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_url.pngbin704 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_user.pngbin654 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_fw-update.gifbin43785 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_help.gifbin1669 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_ifalias.gifbin315 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_ifalias_d.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_import_alias.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_in_d.gifbin190 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_info_pkg.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_interface_down.gifbin88 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_interface_up.gifbin87 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_left.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_left_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_left_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_log.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_log_d.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_log_s.gifbin305 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_log_s_d.gifbin305 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_logs.gifbin2092 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_match.gifbin847 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_match_d.gifbin843 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_minus.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_open.gifbin62 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_other.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_other_d.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_parp.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_parp_d.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_pass.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_pass_add.gifbin183 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_pass_d.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_plus.gifbin1100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_plus_bl.gifbin1096 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_plus_bl_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_plus_d.gifbin682 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_plus_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_plus_p.gifbin1087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_d.gifbin701 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_d.gifbin694 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_mo.gifbin1135 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml.gifbin1105 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_d.gifbin686 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_mo.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reject.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reject_d.gifbin193 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_right.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_service_restart.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_service_restart_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_service_running.gifbin1390 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_service_start.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_service_start_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_service_status.gifbin2150 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_service_stop.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_service_stop_d.gifbin1100 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_service_stopped.gifbin1695 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_services_restart_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_services_start_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_services_stop_mo.gifbin1126 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_system-group-grey.pngbin1566 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_system-group.pngbin3128 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_system-user-grey.pngbin1107 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_system-user.pngbin2084 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_system_lock_screen.pngbin1841 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_system_logout.pngbin2087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_trapped.gifbin1101 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_trapped_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_ts_rule.gifbin194 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_ts_rule_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_up.gifbin1116 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_up_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_up_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_wlan.gifbin66 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_wlan_d.gifbin100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_wol_all.gifbin1126 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_wzd_nsaved.pngbin512 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_wzd_saved.pngbin399 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_x.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_x_d.gifbin680 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_x_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_x_p.gifbin1090 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/in.gifbin177 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/in_d.gifbin190 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/out.gifbin179 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/log.pngbin270 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/logo.gifbin10012 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/menu_down.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/menu_footer.gifbin234 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/menu_right.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/metal_bgr.gifbin734 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/metal_bgr_red.gifbin734 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/bar_blue.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/bar_gray.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/bar_left.gifbin63 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/bar_right.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/bullet_toggle_minus.pngbin154 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/bullet_toggle_plus.pngbin156 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/button.gifbin805 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/key_128.gifbin2766 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/key_152.gifbin2772 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/key_256.gifbin2808 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/key_64.gifbin2723 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/left_background.gifbin38943 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/loader.gifbin5971 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/loader_tab.gifbin5852 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/logon.pngbin27029 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_0.gifbin2195 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_1.gifbin3851 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_10.gifbin10624 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_2.gifbin4611 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_3.gifbin5572 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_4.gifbin7103 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_5.gifbin8717 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_6.gifbin9422 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_7.gifbin9443 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_8.gifbin10240 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_9.gifbin10823 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/progress_bar.gifbin44791 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/tri_c.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/tri_c_black.gifbin69 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/tri_o.gifbin58 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/tri_o_black.gifbin67 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/widget_loader.gifbin1064 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/new_tab_menu.pngbin444 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/status.pngbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/transparent.gifbin146 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/transparent_pixel.gifbin43 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/javascript/ie7/blank.gifbin48 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/javascript/ie7/test-trans.pngbin106 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/_corporate/loader.js29
-rw-r--r--src/usr/local/www/themes/_corporate/new_tab_menu.css101
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/new_tab_menu.pngbin444 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/_corporate/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/code-red/all.css1301
-rwxr-xr-xsrc/usr/local/www/themes/code-red/bottom-loader.js10
-rwxr-xr-xsrc/usr/local/www/themes/code-red/favicon.icobin1406 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/graphlink.css43
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/alert_bgr.pngbin1407 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/background.gifbin112090 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/background.pngbin8502 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/button_left.gifbin534 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/button_mid.gifbin149 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/button_right.gifbin333 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/footer.pngbin25072 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/header.pngbin43633 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/help.pngbin324 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/horizontal.gifbin461 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/favicon.icobin1406 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_3g.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_3g_inactive.gifbin200 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_advanced.gifbin306 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_advanced_s.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_alert.gifbin1015 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_alias_host.gifbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_alias_net.gifbin331 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_alias_port.gifbin346 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_alias_url.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_alias_url_reload.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_block.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_block_add.gifbin192 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_block_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_cablenic.gifbin109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_cal.gifbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_cal_mo.gifbin1060 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_carp.gifbin352 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_carp_d.gifbin357 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_chain.pngbin161 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_check.gifbin1291 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_clock_green.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_clock_grey.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_clock_red.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_close.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_configure.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_down.gifbin1114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_down_d.gifbin689 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_down_mo.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_e.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_e_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_error.gifbin1312 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_exclam.gifbin1274 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_flag_de.pngbin114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_flag_en.pngbin618 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_flag_es.pngbin281 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_flag_pt_BR.pngbin502 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_cert.pngbin1528 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_file.pngbin687 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_group.pngbin748 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_host.pngbin513 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_imp.pngbin644 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_mail.pngbin371 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_pwd.pngbin620 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_search.pngbin593 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_time.pngbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_unknown.pngbin487 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_url.pngbin704 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_user.pngbin654 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_fw-update.gifbin43785 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_help.gifbin1669 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_ifalias.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_ifalias_d.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_import_alias.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_info_pkg.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_interface_down.gifbin88 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_interface_up.gifbin87 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_left.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_left_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_left_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_log.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_log_d.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_log_s.gifbin305 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_log_s_d.gifbin305 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_logs.gifbin2092 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_match.gifbin847 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_match_d.gifbin843 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_minus.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_open.gifbin62 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_other.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_other_d.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_parp.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_parp_d.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_pass.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_pass_add.gifbin183 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_pass_d.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_plus.gifbin1100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_plus_bl.gifbin1096 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_plus_bl_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_plus_d.gifbin682 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_plus_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_plus_p.gifbin1087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_d.gifbin701 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_d.gifbin694 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_mo.gifbin1135 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml.gifbin1105 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_d.gifbin686 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_mo.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reject.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reject_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_right.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_service_restart.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_service_restart_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_service_running.gifbin1390 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_service_start.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_service_start_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_service_status.gifbin2150 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_service_stop.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_service_stop_d.gifbin1100 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_service_stopped.gifbin1695 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_services_restart_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_services_start_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_services_stop_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_system-group-grey.pngbin1566 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_system-group.pngbin3128 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_system-user-grey.pngbin1107 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_system-user.pngbin2084 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_system_lock_screen.pngbin1841 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_system_logout.pngbin2087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_trapped.gifbin1101 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_trapped_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_ts_rule.gifbin194 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_ts_rule_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_up.gifbin1116 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_up_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_up_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_wlan.gifbin66 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_wlan_d.gifbin100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_wol_all.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_wzd_nsaved.pngbin512 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_wzd_saved.pngbin399 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_x.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_x_d.gifbin680 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_x_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_x_p.gifbin1090 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/log.pngbin270 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/logo.gifbin7555 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/logobig.jpgbin7697 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/logon-background.gifbin114596 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/menu_down.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/menu_footer.gifbin234 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/menu_right.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/menubgr.pngbin132 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/menubgr_footer.pngbin372 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/menubgr_highlight.pngbin129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/metal_bgr.gifbin734 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/metal_bgr_red.gifbin734 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/background.gifbin115138 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/bar_blue.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/bar_gray.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/bar_left.gifbin289 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/bar_right.gifbin288 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/bullet_toggle_minus.pngbin154 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/bullet_toggle_plus.pngbin156 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/button.gifbin805 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/graph.pngbin2256 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/key_128.gifbin2766 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/key_152.gifbin2772 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/key_256.gifbin2808 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/key_64.gifbin2723 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/left_background.gifbin38943 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/loader.gifbin5971 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/loader_all.gifbin1398 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/loader_filter.gifbin1436 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/loader_tab.gifbin5852 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/logon.pngbin65956 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_0.gifbin2195 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_1.gifbin3851 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_10.gifbin10624 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_2.gifbin4611 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_3.gifbin5572 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_4.gifbin7103 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_5.gifbin8717 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_6.gifbin9422 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_7.gifbin9443 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_8.gifbin10240 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_9.gifbin10823 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/progress_bar.gifbin44791 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/rrd_error.pngbin38898 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_alerter.gifbin2203 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_carpmaster.gifbin1558 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_left.gifbin600 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_page_loading.gifbin1621 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_reload_all.gifbin1611 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_reload_filter.gifbin1612 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_right.gifbin599 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/tri_c.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/tri_c_black.gifbin69 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/tri_o.gifbin58 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/tri_o_black.gifbin67 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/widget_loader.gifbin2545 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/new_tab_menu.pngbin444 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/status.pngbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/transparent.gifbin146 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/transparent_pixel.gifbin43 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/blank.gifbin48 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-box-model.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-core.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-css-strict.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-css2.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-css3.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-fixed.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-html4.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite-p.js3
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-lite.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-png.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard-p.js3
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/test-trans.pngbin106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/img/grey-40.pngbin223 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/img/submenu-off.gifbin65 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/img/submenu-on.gifbin65 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/img/white-90.pngbin223 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/img/x.gifbin43 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/code-red/javascript/niftyjsCode.js174
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/transmenu-body.php53
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/transmenu-head.php87
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/transmenu.org785
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/transmenuC.js86
-rwxr-xr-xsrc/usr/local/www/themes/code-red/jsevents/body.def7
-rw-r--r--src/usr/local/www/themes/code-red/loader.js29
-rwxr-xr-xsrc/usr/local/www/themes/code-red/login.css1136
-rwxr-xr-xsrc/usr/local/www/themes/code-red/menu.inc177
-rw-r--r--src/usr/local/www/themes/code-red/new_tab_menu.css101
-rwxr-xr-xsrc/usr/local/www/themes/code-red/no_big_logo1
-rwxr-xr-xsrc/usr/local/www/themes/code-red/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/code-red/styles/jquery-ui-1.11.1.css1226
-rwxr-xr-xsrc/usr/local/www/themes/code-red/styles/menustyles.css44
-rwxr-xr-xsrc/usr/local/www/themes/code-red/styles/transmenu.css75
-rwxr-xr-xsrc/usr/local/www/themes/code-red/wizard.css1068
-rw-r--r--src/usr/local/www/themes/metallic/all.css1269
-rwxr-xr-xsrc/usr/local/www/themes/metallic/apple-touch-icon.pngbin4068 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/metallic/bottom-loader.js10
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/alert_bgr.gifbin3415 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/footer.gifbin20440 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/header.gifbin33347 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/help.pngbin324 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/horizontal.gifbin461 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/favicon.icobin1406 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_3g.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_3g_inactive.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_advanced.gifbin306 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_advanced_s.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_alert.gifbin1015 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_alias_host.gifbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_alias_net.gifbin331 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_alias_port.gifbin346 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_alias_url.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_alias_url_reload.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_block.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_block_add.gifbin192 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_block_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_cablenic.gifbin91 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_cal.gifbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_cal_mo.gifbin1060 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_carp.gifbin352 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_carp_d.gifbin357 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_chain.pngbin161 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_check.gifbin1291 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_clock_green.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_clock_grey.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_clock_red.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_close.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_configure.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_down.gifbin1114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_down_d.gifbin689 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_down_mo.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_e.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_e_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_error.gifbin1312 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_exclam.gifbin1274 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_flag_de.pngbin114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_flag_en.pngbin618 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_flag_es.pngbin281 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_flag_pt_BR.pngbin502 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_cert.pngbin1528 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_file.pngbin687 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_group.pngbin748 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_host.pngbin513 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_imp.pngbin644 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_mail.pngbin371 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_pwd.pngbin620 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_search.pngbin593 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_time.pngbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_unknown.pngbin487 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_url.pngbin704 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_user.pngbin654 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_fw-update.gifbin43785 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_help.gifbin1669 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_ifalias.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_ifalias_d.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_import_alias.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_info_pkg.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_interface_down.gifbin88 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_interface_up.gifbin87 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_left.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_left_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_left_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_log.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_log_d.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_log_s.gifbin305 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_log_s_d.gifbin305 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_logs.gifbin2092 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_match.gifbin847 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_match_d.gifbin843 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_minus.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_open.gifbin62 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_other.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_other_d.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_parp.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_parp_d.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_pass.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_pass_add.gifbin183 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_pass_d.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_plus.gifbin1100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_plus_bl.gifbin1096 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_plus_bl_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_plus_d.gifbin682 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_plus_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_plus_p.gifbin1087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_d.gifbin701 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_d.gifbin694 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_mo.gifbin1135 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml.gifbin1105 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_d.gifbin686 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_mo.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reject.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reject_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_right.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_service_restart.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_service_restart_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_service_running.gifbin1390 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_service_start.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_service_start_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_service_status.gifbin2150 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_service_stop.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_service_stop_d.gifbin1100 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_service_stopped.gifbin1695 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_services_restart_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_services_start_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_services_stop_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_system-group-grey.pngbin1566 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_system-group.pngbin3128 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_system-user-grey.pngbin1107 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_system-user.pngbin2084 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_system_lock_screen.pngbin1841 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_system_logout.pngbin2087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_trapped.gifbin1101 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_trapped_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_ts_rule.gifbin194 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_ts_rule_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_up.gifbin1116 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_up_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_up_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_wlan.gifbin66 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_wlan_d.gifbin100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_wol_all.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_wzd_nsaved.pngbin512 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_wzd_saved.pngbin399 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_x.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_x_d.gifbin680 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_x_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_x_p.gifbin1090 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/log.pngbin270 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/logo.gifbin10012 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/logobig.jpgbin7540 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/menu_down.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/menu_footer.gifbin234 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/menu_right.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/metal_bgr.gifbin734 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/metal_bgr_red.gifbin734 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/bar_blue.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/bar_gray.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/bar_left.gifbin289 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/bar_right.gifbin288 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/bullet_toggle_minus.pngbin154 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/bullet_toggle_plus.pngbin156 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/button.gifbin805 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/graph.pngbin2256 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/key_128.gifbin2766 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/key_152.gifbin2772 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/key_256.gifbin2808 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/key_64.gifbin2723 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/left_background.gifbin38943 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/loader.gifbin5971 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/loader_all.gifbin1398 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/loader_filter.gifbin1436 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/loader_tab.gifbin5852 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/logon.pngbin27029 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/progress_bar.gifbin44791 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/rrd_error.pngbin38898 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_alerter.gifbin2203 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_carpmaster.gifbin1558 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_left.gifbin600 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_page_loading.gifbin1621 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_reload_all.gifbin1611 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_reload_filter.gifbin1612 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_right.gifbin599 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/tri_c.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/tri_c_black.gifbin84 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/tri_o.gifbin58 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/tri_o_black.gifbin82 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/widget_loader.gifbin1064 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/new_tab_menu.pngbin444 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/status.pngbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/transparent.gifbin146 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/transparent_pixel.gifbin43 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/javascript/ie7/blank.gifbin48 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/metallic/javascript/ie7/test-trans.pngbin106 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/metallic/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/metallic/loader.js29
-rw-r--r--src/usr/local/www/themes/metallic/login.css1127
-rw-r--r--src/usr/local/www/themes/metallic/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/metallic/no_big_logo1
-rw-r--r--src/usr/local/www/themes/metallic/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/metallic/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/nervecenter/all.css1301
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/apple-touch-icon.pngbin4068 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/bottom-loader.js10
-rw-r--r--src/usr/local/www/themes/nervecenter/favicon.icobin1406 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/graphlink.css43
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/alert_bgr.pngbin10240 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/background.gifbin44574 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/background.pngbin8502 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/footer.pngbin41755 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/header.pngbin49602 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/help.pngbin324 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/horizontal.gifbin461 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/favicon.icobin1406 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_3g.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_3g_inactive.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_advanced.gifbin306 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_advanced_s.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_alert.gifbin1015 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_alias_host.gifbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_alias_net.gifbin331 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_alias_port.gifbin346 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_alias_url.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_alias_url_reload.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_block.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_block_add.gifbin192 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_block_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_cablenic.gifbin91 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_cal.gifbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_cal_mo.gifbin1060 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_carp.gifbin352 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_carp_d.gifbin357 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_chain.pngbin161 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_check.gifbin1291 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_clock_green.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_clock_grey.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_clock_red.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_close.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_configure.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_down.gifbin1114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_down_d.gifbin689 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_down_mo.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_e.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_e_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_error.gifbin1312 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_exclam.gifbin1274 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_flag_de.pngbin114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_flag_en.pngbin618 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_flag_es.pngbin281 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_flag_pt_BR.pngbin502 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_cert.pngbin1528 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_file.pngbin687 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_group.pngbin748 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_host.pngbin513 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_imp.pngbin644 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_mail.pngbin371 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_pwd.pngbin620 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_search.pngbin593 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_time.pngbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_unknown.pngbin487 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_url.pngbin704 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_user.pngbin654 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_fw-update.gifbin43785 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_help.gifbin1669 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_ifalias.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_ifalias_d.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_import_alias.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_info_pkg.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_interface_down.gifbin88 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_interface_up.gifbin87 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_left.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_left_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_left_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_log.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_log_d.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_log_s.gifbin305 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_log_s_d.gifbin305 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_logs.gifbin2092 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_match.gifbin847 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_match_d.gifbin843 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_minus.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_open.gifbin62 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_other.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_other_d.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_parp.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_parp_d.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_pass.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_pass_add.gifbin183 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_pass_d.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_plus.gifbin1100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl.gifbin1096 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_plus_d.gifbin682 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_plus_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_plus_p.gifbin1087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_d.gifbin701 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_d.gifbin694 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_mo.gifbin1135 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml.gifbin1105 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_d.gifbin686 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_mo.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reject.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reject_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_right.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_service_restart.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_service_restart_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_service_running.gifbin1390 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_service_start.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_service_start_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_service_status.gifbin2150 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_service_stop.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_service_stop_d.gifbin1100 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_service_stopped.gifbin1695 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_services_restart_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_services_start_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_services_stop_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_system-group-grey.pngbin1566 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_system-group.pngbin3128 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_system-user-grey.pngbin1107 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_system-user.pngbin2084 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_system_lock_screen.pngbin1841 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_system_logout.pngbin2087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_trapped.gifbin1101 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_trapped_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule.gifbin194 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_up.gifbin1116 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_up_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_up_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_wlan.gifbin66 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_wlan_d.gifbin100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_wol_all.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_wzd_nsaved.pngbin512 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_wzd_saved.pngbin399 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_x.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_x_d.gifbin680 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_x_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_x_p.gifbin1090 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/log.pngbin270 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/logo.gifbin7599 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/logobig.jpgbin7540 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/menu_down.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/menu_footer.gifbin234 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/menu_right.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/metal_bgr.gifbin734 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/metal_bgr_red.gifbin734 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/bar_blue.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/bar_gray.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/bar_left.gifbin289 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/bar_right.gifbin288 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_minus.pngbin154 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_plus.pngbin156 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/button.gifbin805 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/graph.pngbin2256 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/key_128.gifbin2766 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/key_152.gifbin2772 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/key_256.gifbin2808 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/key_64.gifbin2723 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/left_background.gifbin38943 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/loader.gifbin5971 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/loader_all.gifbin1398 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/loader_filter.gifbin1436 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/loader_tab.gifbin5852 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/logon.pngbin47467 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/progress_bar.gifbin44791 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/rrd_error.pngbin38898 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_alerter.gifbin2203 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_carpmaster.gifbin1558 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_left.gifbin600 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_page_loading.gifbin1621 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_reload_all.gifbin1611 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_reload_filter.gifbin1612 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_right.gifbin599 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/tri_c.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/tri_c_black.gifbin69 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/tri_o.gifbin58 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/tri_o_black.gifbin67 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/widget_loader.gifbin2545 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/new_tab_menu.pngbin444 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/status.pngbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/transparent.gifbin146 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/transparent_pixel.gifbin43 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/ie7/blank.gifbin48 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/ie7/test-trans.pngbin106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/img/grey-40.pngbin223 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/img/submenu-off.gifbin65 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/img/submenu-on.gifbin65 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/img/white-90.pngbin223 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/img/x.gifbin43 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/transmenu-body.php51
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/transmenu-head.php85
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/transmenu.org785
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/transmenuC.js86
-rw-r--r--src/usr/local/www/themes/nervecenter/jsevents/body.def7
-rw-r--r--src/usr/local/www/themes/nervecenter/loader.js29
-rw-r--r--src/usr/local/www/themes/nervecenter/login.css1127
-rw-r--r--src/usr/local/www/themes/nervecenter/menu.inc177
-rw-r--r--src/usr/local/www/themes/nervecenter/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/nervecenter/no_big_logo1
-rw-r--r--src/usr/local/www/themes/nervecenter/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/nervecenter/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/nervecenter/styles/menustyles.css44
-rw-r--r--src/usr/local/www/themes/nervecenter/styles/transmenu.css75
-rw-r--r--src/usr/local/www/themes/nervecenter/wizard.css1060
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/all.css1028
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/apple-touch-icon.pngbin4068 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/bottom-loader.js11
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/alert_bgr.gifbin1651 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/header-alert.gifbin4910 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/header.gifbin7932 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/help.pngbin324 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/favicon.icobin1406 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g_inactive.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced.gifbin306 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced_s.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alert.gifbin1044 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_host.gifbin348 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_net.gifbin331 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_port.gifbin346 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url.gifbin314 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url_reload.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_add.gifbin192 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cablenic.gifbin91 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal.gifbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal_mo.gifbin1060 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp.gifbin352 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp_d.gifbin357 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_chain.pngbin161 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_check.gifbin1291 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_green.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_grey.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_red.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_close.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_configure.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down.gifbin1114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_d.gifbin689 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_mo.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_error.gifbin1312 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_exclam.gifbin1274 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_de.pngbin114 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_en.pngbin618 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_es.pngbin281 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_pt_BR.pngbin502 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_cert.pngbin1528 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_file.pngbin687 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_group.pngbin748 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_host.pngbin513 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_imp.pngbin644 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_mail.pngbin371 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_pwd.pngbin620 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_search.pngbin593 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_time.pngbin646 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_unknown.pngbin487 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_url.pngbin704 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_user.pngbin654 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_fw-update.gifbin43785 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_help.gifbin1669 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias.gifbin315 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias_d.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_import_alias.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in_d.gifbin190 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_info_pkg.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_down.gifbin88 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_up.gifbin87 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_d.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s.gifbin305 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s_d.gifbin305 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_logs.gifbin2092 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match.gifbin847 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match_d.gifbin843 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_minus.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_open.gifbin62 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other_d.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp_d.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_add.gifbin183 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_d.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus.gifbin1100 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl.gifbin1096 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_d.gifbin682 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_mo.gifbin1120 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_p.gifbin1087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_d.gifbin701 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_d.gifbin694 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_mo.gifbin1135 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml.gifbin1105 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_d.gifbin686 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_mo.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_right.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_running.gifbin1390 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_status.gifbin2150 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop_d.gifbin1100 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stopped.gifbin1695 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_restart_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_start_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_stop_mo.gifbin1126 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group-grey.pngbin1566 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group.pngbin3128 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user-grey.pngbin1107 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user.pngbin2084 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_lock_screen.pngbin1841 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_logout.pngbin2087 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped.gifbin1101 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule.gifbin194 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up.gifbin1116 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan.gifbin66 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan_d.gifbin100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wol_all.gifbin1114 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_nsaved.pngbin512 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_saved.pngbin399 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_d.gifbin680 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_p.gifbin1090 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/in.gifbin177 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/in_d.gifbin190 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/out.gifbin179 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/log.pngbin270 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/logo.gifbin4878 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/logobig.jpgbin7540 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/menu.gifbin460 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/bar_blue.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/bar_gray.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/bar_left.gifbin289 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/bar_right.gifbin288 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/button.gifbin805 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/key_128.gifbin2766 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/key_152.gifbin2772 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/key_256.gifbin2808 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/key_64.gifbin2723 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/left_background.gifbin38943 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/loader.gifbin5971 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/loader_tab.gifbin5852 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/logon.pngbin27029 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/progress_bar.gifbin44791 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/rrd_error.pngbin38898 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c_black.gifbin69 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o.gifbin58 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o_black.gifbin67 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/widget_loader.gifbin1064 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/new_tab_menu.pngbin444 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/status.pngbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/transparent.gifbin146 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/transparent_pixel.gifbin43 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/javascript/ie7/blank.gifbin48 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/javascript/ie7/test-trans.pngbin106 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/loader.js29
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/login.css1127
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/pfsense/all.css1036
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/apple-touch-icon.pngbin4068 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/bottom-loader.js12
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/alert_bgr.gifbin1651 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/header-alert.gifbin4910 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/header.gifbin18510 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/help.pngbin324 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/favicon.icobin1406 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_3g.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_3g_inactive.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_advanced.gifbin306 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_advanced_s.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_alert.gifbin1044 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_alias_host.gifbin348 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_alias_net.gifbin331 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_alias_port.gifbin346 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_alias_url.gifbin314 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_alias_url_reload.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_block.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_block_add.gifbin192 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_block_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_cablenic.gifbin91 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_cal.gifbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_cal_mo.gifbin1060 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_carp.gifbin352 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_carp_d.gifbin357 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_chain.pngbin161 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_check.gifbin1291 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_clock_green.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_clock_grey.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_clock_red.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_close.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_configure.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_down.gifbin1114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_down_d.gifbin689 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_down_mo.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_e.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_e_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_error.gifbin1312 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_exclam.gifbin1274 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_flag_de.pngbin114 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_flag_en.pngbin618 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_flag_es.pngbin281 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_flag_pt_BR.pngbin502 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_cert.pngbin1528 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_file.pngbin687 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_group.pngbin748 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_host.pngbin513 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_imp.pngbin644 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_mail.pngbin371 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_pwd.pngbin620 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_search.pngbin593 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_time.pngbin646 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_unknown.pngbin487 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_url.pngbin704 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_user.pngbin654 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_fw-update.gifbin43785 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_help.gifbin1669 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_ifalias.gifbin315 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_ifalias_d.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_import_alias.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_info_pkg.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_interface_down.gifbin88 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_interface_up.gifbin87 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_left.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_left_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_left_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_log.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_log_d.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_log_s.gifbin305 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_log_s_d.gifbin305 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_logs.gifbin2092 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_match.gifbin847 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_match_d.gifbin843 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_minus.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_open.gifbin62 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_other.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_other_d.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_parp.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_parp_d.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_pass.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_pass_add.gifbin183 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_pass_d.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_plus.gifbin1100 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl.gifbin1096 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_plus_d.gifbin682 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_plus_mo.gifbin1120 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_plus_p.gifbin1087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_d.gifbin701 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_d.gifbin694 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_mo.gifbin1135 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml.gifbin1105 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_d.gifbin686 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_mo.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reject.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reject_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_right.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_service_restart.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_service_restart_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_service_running.gifbin1390 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_service_start.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_service_start_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_service_status.gifbin2150 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_service_stop.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_service_stop_d.gifbin1100 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_service_stopped.gifbin1695 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_services_restart_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_services_start_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_services_stop_mo.gifbin1126 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_system-group-grey.pngbin1566 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_system-group.pngbin3128 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_system-user-grey.pngbin1107 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_system-user.pngbin2084 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_system_lock_screen.pngbin1841 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_system_logout.pngbin2087 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_trapped.gifbin1101 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_trapped_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_ts_rule.gifbin194 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_ts_rule_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_up.gifbin1116 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_up_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_up_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_wlan.gifbin66 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_wlan_d.gifbin100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_wol_all.gifbin1126 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_wzd_nsaved.pngbin512 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_wzd_saved.pngbin399 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_x.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_x_d.gifbin680 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_x_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_x_p.gifbin1090 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/in.gifbin177 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/in_d.gifbin190 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/out.gifbin179 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/log.pngbin270 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/logo.gifbin4878 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/logobig.jpgbin7540 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/bar_blue.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/bar_gray.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/bar_left.gifbin289 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/bar_right.gifbin288 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/button.gifbin805 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/key_128.gifbin2766 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/key_152.gifbin2772 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/key_256.gifbin2808 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/key_64.gifbin2723 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/left_background.gifbin38943 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/loader.gifbin5971 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/loader_tab.gifbin5852 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/logon.pngbin27029 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/progress_bar.gifbin44791 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/rrd_error.pngbin38898 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/tri_c.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/tri_c_black.gifbin69 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/tri_o.gifbin58 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/tri_o_black.gifbin67 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/widget_loader.gifbin1064 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/new_tab_menu.pngbin444 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/status.pngbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/transparent.gifbin146 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/transparent_pixel.gifbin43 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/pfsense/loader.js30
-rw-r--r--src/usr/local/www/themes/pfsense/login.css1127
-rw-r--r--src/usr/local/www/themes/pfsense/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/pfsense/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/pfsense/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/pfsense_ng/all.css1414
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/apple-touch-icon.pngbin4068 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/bottom-loader.js10
-rw-r--r--src/usr/local/www/themes/pfsense_ng/favicon.icobin1406 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/graphlink.css43
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/alert_bgr.pngbin2483 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/alerter.pngbin3748 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/background.jpgbin49431 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/footer.pngbin2956 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/header.pngbin4994 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/help.pngbin324 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/horizontal.pngbin191 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/hostname.pngbin1899 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/favicon.icobin1406 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_3g.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_3g_inactive.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced.gifbin306 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced_s.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_alert.gifbin1015 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_host.gifbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_net.gifbin331 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_port.gifbin346 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url_reload.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_block.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_block_add.gifbin192 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_block_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_cablenic.gifbin91 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_cal.gifbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_cal_mo.gifbin1060 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_carp.gifbin352 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_carp_d.gifbin357 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_chain.pngbin161 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_check.gifbin1291 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_green.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_grey.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_red.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_close.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_configure.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_down.gifbin1114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_down_d.gifbin689 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_down_mo.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_e.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_e_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_error.gifbin1312 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_exclam.gifbin1274 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_de.pngbin114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_en.pngbin618 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_es.pngbin281 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_pt_BR.pngbin502 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_cert.pngbin1528 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_file.pngbin687 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_group.pngbin748 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_host.pngbin513 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_imp.pngbin644 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_mail.pngbin371 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_pwd.pngbin620 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_search.pngbin593 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_time.pngbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_unknown.pngbin487 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_url.pngbin704 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_user.pngbin654 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_fw-update.gifbin43785 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_help.gifbin1669 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias_d.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_import_alias.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_info_pkg.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_down.gifbin88 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_up.gifbin87 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_left.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_left_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_left_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_log.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_log_d.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s.gifbin305 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s_d.gifbin305 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_logs.gifbin2092 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_match.gifbin847 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_match_d.gifbin843 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_minus.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_open.gifbin62 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_other.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_other_d.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_parp.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_parp_d.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_pass.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_add.gifbin183 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_d.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_plus.gifbin1100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl.gifbin1096 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_d.gifbin682 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_p.gifbin1087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_d.gifbin701 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_d.gifbin694 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_mo.gifbin1135 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml.gifbin1105 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_d.gifbin686 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_mo.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reject.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reject_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_right.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_running.gifbin1390 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_status.gifbin2150 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop_d.gifbin1100 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stopped.gifbin1695 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_services_restart_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_services_start_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_services_stop_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group-grey.pngbin1566 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group.pngbin3128 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user-grey.pngbin1107 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user.pngbin2084 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_system_lock_screen.pngbin1841 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_system_logout.pngbin2087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped.gifbin1101 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule.gifbin194 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_up.gifbin1116 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_up_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_up_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan.gifbin66 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan_d.gifbin100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_wol_all.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_nsaved.pngbin512 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_saved.pngbin399 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_x.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_x_d.gifbin680 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_x_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_x_p.gifbin1090 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/log.pngbin270 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/logo.gifbin2471 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/logobig.jpgbin7540 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/mainmenu-down.gifbin55 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/mainmenu-right.gifbin56 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/mainmenuitem.gifbin54 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/menu-dot.gifbin54 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/menu_footer.gifbin234 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/menu_right.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/menubgr.pngbin132 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/menubgr_footer.pngbin496 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/menubgr_highlight.pngbin252 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/bar_blue.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/bar_gray.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/bar_left.gifbin289 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/bar_right.gifbin288 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_minus.pngbin154 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_plus.pngbin156 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/button.gifbin805 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/graph.pngbin2256 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/key_128.gifbin2766 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/key_152.gifbin2772 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/key_256.gifbin2808 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/key_64.gifbin2723 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/left_background.gifbin38943 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/loader.gifbin5971 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/loader_all.gifbin1398 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/loader_filter.gifbin1436 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/loader_tab.gifbin5852 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/logon.pngbin50494 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/progress_bar.gifbin44791 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/rrd_error.pngbin38898 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_alerter.gifbin2203 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_carpmaster.gifbin1558 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_left.gifbin600 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_page_loading.gifbin1621 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_reload_all.gifbin1611 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_reload_filter.gifbin1612 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_right.gifbin599 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/tri_c.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/tri_c_black.gifbin69 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/tri_o.gifbin58 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/tri_o_black.gifbin67 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/widget_loader.gifbin2545 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/new_tab_menu.pngbin444 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/status.pngbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/transparent.gifbin146 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/transparent_pixel.gifbin43 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/ie7/blank.gifbin48 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/ie7/test-trans.pngbin106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/img/grey-40.pngbin223 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/img/submenu-off.gifbin65 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/img/submenu-on.gifbin65 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/img/white-90.pngbin223 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/img/x.gifbin43 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/transmenu-body.php51
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/transmenu-head.php85
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/transmenu.org785
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/transmenuC.js86
-rw-r--r--src/usr/local/www/themes/pfsense_ng/jsevents/body.def7
-rw-r--r--src/usr/local/www/themes/pfsense_ng/loader.js36
-rw-r--r--src/usr/local/www/themes/pfsense_ng/login.css1127
-rw-r--r--src/usr/local/www/themes/pfsense_ng/menu.inc177
-rw-r--r--src/usr/local/www/themes/pfsense_ng/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/pfsense_ng/no_big_logo1
-rw-r--r--src/usr/local/www/themes/pfsense_ng/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/pfsense_ng/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/pfsense_ng/styles/menustyles.css44
-rw-r--r--src/usr/local/www/themes/pfsense_ng/styles/transmenu.css75
-rw-r--r--src/usr/local/www/themes/pfsense_ng/wizard.css1117
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/all.css1375
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/apple-touch-icon.pngbin4068 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/bottom-loader.js10
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/favicon.icobin1406 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/graphlink.css43
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/alert_bgr.pngbin2483 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/alerter.pngbin3748 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/background.jpgbin49431 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/footer.pngbin2956 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/header.pngbin4994 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/help.pngbin324 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/horizontal.pngbin191 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/hostname.pngbin1899 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/favicon.icobin1406 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g_inactive.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced.gifbin306 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced_s.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alert.gifbin1015 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_host.gifbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_net.gifbin331 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_port.gifbin346 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url_reload.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_add.gifbin192 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cablenic.gifbin91 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal.gifbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal_mo.gifbin1060 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp.gifbin352 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp_d.gifbin357 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_chain.pngbin161 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_check.gifbin1291 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_green.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_grey.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_red.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_close.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_configure.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down.gifbin1114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_d.gifbin689 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_mo.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_error.gifbin1312 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_exclam.gifbin1274 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_de.pngbin114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_en.pngbin618 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_es.pngbin281 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_pt_BR.pngbin502 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_cert.pngbin1528 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_file.pngbin687 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_group.pngbin748 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_host.pngbin513 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_imp.pngbin644 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_mail.pngbin371 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_pwd.pngbin620 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_search.pngbin593 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_time.pngbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_unknown.pngbin487 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_url.pngbin704 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_user.pngbin654 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_fw-update.gifbin43785 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_help.gifbin1669 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias_d.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_import_alias.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_info_pkg.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_down.gifbin88 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_up.gifbin87 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_d.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s.gifbin305 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s_d.gifbin305 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_logs.gifbin2092 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match.gifbin847 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match_d.gifbin843 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_minus.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_open.gifbin62 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other_d.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp_d.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_add.gifbin183 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_d.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus.gifbin1100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl.gifbin1096 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_d.gifbin682 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_p.gifbin1087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_d.gifbin701 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_d.gifbin694 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_mo.gifbin1135 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml.gifbin1105 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_d.gifbin686 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_mo.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_right.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_running.gifbin1390 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_status.gifbin2150 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop_d.gifbin1100 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stopped.gifbin1695 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_restart_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_start_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_stop_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group-grey.pngbin1566 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group.pngbin3128 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user-grey.pngbin1107 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user.pngbin2084 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_lock_screen.pngbin1841 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_logout.pngbin2087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped.gifbin1101 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule.gifbin194 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up.gifbin1116 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan.gifbin66 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan_d.gifbin100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wol_all.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_nsaved.pngbin512 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_saved.pngbin399 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_d.gifbin680 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_p.gifbin1090 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/log.pngbin270 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/logo.gifbin2471 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/logobig.jpgbin7540 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-down.gifbin55 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-right.gifbin56 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/mainmenuitem.gifbin54 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/menu-dot.gifbin54 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/menu_footer.gifbin234 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/menu_right.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/menubgr.pngbin132 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/menubgr_footer.pngbin496 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/menubgr_highlight.pngbin252 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_blue.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_gray.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_left.gifbin289 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_right.gifbin288 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_minus.pngbin154 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_plus.pngbin156 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/button.gifbin805 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/graph.pngbin2256 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/key_128.gifbin2766 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/key_152.gifbin2772 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/key_256.gifbin2808 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/key_64.gifbin2723 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/left_background.gifbin38943 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/loader.gifbin5971 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_all.gifbin1398 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_filter.gifbin1436 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_tab.gifbin5852 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/logon.pngbin50494 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/progress_bar.gifbin44791 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/rrd_error.pngbin38898 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_alerter.gifbin2203 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_carpmaster.gifbin1558 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_left.gifbin600 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_page_loading.gifbin1621 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_all.gifbin1611 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_filter.gifbin1612 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_right.gifbin599 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c_black.gifbin69 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o.gifbin58 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o_black.gifbin67 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/widget_loader.gifbin2545 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/new_tab_menu.pngbin444 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/status.pngbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/transparent.gifbin146 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/transparent_pixel.gifbin43 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/blank.gifbin48 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/test-trans.pngbin106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/img/grey-40.pngbin223 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-off.gifbin65 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-on.gifbin65 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/img/white-90.pngbin223 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/img/x.gifbin43 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-body.php51
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-head.php85
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu.org785
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenuC.js86
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/jsevents/body.def7
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/loader.js294
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/login.css1127
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/menu.inc177
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/no_big_logo1
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/styles/menustyles.css44
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/styles/transmenu.css75
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/wizard.css1117
-rw-r--r--src/usr/local/www/themes/the_wall/all.css1308
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/apple-touch-icon.pngbin4068 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/bottom-loader.js10
-rw-r--r--src/usr/local/www/themes/the_wall/favicon.icobin1406 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/graphlink.css43
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/alert_bgr.pngbin12705 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/background.jpgbin50449 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/footer.pngbin7774 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/header.pngbin44524 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/help.pngbin324 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/horizontal.gifbin461 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/horizontal.pngbin190 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/favicon.icobin1406 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_3g.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_3g_inactive.gifbin200 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_advanced.gifbin306 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_advanced_s.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_alert.gifbin1015 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_alias_host.gifbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_alias_net.gifbin331 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_alias_port.gifbin346 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_alias_url.gifbin314 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_alias_url_reload.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_block.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_block_add.gifbin192 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_block_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_cablenic.gifbin91 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_cal.gifbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_cal_mo.gifbin1060 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_carp.gifbin352 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_carp_d.gifbin357 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_chain.pngbin161 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_check.gifbin1291 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_clock_green.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_clock_grey.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_clock_red.gifbin308 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_close.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_configure.gifbin64 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_down.gifbin1114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_down_d.gifbin689 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_down_mo.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_e.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_e_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_error.gifbin1312 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_exclam.gifbin1274 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_flag_de.pngbin114 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_flag_en.pngbin618 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_flag_es.pngbin281 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_flag_pt_BR.pngbin502 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_cert.pngbin1528 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_file.pngbin687 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_group.pngbin748 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_host.pngbin513 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_imp.pngbin644 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_mail.pngbin371 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_pwd.pngbin620 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_search.pngbin593 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_time.pngbin646 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_unknown.pngbin487 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_url.pngbin704 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_user.pngbin654 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_fw-update.gifbin43785 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_help.gifbin1669 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_ifalias.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_ifalias_d.gifbin315 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_import_alias.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_info_pkg.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_interface_down.gifbin88 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_interface_up.gifbin87 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_left.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_left_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_left_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_log.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_log_d.gifbin297 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_log_s.gifbin305 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_log_s_d.gifbin305 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_logs.gifbin2092 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_match.gifbin847 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_match_d.gifbin843 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_minus.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_open.gifbin62 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_other.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_other_d.gifbin125 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_parp.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_parp_d.gifbin303 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_pass.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_pass_add.gifbin183 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_pass_d.gifbin182 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_plus.gifbin1100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_plus_bl.gifbin1096 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_plus_bl_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_plus_d.gifbin682 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_plus_mo.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_plus_p.gifbin1087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_d.gifbin701 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg.gifbin1109 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_d.gifbin694 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_mo.gifbin1135 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml.gifbin1105 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_d.gifbin686 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_mo.gifbin1131 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reject.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reject_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_right.gifbin1117 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_service_restart.gifbin1120 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_service_restart_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_service_running.gifbin1390 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_service_start.gifbin1119 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_service_start_d.gifbin1115 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_service_status.gifbin2150 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_service_stop.gifbin1106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_service_stop_d.gifbin1100 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_service_stopped.gifbin1695 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_services_restart_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_services_start_mo.gifbin1130 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_services_stop_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_system-group-grey.pngbin1566 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_system-group.pngbin3128 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_system-user-grey.pngbin1107 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_system-user.pngbin2084 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_system_lock_screen.pngbin1841 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_system_logout.pngbin2087 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_trapped.gifbin1101 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_trapped_p.gifbin1079 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_ts_rule.gifbin194 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_ts_rule_d.gifbin193 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_up.gifbin1116 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_up_d.gifbin691 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_up_mo.gifbin1129 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_wlan.gifbin66 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_wlan_d.gifbin100 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_wol_all.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_wzd_nsaved.pngbin512 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_wzd_saved.pngbin399 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_x.gifbin1111 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_x_d.gifbin680 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_x_mo.gifbin1126 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_x_p.gifbin1090 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/in.gifbin177 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/in_d.gifbin190 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/out.gifbin179 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/out_d.gifbin189 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/log.pngbin270 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/logo.gifbin7599 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/logobig.jpgbin7540 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/menu_down.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/menu_right.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/bar_blue.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/bar_gray.gifbin94 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/bar_left.gifbin289 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/bar_right.gifbin288 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/bullet_toggle_minus.pngbin154 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/bullet_toggle_plus.pngbin156 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/button.gifbin805 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/graph.pngbin2256 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/key_128.gifbin2766 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/key_152.gifbin2772 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/key_256.gifbin2808 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/key_64.gifbin2723 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/loader.gifbin2248 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/loader_all.gifbin1398 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/loader_filter.gifbin1436 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/loader_tab.gifbin2248 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/logon.pngbin22000 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/progress_bar.gifbin44791 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/rrd_error.pngbin38898 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_alerter.gifbin2203 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_carpmaster.gifbin1558 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_left.gifbin600 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_page_loading.gifbin1621 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_reload_all.gifbin1611 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_reload_filter.gifbin1612 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_right.gifbin599 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/tri_c.gifbin61 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/tri_c_black.gifbin69 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/tri_o.gifbin58 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/tri_o_black.gifbin67 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/widget_loader.gifbin2545 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/widget_loader_old.gifbin1064 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/new_tab_menu.pngbin444 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/status.pngbin348 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/transparent.gifbin146 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/transparent_pixel.gifbin43 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/ie7/blank.gifbin48 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/ie7/test-trans.pngbin106 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/img/grey-40.pngbin223 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/img/submenu-off.gifbin65 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/img/submenu-on.gifbin65 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/img/white-90.pngbin223 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/img/x.gifbin43 -> 0 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/transmenu-body.php51
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/transmenu-head.php85
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/transmenu.org785
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/transmenuC.js86
-rw-r--r--src/usr/local/www/themes/the_wall/jsevents/body.def7
-rw-r--r--src/usr/local/www/themes/the_wall/loader.js30
-rw-r--r--src/usr/local/www/themes/the_wall/login.css1159
-rw-r--r--src/usr/local/www/themes/the_wall/menu.inc177
-rw-r--r--src/usr/local/www/themes/the_wall/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/the_wall/no_big_logo1
-rw-r--r--src/usr/local/www/themes/the_wall/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/the_wall/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/the_wall/styles/menustyles.css44
-rw-r--r--src/usr/local/www/themes/the_wall/styles/transmenu.css75
-rw-r--r--src/usr/local/www/themes/the_wall/wizard.css1060
-rwxr-xr-xsrc/usr/local/www/tree-images/empty.gifbin837 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/join.gifbin857 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/joinbottom.gifbin850 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/line.gifbin853 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/minus_.gifbin913 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/minus_up.gifbin911 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/page.gifbin980 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/plus_.gifbin910 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/plus_up.gifbin913 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/plus_updown.gifbin915 -> 0 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/zone.gifbin318 -> 0 bytes
-rwxr-xr-x[-rw-r--r--]src/usr/local/www/tree/index.html0
-rwxr-xr-x[-rw-r--r--]src/usr/local/www/tree/tree.css0
-rwxr-xr-x[-rw-r--r--]src/usr/local/www/tree/tree.js0
-rw-r--r--src/usr/local/www/treeview.css48
-rw-r--r--src/usr/local/www/vpn_ipsec.php660
-rw-r--r--src/usr/local/www/vpn_ipsec_keys.php211
-rw-r--r--src/usr/local/www/vpn_ipsec_keys_edit.php114
-rw-r--r--src/usr/local/www/vpn_ipsec_mobile.php745
-rw-r--r--src/usr/local/www/vpn_ipsec_phase1.php1127
-rw-r--r--src/usr/local/www/vpn_ipsec_phase2.php1020
-rw-r--r--src/usr/local/www/vpn_ipsec_settings.php298
-rw-r--r--src/usr/local/www/vpn_l2tp.php434
-rw-r--r--src/usr/local/www/vpn_l2tp_users.php102
-rw-r--r--src/usr/local/www/vpn_l2tp_users_edit.php105
-rw-r--r--src/usr/local/www/vpn_openvpn_client.php1424
-rw-r--r--src/usr/local/www/vpn_openvpn_csc.php928
-rw-r--r--src/usr/local/www/vpn_openvpn_server.php2442
-rw-r--r--src/usr/local/www/vpn_pppoe.php116
-rw-r--r--src/usr/local/www/vpn_pppoe_edit.php746
-rw-r--r--src/usr/local/www/vpn_pptp.php5
-rw-r--r--src/usr/local/www/vpn_pptp_users.php5
-rw-r--r--src/usr/local/www/vpn_pptp_users_edit.php5
-rw-r--r--src/usr/local/www/widgets/widgets/captive_portal_status.widget.php54
-rw-r--r--src/usr/local/www/widgets/widgets/carp_status.widget.php15
-rw-r--r--src/usr/local/www/widgets/widgets/dyn_dns_status.widget.php8
-rw-r--r--src/usr/local/www/widgets/widgets/gateways.widget.php221
-rw-r--r--src/usr/local/www/widgets/widgets/gmirror_status.widget.php41
-rw-r--r--src/usr/local/www/widgets/widgets/installed_packages.widget.php135
-rw-r--r--src/usr/local/www/widgets/widgets/interface_statistics.widget.php208
-rw-r--r--src/usr/local/www/widgets/widgets/interfaces.widget.php58
-rw-r--r--src/usr/local/www/widgets/widgets/ipsec.widget.php190
-rw-r--r--src/usr/local/www/widgets/widgets/load_balancer_status.widget.php81
-rw-r--r--src/usr/local/www/widgets/widgets/log.widget.php281
-rw-r--r--src/usr/local/www/widgets/widgets/ntp_status.widget.php140
-rw-r--r--src/usr/local/www/widgets/widgets/openvpn.widget.php87
-rw-r--r--src/usr/local/www/widgets/widgets/picture.widget.php32
-rw-r--r--src/usr/local/www/widgets/widgets/rss.widget.php139
-rw-r--r--src/usr/local/www/widgets/widgets/services_status.widget.php81
-rw-r--r--src/usr/local/www/widgets/widgets/smart_status.widget.php28
-rw-r--r--src/usr/local/www/widgets/widgets/system_information.widget.php279
-rw-r--r--src/usr/local/www/widgets/widgets/thermal_sensors.widget.php4
-rw-r--r--src/usr/local/www/widgets/widgets/traffic_graphs.widget.php126
-rw-r--r--src/usr/local/www/widgets/widgets/wake_on_lan.widget.php14
2397 files changed, 43645 insertions, 128331 deletions
diff --git a/.gitignore b/.gitignore
index 267142b..d24ef4f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,11 @@ _notes/
/build.conf
# Ignore Vim swap files
.*.swp
+upload.sh
+# eclipse
+.buildpath
+.project
+.settings/
+# PhpStorm
+.idea
+*.php-e
diff --git a/PROGRESS.md b/PROGRESS.md
new file mode 100644
index 0000000..592d477
--- /dev/null
+++ b/PROGRESS.md
@@ -0,0 +1,284 @@
+## Bootstrap Conversion Progress
+
+Use this table to list the php pages that have been converted to bootstrap, those that have yet to be converted, and those that are currently being worked on.
+
+The script used to generate the table can be found at the bottom of this page
+
+Use the ✅ emoji (`✅`) to show that the bootstrap conversion is complete
+Use the 🔄 emoji (`🔄`) to show that the bootstrap conversion is in progress
+
+The table can be generated by running this bash script on the directory in which the php files are located. e.g.:
+
+````bash
+ mktable.sh pfsense-bootstrap/usr/local/www
+````
+
+You can then copy/paste the script output into this file. (Is that recursive?)
+
+````bash
+#!/bin/bash
+# mktable.sh
+
+# Generate a table in GitHub markdown showing each php file and whether it has been converted to bootstrap yet
+# $1 = path to pfSense usr/local/www directory
+# Completed files are assumed to have foot.inc included
+
+COMPLETED=' ✅'
+INPROGRESS=' 🔄'
+pushd $1
+
+printf "|%-45s|%-25s|%-24s|%-60s|\n" "Page/file" "Status" "User" "Comments"
+printf "|---------------------------------------------|:-------------------------:|------------------------|------------------------------------------------------------|\n"
+
+FILES=$(ls -1 *.php)
+
+for F in $FILES ; do
+ printf "|%-45s|" $F
+
+ if(grep foot.inc $F >/dev/null 2>&1 ) ; then
+ printf "%-25s" "$COMPLETED"
+ else
+ printf "%25s" " "
+ fi
+
+ printf "|%24s|%60s|\n" " " " "
+
+done
+
+popd
+
+````
+### PHP file status
+|Page/file |Status |User |Comments |
+|---------------------------------------------|:-------------------------:|------------------------|------------------------------------------------------------|
+|bandwidth_by_ip.php | | | |
+|carp_status.php | ✅ | | |
+|crash_reporter.php | ✅ | | |
+|diag_arp.php | ✅ | | |
+|diag_authentication.php | ✅ | | |
+|diag_backup.php | ✅ | | |
+|diag_confbak.php | ✅ | | |
+|diag_defaults.php | ✅ | | |
+|diag_dns.php | ✅ | | |
+|diag_dump_states.php | ✅ | | |
+|diag_dump_states_sources.php | ✅ | | |
+|diag_gmirror.php | | | |
+|diag_ipsec_leases.php | ✅ | | |
+|diag_ipsec.php | | | |
+|diag_ipsec_sad.php | ✅ | | |
+|diag_ipsec_spd.php | ✅ | | |
+|diag_ipsec_xml.php | | | |
+|diag_limiter_info.php | ✅ | | |
+|diag_logs_filter_dynamic.php | ✅ | | |
+|diag_logs_filter.php | ✅ | | |
+|diag_logs_filter_summary.php | ✅ | | |
+|diag_logs.php | ✅ | | |
+|diag_logs_settings.php | ✅ | | |
+|diag_logs_vpn.php | ✅ | | |
+|diag_nanobsd.php | ✅ | | |
+|diag_ndp.php | ✅ | | |
+|diag_packet_capture.php | ✅ | | |
+|diag_patterns.php | ✅ | | |
+|diag_pf_info.php | ✅ | | |
+|diag_ping.php | ✅ | | |
+|diag_pkglogs.php | ✅ | | |
+|diag_resetstate.php | ✅ | | |
+|diag_routes.php | ✅ | | |
+|diag_smart.php | ✅ | | |
+|diag_sockets.php | ✅ | | |
+|diag_states_summary.php | ✅ | | |
+|diag_system_activity.php | ✅ | | |
+|diag_system_pftop.php | ✅ | | |
+|diag_tables.php | ✅ | | |
+|diag_testport.php | ✅ | | |
+|diag_traceroute.php | ✅ | | |
+|easyrule.php | | | |
+|edit.php | ✅ | | |
+|exec.php | ✅ | | |
+|firewall_aliases_edit.php | ✅ | | |
+|firewall_aliases_import.php | ✅ | | |
+|firewall_aliases.php | ✅ | | |
+|firewall_nat_1to1_edit.php | | | |
+|firewall_nat_1to1.php | | | |
+|firewall_nat_edit.php | | | |
+|firewall_nat_npt_edit.php | ✅ | | |
+|firewall_nat_npt.php | ✅ | | |
+|firewall_nat_out_edit.php | | | |
+|firewall_nat_out.php | | | |
+|firewall_nat.php | | | |
+|firewall_rules_edit.php | ✅ | | |
+|firewall_rules.php | ✅ | | |
+|firewall_schedule_edit.php | | | |
+|firewall_schedule.php | ✅ | | |
+|firewall_shaper_layer7.php | | | |
+|firewall_shaper.php | | | |
+|firewall_shaper_queues.php | | | |
+|firewall_shaper_vinterface.php | | | |
+|firewall_shaper_wizards.php | ✅ | | |
+|firewall_virtual_ip_edit.php | ✅ | | |
+|firewall_virtual_ip.php | ✅ | | |
+|getserviceproviders.php | | | |
+|getstats.php | | | |
+|graph_cpu.php | | | |
+|graph.php | | | |
+|halt.php | ✅ | | |
+|help.php | | | |
+|ifstats.php | | | |
+|index.php | ✅ | | |
+|interfaces_assign.php | ✅ | | |
+|interfaces_bridge_edit.php | ✅ | | |
+|interfaces_bridge.php | ✅ | | |
+|interfaces_gif_edit.php | ✅ | | |
+|interfaces_gif.php | ✅ | | |
+|interfaces_gre_edit.php | ✅ | | |
+|interfaces_gre.php | ✅ | | |
+|interfaces_groups_edit.php | | | |
+|interfaces_groups.php | | | |
+|interfaces_lagg_edit.php | ✅ | | |
+|interfaces_lagg.php | ✅ | | |
+|interfaces.php | | | |
+|interfaces_ppps_edit.php | ✅ | | |
+|interfaces_ppps.php | ✅ | | |
+|interfaces_qinq_edit.php | | | |
+|interfaces_qinq.php | ✅ | | |
+|interfaces_vlan_edit.php | ✅ | | |
+|interfaces_vlan.php | ✅ | | |
+|interfaces_wireless_edit.php | ✅ | | |
+|interfaces_wireless.php | ✅ | | |
+|license.php | ✅ | | |
+|load_balancer_monitor_edit.php | | | |
+|load_balancer_monitor.php | | | |
+|load_balancer_pool_edit.php | | | |
+|load_balancer_pool.php | | | |
+|load_balancer_relay_action_edit.php | | | |
+|load_balancer_relay_action.php | | | |
+|load_balancer_relay_protocol_edit.php | | | |
+|load_balancer_relay_protocol.php | | | |
+|load_balancer_setting.php | ✅ | | |
+|load_balancer_virtual_server_edit.php | | | |
+|load_balancer_virtual_server.php | | | |
+|pkg_edit.php | | | |
+|pkg_mgr_installed.php | ✅ | | |
+|pkg_mgr_install.php | ✅ | | |
+|pkg_mgr.php | ✅ | | |
+|pkg_mgr_settings.php | ✅ | | |
+|pkg.php | | | |
+|reboot.php | ✅ | | |
+|restart_httpd.php | | | |
+|services_captiveportal_filemanager.php | ✅ | | |
+|services_captiveportal_hostname_edit.php | ✅ | | |
+|services_captiveportal_hostname.php | ✅ | | |
+|services_captiveportal_ip_edit.php | ✅ | | |
+|services_captiveportal_ip.php | ✅ | | |
+|services_captiveportal_mac_edit.php | ✅ | | |
+|services_captiveportal_mac.php | ✅ | | |
+|services_captiveportal.php | | | |
+|services_captiveportal_vouchers_edit.php | ✅ | | |
+|services_captiveportal_vouchers.php | ✅ | | |
+|services_captiveportal_zones_edit.php | ✅ | | |
+|services_captiveportal_zones.php | | | |
+|services_dhcp_edit.php | ✅ | | |
+|services_dhcp.php | | | |
+|services_dhcp_relay.php | ✅ | | |
+|services_dhcpv6_edit.php | ✅ | | |
+|services_dhcpv6.php | ✅ | | |
+|services_dhcpv6_relay.php | ✅ | | |
+|services_dnsmasq_domainoverride_edit.php | ✅ | | |
+|services_dnsmasq_edit.php | ✅ | | |
+|services_dnsmasq.php | ✅ | | |
+|services_dyndns_edit.php | ✅ | | |
+|services_dyndns.php | ✅ | | |
+|services_igmpproxy_edit.php | ✅ | | |
+|services_igmpproxy.php | ✅ | | |
+|services_ntpd_gps.php | ✅ | | |
+|services_ntpd.php | ✅ | | |
+|services_ntpd_pps.php | ✅ | | |
+|services_rfc2136_edit.php | ✅ | | |
+|services_rfc2136.php | ✅ | | |
+|services_router_advertisements.php | | | |
+|services_snmp.php | ✅ | | |
+|services_unbound_acls.php | ✅ | | |
+|services_unbound_advanced.php | ✅ | | |
+|services_unbound_domainoverride_edit.php | ✅ | | |
+|services_unbound_host_edit.php | ✅ | | |
+|services_unbound.php | ✅ | | |
+|services_wol_edit.php | ✅ | | |
+|services_wol.php | ✅ | | |
+|stats.php | | | |
+|status_captiveportal_expire.php | ✅ | | |
+|status_captiveportal.php | ✅ | | |
+|status_captiveportal_test.php | ✅ | | |
+|status_captiveportal_voucher_rolls.php | ✅ | | |
+|status_captiveportal_vouchers.php | ✅ | | |
+|status_dhcp_leases.php | ✅ | | |
+|status_dhcpv6_leases.php | ✅ | | |
+|status_filter_reload.php | ✅ | | |
+|status_gateway_groups.php | ✅ | | |
+|status_gateways.php | ✅ | | |
+|status_graph_cpu.php | ✅ | | |
+|status_graph.php | ✅ | | |
+|status_interfaces.php | ✅ | | |
+|status_lb_pool.php | ✅ | | |
+|status_lb_vs.php | ✅ | | |
+|status_ntpd.php | ✅ | | |
+|status_openvpn.php | | | |
+|status.php | ✅ | | |
+|status_queues.php | | | |
+|status_rrd_graph_img.php | | | |
+|status_rrd_graph.php | ✅ | | |
+|status_rrd_graph_settings.php | ✅ | | |
+|status_services.php | ✅ | | |
+|status_upnp.php | ✅ | | |
+|status_wireless.php | ✅ | | |
+|system_advanced_admin.php | ✅ | | |
+|system_advanced_firewall.php | ✅ | | |
+|system_advanced_misc.php | ✅ | | |
+|system_advanced_network.php | ✅ | | |
+|system_advanced_notifications.php | ✅ | | |
+|system_advanced_sysctl.php | | | |
+|system_authservers.php | ✅ | | |
+|system_camanager.php | ✅ | | |
+|system_certmanager.php | ✅ | | |
+|system_crlmanager.php | | | |
+|system_firmware_auto.php | ✅ | | |
+|system_firmware_check.php | ✅ | | |
+|system_firmware.php | ✅ | | |
+|system_firmware_restorefullbackup.php | ✅ | | |
+|system_firmware_settings.php | ✅ | | |
+|system_gateway_groups_edit.php | ✅ | | |
+|system_gateway_groups.php | ✅ | | |
+|system_gateways_edit.php | ✅ | | |
+|system_gateways.php | ✅ | | |
+|system_groupmanager_addprivs.php | ✅ | | |
+|system_groupmanager.php | ✅ | | |
+|system_hasync.php | ✅ | | |
+|system.php | ✅ | | |
+|system_routes_edit.php | ✅ | | |
+|system_routes.php | ✅ | | |
+|system_usermanager_addprivs.php | ✅ | | |
+|system_usermanager_passwordmg.php | ✅ | | |
+|system_usermanager.php | ✅ | | |
+|system_usermanager_settings_ldapacpicker.php | | | |
+|system_usermanager_settings.php | | | |
+|system_usermanager_settings_test.php | | | |
+|uploadconfig.php | | | |
+|vpn_ipsec_keys_edit.php | ✅ | | |
+|vpn_ipsec_keys.php | ✅ | | |
+|vpn_ipsec_mobile.php | ✅ | | |
+|vpn_ipsec_phase1.php | ✅ | | |
+|vpn_ipsec_phase2.php | ✅ | | |
+|vpn_ipsec.php | ✅ | | |
+|vpn_ipsec_settings.php | ✅ | | |
+|vpn_l2tp.php | ✅ | | |
+|vpn_l2tp_users_edit.php | ✅ | | |
+|vpn_l2tp_users.php | ✅ | | |
+|vpn_openvpn_client.php | ✅ | | |
+|vpn_openvpn_csc.php | ✅ | | |
+|vpn_openvpn_server.php | ✅ | | |
+|vpn_pppoe_edit.php | ✅ | | |
+|vpn_pppoe.php | ✅ | | |
+|vpn_pptp.php | | | |
+|vpn_pptp_users_edit.php | | | |
+|vpn_pptp_users.php | | | |
+|wizard.php | | | |
+|xmlrpc.php | | | |
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..cd7501d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,167 @@
+pfSense on bootstrap (<a href="https://github.com/SjonHortensius/pfsense/blob/bootstrap/PROGRESS.md#php-file-status">progress</a>)
+====================
+
+We are migrating pfSense to Bootstrap. You can help! Please respect these code-guidelines:
+
+* use tabs (tabstop=4) for indenting (except the license-header which contains 3 lines that are indented with ```\t<SP><SP><SP>```)
+* no trailing whitespace
+* limited echoing of HTML from php, please use proper templating syntax instead (eg. foreach/endforeach)
+* limited attributes on elements; so _**no** style/align/width attributes_
+* no inline javascript, no ```&nbsp;```, no tables for layout (replace them with [panels](getbootstrap.com/components/#panels) where necessary)
+* html attributes should be using double-quoted attribute-values. This means your php-code should probably use single-quoted strings
+* we use icons for status-indication and buttons for actions
+* **do not** refactor any of the 'backend' code that is on top of each file. Only changes necessary after updating are acceptable; any other changes will be rejected (including changes that were done upstream)
+* we accepth both [K&R](https://en.wikipedia.org/wiki/Indent_style#K.26R_style) and [ZF](http://framework.zend.com/manual/1.12/en/coding-standard.html) styled code, the above guidelines have a higher precedence
+
+If you feel adventurous you can sometimes rewrite some PHP & javascript code as well; but try to keep this to a minimum.
+
+# Development setup
+
+We suggest you setup a development enviroment for testing your changes. This can be done with either Virtualbox or Qemu.
+
+## Qemu
+
+Use libvirt to setup a FreeBSD-10 machine with 2 NICs. Boot the latest pfSense.iso and install it. I've attached both NICs to the virbr0 that libvirt offers by default. One interface can be used as WAN (where pfSense will use dhcp and should get a NATted ip on your local network), the other as a LAN interface with a fixed IP address.
+
+## Virtualbox
+
+Create a new virtual machine (FreeBSD 64 bit) and follow the wizard to configure the amount of RAM (512MB) and create a virtual HDD (8GB will do). When finished, don't start the machine but open the settings dialog and configure two network adapters. Both should be configured as 'Bridged Adapter', attached to your active network connection.
+
+Once saved, you can start the machine. Virtualbox will ask you to configure a bootable medium. Use the latest available .iso, follow the standard installation steps and set up the configuration as described in the Qemu instructions.
+
+When finished, don't forget to remove the installation disk from your machine. Otherwise, it'll keep booting the installer instead of your installation.
+
+## Post install tasks
+
+Disable the dhcp server (on the LAN interface) of your pfSense install and you're good to go. Start the ssh-daemon, login and setup public-key authentication (for the root user). Execute `pkg install rsync` and create a script to upload your changes from your development environment to your pfSense install:
+
+```bash
+#!/bin/sh
+
+HOST=192.168.122.100
+
+rsync -xav --delete `dirname $0`/usr/local/www/ root@$HOST:/usr/local/www/
+rsync -xav --delete `dirname $0`/etc/inc/ root@$HOST:/etc/inc/
+```
+
+# Cleaner
+
+Before diving into a file, clean it with the supplied cleaner (`clean.sh`). This script tries to remove most of the unnecessary element attributes and does a bunch of other replaces which have to be done in every file.
+
+# Migration conventions
+
+All migrated files (in usr/local/www) are formatted with default [Bootstrap](http://getbootstrap.com/) components. Custom CSS goes into `usr/www/bootstrap/css/pfSense.css`, but try to keep this to a minimum.
+
+The Bootstrap grid system is used for defining columns. We've chosen the 'small' breakpoint as the default breakpoint to collapse from a horizontal to vertical layout. You should define your column widths with `.col-sm-*`, unless there's a good (and documented ;) ) reason to deviate from this default.
+
+## Forms
+
+We're following a few conventions for a clean and consistent form layout:
+
+* Every form should have at least one 'panel' which contains the form fields. If certain fields can be grouped together, you can add multiple panels to a form.
+* A field consists of an outer wrapper `.form-group` which contains a `label` and the `input`
+* The submit button should be placed outside of the panels to prevent confusion (e.g., the save button saves the whole form and not just the last panel).
+* Checkboxes are placed within a label (see example below). The wrapping div needs an additional `.checkbox` class
+* Additional field descriptions can be placed in the `.help-block` `span`
+
+After determining the proper layout for forms we decided to create wrappers in PHP to create all forms. This de-duplicates all of the current HTML, making this migration a bit harder but any future updates infinitely easier (since all forms can be updated centrally). This is what the form-code should look like:
+
+```php
+require('classes/Form.class.php');
+$form = new Form;
+
+$section = new Form_Section('System');
+
+$section->addInput(new Form_Input(
+ 'hostname',
+ 'Hostname',
+ 'text',
+ $pconfig['hostname'],
+ ['placeholder' => 'pfSense']
+))->setHelp('Name of the firewall host, without domain part');
+
+$section->addInput(new Form_Input(
+ 'domain',
+ 'Domain',
+ 'text',
+ $pconfig['domain'],
+ ['placeholder' => 'mycorp.com, home, office, private, etc.']
+))->setHelp('Do not use \'local\' as a domain name. It will cause local '.
+ 'hosts running mDNS (avahi, bonjour, etc.) to be unable to resolve '.
+ 'local hosts not running mDNS.');
+
+$form->add($section);
+
+print $form;
+```
+
+Please make sure the referenced $_POST fields in the php-code above this code are also updated since they are automatically generated
+
+The PHP code will output HTML something like this (with everything but relevant Bootstrap classes omitted for this example):
+
+```html
+<form class="form-horizontal">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title">Form or panel heading</h2>
+ </div>
+ <div class="panel-body">
+ <div class="form-group">
+ <label for="input" class="col-sm-2 control-label">An input</label>
+ <div class="col-sm-10">
+ <input class="form-control" id="input" />
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="second-input" class="col-sm-2 control-label">Second label</label>
+ <div class="col-sm-10">
+ <input class="form-control" id="second-input" />
+ <span class="help-block">What's this all about?</span>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="second-input" class="col-sm-2 control-label">Checkbox</label>
+ <div class="col-sm-10 checkbox">
+ <label>
+ <input type="checkbox" id="checkbox" /> Checkbox description
+ </label>
+ </div>
+ </div>
+
+ <!-- And more form-groups -->
+
+ </div>
+ </div>
+
+ <!-- And more panels -->
+
+ <div class="col-sm-10 col-sm-offset-2">
+ <input type="submit" class="btn btn-primary" value="Save" />
+ </div>
+</form>
+```
+
+## Tables
+
+* Wrap your tables in a `<div class="table-responsive">` to make them scroll horizontally on small devices.
+* Tables get a standard set of classes: `table table-striped table-hover`
+* Please add a `thead` (with corresponding `th`'s) and `tbody`
+
+## Buttons
+
+Many tables have 'action' buttons per row, like 'edit', 'move' and 'delete'. The old template uses icons for these actions, but in most cases there are not sufficient different icons and / or the icons aren't very self explanatory. We've chosen to replace these icons with (small) buttons:
+
+```html
+<a class="btn btn-xs btn-primary">edit</a> <a class="btn btn-xs btn-danger">delete</a>
+```
+
+The button colours aren't set in stone, but the variants used so far are:
+
+* edit - dark blue, `btn-primary`
+* enable / disable - yellow, `btn-warning`
+* delete - red, `btn-danger`
+* copy - neutral, `btn-default`
+
+## Icons
+
+Icons are primarily used for status indications. Try to supply a legend when the icon is not 100% self explanatory. See `usr/local/www/firewall_rules.php` for an good example of icon usage and a legend.
diff --git a/clean.sh b/clean.sh
new file mode 100755
index 0000000..3f14115
--- /dev/null
+++ b/clean.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+sed -i '' 's/> </></g' $1 ;
+sed -i '' 's/ / /g' $1 ;
+sed -i '' 's/\s+$//g' $1 ;
+sed -i '' 's/ width="17" height="17" border="0"//g' $1 ;
+sed -i '' 's/<td [^>]+listhdrr[^>]+>/<th>/g' $1 ;
+sed -i '' 's/<body[^>]*>//g' $1 ;
+sed -i '' 's/<\(table\|td\|span\|div\)[^>]\+>/<\1>/g' $1 ;
+sed -i '' 's/<?php include("fbegin.inc"); ?>//g' $1 ;
+sed -i '' 's/<?php include("fend.inc"); ?>/<?php include("foot.inc"); ?>/g' $1 ;
+sed -i '' 's/<?php echo /<?=/g' $1 ;
+sed -i '' 's/;\s*?>/?>/g' $1 ;
+sed -i '' 's/<?\s*=\s*/<?=/g' $1 ;
+sed -i '' 's/ <> / != /g' $1 ;
diff --git a/src/etc/inc/auth.inc b/src/etc/inc/auth.inc
index 3c0acaa..ad98c5c 100644
--- a/src/etc/inc/auth.inc
+++ b/src/etc/inc/auth.inc
@@ -73,11 +73,11 @@ if (function_exists("display_error_form") && !isset($config['system']['webgui'][
$http_host = $http_host[0];
}
if (is_ipaddr($http_host) or $_SERVER['SERVER_ADDR'] == "127.0.0.1" or
- strcasecmp($http_host, "localhost") == 0 or $_SERVER['SERVER_ADDR'] == "::1") {
+ strcasecmp($http_host, "localhost") == 0 or $_SERVER['SERVER_ADDR'] == "::1") {
$found_host = true;
}
if (strcasecmp($http_host, $config['system']['hostname'] . "." . $config['system']['domain']) == 0 or
- strcasecmp($http_host, $config['system']['hostname']) == 0) {
+ strcasecmp($http_host, $config['system']['hostname']) == 0) {
$found_host = true;
}
@@ -125,8 +125,24 @@ if (function_exists("display_error_form") && !isset($config['system']['webgui'][
if ($_SERVER['HTTP_REFERER'] == file_get_contents("{$g['tmp_path']}/setupwizard_lastreferrer")) {
unlink("{$g['tmp_path']}/setupwizard_lastreferrer");
header("Refresh: 1; url=index.php");
- echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";
- echo "<html><head><title>" . gettext("Redirecting...") . "</title></head><body>" . gettext("Redirecting to the dashboard...") . "</body></html>";
+?>
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <link rel="stylesheet" href="/bootstrap/css/pfSense.css" />
+ <title><?=gettext("Redirecting..."); ?></title>
+</head>
+<body id="error" class="no-menu">
+ <div id="jumbotron">
+ <div class="container">
+ <div class="col-sm-offset-3 col-sm-6 col-xs-12">
+ <p><?=gettext("Redirecting to the dashboard...")?></p>
+ </div>
+ </div>
+ </div>
+</body>
+</html>
+<?php
exit;
}
}
@@ -135,7 +151,7 @@ if (function_exists("display_error_form") && !isset($config['system']['webgui'][
$referrer_host = str_replace(array("[", "]"), "", $referrer_host);
if ($referrer_host) {
if (strcasecmp($referrer_host, $config['system']['hostname'] . "." . $config['system']['domain']) == 0 ||
- strcasecmp($referrer_host, $config['system']['hostname']) == 0) {
+ strcasecmp($referrer_host, $config['system']['hostname']) == 0) {
$found_host = true;
}
@@ -293,7 +309,7 @@ function get_user_privileges(& $user) {
foreach ($names as $name) {
$group = getGroupEntry($name);
if (is_array($group['priv'])) {
- $privs = array_merge($privs, $group['priv']);
+ $privs = array_merge( $privs, $group['priv']);
}
}
@@ -353,7 +369,7 @@ function local_sync_accounts() {
$fd = popen("/usr/sbin/pw usershow -a", "r");
if ($fd) {
while (!feof($fd)) {
- $line = explode(":", fgets($fd));
+ $line = explode(":",fgets($fd));
if (((!strncmp($line[0], "_", 1)) || ($line[2] < 2000) || ($line[2] > 65000)) && ($line[0] != "admin")) {
continue;
}
@@ -376,7 +392,7 @@ function local_sync_accounts() {
$fd = popen("/usr/sbin/pw groupshow -a", "r");
if ($fd) {
while (!feof($fd)) {
- $line = explode(":", fgets($fd));
+ $line = explode(":",fgets($fd));
if (!strncmp($line[0], "_", 1)) {
continue;
}
@@ -571,7 +587,7 @@ function local_user_set_password(&$user, $password) {
$ustr = '';
for ($i = 0; $i < strlen($astr); $i++) {
$a = ord($astr{$i}) << 8;
- $ustr .= sprintf("%X", $a);
+ $ustr.= sprintf("%X", $a);
}
}
@@ -585,7 +601,7 @@ function local_user_get_groups($user, $all = false) {
}
foreach ($config['system']['group'] as $group) {
- if ($all || (!$all && ($group['name'] != "all"))) {
+ if ( $all || ( !$all && ($group['name'] != "all"))) {
if (is_array($group['member'])) {
if (in_array($user['uid'], $group['member'])) {
$groups[] = $group['name'];
@@ -604,7 +620,7 @@ function local_user_get_groups($user, $all = false) {
}
-function local_user_set_groups($user, $new_groups = NULL) {
+function local_user_set_groups($user, $new_groups = NULL ) {
global $debug, $config, $groupindex;
if (!is_array($config['system']['group'])) {
@@ -624,7 +640,7 @@ function local_user_set_groups($user, $new_groups = NULL) {
/* determine which memberships to add */
foreach ($new_groups as $groupname) {
- if ($groupname == '' || in_array($groupname, $cur_groups)) {
+ if ($groupname == '' || in_array($groupname,$cur_groups)) {
continue;
}
$group = & $config['system']['group'][$groupindex[$groupname]];
@@ -635,7 +651,7 @@ function local_user_set_groups($user, $new_groups = NULL) {
/* determine which memberships to remove */
foreach ($cur_groups as $groupname) {
- if (in_array($groupname, $new_groups)) {
+ if (in_array($groupname,$new_groups)) {
continue;
}
if (!isset($config['system']['group'][$groupindex[$groupname]])) {
@@ -681,7 +697,7 @@ function local_group_set($group, $reset = false) {
$group_gid = $group['gid'];
$group_members = '';
if (!$reset && !empty($group['member']) && count($group['member']) > 0) {
- $group_members = implode(",", $group['member']);
+ $group_members = implode(",",$group['member']);
}
if (empty($group_name)) {
@@ -744,7 +760,7 @@ function ldap_test_connection($authcfg) {
}
/* first check if there is even an LDAP server populated */
- if (!$ldapserver) {
+ if ( !$ldapserver) {
return false;
}
@@ -953,8 +969,8 @@ function ldap_get_user_ous($show_complete_ou=true, $authcfg) {
if (!$show_complete_ou) {
$inf_split = explode(",", $inf['dn']);
$ou = $inf_split[0];
- $ou = str_replace("OU=", "", $ou);
- $ou = str_replace("CN=", "", $ou);
+ $ou = str_replace("OU=","", $ou);
+ $ou = str_replace("CN=","", $ou);
} else {
if ($inf['dn']) {
$ou = $inf['dn'];
@@ -1092,7 +1108,7 @@ function ldap_get_groups($username, $authcfg) {
/* Time to close LDAP connection */
@ldap_unbind($ldap);
- $groups = print_r($memberof, true);
+ $groups = print_r($memberof,true);
//log_error("Returning groups ".$groups." for user $username");
@@ -1212,7 +1228,7 @@ function ldap_backed($username, $passwd, $authcfg) {
$ldac_splits = explode(";", $ldapauthcont);
/* setup the usercount so we think we haven't found anyone yet */
- $usercount = 0;
+ $usercount = 0;
/*****************************************************************/
/* We First find the user based on username and filter */
@@ -1240,15 +1256,15 @@ function ldap_backed($username, $passwd, $authcfg) {
}
/* Support legacy auth container specification. */
if (stristr($ldac_split, "DC=") || empty($ldapbasedn)) {
- $search = @$ldapfunc($ldap,$ldac_split,$ldapfilter);
+ $search = @$ldapfunc($ldap,$ldac_split,$ldapfilter);
} else {
- $search = @$ldapfunc($ldap,$ldapsearchbasedn,$ldapfilter);
+ $search = @$ldapfunc($ldap,$ldapsearchbasedn,$ldapfilter);
}
if (!$search) {
log_error(sprintf(gettext("Search resulted in error: %s"), ldap_error($ldap)));
continue;
}
- $info = ldap_get_entries($ldap, $search);
+ $info = ldap_get_entries($ldap,$search);
$matches = $info['count'];
if ($matches == 1) {
$userdn = $_SESSION['ldapdn'] = $info[0]['dn'];
@@ -1375,7 +1391,7 @@ function get_user_expiration_date($username) {
function is_account_expired($username) {
$expirydate = get_user_expiration_date($username);
if ($expirydate) {
- if (strtotime("-1 day") > strtotime(date("m/d/Y", strtotime($expirydate)))) {
+ if (strtotime("-1 day") > strtotime(date("m/d/Y",strtotime($expirydate)))) {
return true;
}
}
@@ -1419,7 +1435,7 @@ function auth_get_authserver_list() {
}
}
- $list["Local Database"] = array("name" => gettext("Local Database"), "type" => "Local Auth", "host" => $config['system']['hostname']);
+ $list["Local Database"] = array( "name" => gettext("Local Database"), "type" => "Local Auth", "host" => $config['system']['hostname']);
return $list;
}
diff --git a/src/etc/inc/authgui.inc b/src/etc/inc/authgui.inc
index 07cf9a9..721be47 100644
--- a/src/etc/inc/authgui.inc
+++ b/src/etc/inc/authgui.inc
@@ -110,50 +110,24 @@ function display_error_form($http_code, $desc) {
}
?>
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
- <head>
- <script type="text/javascript" src="/javascript/jquery-1.11.1.min.js"></script>
- <script type="text/javascript" src="/javascript/jquery-migrate-1.2.1.min.js"></script>
- <title><?=$http_code?></title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <link rel="shortcut icon" href="/themes/<?= $g['theme'] ?>/images/icons/favicon.ico" />
- <?php if (file_exists("{$g['www_path']}/themes/{$g['theme']}/login.css")): ?>
- <link rel="stylesheet" type="text/css" href="/themes/<?= $g['theme'] ?>/login.css" media="all" />
- <?php else: ?>
- <link rel="stylesheet" type="text/css" href="/themes/<?= $g['theme'] ?>/all.css" media="all" />
- <?php endif; ?>
- <script type="text/javascript">
- //<![CDATA[
- function page_load() {}
- function clearError() {
- if ($('#inputerrors')) {
- $('#inputerrors').html('');
- }
- }
- <?php
- require("headjs.php");
- echo getHeadJS();
- ?>
- //]]>
- </script>
- <script type="text/javascript" src="/themes/<?= $g['theme'] ?>/javascript/niftyjsCode.js"></script>
- </head>
- <body onload="page_load();">
- <div id="errordesc">
- <h1>&nbsp</h1>
- <a href="/index.php?logout">
- <p id="errortext" style="vertical-align: middle; text-align: center;">
- <span style="color: #000000; font-weight: bold;">
- <?=$desc;?>
- </span>
- </p>
+<<<<<<< HEAD
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <link rel="stylesheet" href="/bootstrap/css/pfSense.css" />
+ <title><?=gettext("Error: not allowed"); ?></title>
+</head>
+<body id="error" class="no-menu">
+ <div id="jumbotron">
+ <div class="container">
+ <div class="col-sm-offset-3 col-sm-6 col-xs-12">
+ <!-- FIXME: We really need to POST the logout action -->
+ <div class="alert alert-danger" role="alert"><a href="index.php?logout"><?=$desc;?></a></div>
+ </div>
</div>
- </body>
+ </div>
+</body>
</html>
-
<?php
} // end function
@@ -233,103 +207,79 @@ if ($local_ip == false) {
}
?>
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <link rel="stylesheet" href="/bootstrap/css/pfSense.css" />
+ <title><?=gettext("Login"); ?></title>
+ <script>var events = events || [];</script>
+</head>
+<body id="login" class="no-menu">
+ <div id="jumbotron">
+ <div class="container">
+ <div class="col-sm-offset-3 col-sm-6 col-xs-12">
+<?php
+ if(is_ipaddr($http_host) && !$local_ip && !isset($config['system']['webgui']['nohttpreferercheck'])) {
+ $nifty_background = "#999";
+ print_info_box(gettext("You are accessing this router by an IP address not configured locally, which may be forwarded by NAT or other means. <br /><br />If you did not setup this forwarding, you may be the target of a man-in-the-middle attack."));
+ }
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
- <head>
- <script type="text/javascript" src="/javascript/jquery-1.11.1.min.js"></script>
- <script type="text/javascript" src="/javascript/jquery-migrate-1.2.1.min.js"></script>
- <script type="text/javascript">
- //<![CDATA[
- $(document).ready(function() { jQuery('#usernamefld').focus(); });
- //]]>
- </script>
+ $loginautocomplete = isset($config['system']['webgui']['loginautocomplete']) ? '' : 'autocomplete="off"';
+?>
- <title><?=gettext("Login"); ?></title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <link rel="shortcut icon" href="/themes/<?= $g['theme'] ?>/images/icons/favicon.ico" />
- <?php if (file_exists("{$g['www_path']}/themes/{$g['theme']}/login.css")): ?>
- <link rel="stylesheet" type="text/css" href="/themes/<?= $g['theme'] ?>/login.css" media="all" />
- <?php else: ?>
- <link rel="stylesheet" type="text/css" href="/themes/<?= $g['theme'] ?>/all.css" media="all" />
- <?php endif; ?>
- <script type="text/javascript">
- //<![CDATA[
- function page_load() {}
- function clearError() {
- if ($('#inputerrors')) {
- $('#inputerrors').html('');
- }
- }
- <?php
- require("headjs.php");
- echo getHeadJS();
- ?>
- //]]>
- </script>
- <script type="text/javascript" src="/themes/<?= $g['theme'] ?>/javascript/niftyjsCode.js"></script>
- </head>
- <body onload="page_load()">
- <div id="login">
- <?php
- if (is_ipaddr($http_host) && !$local_ip && !isset($config['system']['webgui']['nohttpreferercheck'])) {
- $nifty_background = "#999";
- print_info_box(gettext("You are accessing this router by an IP address not configured locally, which may be forwarded by NAT or other means. <br /><br />If you did not setup this forwarding, you may be the target of a man-in-the-middle attack."));
- }
- $loginautocomplete = isset($config['system']['webgui']['loginautocomplete']) ? '' : 'autocomplete="off"';
- ?>
- <form id="iform" name="iform" method="post" <?= $loginautocomplete ?> action="<?=$_SERVER['SCRIPT_NAME'];?>">
- <h1>&nbsp;</h1>
- <div id="inputerrors"><?=$_SESSION['Login_Error'];?></div>
- <p>
- <span style="text-align:left">
- <?=gettext("Username:"); ?><br />
- <input onclick="clearError();" onchange="clearError();" id="usernamefld" type="text" name="usernamefld" class="formfld user" tabindex="1" />
- </span>
- </p>
- <p>
- <br />
- <span style="text-align:left">
- <?=gettext("Password:"); ?> <br />
- <input onclick="clearError();" onchange="clearError();" id="passwordfld" type="password" name="passwordfld" class="formfld pwd" tabindex="2" />
- </span>
- </p>
- <p>
- <br />
- <span style="text-align:center; font-weight: normal ; font-style: italic">
- <?=gettext("Enter username and password to login."); ?>
- </span>
-
- <span style="text-align:center; font-weight: normal ; font-style: italic; color: #ff0000; display:none" id="no_cookies">
- <br /><br />
- <?= gettext("Your browser must support cookies to login."); ?>
- </span>
- </p>
- <p>
- <span style="text-align:center">
- <input type="submit" name="login" class="formbtn" value="<?=gettext("Login"); ?>" tabindex="3" />
- </span>
- </p>
- </form>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title">Login to pfSense</h2>
+ </div>
+
+ <div class="panel-body">
+<?php if (!empty($_SESSION['Login_Error'])): ?>
+ <div class="alert alert-danger" role="alert"><?=$_SESSION['Login_Error'];?></div>
+<?php endif ?>
+ <div class="alert alert-warning" class="hidden" id="no_cookies"><?= gettext("Your browser must support cookies to login."); ?></div>
+
+ <form method="post" <?= $loginautocomplete ?> action="<?=$_SERVER['SCRIPT_NAME'];?>" class="form-horizontal">
+ <div class="form-group">
+ <label for="usernamefld" class="col-sm-3 control-label">Username</label>
+ <div class="col-sm-9 col-md-7">
+ <input type="text" class="form-control" name="usernamefld" id="usernamefld" placeholder="Enter your username">
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="passwordfld" class="col-sm-3 control-label">Password</label>
+ <div class="col-sm-9 col-md-7">
+ <input type="password" class="form-control" name="passwordfld" id="passwordfld" placeholder="Enter your password">
+ </div>
+ </div>
+
+ <div class="form-group">
+ <div class="col-sm-offset-3 col-sm-9 col-md-7">
+ <button type="submit" class="btn btn-primary" name="login">Login</button>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
</div>
- <script type="text/javascript">
- //<![CDATA[
- document.cookie=
- "cookie_test=1" +
- "<?php echo $config['system']['webgui']['protocol'] == 'https' ? '; secure' : '';?>";
-
- if (document.cookie.indexOf("cookie_test") == -1) {
- document.getElementById("no_cookies").style.display="";
- }
- // Delete it
- document.cookie = "cookie_test=1; expires=Thu, 01-Jan-1970 00:00:01 GMT";
- //]]>
+ <script>
+ events.push(function() {
+ document.cookie=
+ "cookie_test=1" +
+ "<?php echo $config['system']['webgui']['protocol'] == 'https' ? '; secure' : '';?>";
+
+ if (document.cookie.indexOf("cookie_test") == -1)
+ document.getElementById("no_cookies").style.display="";
+ else
+ document.getElementById("no_cookies").style.display="none";
+
+ // Delete it
+ document.cookie = "cookie_test=1; expires=Thu, 01-Jan-1970 00:00:01 GMT";
+ });
</script>
- </body>
-</html>
<?php
-} // end function
+require('foot.inc');
-?>
+} // end function
diff --git a/src/etc/inc/filter_log.inc b/src/etc/inc/filter_log.inc
index 999d81a..11ee6de 100644
--- a/src/etc/inc/filter_log.inc
+++ b/src/etc/inc/filter_log.inc
@@ -31,7 +31,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /usr/sbin/fifolog_reader /usr/bin/tail /usr/local/sbin/clog
- pfSense_MODULE: filter
+ pfSense_MODULE: filter
*/
require 'config.inc';
@@ -74,7 +74,7 @@ function conv_log_filter($logfile, $nentries, $tail = 50, $filtertext = "", $fil
$flent = parse_filter_line($logent);
if (!$filterinterface || ($filterinterface == $flent['interface'])) {
if ((($flent != "") && (!is_array($filtertext)) && (match_filter_line ($flent, $filtertext))) ||
- (($flent != "") && (is_array($filtertext)) && (match_filter_field($flent, $filtertext)))) {
+ (($flent != "") && ( is_array($filtertext)) && (match_filter_field($flent, $filtertext)))) {
$counter++;
$filterlog[] = $flent;
}
@@ -86,7 +86,7 @@ function conv_log_filter($logfile, $nentries, $tail = 50, $filtertext = "", $fil
function escape_filter_regex($filtertext) {
/* If the caller (user) has not already put a backslash before a slash, to escape it in the regex, */
- /* then this will do it. Take out any "\/" already there, then turn all ordinary "/" into "\/". */
+ /* then this will do it. Take out any "\/" already there, then turn all ordinary "/" into "\/". */
return str_replace('/', '\/', str_replace('\/', '/', $filtertext));
}
@@ -156,7 +156,7 @@ function parse_filter_line($line) {
$flent['anchor'] = $rule_data[$field++];
$flent['tracker'] = $rule_data[$field++];
$flent['realint'] = $rule_data[$field++];
- $flent['interface'] = convert_real_interface_to_friendly_descr($flent['realint']);
+ $flent['interface'] = convert_real_interface_to_friendly_descr($flent['realint']);
$flent['reason'] = $rule_data[$field++];
$flent['act'] = $rule_data[$field++];
$flent['direction'] = $rule_data[$field++];
@@ -198,7 +198,7 @@ function parse_filter_line($line) {
$flent['ack'] = $rule_data[$field++];
$flent['window'] = $rule_data[$field++];
$flent['urg'] = $rule_data[$field++];
- $flent['options'] = explode(";", $rule_data[$field++]);
+ $flent['options'] = explode(";",$rule_data[$field++]);
}
} else if ($flent['protoid'] == '1') { // ICMP
$flent['src'] = $flent['srcip'];
@@ -261,7 +261,7 @@ function parse_filter_line($line) {
}
} else {
if ($g['debug']) {
- log_error(sprintf(gettext("There was a error parsing rule number: %s. Please report to mailing list or forum."), $flent['rulenum']));
+ log_error(sprintf(gettext("There was a error parsing rule number: %s. Please report to mailing list or forum."), $flent['rulenum']));
}
return "";
}
@@ -271,7 +271,7 @@ function parse_filter_line($line) {
return $flent;
} else {
if ($g['debug']) {
- log_error(sprintf(gettext("There was a error parsing rule: %s. Please report to mailing list or forum."), $errline));
+ log_error(sprintf(gettext("There was a error parsing rule: %s. Please report to mailing list or forum."), $errline));
}
return "";
}
@@ -379,14 +379,14 @@ function find_rule_by_number_buffer($rulenum, $trackernum, $type) {
$lookup_key = $trackernum;
}
- if ($type == "rdr") {
+ if ($type == "rdr") {
$ruleString = $buffer_rules_rdr[$lookup_key];
//TODO: get the correct 'description' part of a RDR log line. currently just first 30 characters..
- $rulename = substr($ruleString, 0, 30);
+ $rulename = substr($ruleString,0,30);
} else {
$ruleString = $buffer_rules_normal[$lookup_key];
- list(,$rulename,) = explode("\"", $ruleString);
- $rulename = str_replace("USER_RULE: ", '<img src="/themes/' . $g['theme'] . '/images/icons/icon_frmfld_user.png" width="11" height="12" title="USER_RULE" alt="USER_RULE"/> ', $rulename);
+ list(,$rulename,) = explode("\"",$ruleString);
+ $rulename = str_replace("USER_RULE: ",'<img src="/themes/'.$g['theme'].'/images/icons/icon_frmfld_user.png" width="11" height="12" title="USER_RULE" alt="USER_RULE"/> ',$rulename);
}
return "{$rulename} ({$lookup_key})";
}
@@ -406,16 +406,16 @@ function find_action_image($action) {
function handle_ajax($nentries, $tail = 50) {
global $config;
if ($_GET['lastsawtime'] or $_POST['lastsawtime']) {
- global $filter_logfile, $filterent;
+ global $filter_logfile,$filterent;
if ($_GET['lastsawtime']) {
$lastsawtime = $_GET['lastsawtime'];
}
if ($_POST['lastsawtime']) {
$lastsawtime = $_POST['lastsawtime'];
}
- /* compare lastsawrule's time stamp to filter logs.
- * afterwards return the newer records so that client
- * can update AJAX interface screen.
+ /* compare lastsawrule's time stamp to filter logs.
+ * afterwards return the newer records so that client
+ * can update AJAX interface screen.
*/
$new_rules = "";
$filterlog = conv_log_filter($filter_logfile, $nentries, $tail);
@@ -429,8 +429,8 @@ function handle_ajax($nentries, $tail = 50) {
$log_row['proto'] .= ":{$log_row['tcpflags']}";
}
- $img = "<a href=\"#\" onClick=\"javascript:getURL('diag_logs_filter.php?getrulenum={$log_row['rulenum']},{$log_row['rulenum']}', outputrule);\">{$img}</a>";
- $new_rules .= "{$img}||{$log_row['time']}||{$log_row['interface']}||{$log_row['srcip']}||{$log_row['srcport']}||{$log_row['dstip']}||{$log_row['dstport']}||{$log_row['proto']}||{$log_row['version']}||" . time() . "||\n";
+ $btn = "<a href=\"#\" class=\"btn btn-danger btn-xs\" onClick=\"javascript:getURL('diag_logs_filter.php?getrulenum={$log_row['rulenum']},{$log_row['rulenum']}', outputrule);\">" . gettext("Block") . " </a>";
+ $new_rules .= "{$btn}||{$log_row['time']}||{$log_row['interface']}||{$log_row['srcip']}||{$log_row['srcport']}||{$log_row['dstip']}||{$log_row['dstport']}||{$log_row['proto']}||{$log_row['version']}||" . time() . "||\n";
}
}
echo $new_rules;
diff --git a/src/etc/inc/globals.inc b/src/etc/inc/globals.inc
index a5c5312..66107c0 100644
--- a/src/etc/inc/globals.inc
+++ b/src/etc/inc/globals.inc
@@ -63,7 +63,7 @@ $g = array(
"product_copyright_url" => "http://www.electricsheepfencing.com",
"product_copyright_years" => "2004 - ".date("Y"),
"product_website" => "www.pfsense.org",
- "product_website_footer" => "https://www.pfsense.org/?gui22",
+ "product_website_footer" => "https://www.pfsense.org/?gui=bootstrap",
"product_email" => "coreteam@pfsense.org",
"hideplatform" => false,
"hidedownloadbackup" => false,
diff --git a/src/etc/inc/gmirror.inc b/src/etc/inc/gmirror.inc
index 9e26dfb..24508e9 100644
--- a/src/etc/inc/gmirror.inc
+++ b/src/etc/inc/gmirror.inc
@@ -68,33 +68,39 @@ function gmirror_get_status_single($mirror) {
function gmirror_html_status() {
$mirrors = gmirror_get_status();
$output = "";
- if (count($mirrors) > 0) {
- $output .= "<tr>\n";
- $output .= "<td width=\"40%\" class=\"vncellt\">Name</td>\n";
- $output .= "<td width=\"40%\" class=\"vncellt\">Status</td>\n";
- $output .= "<td width=\"20%\" class=\"vncellt\">Component</td>\n";
- $output .= "</tr>\n";
- foreach ($mirrors as $mirror => $name) {
- $components = count($name["components"]);
- $output .= "<tr>\n";
- $output .= "<td width=\"40%\" rowspan=\"{$components}\" class=\"listr\">{$name['name']}</td>\n";
- $output .= "<td width=\"40%\" rowspan=\"{$components}\" class=\"listr\">{$name['status']}</td>\n";
- $output .= "<td width=\"20%\" class=\"listr\">{$name['components'][0]}</td>\n";
- $output .= "</tr>\n";
- if (count($name["components"]) > 1) {
- $morecomponents = array_slice($name["components"], 1);
- foreach ($morecomponents as $component) {
- $output .= "<tr>\n";
- $output .= "<td width=\"20%\" class=\"listr\">{$component}</td>\n";
- $output .= "</tr>\n";
- }
- }
- }
- } else {
- $output .= "<tr><td colspan=\"3\" class=\"listr\">No Mirrors Found</td></tr>\n";
+ if (count($mirrors) < 1) {
+?>
+<div class="alert">
+ <p>No Mirrors Found</p>
+</div>
+<?php
+ return;
}
- // $output .= "<tr><td colspan=\"3\" class=\"listr\">Updated at " . date("F j, Y, g:i:s a") . "</td></tr>\n";
- return $output;
+
+?>
+<table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th>Name</td>
+ <th>Status</td>
+ <th>Component</td>
+ </tr>
+ </thead>
+ <tbody>
+<?php foreach ($mirrors as $mirror => $name): ?>
+ <tr>
+ <td rowspan="<?=count($name["components"])?>"><?=$name['name']?></td>
+ <td rowspan="<?=count($name["components"])?>"><?=$name['status']?></td>
+ <td><?=$name['components'][0]?></td>
+ </tr>
+<?php if (count($name["components"]) > 1): ?>
+ <?php foreach (array_slice($name["components"], 1) as $component): ?>
+ <tr>
+ <td><?=$component?></td>
+ </tr>
+ <?php endforeach; ?>
+ <?php endif; ?>
+<?php endforeach;
}
/* List all disks in the system (potential gmirror targets) */
diff --git a/src/etc/inc/openvpn.inc b/src/etc/inc/openvpn.inc
index d74aa3e..945e7ff 100644
--- a/src/etc/inc/openvpn.inc
+++ b/src/etc/inc/openvpn.inc
@@ -526,7 +526,7 @@ function openvpn_reconfigure($mode, $settings) {
// Otherwise, if a specific interface is requested, use it
// If "any" interface was selected, local directive will be omitted.
if (is_ipaddrv4($ipaddr)) {
- $iface_ip = $ipaddr;
+ $iface_ip=$ipaddr;
} else {
if ((!empty($interface)) && (strcmp($interface, "any"))) {
$iface_ip=get_interface_ip($interface);
@@ -694,7 +694,7 @@ function openvpn_reconfigure($mode, $settings) {
$cert = lookup_cert($settings['certref']);
/* XXX: Seems not used at all! */
$servercn = urlencode(cert_get_cn($cert['crt']));
- $conf .= "tls-verify \"/usr/local/sbin/ovpn_auth_verify tls '{$servercn}' {$settings['cert_depth']} \"\n";
+ $conf .= "tls-verify \"/usr/local/sbin/ovpn_auth_verify tls '{$servercn}' {$settings['cert_depth']}\"\n";
}
}
@@ -793,12 +793,12 @@ function openvpn_reconfigure($mode, $settings) {
$up_file = "{$g['varetc_path']}/openvpn/{$mode_id}.up";
$conf .= "auth-user-pass {$up_file}\n";
if ($settings['auth_user']) {
- $userpass = "{$settings['auth_user']}\n";
+ $userpass = "{$settings['auth_user']}\n";
} else {
$userpass = "";
}
if ($settings['auth_pass']) {
- $userpass .= "{$settings['auth_pass']}\n";
+ $userpass .= "{$settings['auth_pass']}\n";
}
// If only auth_pass is given, then it acts like a user name and we put a blank line where pass would normally go.
if (!($settings['auth_user'] && $settings['auth_pass'])) {
@@ -1229,8 +1229,8 @@ function openvpn_get_active_servers($type="multipoint") {
}
function openvpn_get_server_status($server, $socket) {
- $errval;
- $errstr;
+ $errval = null;
+ $errstr = null;
$fp = @stream_socket_client($socket, $errval, $errstr, 1);
if ($fp) {
stream_set_timeout($fp, 1);
@@ -1323,7 +1323,7 @@ function openvpn_get_active_clients() {
$client['vpnid'] = $settings['vpnid'];
$client['mgmt'] = "client{$client['vpnid']}";
$socket = "unix://{$g['varetc_path']}/openvpn/{$client['mgmt']}.sock";
- $client['status'] = "down";
+ $client['status']="down";
$clients[] = openvpn_get_client_status($client, $socket);
}
@@ -1332,8 +1332,8 @@ function openvpn_get_active_clients() {
}
function openvpn_get_client_status($client, $socket) {
- $errval;
- $errstr;
+ $errval = null;
+ $errstr = null;
$fp = @stream_socket_client($socket, $errval, $errstr, 1);
if ($fp) {
stream_set_timeout($fp, 1);
@@ -1351,29 +1351,29 @@ function openvpn_get_client_status($client, $socket) {
}
/* Get the client state */
- if (strstr($line, "CONNECTED")) {
- $client['status'] = "up";
+ if (strstr($line,"CONNECTED")) {
+ $client['status']="up";
$list = explode(",", $line);
- $client['connect_time'] = date("D M j G:i:s Y", $list[0]);
- $client['virtual_addr'] = $list[3];
+ $client['connect_time'] = date("D M j G:i:s Y", $list[0]);
+ $client['virtual_addr'] = $list[3];
$client['remote_host'] = $list[4];
}
- if (strstr($line, "CONNECTING")) {
- $client['status'] = "connecting";
+ if (strstr($line,"CONNECTING")) {
+ $client['status']="connecting";
}
- if (strstr($line, "ASSIGN_IP")) {
- $client['status'] = "waiting";
+ if (strstr($line,"ASSIGN_IP")) {
+ $client['status']="waiting";
$list = explode(",", $line);
- $client['connect_time'] = date("D M j G:i:s Y", $list[0]);
- $client['virtual_addr'] = $list[3];
+ $client['connect_time'] = date("D M j G:i:s Y", $list[0]);
+ $client['virtual_addr'] = $list[3];
}
- if (strstr($line, "RECONNECTING")) {
- $client['status'] = "reconnecting";
+ if (strstr($line,"RECONNECTING")) {
+ $client['status']="reconnecting";
$list = explode(",", $line);
- $client['connect_time'] = date("D M j G:i:s Y", $list[0]);
+ $client['connect_time'] = date("D M j G:i:s Y", $list[0]);
$client['status'] .= "; " . $list[2];
}
/* parse end of output line */
@@ -1395,12 +1395,12 @@ function openvpn_get_client_status($client, $socket) {
break;
}
- if (strstr($line, "TCP/UDP read bytes")) {
+ if (strstr($line,"TCP/UDP read bytes")) {
$list = explode(",", $line);
$client['bytes_recv'] = $list[1];
}
- if (strstr($line, "TCP/UDP write bytes")) {
+ if (strstr($line,"TCP/UDP write bytes")) {
$list = explode(",", $line);
$client['bytes_sent'] = $list[1];
}
diff --git a/src/etc/inc/pfsense-utils.inc b/src/etc/inc/pfsense-utils.inc
index 91988c7..2cedc52 100644
--- a/src/etc/inc/pfsense-utils.inc
+++ b/src/etc/inc/pfsense-utils.inc
@@ -79,7 +79,7 @@ function have_ruleint_access($if) {
* returns true if a url is available
******/
function does_url_exist($url) {
- $fd = fopen("$url", "r");
+ $fd = fopen("$url","r");
if ($fd) {
fclose($fd);
return true;
@@ -98,14 +98,14 @@ function does_url_exist($url) {
******/
function is_private_ip($iptocheck) {
$isprivate = false;
- $ip_private_list = array(
+ $ip_private_list=array(
"10.0.0.0/8",
"100.64.0.0/10",
"172.16.0.0/12",
"192.168.0.0/16",
);
foreach ($ip_private_list as $private) {
- if (ip_in_subnet($iptocheck, $private) == true) {
+ if (ip_in_subnet($iptocheck,$private)==true) {
$isprivate = true;
}
}
@@ -136,15 +136,15 @@ function get_tmp_file() {
function get_dns_servers() {
$dns_servers = array();
if (file_exists("/etc/resolv.conf")) {
- $dns_s = file("/etc/resolv.conf", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ $dns_s = file("/etc/resolv.conf", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
}
if (is_array($dns_s)) {
- foreach ($dns_s as $dns) {
- $matches = "";
- if (preg_match("/nameserver (.*)/", $dns, $matches)) {
- $dns_servers[] = $matches[1];
- }
- }
+ foreach ($dns_s as $dns) {
+ $matches = "";
+ if (preg_match("/nameserver (.*)/", $dns, $matches)) {
+ $dns_servers[] = $matches[1];
+ }
+ }
}
return array_unique($dns_servers);
}
@@ -502,7 +502,7 @@ function WakeOnLan($addr, $mac) {
$addr_byte = explode(':', $mac);
$hw_addr = '';
- for ($a = 0; $a < 6; $a++) {
+ for ($a=0; $a < 6; $a++) {
$hw_addr .= chr(hexdec($addr_byte[$a]));
}
@@ -519,7 +519,7 @@ function WakeOnLan($addr, $mac) {
log_error(sprintf(gettext("Error code is '%1\$s' - %2\$s"), socket_last_error($s), socket_strerror(socket_last_error($s))));
} else {
// setting a broadcast option to socket:
- $opt_ret = socket_set_option($s, 1, 6, TRUE);
+ $opt_ret = socket_set_option($s, 1, 6, TRUE);
if ($opt_ret < 0) {
log_error(sprintf(gettext("setsockopt() failed, error: %s"), strerror($opt_ret)));
}
@@ -564,7 +564,7 @@ function backup_config_section($section_name) {
function restore_config_section($section_name, $new_contents) {
global $config, $g;
conf_mount_rw();
- $fout = fopen("{$g['tmp_path']}/tmpxml", "w");
+ $fout = fopen("{$g['tmp_path']}/tmpxml","w");
fwrite($fout, $new_contents);
fclose($fout);
@@ -625,10 +625,10 @@ function merge_config_section($section_name, $new_contents) {
function http_post($server, $port, $url, $vars) {
$user_agent = "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)";
$urlencoded = "";
- while (list($key, $value) = each($vars)) {
- $urlencoded .= urlencode($key) . "=" . urlencode($value) . "&";
+ while (list($key,$value) = each($vars)) {
+ $urlencoded.= urlencode($key) . "=" . urlencode($value) . "&";
}
- $urlencoded = substr($urlencoded, 0, -1);
+ $urlencoded = substr($urlencoded,0,-1);
$content_length = strlen($urlencoded);
$headers = "POST $url HTTP/1.1
Accept: */*
@@ -654,7 +654,7 @@ Content-Length: $content_length
$ret = "";
while (!feof($fp)) {
- $ret .= fgets($fp, 1024);
+ $ret.= fgets($fp, 1024);
}
fclose($fp);
@@ -668,7 +668,7 @@ if (!function_exists('php_check_syntax')) {
global $g;
function php_check_syntax($code_to_check, &$errormessage) {
return false;
- $fout = fopen("{$g['tmp_path']}/codetocheck.php", "w");
+ $fout = fopen("{$g['tmp_path']}/codetocheck.php","w");
$code = $_POST['content'];
$code = str_replace("<?php", "", $code);
$code = str_replace("?>", "", $code);
@@ -709,11 +709,11 @@ if (!function_exists('php_check_syntax')) {
}
/*
- * rmdir_recursive($path, $follow_links=false)
+ * rmdir_recursive($path,$follow_links=false)
* Recursively remove a directory tree (rm -rf path)
* This is for directories _only_
*/
-function rmdir_recursive($path, $follow_links=false) {
+function rmdir_recursive($path,$follow_links=false) {
$to_do = glob($path);
if (!is_array($to_do)) {
$to_do = array($to_do);
@@ -725,7 +725,7 @@ function rmdir_recursive($path, $follow_links=false) {
while ($entry = readdir($dir)) {
if (is_file("$workingdir/$entry") || ((!$follow_links) && is_link("$workingdir/$entry"))) {
unlink("$workingdir/$entry");
- } elseif (is_dir("$workingdir/$entry") && $entry != '.' && $entry != '..') {
+ } elseif (is_dir("$workingdir/$entry") && $entry!='.' && $entry!='..') {
rmdir_recursive("$workingdir/$entry");
}
}
@@ -985,7 +985,7 @@ function reload_all_sync() {
send_event("service restart webgui");
}
-function setup_serial_port($when = "save", $path = "") {
+function setup_serial_port($when="save", $path="") {
global $g, $config;
conf_mount_rw();
$ttys_file = "{$path}/etc/ttys";
@@ -1013,7 +1013,7 @@ function setup_serial_port($when = "save", $path = "") {
}
$boot_config_split = explode("\n", $boot_config);
- $fd = fopen($boot_config_file, "w");
+ $fd = fopen($boot_config_file,"w");
if ($fd) {
foreach ($boot_config_split as $bcs) {
if (stristr($bcs, "-D") || stristr($bcs, "-h")) {
@@ -1044,9 +1044,9 @@ function setup_serial_port($when = "save", $path = "") {
// do not contain a console directive.
foreach ($boot_config_split as $bcs) {
if (!empty($bcs) &&
- (stripos($bcs, "console") === false) &&
- (stripos($bcs, "boot_multicons") === false) &&
- (stripos($bcs, "boot_serial") === false) &&
+ (stripos($bcs, "console") === false) &&
+ (stripos($bcs, "boot_multicons") === false) &&
+ (stripos($bcs, "boot_serial") === false) &&
(stripos($bcs, "hw.usb.no_pf") === false) &&
(stripos($bcs, "hint.uart.0.flags") === false) &&
(stripos($bcs, "hint.uart.1.flags") === false)) {
@@ -1266,7 +1266,7 @@ function is_pppoe_server_enabled() {
}
function convert_seconds_to_hms($sec) {
- $min = $hrs = 0;
+ $min=$hrs=0;
if ($sec != 0) {
$min = floor($sec/60);
$sec %= 60;
@@ -1293,8 +1293,8 @@ function convert_seconds_to_hms($sec) {
function get_ppp_uptime($port) {
if (file_exists("/conf/{$port}.log")) {
$saved_time = file_get_contents("/conf/{$port}.log");
- $uptime_data = explode("\n", $saved_time);
- $sec = 0;
+ $uptime_data = explode("\n",$saved_time);
+ $sec=0;
foreach ($uptime_data as $upt) {
$sec += substr($upt, 1 + strpos($upt, " "));
}
@@ -1803,7 +1803,7 @@ function download_file($url, $destination, $verify_ssl = true, $connect_timeout
function download_file_with_progress_bar($url_file, $destination_file, $readbody = 'read_body', $connect_timeout = 5, $timeout = 0) {
global $config, $g;
global $ch, $fout, $file_size, $downloaded, $config, $first_progress_update;
- $file_size = 1;
+ $file_size = 1;
$downloaded = 1;
$first_progress_update = TRUE;
/* open destination file */
@@ -1919,12 +1919,12 @@ function update_output_window($text) {
global $pkg_interface;
$log = preg_replace("/\n/", "\\n", $text);
if ($pkg_interface != "console") {
- echo "\n<script type=\"text/javascript\">";
- echo "\n//<![CDATA[";
- echo "\nthis.document.forms[0].output.value = \"" . $log . "\";";
- echo "\nthis.document.forms[0].output.scrollTop = this.document.forms[0].output.scrollHeight;";
- echo "\n//]]>";
- echo "\n</script>";
+?>
+<script>
+ document.getElementById("output").textContent="<?=htmlspecialchars($log)?>";
+ document.getElementById("output").scrollTop = document.getElementById("output").scrollHeight;
+</script>
+<?php
}
/* ensure that contents are written out */
ob_flush();
@@ -1938,12 +1938,9 @@ function update_status($status) {
if ($pkg_interface == "console") {
echo "\r{$status}";
} else {
- echo "\n<script type=\"text/javascript\">";
- echo "\n//<![CDATA[";
- echo "\nthis.document.forms[0].status.value=\"" . $status . "\";";
- echo "\n//]]>";
- echo "\n</script>";
+ echo '<script>document.getElementById("status").innerText="'. htmlspecialchars($status).'";</script>';
}
+
/* ensure that contents are written out */
ob_flush();
}
@@ -1957,11 +1954,7 @@ function update_progress_bar($percent, $first_time) {
$percent = 1;
}
if ($pkg_interface <> "console") {
- echo "\n<script type=\"text/javascript\">";
- echo "\n//<![CDATA[";
- echo "\ndocument.progressbar.style.width='" . $percent . "%';";
- echo "\n//]]>";
- echo "\n</script>";
+ echo '<script>document.getElementById("progressbar").style.width="'. $percent.'%";</script>';
} else {
if (!($first_time)) {
echo "\x08\x08\x08\x08\x08";
@@ -2362,21 +2355,21 @@ function nanobsd_switch_boot_slice() {
}
ob_implicit_flush(1);
if (strstr($slice, "s2")) {
- $ASLICE = "2";
- $AOLDSLICE = "1";
- $AGLABEL_SLICE = "pfsense1";
- $AUFS_ID = "1";
- $AOLD_UFS_ID = "0";
+ $ASLICE="2";
+ $AOLDSLICE="1";
+ $AGLABEL_SLICE="pfsense1";
+ $AUFS_ID="1";
+ $AOLD_UFS_ID="0";
} else {
- $ASLICE = "1";
- $AOLDSLICE = "2";
- $AGLABEL_SLICE = "pfsense0";
- $AUFS_ID = "0";
- $AOLD_UFS_ID = "1";
- }
- $ATOFLASH = "{$BOOT_DRIVE}s{$ASLICE}";
- $ACOMPLETE_PATH = "{$BOOT_DRIVE}s{$ASLICE}a";
- $ABOOTFLASH = "{$BOOT_DRIVE}s{$AOLDSLICE}";
+ $ASLICE="1";
+ $AOLDSLICE="2";
+ $AGLABEL_SLICE="pfsense0";
+ $AUFS_ID="0";
+ $AOLD_UFS_ID="1";
+ }
+ $ATOFLASH="{$BOOT_DRIVE}s{$ASLICE}";
+ $ACOMPLETE_PATH="{$BOOT_DRIVE}s{$ASLICE}a";
+ $ABOOTFLASH="{$BOOT_DRIVE}s{$AOLDSLICE}";
conf_mount_rw();
set_single_sysctl("kern.geom.debugflags", "16");
exec("gpart set -a active -i {$ASLICE} {$BOOT_DRIVE}");
@@ -2450,23 +2443,23 @@ function nanobsd_detect_slice_info() {
// Detect which slice is active and set information.
if (strstr($REAL_BOOT_DEVICE, "s1")) {
- $SLICE = "2";
- $OLDSLICE = "1";
- $GLABEL_SLICE = "pfsense1";
- $UFS_ID = "1";
- $OLD_UFS_ID = "0";
+ $SLICE="2";
+ $OLDSLICE="1";
+ $GLABEL_SLICE="pfsense1";
+ $UFS_ID="1";
+ $OLD_UFS_ID="0";
} else {
- $SLICE = "1";
- $OLDSLICE = "2";
- $GLABEL_SLICE = "pfsense0";
- $UFS_ID = "0";
- $OLD_UFS_ID = "1";
+ $SLICE="1";
+ $OLDSLICE="2";
+ $GLABEL_SLICE="pfsense0";
+ $UFS_ID="0";
+ $OLD_UFS_ID="1";
}
- $TOFLASH = "{$BOOT_DRIVE}s{$SLICE}";
- $COMPLETE_PATH = "{$BOOT_DRIVE}s{$SLICE}a";
- $COMPLETE_BOOT_PATH = "{$BOOT_DRIVE}s{$OLDSLICE}";
- $BOOTFLASH = "{$BOOT_DRIVE}s{$OLDSLICE}";
+ $TOFLASH="{$BOOT_DRIVE}s{$SLICE}";
+ $COMPLETE_PATH="{$BOOT_DRIVE}s{$SLICE}a";
+ $COMPLETE_BOOT_PATH="{$BOOT_DRIVE}s{$OLDSLICE}";
+ $BOOTFLASH="{$BOOT_DRIVE}s{$OLDSLICE}";
}
function nanobsd_friendly_slice_name($slicename) {
@@ -2665,10 +2658,10 @@ function generate_ipv6_from_mac($mac) {
$ipv6 = "fe80::";
foreach ($elements as $byte) {
if ($i == 0) {
- $hexadecimal = substr($byte, 1, 2);
+ $hexadecimal = substr($byte, 1, 2);
$bitmap = base_convert($hexadecimal, 16, 2);
$bitmap = str_pad($bitmap, 4, "0", STR_PAD_LEFT);
- $bitmap = substr($bitmap, 0, 2) ."1". substr($bitmap, 3, 4);
+ $bitmap = substr($bitmap, 0, 2) ."1". substr($bitmap, 3,4);
$byte = substr($byte, 0, 1) . base_convert($bitmap, 2, 16);
}
$ipv6 .= $byte;
@@ -2705,7 +2698,7 @@ function load_mac_manufacturer_table() {
foreach ($macs as $line) {
if (preg_match('/([0-9A-Fa-f]{6}) (.*)$/', $line, $matches)) {
/* store values like this $mac_man['000C29']='VMware' */
- $mac_man["$matches[1]"] = $matches[2];
+ $mac_man["$matches[1]"]=$matches[2];
}
}
return $mac_man;
@@ -2801,7 +2794,7 @@ function where_is_ipaddr_configured($ipaddr, $ignore_if = "", $check_localip = f
$where_entry['if'] = $if;
$where_entry['ip_or_subnet'] = get_interface_ip($if) . "/" . get_interface_subnet($if);
$where_configured[] = $where_entry;
- }
+ }
}
}
} else {
@@ -2827,7 +2820,7 @@ function where_is_ipaddr_configured($ipaddr, $ignore_if = "", $check_localip = f
$interface_list_vips = get_configured_vips_list(true);
foreach ($interface_list_vips as $id => $vip) {
/* Skip CARP interfaces here since they were already checked above */
- if ($id == $ignore_vip_id || (substr($ignore_if, 0, 4) == '_vip') && substr($ignore_vip_if, 5) == $vip['uniqdid']) {
+ if ($id == $ignore_vip_id || (substr($ignore_if, 0, 4) == '_vip') && substr($ignore_vip_if, 5) == $vip['uniqdid']) {
continue;
}
if (strcasecmp($ipaddr, $vip['ipaddr']) == 0) {
@@ -2883,8 +2876,8 @@ function set_language($lang = 'en_US', $encoding = "UTF-8") {
putenv("LANG={$lang}.{$encoding}");
setlocale(LC_ALL, "{$lang}.{$encoding}");
textdomain("pfSense");
- bindtextdomain("pfSense", "/usr/local/share/locale");
- bind_textdomain_codeset("pfSense", "{$lang}.{$encoding}");
+ bindtextdomain("pfSense","/usr/local/share/locale");
+ bind_textdomain_codeset("pfSense","{$lang}.{$encoding}");
}
function get_locale_list() {
@@ -3179,7 +3172,7 @@ function pkg_call_plugins($plugin_type, $plugin_params) {
continue;
}
$pkg_config = parse_xml_config_pkg("/usr/local/pkg/" . $package['configurationfile'], 'packagegui');
- $pkgname = substr(reverse_strrchr($package['configurationfile'], "."), 0, -1);
+ $pkgname = substr(reverse_strrchr($package['configurationfile'], "."),0,-1);
if (is_array($pkg_config['plugins']['item'])) {
foreach ($pkg_config['plugins']['item'] as $plugin) {
if ($plugin['type'] == $plugin_type) {
diff --git a/src/etc/inc/pkg-utils.inc b/src/etc/inc/pkg-utils.inc
index 54c018d..d18efe8 100644
--- a/src/etc/inc/pkg-utils.inc
+++ b/src/etc/inc/pkg-utils.inc
@@ -569,8 +569,8 @@ function install_package_xml($package_name) {
$static_output .= sprintf(gettext("The %s package is not installed.%sInstallation aborted."), $package_name, "\n\n");
update_output_window($static_output);
if ($pkg_interface <> "console") {
- echo "\n<script type=\"text/javascript\">document.progressbar.style.visibility='hidden';</script>";
- echo "\n<script type=\"text/javascript\">document.progholder.style.visibility='hidden';</script>";
+ echo "\n<script>document.getElementById('progressbar').style.visibility='hidden';</script>";
+ echo "\n<script>document.getElementById('progholder').style.visibility='hidden';</script>";
}
uninstall_package($package_name);
@@ -691,8 +691,8 @@ function install_package_xml($package_name) {
update_output_window($static_output);
pkg_debug(gettext("Unable to load package configuration. Installation aborted.") ."\n");
if ($pkg_interface <> "console") {
- echo "\n<script type=\"text/javascript\">document.progressbar.style.visibility='hidden';</script>";
- echo "\n<script type=\"text/javascript\">document.progholder.style.visibility='hidden';</script>";
+ echo "\n<script>document.getElementById('progressbar').style.visibility='hidden';</script>";
+ echo "\n<script>document.getElementById('progholder').style.visibility='hidden';</script>";
}
uninstall_package($package_name);
@@ -748,8 +748,8 @@ function delete_package_xml($package_name, $when = "post-deinstall") {
$static_output .= sprintf(gettext("The %s package is not installed.%sDeletion aborted."), $package_name, "\n\n");
update_output_window($static_output);
if ($pkg_interface <> "console") {
- echo "\n<script type=\"text/javascript\">document.progressbar.style.visibility='hidden';</script>";
- echo "\n<script type=\"text/javascript\">document.progholder.style.visibility='hidden';</script>";
+ echo "\n<script>document.getElementById('progressbar').style.visibility='hidden';</script>";
+ echo "\n<script>document.getElementById('progholder').style.visibility='hidden';</script>";
}
ob_flush();
sleep(1);
diff --git a/src/etc/inc/service-utils.inc b/src/etc/inc/service-utils.inc
index 77a7914..2fa75cf 100644
--- a/src/etc/inc/service-utils.inc
+++ b/src/etc/inc/service-utils.inc
@@ -491,9 +491,20 @@ function get_service_status_icon($service, $withtext = true, $smallicon = false)
}
function get_service_control_links($service, $addname = false) {
- global $g;
$output = "";
$stitle = ($addname) ? $service['name'] . " " : "";
+
+ switch ($service['name']) {
+ case "openvpn":
+ $link = '<a title="%s" href="status_services.php?mode=%s&amp;service='.$service['name'].'.&amp;vpnmode='.$service['mode'].'.&amp;id='.$service['vpnid'].'">';
+ break;
+ case "captiveportal":
+ $link = '<a title="%s" href="status_services.php?mode=%s&amp;service='.$service['name'].'.&amp;zone='.$service['zone'].'">';
+ break;
+ default:
+ $link = '<a title="%s" href="status_services.php?mode=%s&amp;service='.$service['name'].'">';
+ }
+
if (get_service_status($service)) {
switch ($service['name']) {
case "openvpn":
@@ -520,22 +531,13 @@ function get_service_control_links($service, $addname = false) {
$output .= "</a>";
} else {
$service_enabled = is_service_enabled($service['name']);
- switch ($service['name']) {
- case "openvpn":
- $output .= "<a href='status_services.php?mode=startservice&amp;service={$service['name']}&amp;vpnmode={$service['mode']}&amp;id={$service['vpnid']}'>";
- break;
- case "captiveportal":
- $output .= "<a href='status_services.php?mode=startservice&amp;service={$service['name']}&amp;zone={$service['zone']}'>";
- break;
- default:
- if ($service_enabled) {
- $output .= "<a href='status_services.php?mode=startservice&amp;service={$service['name']}'>";
- }
- }
- if ($service_enabled) {
- $output .= "<img style=\"vertical-align:middle\" title='" . sprintf(gettext("Start %sService"), $stitle) . "' border='0' src='/themes/".$g['theme']."/images/icons/icon_service_start.gif' alt='start' /></a>\n";
+
+ if ($service['name'] == 'openvpn' || $service['name'] == 'captiveportal' || $service_enabled) {
+ $output .= sprintf($link, sprintf(gettext("Start %sService"), $stitle), 'startservice');
+ $output .= '<i class="icon icon-play-circle"></i></a> ';
}
}
+
return $output;
}
diff --git a/src/etc/inc/services.inc b/src/etc/inc/services.inc
index c254c35..333261d 100644
--- a/src/etc/inc/services.inc
+++ b/src/etc/inc/services.inc
@@ -391,7 +391,7 @@ function services_dhcpd_configure($family = "all", $blacklist = array()) {
global $config, $g;
/* configure DHCPD chroot once */
- $fd = fopen("{$g['tmp_path']}/dhcpd.sh", "w");
+ $fd = fopen("{$g['tmp_path']}/dhcpd.sh","w");
fwrite($fd, "/bin/mkdir -p {$g['dhcpd_chroot_path']}\n");
fwrite($fd, "/bin/mkdir -p {$g['dhcpd_chroot_path']}/dev\n");
fwrite($fd, "/bin/mkdir -p {$g['dhcpd_chroot_path']}/etc\n");
@@ -406,7 +406,7 @@ function services_dhcpd_configure($family = "all", $blacklist = array()) {
fwrite($fd, "/bin/cp -n /usr/local/sbin/dhcpd {$g['dhcpd_chroot_path']}/usr/local/sbin/\n");
fwrite($fd, "/bin/chmod a+rx {$g['dhcpd_chroot_path']}/usr/local/sbin/dhcpd\n");
- $status = `/sbin/mount | /usr/bin/grep -v grep | /usr/bin/grep "{$g['dhcpd_chroot_path']}/dev"`;
+ $status = `/sbin/mount | /usr/bin/grep -v grep | /usr/bin/grep "{$g['dhcpd_chroot_path']}/dev"`;
if (!trim($status)) {
fwrite($fd, "/sbin/mount -t devfs devfs {$g['dhcpd_chroot_path']}/dev\n");
}
@@ -596,7 +596,7 @@ EOD;
$my_port = "519";
$peer_port = "520";
$type = "primary";
- $dhcpdconf_pri = "split 128;\n";
+ $dhcpdconf_pri = "split 128;\n";
$dhcpdconf_pri .= " mclt 600;\n";
}
@@ -709,16 +709,16 @@ EOPP;
$all_mac_strings[] = $dhcpifconf['mac_allow'];
$all_mac_strings[] = $dhcpifconf['mac_deny'];
if (!empty($all_mac_strings)) {
- $all_mac_list = array_unique(explode(',', implode(',', $all_mac_strings)));
- foreach ($all_mac_list as $mac) {
- if (empty($mac)) {
- continue;
- }
- $dhcpdconf .= 'class "' . str_replace(':', '', $mac) . '" {' . "\n";
- // Skip the first octet of the MAC address - for media type, typically Ethernet ("01") and match the rest.
- $dhcpdconf .= ' match if substring (hardware, 1, ' . (substr_count($mac, ':') + 1) . ') = ' . $mac . ';' . "\n";
- $dhcpdconf .= '}' . "\n";
+ $all_mac_list = array_unique(explode(',', implode(',', $all_mac_strings)));
+ foreach ($all_mac_list as $mac) {
+ if (empty($mac)) {
+ continue;
}
+ $dhcpdconf .= 'class "' . str_replace(':', '', $mac) . '" {' . "\n";
+ // Skip the first octet of the MAC address - for media type, typically Ethernet ("01") and match the rest.
+ $dhcpdconf .= ' match if substring (hardware, 1, ' . (substr_count($mac, ':') + 1) . ') = ' . $mac . ';' . "\n";
+ $dhcpdconf .= '}' . "\n";
+ }
}
$dhcpdconf .= "subnet {$subnet} netmask {$subnetmask} {\n";
@@ -1598,12 +1598,12 @@ function services_dhcrelay_configure() {
$dhcrelayifs[] = get_real_interface($dhcrelayif);
}
}
-
- $srvips = explode(",", $dhcrelaycfg['server']);
+
+ $srvips = explode(",", $dhcrelaycfg['server']);
if (!is_array($srvips)) {
log_error("No destination IP has been configured!");
return;
- }
+ }
$dhcrelayifs = array_unique($dhcrelayifs);
@@ -1613,10 +1613,10 @@ function services_dhcrelay_configure() {
return; /* XXX */
}
- $cmd = "/usr/local/sbin/dhcrelay -i " . implode(" -i ", $dhcrelayifs);
+ $cmd = "/usr/local/sbin/dhcrelay -i " . implode(" -i ", $dhcrelayifs);
if (isset($dhcrelaycfg['agentoption'])) {
- $cmd .= " -a -m replace";
+ $cmd .= " -a -m replace";
}
$cmd .= " " . implode(" ", $srvips);
@@ -1711,8 +1711,8 @@ function services_dyndns_configure_client($conf) {
$dnsPort = NULL,
$dnsUpdateURL = "{$conf['updateurl']}",
$forceUpdate = $conf['force'],
- $dnsZoneID = $conf['zoneid'],
- $dnsTTL = $conf['ttl'],
+ $dnsZoneID=$conf['zoneid'],
+ $dnsTTL=$conf['ttl'],
$dnsResultMatch = "{$conf['resultmatch']}",
$dnsRequestIf = "{$conf['requestif']}",
$dnsID = "{$conf['id']}",
@@ -1811,7 +1811,7 @@ function services_dnsmasq_configure() {
}
/* generate hosts file */
- if (system_hosts_generate() != 0) {
+ if (system_hosts_generate()!=0) {
$return = 1;
}
@@ -1967,7 +1967,7 @@ function services_dnsmasq_configure() {
}
if (!platform_booting()) {
- if (services_dhcpd_configure() != 0) {
+ if (services_dhcpd_configure()!=0) {
$return = 1;
}
}
@@ -1997,7 +1997,7 @@ function services_unbound_configure() {
}
/* generate hosts file */
- if (system_hosts_generate() != 0) {
+ if (system_hosts_generate()!=0) {
$return = 1;
}
@@ -2011,7 +2011,7 @@ function services_unbound_configure() {
}
if (!platform_booting()) {
- if (services_dhcpd_configure() != 0) {
+ if (services_dhcpd_configure()!=0) {
$return = 1;
}
}
@@ -2042,7 +2042,7 @@ function services_snmpd_configure() {
/* generate snmpd.conf */
$fd = fopen("{$g['varetc_path']}/snmpd.conf", "w");
if (!$fd) {
- printf(gettext("Error: cannot open snmpd.conf in services_snmpd_configure().%s"), "\n");
+ printf(gettext("Error: cannot open snmpd.conf in services_snmpd_configure().%s"),"\n");
return 1;
}
@@ -2483,11 +2483,10 @@ function upnp_start() {
}
}
-function install_cron_job($command, $active = false, $minute = "0", $hour = "*", $monthday = "*", $month = "*", $weekday = "*", $who = "root") {
+function install_cron_job($command, $active=false, $minute="0", $hour="*", $monthday="*", $month="*", $weekday="*", $who="root") {
global $config, $g;
$is_installed = false;
- $cron_changed = true;
if (!is_array($config['cron'])) {
$config['cron'] = array();
@@ -2496,7 +2495,7 @@ function install_cron_job($command, $active = false, $minute = "0", $hour = "*",
$config['cron']['item'] = array();
}
- $x = 0;
+ $x=0;
foreach ($config['cron']['item'] as $item) {
if (strstr($item['command'], $command)) {
$is_installed = true;
@@ -2518,13 +2517,8 @@ function install_cron_job($command, $active = false, $minute = "0", $hour = "*",
$config['cron']['item'][] = $cron_item;
write_config(sprintf(gettext("Installed cron job for %s"), $command));
} else {
- if ($config['cron']['item'][$x] == $cron_item) {
- $cron_changed = false;
- log_error(sprintf(gettext("Checked cron job for %s, no change needed"), $command));
- } else {
- $config['cron']['item'][$x] = $cron_item;
- write_config(sprintf(gettext("Updated cron job for %s"), $command));
- }
+ $config['cron']['item'][$x] = $cron_item;
+ write_config(sprintf(gettext("Updated cron job for %s"), $command));
}
} else {
if ($is_installed == true) {
diff --git a/src/etc/inc/shaper.inc b/src/etc/inc/shaper.inc
index 29ae7e9..f5c91b0 100644
--- a/src/etc/inc/shaper.inc
+++ b/src/etc/inc/shaper.inc
@@ -1,33 +1,58 @@
<?php
/*
shaper.inc
- Copyright (C) 2008 Ermal Luçi
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
- pfSense_BUILDER_BINARIES: /bin/kill /sbin/kldload /bin/rm /bin/ps
- pfSense_MODULE: shaper
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/* XXX: needs some reducing on include. */
/* include all configuration functions. */
@@ -208,7 +233,7 @@ function get_interface_bandwidth($object) {
$altq =& $altq_list_queues[$int];
if ($altq) {
$bw_3 = $altq->GetBandwidth();
- $bw_3 = $bw_3 * get_bandwidthtype_scale($altq->GetBwscale());
+ $bw_3 = $bw_3 * get_bandwidthtype_scale($altq->GetBwscale());
return floatval($bw_3);
} else {
return 0;
@@ -525,7 +550,7 @@ class altq_root_queue {
function &find_parentqueue($interface, $qname) {
if ($qname == $interface) {
- $result = NULL;
+ $result = NULL;
} else if ($this->queues[$qname]) {
$result = $this;
} else if ($this->GetScheduler() <> "PRIQ") {
@@ -545,7 +570,7 @@ class altq_root_queue {
$tree .= "\">" . $shaperIFlist[$this->GetInterface()] . "</a>";
if (is_array($this->queues)) {
$tree .= "<ul>";
- foreach ($this->queues as $q) {
+ foreach ($this->queues as $q) {
$tree .= $q->build_tree();
}
$tree .= "</ul>";
@@ -576,15 +601,15 @@ class altq_root_queue {
/*
* First it spits:
* altq on $interface ..............
- * then it goes like
- * foreach ($queues as $qkey => $queue) {
- * this->queues[$qkey]->build_rule();
- * }
+ * then it goes like
+ * foreach ($queues as $qkey => $queue) {
+ * this->queues[$qkey]->build_rule();
+ * }
*/
function build_rules(&$default = false) {
if (count($this->queues) > 0 && $this->GetEnabled() == "on") {
$default = false;
- $rules = " altq on " . get_real_interface($this->GetInterface());
+ $rules = " altq on " . get_real_interface($this->GetInterface());
if ($this->GetScheduler()) {
$rules .= " ".strtolower($this->GetScheduler());
}
@@ -625,7 +650,7 @@ class altq_root_queue {
}
$frule .= $rules;
} else if ($this->GetEnabled() == "on" && $this->GetScheduler() == "CODELQ") {
- $rules = " altq on " . get_real_interface($this->GetInterface());
+ $rules = " altq on " . get_real_interface($this->GetInterface());
if ($this->GetScheduler()) {
$rules .= " ".strtolower($this->GetScheduler());
}
@@ -675,129 +700,134 @@ class altq_root_queue {
global $g;
$altq =& $this;
+
if ($altq) {
$scheduler = ": " . $altq->GetScheduler();
}
- $form = "<tr><td width=\"20%\" class=\"vtable\">";
- $form .= "<a href=\"firewall_shaper.php?interface=" . $this->GetInterface() . "&amp;queue=". $this->GetInterface()."&amp;action=show\">". $shaperIFlist[$this->GetInterface()] .": ".$scheduler."</a>";
- $form .= "</td></tr>";
- $form .= "<tr>";
- $form .= "<td width=\"50%\" class=\"vncellreq\">";
- $form .= "Bandwidth: " . $this->GetBandwidth().$this->GetBwscale();
- $form .= "</td><td width=\"50%\"></td></tr>";
- $form .= "<tr><td width=\"20%\" class=\"vncellreq\">";
- $form .= "<a href=\"firewall_shaper_queues.php?interface=";
- $form .= $this->GetInterface() . "&amp;queue=";
- $form .= $this->GetQname() . "&amp;action=delete\">";
- $form .= "<img src=\"";
- $form .= "./themes/".$g['theme']."/images/icons/icon_x.gif\"";
- $form .= " width=\"17\" height=\"17\" border=\"0\" title=\"Disable shaper on interface\" alt=\"disable\" />";
- $form .= "<span>Disable shaper on interface</span></a></td></tr>";
+
+ $form = '<dl class="dl-horizontal">';
+ $form .= ' <dt>';
+ $form .= ' <a href="firewall_shaper.php?interface=' . $this->GetInterface() . '&amp;queue=' . $this->GetQname() . '&amp;action=show">' . $shaperIFlist[$this->GetInterface()] . '</a>';
+ $form .= ' </dt>';
+ $form .= ' <dd>';
+ $form .= $scheduler;
+ $form .= ' </dd>';
+
+ $form .= ' <dt>';
+ $form .= 'Bandwidth';
+ $form .= ' </dt>';
+ $form .= ' <dd>';
+ $form .= $this->GetBandwidth() . '&nbsp;' . $this->GetBwscale();
+ $form .= ' </dd>';
+
+ $form .= ' <dt>';
+ $form .= 'Disable';
+ $form .= ' <dt>';
+ $form .= ' <dd>';
+
+ $form .= '<a class="btn btn-default btn-xs" href="firewall_shaper_queues.php?interface=';
+ $form .= $this->GetInterface() . '&amp;queue=';
+ $form .= $this->GetQname() . '&amp;action=delete">';
+ $form .= gettext("Disable shaper on interface") . '</a>';
+
+ $form .= ' </dd>';
+
+ $form .= '</dl>';
return $form;
}
+
/*
* For requesting the parameters of the root queues
* to the user like the traffic wizard does.
*/
function build_form() {
- $form = "<tr><td valign=\"middle\" class=\"vncellreq\"><br />";
- $form .= gettext("Enable/Disable");
- $form .= "<br /></td><td class=\"vncellreq\">";
- $form .= " <input type=\"checkbox\" id=\"enabled\" name=\"enabled\" value=\"on\"";
- if ($this->GetEnabled() == "on") {
- $form .= " checked=\"checked\"";
- }
- $form .= " /><span class=\"vexpl\"> " . gettext("Enable/disable discipline and its children") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\"><br /><span class=\"vexpl\">" . gettext("Name") . "</span></td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<strong>".$this->GetQname()."</strong>";
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Scheduler Type ");
- $form .= "</td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<select id=\"scheduler\" name=\"scheduler\" class=\"formselect\">";
- $form .= "<option value=\"HFSC\"";
- if ($this->GetScheduler() == "HFSC") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">HFSC</option>";
- $form .= "<option value=\"CBQ\"";
- if ($this->GetScheduler() == "CBQ") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">CBQ</option>";
- $form .= "<option value=\"FAIRQ\"";
- if ($this->GetScheduler() == "FAIRQ") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">FAIRQ</option>";
- $form .= "<option value=\"CODELQ\"";
- if ($this->GetScheduler() == "CODELQ") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">CODELQ</option>";
- $form .= "<option value=\"PRIQ\"";
- if ($this->GetScheduler() == "PRIQ") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">PRIQ</option>";
- $form .= "</select>";
- $form .= "<br /> <span class=\"vexpl\">";
- $form .= gettext("NOTE: Changing this changes all child queues!");
- $form .= gettext(" Beware you can lose information.");
- $form .= "</span>";
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Bandwidth");
- $form .= "</td><td class=\"vncellreq\">";
- $form .= "<input type=\"text\" id=\"bandwidth\" name=\"bandwidth\" value=\"";
- $form .= $this->GetBandwidth() . "\" />";
- $form .= "<select id=\"bandwidthtype\" name=\"bandwidthtype\" class=\"formselect\">";
- $form .= "<option value=\"Kb\"";
- if ($this->GetBwscale() == "Kb") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">Kbit/s</option>";
- $form .= "<option value=\"Mb\"";
- if ($this->GetBwscale() == "Mb") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">Mbit/s</option>";
- $form .= "<option value=\"Gb\"";
- if ($this->GetBwscale() == "Gb") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">Gbit/s</option>";
- $form .= "<option value=\"b\"";
- if ($this->GetBwscale() == "b") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">Bit/s</option>";
- $form .= "</select>";
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">Queue Limit</td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<input type=\"text\" id=\"qlimit\" name=\"qlimit\" value=\"";
- $form .= $this->GetQlimit();
- $form .= "\" />";
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">TBR Size</td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<br /><input type=\"text\" id=\"tbrconfig\" name=\"tbrconfig\" value=\"";
- $form .= $this->GetTbrConfig();
- $form .= "\" />";
- $form .= "<br /> <span class=\"vexpl\">";
- $form .= gettext("Adjusts the size, in bytes, of the token bucket regulator. "
- . "If not specified, heuristics based on the interface "
- . "bandwidth are used to determine the size.");
- $form .= "</span></td></tr>";
- $form .= "<input type=\"hidden\" id=\"interface\" name=\"interface\"";
- $form .= " value=\"" . $this->GetInterface() . "\" />";
- $form .= "<input type=\"hidden\" id=\"name\" name=\"name\" value=\"".$this->GetQname()."\" />";
- return $form;
+ $sform = new Form(new Form_Button(
+ 'Submit',
+ 'Save'
+ ));
+
+ $section = new Form_Section(null);
+
+ $section->addInput(new Form_Checkbox(
+ 'enabled',
+ 'Enable/Disable',
+ 'Enable/disable discipline and its children',
+ ($this->GetEnabled() == "on"),
+ 'on'
+ ));
+
+ $section->addInput(new Form_StaticText(
+ 'Name',
+ $this->GetQname()
+ ));
+
+ $section->addInput(new Form_Select(
+ 'scheduler',
+ 'Scheduler Type',
+ $this->GetScheduler(),
+ array('HFSC' => 'HFSC',
+ 'CBQ' => 'CBQ',
+ 'FAIRQ' => 'FAIRQ',
+ 'CODELQ' => 'CODELQ',
+ 'PRIQ' => 'PRIQ')
+ ))->setHelp('Changing this changes all child queues! Beware you can lose information.');
+
+ $group = new Form_group('Bandwidth');
+
+ $group->add(new Form_Input(
+ 'bandwidth',
+ null,
+ 'number',
+ $this->GetBandwidth()
+ ));
+
+ $group->add(new Form_Select(
+ 'bandwidthtype',
+ null,
+ $this->GetBwscale(),
+ array('Kb' => 'Kb',
+ 'Mb' => 'Mb',
+ 'Gb' => 'Gb',
+ 'b' => 'b')
+ ));
+
+ $section->add($group);
+
+ $section->addInput(new Form_Input(
+ 'qlimit',
+ 'Queue Limit',
+ 'number',
+ $this->GetQlimit()
+ ));
+
+ $section->addInput(new Form_Input(
+ 'tbrconfig',
+ 'TRB Size',
+ 'number',
+ $this->GetTbrConfig()
+ ))->setHelp('Adjusts the size, in bytes, of the token bucket regulator. If not specified, heuristics based on the interface ' .
+ 'bandwidth are used to determine the size.');
+
+ $section->addInput(new Form_Input(
+ 'interface',
+ null,
+ 'hidden',
+ $this->GetInterface()
+ ));
+
+ $section->addInput(new Form_Input(
+ 'name',
+ null,
+ 'hidden',
+ $this->GetQname()
+ ));
+
+ $sform->add($section);
+
+ return($sform);
}
function update_altq_queue_data(&$data) {
@@ -1095,7 +1125,7 @@ class priq_queue {
$input_errors[] = "Bandwidth cannot be negative.";
}
if ($data['priority'] && (!is_numeric($data['priority']) ||
- ($data['priority'] < 1) || ($data['priority'] > 15))) {
+ ($data['priority'] < 1) || ($data['priority'] > 15))) {
$input_errors[] = gettext("The priority must be an integer between 1 and 15.");
}
if ($data['qlimit'] && (!is_numeric($data['qlimit']))) {
@@ -1270,89 +1300,103 @@ class priq_queue {
* for getting the parameters.
* Should do even for first time when the
* object is created and later when we may
- * need to update it.
+ * need to update it. (2)
*/
+
function build_form() {
- $form = "<tr><td valign=\"middle\" class=\"vncellreq\"><br />";
- $form .= gettext("Enable/Disable");
- $form .= "<br /></td><td class=\"vncellreq\">";
- $form .= " <input type=\"checkbox\" id=\"enabled\" name=\"enabled\" value=\"on\"";
- if ($this->GetEnabled() == "on") {
- $form .= " checked=\"checked\"";
- }
- $form .= " /><span class=\"vexpl\"> " . gettext("Enable/Disable queue and its children") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr>";
- $form .= "<td width=\"22%\" valign=\"middle\" class=\"vncellreq\">";
- $form .= gettext("Queue Name") . "</td><td width=\"78%\" class=\"vtable\">";
- $form .= "<input name=\"newname\" type=\"text\" id=\"newname\" class=\"formfld unknown\" size=\"15\" maxlength=\"15\" value=\"";
- $form .= htmlspecialchars($this->GetQname());
- $form .= "\" />";
- $form .= "<input name=\"name\" type=\"hidden\" id=\"name\" class=\"formfld unknown\" size=\"15\" maxlength=\"15\" value=\"";
- $form .= htmlspecialchars($this->GetQname());
- $form .= "\" />";
- $form .= "<br /> <span class=\"vexpl\">" . gettext("Enter the name of the queue here. Do not use spaces and limit the size to 15 characters.");
- $form .= "</span><br /></td>";
- $form .= "</tr><tr>";
- $form .= "<td width=\"22%\" valign=\"middle\" class=\"vncellreq\">" . gettext("Priority") . "</td>";
- $form .= "<td width=\"78%\" class=\"vtable\"> <input name=\"priority\" type=\"text\" id=\"priority\" size=\"5\" value=\"";
- $form .= htmlspecialchars($this->GetQpriority());
- $form .= "\" />";
- $form .= "<br /> <span class=\"vexpl\">" . gettext("For hfsc, the range is 0 to 7. The default is 1. Hfsc queues with a higher priority are preferred in the case of overload.") . "</span></td>";
- $form .= "</tr>";
- $form .= "<tr>";
- $form .= "<td width=\"22%\" valign=\"middle\" class=\"vncellreq\">" . gettext("Queue limit") . "</td>";
- $form .= "<td width=\"78%\" class=\"vtable\"> <input name=\"qlimit\" type=\"text\" id=\"qlimit\" size=\"8\" value=\"";
- $form .= htmlspecialchars($this->GetQlimit());
- $form .= "\" />";
- $form .= "<br /> <span class=\"vexpl\">" . gettext("Queue limit in packets.");
- $form .= "</span></td></tr>";
- $form .= "<tr>";
- $form .= "<td width=\"22%\" valign=\"middle\" class=\"vncell\">" . gettext("Scheduler options") . "</td>";
- $form .= "<td width=\"78%\" class=\"vtable\">";
- if (empty($this->subqueues)) {
- if ($this->GetDefault()) {
- $form .= "<input type=\"checkbox\" id=\"default\" checked=\"checked\" name=\"default\" value=\"default\"";
- $form .= " /> " . gettext("Default queue") . "<br />";
- } else {
- $form .= "<input type=\"checkbox\" id=\"default\" name=\"default\" value=\"default\"";
- $form .= " /> " . gettext("Default queue") . "<br />";
- }
- }
- $form .= "<input type=\"checkbox\" id=\"red\" name=\"red\" value=\"red\" ";
- $tmpvalue = $this->GetRed();
- if (!empty($tmpvalue)) {
- $form .= " checked=\"checked\"";
- }
- $form .= " /> <a target=\"_new\" href=\"http://www.openbsd.org/faq/pf/queueing.html#red\">" . gettext("Random Early Detection") . "</a><br />";
- $form .= "<input type=\"checkbox\" id=\"rio\" name=\"rio\" value=\"rio\"";
- $tmpvalue = $this->GetRio();
- if (!empty($tmpvalue)) {
- $form .= " checked=\"checked\"";
- }
- $form .= " /> <a target=\"_new\" href=\"http://www.openbsd.org/faq/pf/queueing.html#rio\">" . gettext("Random Early Detection In and Out") . "</a><br />";
- $form .= "<input type=\"checkbox\" id=\"ecn\" name=\"ecn\" value=\"ecn\"";
- $tmpvalue = $this->GetEcn();
- if (!empty($tmpvalue)) {
- $form .= " checked=\"checked\"";
- }
- $form .= " /> <a target=\"_new\" href=\"http://www.openbsd.org/faq/pf/queueing.html#ecn\">" . gettext("Explicit Congestion Notification") . "</a><br />";
- $form .= "<input type=\"checkbox\" id=\"codel\" name=\"codel\" value=\"codel\"";
- $tmpvalue = $this->GetCodel();
- if (!empty($tmpvalue)) {
- $form .= " checked=\"checked\"";
- }
- $form .= " /> <a target=\"_new\" href=\"http://www.bufferbloat.net/projects/codel/wiki\">" . gettext("Codel Active Queue") . "</a><br />";
- $form .= "<span class=\"vexpl\"><br />" . gettext("Select options for this queue");
- $form .= "</span></td></tr><tr>";
- $form .= "<td width=\"22%\" class=\"vncellreq\">" . gettext("Description") . "</td>";
- $form .= "<td width=\"78%\" class=\"vtable\">";
- $form .= "<input type=\"text\" name=\"description\" size=\"40\" class=\"formfld unknown\" value=\"" . htmlspecialchars($this->GetDescription()) . "\" />";
- $form .= "</td></tr>";
- $form .= "<input type=\"hidden\" name=\"interface\" id=\"interface\"";
- $form .= " value=\"".$this->GetInterface()."\" />";
- return $form;
+ $sform = new Form();
+
+ $section = new Form_Section(null);
+
+ $section->addInput(new Form_Checkbox(
+ 'enabled',
+ 'Enable/Disable',
+ 'Enable/disable discipline and its children',
+ ($this->GetEnabled() == "on"),
+ 'on'
+ ));
+
+ $section->addInput(new Form_StaticText(
+ 'Name',
+ $this->GetQname()
+ ))->setHelp('Enter the name of the queue here. Do not use spaces and limit the size to 15 characters.');
+
+ $section->addInput(new Form_Input(
+ 'priority',
+ 'Priority',
+ 'number',
+ $this->GetQpriority(),
+ ['min' => '0', 'max'=> '7']
+ ))->setHelp('For hfsc, the range is 0 to 7. The default is 1. Hfsc queues with a higher priority are preferred in the case of overload.');
+
+ $section->addInput(new Form_Input(
+ 'qlimit',
+ 'Queue Limit',
+ 'number',
+ $this->GetQlimit()
+ ))->setHelp('Queue limit in packets.');
+
+ $group = new Form_Group('Scheduler options');
+
+ if (empty($this->subqueues)) {
+ $group->add(new Form_Checkbox(
+ 'default',
+ null,
+ null,
+ $this->GetDefault()
+ ))->setHelp('Default Queue');
+ }
+
+ $group->add(new Form_Checkbox(
+ 'red',
+ null,
+ null,
+ !empty($this->GetRed())
+ ))->setHelp('<a target="_new" href="http://www.openbsd.org/faq/pf/queueing.html#red">' . gettext('Random Early Detection') . '</a>');
+
+ $group->add(new Form_Checkbox(
+ 'rio',
+ null,
+ null,
+ !empty($this->GetRio())
+ ))->setHelp('<a target="_new" href="http://www.openbsd.org/faq/pf/queueing.html#rio">' . gettext('Random Early Detection In and Out') . '</a>');
+
+ $group->add(new Form_Checkbox(
+ 'ecn',
+ null,
+ null,
+ !empty($this->GetEcn())
+ ))->setHelp('<a target="_new" href="http://www.openbsd.org/faq/pf/queueing.html#ecn">' . gettext('Explicit Congestion Notification') . '</a>');
+
+ $group->add(new Form_Checkbox(
+ 'codel',
+ null,
+ null,
+ !empty($this->GetCodel())
+ ))->setHelp('<a target="_new" href="http://www.openbsd.org/faq/pf/queueing.html#ecn">' . gettext('Explicit Congestion Notification') . '</a>');
+
+ $group->setHelp('Select options for this queue');
+
+ $section->add($group);
+
+ $section->addInput(new Form_Input(
+ 'description',
+ 'Description',
+ 'text',
+ $this->GetDescription()
+ ));
+
+ $section->addInput(new Form_Input(
+ 'interface',
+ null,
+ 'hidden',
+ $this->GetInterface()
+ ));
+
+ $sform->add($section);
+
+ return($sform);
}
function build_shortform() {
@@ -1361,36 +1405,59 @@ class priq_queue {
global $shaperIFlist;
$altq =& $altq_list_queues[$this->GetInterface()];
+
if ($altq) {
- $scheduler = ": " . $altq->GetScheduler();
+ $scheduler = $altq->GetScheduler();
}
- $form = "<tr><td width=\"20%\" class=\"vtable\">";
- $form .= "<a href=\"firewall_shaper.php?interface=" . $this->GetInterface() . "&amp;queue=" . $this->GetQname()."&amp;action=show\">". $shaperIFlist[$this->GetInterface()] .$scheduler."</a>";
- $form .= "</td></tr>";
- /*
- * XXX: Hack in sight maybe fix with a class that wraps all
- * of this layer violations
- */
- $form .= "<tr>";
- $form .= "<td width=\"50%\" class=\"vncellreq\">";
- $form .= gettext("Bandwidth:") . " " . $this->GetBandwidth().$this->GetBwscale();
- $form .= "</td><td width=\"50%\"></td></tr>";
+
+ $form = '<dl class="dl-horizontal">';
+ $form .= ' <dt>';
+ $form .= ' <a href="firewall_shaper.php?interface=' . $this->GetInterface() . '&amp;queue=' . $this->GetQname() . '&amp;action=show">' . $shaperIFlist[$this->GetInterface()] . '</a>';
+ $form .= ' </dt>';
+ $form .= ' <dd>';
+ $form .= $scheduler;
+ $form .= ' </dd>';
+
+ $form .= ' <dt>';
+ $form .= 'Bandwidth';
+ $form .= ' </dt>';
+ $form .= ' <dd>';
+ $form .= $this->GetBandwidth() . '&nbsp;' . $this->GetBwscale();
+ $form .= ' </dd>';
+
$tmpvalue = $this->GetQpriority();
if (!empty($tmpvalue)) {
- $form .= "<tr><td width=\"20%\" class=\"vncellreq\">" .gettext("Priority: on") . " </td></tr>";
+ $form .= ' <dt>';
+ $form .= 'Priority';
+ $form .= ' <dt>';
+ $form .= ' <dd>';
+ $form .= 'On';
+ $form .= ' </dd>';
}
+
$tmpvalue = $this->GetDefault();
if (!empty($tmpvalue)) {
- $form .= "<tr><td class=\"vncellreq\">" . gettext("Default: on") . " </td></tr>";
+ $form .= ' <dt>';
+ $form .= 'Default';
+ $form .= ' <dt>';
+ $form .= ' <dd>';
+ $form .= 'On';
+ $form .= ' </dd>';
}
- $form .= "<tr><td width=\"20%\" class=\"vncellreq\">";
- $form .= "<a href=\"firewall_shaper_queues.php?interface=";
- $form .= $this->GetInterface() . "&amp;queue=";
- $form .= $this->GetQname() . "&amp;action=delete\">";
- $form .= "<img src=\"";
- $form .= "./themes/".$g['theme']."/images/icons/icon_x.gif\"";
- $form .= " width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("Delete queue from interface") . "\" alt=\"delete\" />";
- $form .= "<span>" . gettext("Delete queue from interface") . "</span></a></td></tr>";
+
+ $form .= ' <dt>';
+ $form .= 'Delete';
+ $form .= ' <dt>';
+ $form .= ' <dd>';
+
+ $form .= '<a class="btn btn-danger btn-xs" href="firewall_shaper_queues.php?interface=';
+ $form .= $this->GetInterface() . '&amp;queue=';
+ $form .= $this->GetQname() . '&amp;action=delete">';
+ $form .= gettext("Delete queue from interface") . '</a>';
+
+ $form .= ' </dd>';
+
+ $form .= '</dl>';
return $form;
@@ -1698,7 +1765,7 @@ class hfsc_queue extends priq_queue {
unref_on_altq_queue_list($this->GetQname());
cleanup_queue_from_rules($this->GetQname());
$parent =& $this->GetParent();
- foreach ($this->subqueues as $q) {
+ foreach ($this->subqueues as $q) {
$this->SetAvailableBandwidth($this->GetAvailableBandwidth() + $q->GetAvailableBandwidth());
$q->delete_queue();
}
@@ -1772,10 +1839,10 @@ class hfsc_queue extends priq_queue {
*/
}
- if ($data['upperlimit1'] <> "" && $data['upperlimit2'] == "") {
+ if ($data['upperlimit1'] <> "" && $data['upperlimit2'] == "") {
$input_errors[] = gettext("upperlimit service curve defined but missing (d) value");
}
- if ($data['upperlimit2'] <> "" && $data['upperlimit1'] == "") {
+ if ($data['upperlimit2'] <> "" && $data['upperlimit1'] == "") {
$input_errors[] = gettext("upperlimit service curve defined but missing initial bandwidth (m1) value");
}
if ($data['upperlimit1'] <> "" && !is_valid_shaperbw($data['upperlimit1'])) {
@@ -1801,10 +1868,10 @@ class hfsc_queue extends priq_queue {
}
}
*/
- if ($data['linkshare1'] <> "" && $data['linkshare2'] == "") {
+ if ($data['linkshare1'] <> "" && $data['linkshare2'] == "") {
$input_errors[] = gettext("linkshare service curve defined but missing (d) value");
}
- if ($data['linkshare2'] <> "" && $data['linkshare1'] == "") {
+ if ($data['linkshare2'] <> "" && $data['linkshare1'] == "") {
$input_errors[] = gettext("linkshare service curve defined but missing initial bandwidth (m1) value");
}
if ($data['linkshare1'] <> "" && !is_valid_shaperbw($data['linkshare1'])) {
@@ -1816,10 +1883,10 @@ class hfsc_queue extends priq_queue {
if ($data['linkshare3'] <> "" && !is_valid_shaperbw($data['linkshare3'])) {
$input_errors[] = gettext("linkshare m2 value needs to be Kb, Mb, Gb, or %");
}
- if ($data['realtime1'] <> "" && $data['realtime2'] == "") {
+ if ($data['realtime1'] <> "" && $data['realtime2'] == "") {
$input_errors[] = gettext("realtime service curve defined but missing (d) value");
}
- if ($data['realtime2'] <> "" && $data['realtime1'] == "") {
+ if ($data['realtime2'] <> "" && $data['realtime1'] == "") {
$input_errors[] = gettext("realtime service curve defined but missing initial bandwidth (m1) value");
}
@@ -1927,7 +1994,7 @@ class hfsc_queue extends priq_queue {
$tree .= " >" . $this->GetQname() . "</a>";
if (is_array($this->subqueues)) {
$tree .= "<ul>";
- foreach ($this->subqueues as $q) {
+ foreach ($this->subqueues as $q) {
$tree .= $q->build_tree();
}
$tree .= "</ul>";
@@ -1993,13 +2060,13 @@ class hfsc_queue extends priq_queue {
$default = true;
}
- if ($this->GetRealtime() <> "") {
+ if ($this->GetRealtime() <> "") {
if ($comma) {
$pfq_rule .= " , ";
}
- if ($this->GetR_m1() <> "" && $this->GetR_d() <> "" && $this->GetR_m2() <> "") {
+ if ($this->GetR_m1() <> "" && $this->GetR_d() <> "" && $this->GetR_m2() <> "") {
$pfq_rule .= " realtime (".$this->GetR_m1() . ", " . $this->GetR_d().", ". $this->GetR_m2() .") ";
- } else if ($this->GetR_m2() <> "") {
+ } else if ($this->GetR_m2() <> "") {
$pfq_rule .= " realtime " . $this->GetR_m2();
}
$comma = 1;
@@ -2050,168 +2117,194 @@ class hfsc_queue extends priq_queue {
}
function build_javascript() {
- $javascript = parent::build_javascript();
- $javascript .= "<script type=\"text/javascript\">";
- $javascript .= "//<![CDATA[\n";
- $javascript .= "function enable_realtime(enable_over) { \n";
- $javascript .= "if (document.iform.realtime.checked || enable_over) { \n";
- $javascript .= "document.iform.realtime1.disabled = 0;\n";
- $javascript .= "document.iform.realtime2.disabled = 0;\n";
- $javascript .= "document.iform.realtime3.disabled = 0;\n";
- $javascript .= " } else { \n";
- $javascript .= "document.iform.realtime1.disabled = 1;\n";
- $javascript .= "document.iform.realtime2.disabled = 1;\n";
- $javascript .= "document.iform.realtime3.disabled = 1;\n";
- $javascript .= " } \n";
- $javascript .= " } \n";
- $javascript .= "function enable_linkshare(enable_over) { \n";
- $javascript .= "if (document.iform.linkshare.checked || enable_over) { \n";
- $javascript .= "document.iform.linkshare1.disabled = 0;\n";
- $javascript .= "document.iform.linkshare2.disabled = 0;\n";
- $javascript .= "document.iform.linkshare3.disabled = 0;\n";
- $javascript .= " } else { \n";
- $javascript .= "document.iform.linkshare1.disabled = 1;\n";
- $javascript .= "document.iform.linkshare2.disabled = 1;\n";
- $javascript .= "document.iform.linkshare3.disabled = 1;\n";
- $javascript .= " } \n";
- $javascript .= " } \n";
- $javascript .= "function enable_upperlimit(enable_over) { \n";
- $javascript .= "if (document.iform.upperlimit.checked || enable_over) { \n";
- $javascript .= "document.iform.upperlimit1.disabled = 0;\n";
- $javascript .= "document.iform.upperlimit2.disabled = 0;\n";
- $javascript .= "document.iform.upperlimit3.disabled = 0;\n";
- $javascript .= " } else { \n";
- $javascript .= "document.iform.upperlimit1.disabled = 1;\n";
- $javascript .= "document.iform.upperlimit2.disabled = 1;\n";
- $javascript .= "document.iform.upperlimit3.disabled = 1;\n";
- $javascript .= " } \n";
-
- $javascript .= "} \n";
- $javascript .= "//]]>";
- $javascript .= "</script>";
+
+ $javascript = <<<EOJS
+<script type="text/javascript">
+//<![CDATA[
+ events.push(function(){
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
+ }
+
+ // Upperlimit
+ function enable_upperlimit() {
+ disableInput('upperlimit1', !$('#upperlimit').prop('checked'));
+ disableInput('upperlimit2', !$('#upperlimit').prop('checked'));
+ disableInput('upperlimit3', !$('#upperlimit').prop('checked'));
+ }
+
+ $('#upperlimit').click(function () {
+ enable_upperlimit();
+ });
+
+ enable_upperlimit();
+
+ // realtime
+ function enable_realtime() {
+ disableInput('realtime1', !$('#realtime').prop('checked'));
+ disableInput('realtime2', !$('#realtime').prop('checked'));
+ disableInput('realtime3', !$('#realtime').prop('checked'));
+ }
+
+ $('#realtime').click(function () {
+ enable_realtime();
+ });
+
+ enable_realtime();
+
+ // linkshare
+ function enable_linkshare() {
+ disableInput('linkshare1', !$('#linkshare').prop('checked'));
+ disableInput('linkshare2', !$('#linkshare').prop('checked'));
+ disableInput('linkshare3', !$('#linkshare').prop('checked'));
+ }
+
+ $('#linkshare').click(function () {
+ enable_linkshare();
+ });
+
+ enable_linkshare();
+ });
+//]]>
+</script>
+EOJS;
return $javascript;
}
function build_form() {
- $form = parent::build_form();
- $form .= "<tr>";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Bandwidth") . "</td>";
- $form .= "<td class=\"vtable\"> <input name=\"bandwidth\" id=\"bandwidth\" class=\"formfld unknown\" value=\"";
- $form .= htmlspecialchars($this->GetBandwidth());
- $form .= "\" />";
- $form .= "<select name=\"bandwidthtype\" id=\"bandwidthtype\" class=\"formselect\">";
- $form .= "<option value=\"Gb\"";
- if ($this->GetBwscale() == "Gb") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Gbit/s") . "</option>";
- $form .= "<option value=\"Mb\"";
- if ($this->GetBwscale() == "Mb") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Mbit/s") . "</option>";
- $form .= "<option value=\"Kb\"";
- if ($this->GetBwscale() == "Kb") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Kbit/s") . "</option>";
- $form .= "<option value=\"b\"";
- if ($this->GetBwscale() == "b") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Bit/s") . "</option>";
- $form .= "<option value=\"%\"";
- if ($this->GetBwscale() == "%") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">%</option>";
- $form .= "</select> <br />";
- $form .= "<span class=\"vexpl\">" . gettext("Choose the amount of bandwidth for this queue");
- $form .= "</span></td></tr>";
- $form .= "<tr>";
- $form .= "<td width=\"22%\" valign=\"middle\" class=\"vncellreq\">" . gettext("Service Curve (sc)") . "</td>";
- $form .= "<td width=\"78%\" class=\"vtable\">";
- $form .= "<table>";
- $form .= "<tr><td>&nbsp;</td><td><center>m1</center></td><td><center>d</center></td><td><center><b>m2</b></center></td></tr>";
- $form .= "<tr><td><input type=\"checkbox\" id=\"upperlimit\" name=\"upperlimit\"";
- if ($this->GetUpperlimit()<> "") {
- $form .= " checked=\"checked\" ";
- }
- $form .= "onchange=\"enable_upperlimit()\" /> " . gettext("Upperlimit:") . "</td><td><input size=\"6\" value=\"";
- $form .= htmlspecialchars($this->GetU_m1());
- $form .= "\" id=\"upperlimit1\" name=\"upperlimit1\" ";
- if ($this->GetUpperlimit() == "") {
- $form .= " disabled=\"disabled\"";
- }
- $form .= " /></td><td><input size=\"6\" value=\"";
- $form .= htmlspecialchars($this->GetU_d());
- $form .= "\" id=\"upperlimi2\" name=\"upperlimit2\" ";
- if ($this->GetUpperlimit() == "") {
- $form .= " disabled=\"disabled\"";
- }
- $form .= " /></td><td><input size=\"6\" value=\"";
- $form .= htmlspecialchars($this->GetU_m2());
- $form .= "\" id=\"upperlimit3\" name=\"upperlimit3\" ";
- if ($this->GetUpperlimit() == "") {
- $form .= " disabled=\"disabled\"";
- }
- $form .= " /></td><td>" . gettext("The maximum allowed bandwidth for the queue.") . "</td></tr>";
- $form .= "<tr><td><input type=\"checkbox\" id=\"realtime\" name=\"realtime\"";
- if ($this->GetRealtime() <> "") {
- $form .= " checked=\"checked\" ";
- }
- $form .= "onchange=\"enable_realtime()\" /> " . gettext("Real time:") . "</td><td><input size=\"6\" value=\"";
- $form .= htmlspecialchars($this->GetR_m1());
- $form .= "\" id=\"realtime1\" name=\"realtime1\" ";
- if ($this->GetRealtime() == "") {
- $form .= " disabled=\"disabled\"";
- }
- $form .= " /></td><td><input size=\"6\" value=\"";
- $form .= htmlspecialchars($this->GetR_d());
- $form .= "\" id=\"realtime2\" name=\"realtime2\" ";
- if ($this->GetRealtime() == "") {
- $form .= " disabled=\"disabled\"";
- }
- $form .= " /></td><td><input size=\"6\" value=\"";
- $form .= htmlspecialchars($this->GetR_m2());
- $form .= "\" id=\"realtime3\" name=\"realtime3\" ";
- if ($this->GetRealtime() == "") {
- $form .= " disabled=\"disabled\"";
- }
- $form .= " /></td><td>" . gettext("The minimum required bandwidth for the queue.") . "</td></tr>";
- $form .= "<tr><td><input type=\"checkbox\" id=\"linkshare\" name=\"linkshare\"";
- if ($this->GetLinkshare() <> "") {
- $form .= " checked=\"checked\" ";
- }
- $form .= "onchange=\"enable_linkshare()\" /> " . gettext("Link share:") . "</td><td><input size=\"6\" value=\"";
- $form .= htmlspecialchars($this->GetL_m1());
- $form .= "\" id=\"linkshare1\" name=\"linkshare1\" ";
- if ($this->GetLinkshare() == "") {
- $form .= " disabled=\"disabled\"";
- }
- $form .= " /></td><td><input size=\"6\" value=\"";
- $form .= htmlspecialchars($this->GetL_d());
- $form .= "\" id=\"linkshare2\" name=\"linkshare2\" ";
- if ($this->GetLinkshare() == "") {
- $form .= " disabled=\"disabled\"";
- }
- $form .= " /></td><td><input size=\"6\" value=\"";
- $form .= htmlspecialchars($this->GetL_m2());
- $form .= "\" id=\"linkshare3\" name=\"linkshare3\" ";
- if ($this->GetLinkshare() == "") {
- $form .= " disabled=\"disabled\"";
- }
- $form .= " /></td><td>" . gettext("The bandwidth share of a backlogged queue - this overrides priority.") . "</td></tr>";
- $form .= "</table><br />";
- $form .= gettext("The format for service curve specifications is (m1, d, m2). m2 controls "
- . "the bandwidth assigned to the queue. m1 and d are optional and can be "
- . "used to control the initial bandwidth assignment. For the first d milliseconds the queue gets the bandwidth given as m1, afterwards the value "
- . "given in m2.");
- $form .= "</td>";
- $form .= "</tr>";
- return $form;
+ $sform = parent::build_form();
+
+ $section = new Form_Section('Service Curve (sc)');
+
+ $group = new Form_Group('Bandwidth');
+
+ $group->add(new Form_Input(
+ 'bandwidth',
+ null,
+ 'number',
+ $this->GetBandwidth()
+ ));
+
+ $group->add(new Form_Select(
+ 'bandwidthtype',
+ null,
+ $this->GetBwscale(),
+ array('Kb' => 'Kb',
+ 'Mb' => 'Mb',
+ 'Gb' => 'Gb',
+ 'b' => 'b')
+ ));
+
+ $group->setHelp('Choose the amount of bandwidth for this queue');
+
+ $section->add($group);
+
+ $group = new Form_Group('Max bandwidth for queue.');
+
+ $group->add(new Form_Checkbox(
+ 'upperlimit',
+ null,
+ 'Upper Limit',
+ ($this->GetUpperlimit()<> "")
+ ));
+
+ $group->add(new Form_Input(
+ 'upperlimit1',
+ null,
+ 'text',
+ $this->GetU_m1()
+ ));
+
+ $group->add(new Form_Input(
+ 'upperlimit2',
+ null,
+ 'text',
+ $this->GetU_d()
+ ));
+ $group->add(new Form_Input(
+ 'upperlimit3',
+ null,
+ 'text',
+ $this->GetU_m2()
+ ));
+
+
+ $section->add($group);
+
+ $group = new Form_Group('Min bandwidth for queue.');
+
+ $group->add(new Form_Checkbox(
+ 'realtime',
+ null,
+ 'Real Time',
+ ($this->GetRealtime()<> "")
+ ));
+
+ $group->add(new Form_Input(
+ 'realtime1',
+ null,
+ 'text',
+ $this->GetR_m1()
+ ));
+
+ $group->add(new Form_Input(
+ 'realtime2',
+ null,
+ 'text',
+ $this->GetR_d()
+ ));
+ $group->add(new Form_Input(
+ 'realtime3',
+ null,
+ 'text',
+ $this->GetR_m2()
+ ));
+
+ $section->add($group);
+
+ $group = new Form_Group('B/W share of a backlogged queue.');
+
+ $group->add(new Form_Checkbox(
+ 'linkshare',
+ null,
+ 'Link Share',
+ ($this->GetLinkshare()<> "")
+ ));
+
+ $group->add(new Form_Input(
+ 'linkshare1',
+ null,
+ 'text',
+ $this->GetL_m1()
+ ));
+
+ $group->add(new Form_Input(
+ 'linkshare2',
+ null,
+ 'text',
+ $this->GetL_d()
+ ));
+ $group->add(new Form_Input(
+ 'linkshare3',
+ null,
+ 'text',
+ $this->GetL_m2()
+ ));
+
+ $group->sethelp('Bandwidth share overrides priority.' . '<br />' .
+ 'The format for service curve specifications is (m1, d, m2). m2 controls the bandwidth assigned to the queue. ' .
+ 'm1 and d are optional and can be used to control the initial bandwidth assignment. ' .
+ 'For the first d milliseconds the queue gets the bandwidth given as m1, afterwards the value given in m2.');
+
+ $section->add($group);
+
+ $sform->add($section);
+
+ return($sform);
}
function update_altq_queue_data(&$data) {
@@ -2543,7 +2636,7 @@ class cbq_queue extends priq_queue {
$tree .= " >" . $this->GetQname() . "</a>";
if (is_array($this->subqueues)) {
$tree .= "<ul>";
- foreach ($this->subqueues as $q) {
+ foreach ($this->subqueues as $q) {
$tree .= $q->build_tree();
}
$tree .= "</ul>";
@@ -2637,51 +2730,41 @@ class cbq_queue extends priq_queue {
}
function build_form() {
- $form = parent::build_form();
- $form .= "<tr>";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Bandwidth") . "</td>";
- $form .= "<td class=\"vtable\"> <input name=\"bandwidth\" id=\"bandwidth\" class=\"formfld unknown\" value=\"";
- if ($this->GetBandwidth() > 0) {
- $form .= htmlspecialchars($this->GetBandwidth());
- }
- $form .= "\" />";
- $form .= "<select name=\"bandwidthtype\" id=\"bandwidthtype\" class=\"formselect\">";
- $form .= "<option value=\"Gb\"";
- if ($this->GetBwscale() == "Gb") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Gbit/s") . "</option>";
- $form .= "<option value=\"Mb\"";
- if ($this->GetBwscale() == "Mb") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Mbit/s") . "</option>";
- $form .= "<option value=\"Kb\"";
- if ($this->GetBwscale() == "Kb") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Kbit/s") . "</option>";
- $form .= "<option value=\"b\"";
- if ($this->GetBwscale() == "b") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Bit/s") . "</option>";
- $form .= "<option value=\"%\"";
- if ($this->GetBwscale() == "%") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">%</option>";
- $form .= "</select> <br />";
- $form .= "<span class=\"vexpl\">" . gettext("Choose the amount of bandwidth for this queue");
- $form .= "</span></td></tr>";
- $form .= "<tr><td class=\"vncellreq\">" . gettext("Scheduler specific options") . "</td>";
- $form .= "<td class=\"vtable\"><input type=\"checkbox\" id=\"borrow\" name=\"borrow\"";
- if ($this->GetBorrow() == "on") {
- $form .= " checked=\"checked\" ";
- }
- $form .= " /> " . gettext("Borrow from other queues when available") . "<br /></td></tr>";
+ $sform = parent::build_form();
- return $form;
+ $section = new Form_Section('');
+
+ $group = new Form_Group('Bandwidth');
+
+ $group->add(new Form_Input(
+ 'bandwidth',
+ null,
+ 'number',
+ $this->GetBandwidth()
+ ));
+
+ $group->add(new Form_Select(
+ 'bandwidthtype',
+ null,
+ $this->GetBwscale(),
+ array('Kb' => 'Kb',
+ 'Mb' => 'Mb',
+ 'Gb' => 'Gb',
+ 'b' => 'b')
+ ));
+
+ $group->setHelp('Choose the amount of bandwidth for this queue');
+
+ $section->add($group);
+
+ $section->addInput(new Form_Checkbox(
+ 'borrow',
+ 'Scheduler option',
+ 'Borrow from other queues when available',
+ ($this->GetBorrow() == "on")
+ ));
+
+ return $sform;
}
function update_altq_queue_data(&$data) {
@@ -2888,7 +2971,7 @@ class fairq_queue extends priq_queue {
$pfq_rule .= " qlimit " . $this->GetQlimit();
}
if ($this->GetDefault() || $this->GetRed() || $this->GetRio() ||
- $this->GetEcn() || $this->GetBuckets() || $this->GetHogs() || $this->GetCodel()) {
+ $this->GetEcn() || $this->GetBuckets() || $this->GetHogs() || $this->GetCodel()) {
$pfq_rule .= " fairq ( ";
$tmpvalue = trim($this->GetRed());
if (!empty($tmpvalue)) {
@@ -2948,54 +3031,45 @@ class fairq_queue extends priq_queue {
function build_form() {
$form = parent::build_form();
- $form .= "<tr>";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Bandwidth") . "</td>";
- $form .= "<td class=\"vtable\"> <input name=\"bandwidth\" id=\"bandwidth\" class=\"formfld unknown\" value=\"";
- if ($this->GetBandwidth() > 0) {
- $form .= htmlspecialchars($this->GetBandwidth());
- }
- $form .= "\" />";
- $form .= "<select name=\"bandwidthtype\" id=\"bandwidthtype\" class=\"formselect\">";
- $form .= "<option value=\"Gb\"";
- if ($this->GetBwscale() == "Gb") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Gbit/s") . "</option>";
- $form .= "<option value=\"Mb\"";
- if ($this->GetBwscale() == "Mb") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Mbit/s") . "</option>";
- $form .= "<option value=\"Kb\"";
- if ($this->GetBwscale() == "Kb") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Kbit/s") . "</option>";
- $form .= "<option value=\"b\"";
- if ($this->GetBwscale() == "b") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Bit/s") . "</option>";
- $form .= "<option value=\"%\"";
- if ($this->GetBwscale() == "%") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">%</option>";
- $form .= "</select> <br />";
- $form .= "<span class=\"vexpl\">" . gettext("Choose the amount of bandwidth for this queue");
- $form .= "</span></td></tr>";
+
+ $section = new Form_Section('');
+
+ $group = new Form_Group('Bandwidth');
+
+ $group->add(new Form_Input(
+ 'bandwidth',
+ null,
+ 'number',
+ $this->GetBandwidth()
+ ));
+
+ $group->add(new Form_Select(
+ 'bandwidthtype',
+ null,
+ $this->GetBwscale(),
+ array('Kb' => 'Kb',
+ 'Mb' => 'Mb',
+ 'Gb' => 'Gb',
+ 'b' => 'b')
+ ));
+
+ $group->setHelp('Choose the amount of bandwidth for this queue');
+
+ $section->add($group);
+
+
$form .= "<tr><td class=\"vncellreq\">" . gettext("Scheduler specific options") . "</td>";
$form .= "<td class=\"vtable\"><table><tr><td>";
$form .= "<input id=\"buckets\" name=\"buckets\" value=\"";
$tmpvalue = trim($this->GetBuckets());
if (!empty($tmpvalue)) {
- $form .= $this->GetBuckets();
+ $form .= $this->GetBuckets();
}
$form .= "\" /> " . gettext("Number of buckets available.") . "<br /></td></tr>";
$form .= "<tr><td class=\"vtable\"><input id=\"hogs\" name=\"hogs\" value=\"";
$tmpvalue = trim($this->GetHogs());
if (!empty($tmpvalue)) {
- $form .= $this->GetHogs();
+ $form .= $this->GetHogs();
}
$form .= "\" /> " . gettext("Bandwidth limit for hosts to not saturate link.") . "<br /></td></tr>";
$form .= "</table></td></tr>";
@@ -3197,11 +3271,11 @@ class dummynet_class {
shaper_do_input_validation($data, $reqdfields, $reqdfieldsn, $input_errors);
if ($data['plr'] && (!is_numeric($data['plr']) ||
- ($data['plr'] < 0) || ($data['plr'] > 1))) {
+ ($data['plr'] < 0) || ($data['plr'] > 1))) {
$input_errors[] = gettext("Plr must be a value between 0 and 1.");
}
if ($data['buckets'] && (!is_numeric($data['buckets']) ||
- ($data['buckets'] < 16) || ($data['buckets'] > 65535))) {
+ ($data['buckets'] < 16) || ($data['buckets'] > 65535))) {
$input_errors[] = gettext("Buckets must be an integer between 16 and 65535.");
}
if ($data['qlimit'] && (!is_numeric($data['qlimit']))) {
@@ -3481,7 +3555,7 @@ class dnpipe_class extends dummynet_class {
$tree .= $this->GetQname() . "</a>";
if (is_array($this->subqueues)) {
$tree .= "<ul>";
- foreach ($this->subqueues as $q) {
+ foreach ($this->subqueues as $q) {
$tree .= $q->build_tree();
}
$tree .= "</ul>";
@@ -3592,41 +3666,29 @@ class dnpipe_class extends dummynet_class {
<script type='text/javascript'>
//<![CDATA[
var addBwRowTo = (function() {
+
return (function (tableId) {
- var d, tbody, tr, td;
- d = document;
- tbody = d.getElementById(tableId).getElementsByTagName("tbody").item(0);
- tr = d.createElement("tr");
- td = d.createElement("td");
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='bandwidth_row-" + totalrows + "' /><input size='10' type='text' class='formfld unknown' name='bandwidth" + totalrows + "' id='bandwidth" + totalrows + "' />";
- tr.appendChild(td);
- //td = d.createElement("td");
- //td.innerHTML="<input type='hidden' value='" + totalrows +"' name='burst_row-" + totalrows + "' /><input size='10' type='text' class='formfld unknown' name='burst" + totalrows + "' id='burst" + totalrows + "' />";
- //tr.appendChild(td);
- td = d.createElement("td");
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='bwtype_row-" + totalrows + "' /><select class='formselect' name='bwtype" + totalrows + "'>{$bwopt}</select>";
- tr.appendChild(td);
- td = d.createElement("td");
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='bwsched_row-" + totalrows + "' /><select class='formselect' name='bwsched" + totalrows + "'>{$schedules}</select>";
- tr.appendChild(td);
- td = d.createElement("td");
- td.rowSpan = "1";
- td.innerHTML = '<a onclick="removeBwRow(this); return false;" href="#"><img border="0" src="/themes/{$g['theme']}/images/icons/icon_x.gif" alt="remove" /></a>';
- tr.appendChild(td);
- tbody.appendChild(tr);
- totalrows++;
+
+ var table = document.getElementById(tableId);
+ var totalrows = table.rows.length -1;
+
+ var row = table.insertRow(totalrows + 1);
+ var cell1 = row.insertCell(0);
+ var cell2 = row.insertCell(1);
+ var cell3 = row.insertCell(2);
+ var cell4 = row.insertCell(3);
+
+ cell1.innerHTML = "<input type='hidden' value='" + totalrows +"' name='bandwidth_row-" + totalrows + "' /><input type='text' class='form-control' name='bandwidth" + totalrows + "' id='bandwidth" + totalrows + "' />";
+ cell2.innerHTML = "<input type='hidden' value='" + totalrows +"' name='bwtype_row-" + totalrows + "' /><select class='form-control' name='bwtype" + totalrows + "'>{$bwopt}</select>";
+ cell3.innerHTML = "<input type='hidden' value='" + totalrows +"' name='bwsched_row-" + totalrows + "' /><select class='form-control' name='bwsched" + totalrows + "'>{$schedules}</select>";
+ cell4.innerHTML = '<a class="btn btn-default" onclick="removeBwRow(this); return false;" href="#">Remove</a>';
+
});
})();
function removeBwRow(el) {
- var cel;
- while (el && el.nodeName.toLowerCase() != "tr") {
- el = el.parentNode;
- if (el && el.parentNode) {
- cel = el.getElementsByTagName("td").item(0);
- el.parentNode.removeChild(el);
- }
- }
+ var d = el.parentNode.parentNode.rowIndex;
+ document.getElementById('maintable').deleteRow(d);
}
//]]>
</script>
@@ -3636,194 +3698,231 @@ EOD;
return $javasr;
}
- function build_form() {
- global $g, $config;
+ // Compose a table of bandwidths that can then be inserted into the form using a Form_StaticText
+ // The table has been "Bootstrapped" to match the web design while maintaining compatibility with
+ // with the javascript in this class
+ function build_bwtable() {
+ global $config;
- //build list of schedules
+ $bandwidth = $this->GetBandwidth();
+ //build list of schedules
$schedules = array();
$schedules[] = "none";//leave none to leave rule enabled all the time
if (is_array($config['schedules']) && is_array($config['schedules']['schedule'])) {
foreach ($config['schedules']['schedule'] as $schedule) {
- if ($schedule['name'] <> "") {
+ if ($schedule['name'] != "") {
$schedules[] = $schedule['name'];
}
}
}
- $form = "<tr><td valign=\"middle\" class=\"vncellreq\"><br />";
- $form .= gettext("Enable");
- $form .= "</td><td class=\"vncellreq\">";
- $form .= " <input type=\"checkbox\" id=\"enabled\" name=\"enabled\" value=\"on\"";
- if ($this->GetEnabled() == "on") {
- $form .= " checked=\"checked\"";
- }
- $form .= " /><span class=\"vexpl\"> " . gettext("Enable limiter and its children") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\"><br /><span class=\"vexpl\">" . gettext("Name") . "</span></td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<input type=\"text\" id=\"newname\" name=\"newname\" value=\"";
- $form .= $this->GetQname()."\" />";
- $form .= "<input type=\"hidden\" id=\"name\" name=\"name\" value=\"";
- $form .= $this->GetQname()."\" />";
- if ($this->GetNumber() > 0) {
- $form .= "<input type=\"hidden\" id=\"number\" name=\"number\" value=\"";
- $form .= $this->GetNumber()."\" />";
- }
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Bandwidth");
- $bandwidth = $this->GetBandwidth();
- $form .= "</td><td class=\"vncellreq\">";
- $form .= "<table id='maintable'>";
- $form .= "<tbody><tr>";
- $form .= "<td width='35%'><div id='onecolumn'>Bandwidth</div></td>";
+ $form = '<div class="table-responsive">';
+ $form .= '<table id="maintable" class="table table-hover table-striped">';
+ $form .= "<thead><tr>";
+ $form .= "<th>Bandwidth</th>";
//$form .= "<td width='35%'><div id='fifthcolumn'>Burst</div></td>";
- $form .= "<td width='20%'><div id='twocolumn'>Bw type</div></td>";
- $form .= "<td width='35%' ><div id='thirdcolumn'>Schedule</div></td>";
- $form .= "<td width='5%'><div id='fourthcolumn'></div></td>";
- $form .= "</tr>";
+ $form .= "<th>Bw type</th>";
+ $form .= "<th>Schedule</th>";
+ $form .= "<th></th>";
+ $form .= "</tr></thead>";
+ $form .= "<tbody>";
+
+ // If there are no bandwidths defined, make a blank one for convenience
+ if(empty($bandwidth))
+ $bandwidth = array(0 => array('bw' => '', 'bwscale' => 'Kb', 'bwsched' => 'none'));
+
if (is_array($bandwidth)) {
foreach ($bandwidth as $bwidx => $bw) {
- $form .= "\n<tr><td width='40%'>";
- $form .= "<input class='formfld unknown' size='10' type=\"text\" id=\"bandwidth{$bwidx}\" name=\"bandwidth{$bwidx}\" value=\"{$bw['bw']}\" />";
+ $form .= '<tr>';
+ $form .= '<td class="col-xs-4">';
+ $form .= "<input class='form-control' type=\"number\" id=\"bandwidth{$bwidx}\" name=\"bandwidth{$bwidx}\" value=\"{$bw['bw']}\" />";
//$form .= "</td><td width='20%'>";
//$form .= "<input class='formfld unknown' size='10' type=\"text\" id=\"burst{$bwidx}\" name=\"burst{$bwidx}\" value=\"{$bw['burst']}\" />";
- $form .= "</td><td width='20%'>";
- $form .= "<select id=\"bwtype{$bwidx}\" name=\"bwtype{$bwidx}\" class=\"formselect\">";
+ $form .= "</td>";
+ $form .= '<td class="col-xs-4">';
+ $form .= "<select id=\"bwtype{$bwidx}\" name=\"bwtype{$bwidx}\" class=\"form-control\">";
+
foreach (array("Kb" => "Kbit/s", "Mb" => "Mbit/s", "Gb" => "Gbit/s", "b" => "Bit/s") as $bwsidx => $bwscale) {
$form .= "<option value=\"{$bwsidx}\"";
+
if ($bw['bwscale'] == $bwsidx) {
$form .= " selected=\"selected\"";
}
+
$form .= ">{$bwscale}</option>";
}
+
$form .= "</select>";
- $form .= "</td><td width='35%' >";
- $form .= "<select id=\"bwsched{$bwidx}\" name=\"bwsched{$bwidx}\" class=\"formselect\">";
+ $form .= "</td>";
+ $form .= '<td class="col-xs-4">';
+ $form .= "<select id=\"bwsched{$bwidx}\" name=\"bwsched{$bwidx}\" class=\"form-control\">";
+
foreach ($schedules as $schd) {
$selected = "";
if ($bw['bwsched'] == $schd) {
$selected = "selected=\"selected\"";
}
+
$form .= "<option value='{$schd}' {$selected}>{$schd}</option>";
}
+
$form .= "</select>";
- $form .= "</td><td width='5%' >";
- $form .= "<a onclick=\"removeBwRow(this); return false;\" href='#'><img border='0' src='/themes/{$g['theme']}/images/icons/icon_x.gif' alt='remove' /></a>";
+ $form .= "</td>";
+ $form .= '<td>';
+ $form .= '<a type="button" class="btn btn-default" onclick="removeBwRow(this); return false;">' . gettext('Remove') . '</a>';
$form .= "</td></tr>";
}
}
- $form .= "</tbody></table>";
- $form .= "<a onclick=\"javascript:addBwRowTo('maintable'); return false;\" href='#'>";
- $form .= "<img border='0' src='/themes/{$g['theme']}/images/icons/icon_plus.gif' alt='add' title='" . gettext("add another schedule") . "' /></a>";
- //$form .= "<br /><span class=\"vexpl\">" . gettext("Bandwidth is a rate (e.g. Mbit/s), burst is a total amount of data that will be transferred at full speed after an idle period.") . "</span><br />";
- $form .= "<br /><span class=\"vexpl\">" . gettext("Bandwidth is the rate (e.g. Mbit/s) to which traffic in this limiter will be restricted.") . "</span><br />";
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Mask") . "</td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<select name=\"mask\" id=\"mask\" class=\"formselect\" onchange=\"enable_maskbits();\" >";
- $form .= "<option value=\"none\"";
- $mask = $this->GetMask();
- if ($mask['type'] == "none") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">none</option>";
- $form .= "<option value=\"srcaddress\"";
- if ($mask['type'] == "srcaddress") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Source addresses") . "</option>";
- $form .= "<option value=\"dstaddress\"";
- if ($mask['type'] == "dstaddress") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Destination addresses") . "</option>";
- $form .= "</select>";
- $form .= "&nbsp;<br />";
- $form .= "<span class=\"vexpl\">" . gettext("If 'source' or 'destination' slots is chosen, \n"
- . "a dynamic pipe with the bandwidth, delay, packet loss and queue size given above will \n"
- . "be created for each source/destination IP address encountered, \n"
- . "respectively. This makes it possible to easily specify bandwidth \n"
- . "limits per host.") . "</span><br />";
- $form .= "255.255.255.255/&nbsp;<input type=\"text\" class=\"formfld unknown\" size=\"2\" id=\"maskbits\" name=\"maskbits\" value=\"";
- if ($mask['type'] <> "none") {
- $form .= $mask['bits'];
- }
- $form .= "\"";
- if ($mask['type'] == "none") {
- $form .= " disabled";
- }
- $form .= " />";
- $form .= "&nbsp; IPV4 mask bits (1-32)<br />";
- $form .= "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/&nbsp;<input type=\"text\" class=\"formfld unknown\" size=\"2\" id=\"maskbitsv6\" name=\"maskbitsv6\" value=\"";
- if ($mask['type'] <> "none") {
- $form .= $mask['bitsv6'];
- }
- $form .= "\"";
- if ($mask['type'] == "none") {
- $form .= " disabled";
- }
- $form .= " />";
- $form .= "&nbsp; IPV6 mask bits (1-128)<br />";
- $form .= "<span class=\"vexpl\">" . gettext("If 'source' or 'destination' slots is chosen, \n"
- . "leaving the mask bits blank will create one pipe per host. Otherwise specify \n"
- . "the number of 'one' bits in the subnet mask used to group multiple hosts \n"
- . "per pipe.") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Description") . "</td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<input type=\"text\" class=\"formfld unknown\" size=\"40\" id=\"description\" name=\"description\" value=\"";
- $form .= htmlspecialchars($this->GetDescription());
- $form .= "\" />";
- $form .= "<br /> <span class=\"vexpl\">";
- $form .= gettext("You may enter a description here for your reference (not parsed).") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr id=\"sprtable4\">";
- $form .= "<td></td>";
- $form .= "<td><div id=\"showadvancedboxspr\">";
- $form .= "<p><input type=\"button\" onclick=\"show_source_port_range()\"";
- $form .= " value=\"" . gettext("Show advanced options") . "\" />";
- $form .= "</p></div></td></tr>";
- $form .= "<tr style=\"display:none\" id=\"sprtable\">";
-
- $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Delay") . "</td>";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">";
- $form .= "<input name=\"delay\" type=\"text\" id=\"delay\" size=\"5\" value=\"";
- $form .= $this->GetDelay() . "\" />";
- $form .= "&nbsp;ms<br /> <span class=\"vexpl\">" . gettext("Hint: in most cases, you "
- . "should specify 0 here (or leave the field empty)") . "</span><br />";
- $form .= "</td></tr>";
- $form .= "<tr style=\"display:none\" id=\"sprtable1\">";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Packet loss rate") . "</td>";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">";
- $form .= "<input name=\"plr\" type=\"text\" id=\"plr\" size=\"5\" value=\"";
- $form .= $this->GetPlr() . "\" />";
- $form .= "&nbsp;<br /> <span class=\"vexpl\">" . gettext("Hint: in most cases, you "
- . "should specify 0 here (or leave the field empty). "
- . "A value of 0.001 means one packet in 1000 gets dropped") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr style=\"display:none\" id=\"sprtable2\">";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Queue Size") . "</td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<input type=\"text\" id=\"qlimit\" name=\"qlimit\" value=\"";
- $form .= $this->GetQlimit() . "\" />";
- $form .= "&nbsp;slots<br />";
- $form .= "<span class=\"vexpl\">" . gettext("Hint: in most cases, you "
- . "should leave the field empty. All packets in this pipe are placed into a fixed-size queue first, "
- . "then they are delayed by value specified in the Delay field, and then they "
- . "are delivered to their destination.") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr style=\"display:none\" id=\"sprtable5\">";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Bucket Size") . "</td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<input type=\"text\" id=\"buckets\" name=\"buckets\" value=\"";
- $form .= $this->GetBuckets() . "\" />";
- $form .= "&nbsp;slots<br />";
- $form .= "<span class=\"vexpl\">" . gettext("Hint: in most cases, you "
- . "should leave the field empty. It increases the hash size set.");
- $form .= "</span></td></tr>";
+ $form .= "</tbody></table></div><br />";
- return $form;
+ $form .= '<a type="button" class="btn btn-sm btn-success" onclick="javascript:addBwRowTo(\'maintable\'); return false;" >';
+ $form .= gettext("Add another schedule") . "</a>";
+
+ return($form);
+ }
+
+ function build_form() {
+ global $g, $config, $pipe, $action, $qname;
+ //build list of schedules
+ $schedules = array();
+ $schedules[] = "none";//leave none to leave rule enabled all the time
+ if (is_array($config['schedules']) && is_array($config['schedules']['schedule'])) {
+ foreach ($config['schedules']['schedule'] as $schedule) {
+ if ($schedule['name'] <> "") {
+ $schedules[] = $schedule['name'];
+ }
+ }
+ }
+
+
+ $sform = new Form();
+
+ $section = new Form_Section('Limiters');
+
+ $section->addInput(new Form_Checkbox(
+ 'enabled',
+ 'Enable',
+ 'Enable limiter and its children',
+ ($this->GetEnabled() == "on"),
+ 'on'
+ ));
+
+ $section->addInput(new Form_Input(
+ 'newname',
+ 'Name',
+ 'text',
+ $this->GetQname()
+ ));
+
+ $section->addInput(new Form_Input(
+ 'name',
+ null,
+ 'hidden',
+ $this->GetQname()
+ ));
+
+ if ($this->GetNumber() > 0) {
+ $section->addInput(new Form_Input(
+ 'number',
+ null,
+ 'hidden',
+ $this->GetNumber()
+ ));
+ }
+
+ $bandwidth = $this->GetBandwidth();
+
+ // Delete a row
+// if(isset($_GET['delbwrow']) && (count($bandwidth) > 0))
+// unset($bandwidth[$_GET['delbwrow']]);
+
+ // Add a row
+// if($_GET['newbwrow']) {
+// array_push($bandwidth, array(count($bandwidth) => array('bw' => '', 'burst' => '', 'bwscale' => 'Kb', 'bwsched' => 'none') ));
+// }
+
+ if (is_array($bandwidth)) {
+ $section->addInput(new Form_StaticText(
+ 'Bandwidth',
+ $this->build_bwtable()
+ ));
+ }
+
+ $mask = $this->GetMask();
+
+ $section->addInput(new Form_Select(
+ 'scheduler',
+ 'Mask',
+ $mask['type'],
+ array('none' => 'None', 'srcaddress' => 'Source addresses', 'dstaddress' => 'Destination addresses')
+ ))->setHelp('If "source" or "destination" slots is chosen a dynamic pipe with the bandwidth, delay, packet loss ' .
+ 'and queue size given above will be created for each source/destination IP address encountered, respectively. ' .
+ 'This makes it possible to easily specify bandwidth limits per host.');
+
+ $group = new Form_Group(null);
+
+ $group->add(new Form_Select(
+ 'maskbits',
+ null,
+ $mask['bits'],
+ array_combine(range(32, 1, -1), range(32, 1, -1))
+ ))->setHelp('IPV4 mask bits' . '<br />' . '255.255.255.255/?');
+
+ $group->add(new Form_Select(
+ 'maskbitsv6',
+ null,
+ $mask['bitsv6'],
+ array_combine(range(128, 1, -1), range(128, 1, -1))
+ ))->setHelp('IPV6 mask bits' . '<br />' . '<font face="consolas">ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/?</font>');
+
+ $section->add($group);
+
+ $section->addInput(new Form_Input(
+ 'description',
+ 'Description',
+ 'text',
+ $this->GetDescription()
+ ))->setHelp('You may enter a description here for your reference (not parsed).');
+
+ $sform->add($section);
+
+ $section = new Form_Section('Advanced options');
+
+ $section->addInput(new Form_Input(
+ 'delay',
+ 'Delay (ms)',
+ 'text',
+ $this->GetDelay() > 0 ? $this->GetDelay():null
+ ))->setHelp('In most cases, you should specify 0 here (or leave the field empty)');
+
+ $section->addInput(new Form_Input(
+ 'plr',
+ 'Packet Loss Rate',
+ 'number',
+ $this->GetPlr(),
+ ['step' => '0.001', 'min' => '0.000']
+ ))->setHelp('In most cases, you should specify 0 here (or leave the field empty). ' .
+ 'A value of 0.001 means one packet in 1000 gets dropped');
+
+ $section->addInput(new Form_Input(
+ 'qlimit',
+ 'Queue size (slots)',
+ 'number',
+ $this->GetQlimit()
+ ))->setHelp('In most cases, you should leave the field empty. All packets in this pipe are placed into a fixed-size queue first, ' .
+ 'then they are delayed by value specified in the Delay field, and then they are delivered to their destination.');
+
+ $section->addInput(new Form_Input(
+ 'buckets',
+ 'Bucket size (slots)',
+ 'number',
+ $this->GetBuckets()
+ ))->setHelp('In most cases, you should leave this field empty. It increases the hash size set');
+
+ $sform->add($section);
+
+ return($sform);
}
function wconfig() {
@@ -3889,7 +3988,7 @@ class dnqueue_class extends dummynet_class {
parent::validate_input($data, $input_errors);
if ($data['weight'] && ((!is_numeric($data['weight'])) ||
- ($data['weight'] < 1 && $data['weight'] > 100))) {
+ ($data['weight'] < 1 && $data['weight'] > 100))) {
$input_errors[] = gettext("Weight must be an integer between 1 and 100.");
}
}
@@ -4004,136 +4103,207 @@ class dnqueue_class extends dummynet_class {
return parent::build_javascript();
}
-
function build_form() {
- $form = "<tr><td valign=\"middle\" class=\"vncellreq\"><br />";
- $form .= gettext("Enable/Disable");
- $form .= "</td><td class=\"vncellreq\">";
- $form .= " <input type=\"checkbox\" id=\"enabled\" name=\"enabled\" value=\"on\"";
- if ($this->GetEnabled() == "on") {
- $form .= " checked=\"checked\"";
- }
- $form .= " /><span class=\"vexpl\"> " . gettext("Enable/Disable queue") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\"><br /><span class=\"vexpl\">" . gettext("Name") . "</span></td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<input type=\"text\" id=\"newname\" name=\"newname\" value=\"";
- $form .= $this->GetQname()."\" />";
- $form .= "<input type=\"hidden\" id=\"name\" name=\"name\" value=\"";
- $form .= $this->GetQname()."\" />";
+ global $g, $config, $pipe, $action, $qname;
+
+ //build list of schedules
+ $schedules = array();
+ $schedules[] = "none";//leave none to leave rule enabled all the time
+ if (is_array($config['schedules']) && is_array($config['schedules']['schedule'])) {
+ foreach ($config['schedules']['schedule'] as $schedule) {
+ if ($schedule['name'] <> "") {
+ $schedules[] = $schedule['name'];
+ }
+ }
+ }
+
+
+ $sform = new Form();
+
+ $section = new Form_Section('Limiters');
+
+ $section->addInput(new Form_Checkbox(
+ 'enabled',
+ 'Enable',
+ 'Enable this queue',
+ ($this->GetEnabled() == "on"),
+ 'on'
+ ));
+
+ $section->addInput(new Form_Input(
+ 'newname',
+ 'Name',
+ 'text',
+ $this->GetQname()
+ ));
+
+ $section->addInput(new Form_Input(
+ 'name',
+ null,
+ 'hidden',
+ $this->GetQname()
+ ));
+
if ($this->GetNumber() > 0) {
- $form .= "<input type=\"hidden\" id=\"number\" name=\"number\" value=\"";
- $form .= $this->GetNumber()."\" />";
- }
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Mask") . "</td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<select name=\"mask\" id=\"mask\" class=\"formselect\" onchange=\"enable_maskbits();\" >";
- $form .= "<option value=\"none\"";
- $mask = $this->GetMask();
- if ($mask['type'] == "none") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("none") . "</option>";
- $form .= "<option value=\"srcaddress\"";
- if ($mask['type'] == "srcaddress") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Source addresses") . "</option>";
- $form .= "<option value=\"dstaddress\"";
- if ($mask['type'] == "dstaddress") {
- $form .= " selected=\"selected\"";
- }
- $form .= ">" . gettext("Destination addresses") . "</option>";
- $form .= "</select>";
- $form .= "&nbsp;slots<br />";
- $form .= "<span class=\"vexpl\">" . gettext("If 'source' or 'destination' slots is chosen, \n"
- . "a dynamic pipe with the bandwidth, delay, packet loss and queue size given above will \n"
- . "be created for each source/destination IP address encountered, \n"
- . "respectively. This makes it possible to easily specify bandwidth \n"
- . "limits per host.") . "</span><br />";
- $form .= "255.255.255.255/&nbsp;<input type=\"text\" class=\"formfld unknown\" size=\"2\" id=\"maskbits\" name=\"maskbits\" value=\"";
- if ($mask['type'] <> "none") {
- $form .= $mask['bits'];
- }
- $form .= "\"";
- if ($mask['type'] == "none") {
- $form .= " disabled";
- }
- $form .= " />";
- $form .= "&nbsp; IPV4 mask bits (1-32)<br />";
- $form .= "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/&nbsp;<input type=\"text\" class=\"formfld unknown\" size=\"2\" id=\"maskbitsv6\" name=\"maskbitsv6\" value=\"";
- if ($mask['type'] <> "none") {
- $form .= $mask['bitsv6'];
- }
- $form .= "\"";
- if ($mask['type'] == "none") {
- $form .= " disabled";
- }
- $form .= " />";
- $form .= "&nbsp; IPV6 mask bits (1-128)<br />";
- $form .= "<span class=\"vexpl\">" . gettext("If 'source' or 'destination' slots is chosen, \n"
- . "leaving the mask bits blank will create one pipe per host. Otherwise specify \n"
- . "the number of 'one' bits in the subnet mask used to group multiple hosts \n"
- . "per queue.") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Description") . "</td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<input type=\"text\" id=\"description\" class=\"formfld unknown\" size=\"40\" name=\"description\" value=\"";
- $form .= htmlspecialchars($this->GetDescription());
- $form .= "\" />";
- $form .= "<br /> <span class=\"vexpl\">";
- $form .= gettext("You may enter a description here for your reference (not parsed).") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr id=\"sprtable4\">";
- $form .= "<td></td>";
- $form .= "<td><div id=\"showadvancedboxspr\">";
- $form .= "<p><input type=\"button\" onclick=\"show_source_port_range()\"";
- $form .= " value=\"" . gettext("Show advanced options") . "\" />";
- $form .= "</p></div></td></tr>";
- $form .= "<tr style=\"display:none\" id=\"sprtable\">";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Weight") . "</td>";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">";
- $form .= "<input name=\"weight\" type=\"text\" id=\"weight\" size=\"5\" value=\"";
- $form .= $this->GetWeight() . "\" />";
- $form .= "&nbsp;<br /> <span class=\"vexpl\">" . gettext("Hint: For queues under the same parent "
- . "this specifies the share that a queue gets(values range from 1 to 100, you can leave it blank otherwise)") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr style=\"display:none\" id=\"sprtable1\">";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Packet loss rate") . "</td>";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">";
- $form .= "<input name=\"plr\" type=\"text\" id=\"plr\" size=\"5\" value=\"";
- $form .= $this->GetPlr() . "\" />";
- $form .= "&nbsp;<br /> <span class=\"vexpl\">" . gettext("Hint: in most cases, you "
- . "should specify 0 here (or leave the field empty). "
- . "A value of 0.001 means one packet in 1000 gets dropped") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr style=\"display:none\" id=\"sprtable2\">";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Queue Size") . "</td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<input type=\"text\" id=\"qlimit\" name=\"qlimit\" value=\"";
- $form .= $this->GetQlimit() . "\" />";
- $form .= "&nbsp;slots<br />";
- $form .= "<span class=\"vexpl\">" . gettext("Hint: in most cases, you "
- . "should leave the field empty. All packets in this pipe are placed into a fixed-size queue first, "
- . "then they are delayed by value specified in the Delay field, and then they "
- . "are delivered to their destination.") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr style=\"display:none\" id=\"sprtable5\">";
- $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Bucket Size") . "</td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<input type=\"text\" id=\"buckets\" name=\"buckets\" value=\"";
- $form .= $this->GetBuckets() . "\" />";
- $form .= "&nbsp;" . gettext("slots") . "<br />";
- $form .= "<span class=\"vexpl\">" . gettext("Hint: in most cases, you "
- . "should leave the field empty. It increases the hash size set.");
- $form .= "</span></td></tr>";
-
- $form .= "<input type=\"hidden\" id=\"pipe\" name=\"pipe\"";
- $form .= " value=\"" . $this->GetPipe() . "\" />";
+ $section->addInput(new Form_Input(
+ 'number',
+ null,
+ 'hidden',
+ $this->GetNumber()
+ ));
+ }
- return $form;
+ $bandwidth = $this->GetBandwidth();
+
+ // Delete a row
+ if(isset($_GET['delbwrow']) && (count($bandwidth) > 0))
+ unset($bandwidth[$_GET['delbwrow']]);
+
+ // Add a row
+ if($_GET['newbwrow']) {
+ array_push($bandwidth, array(count($bandwidth) => array('bw' => '', 'burst' => '', 'bwscale' => 'Kb', 'bwsched' => 'none') ));
+
+ }
+
+ if (is_array($bandwidth)) {
+ $row = 0;
+ $numrows = count($bandwidth) - 1;
+
+ if($numrows >= 0) {
+ foreach ($bandwidth as $bwidx => $bw) {
+ $group = new Form_Group($row == 0 ? 'Bandwidth':null);
+
+ $group->add(new Form_Input(
+ 'bandwidth' . $bwidx,
+ null,
+ 'text',
+ $bw['bw']
+ ))->setHelp($row == $numrows ? 'Bandwidth':null);
+
+ $group->add(new Form_Select(
+ 'bwtype' . $bwidx,
+ null,
+ $bw['bwscale'],
+ array('Kb' => 'Kbit/s', 'Mb' => 'Mbit/s', 'Gb' => 'Gbit/s', 'b' => 'Bit/s')
+ ))->setHelp($row == $numrows ? 'Bw Type':null);;
+
+ $group->add(new Form_Select(
+ 'bwsched' . $bwidx,
+ null,
+ $bw['bwsched'],
+ $schedules
+ ))->setHelp($row == $numrows ? 'Schedule':null);;
+
+ $group->add(new Form_Button(
+ 'delete' + $bwidx,
+ 'Delete',
+ 'firewall_shaper_vinterface.php?pipe=' . $pipe . '&queue=' . $qname . '&action=' . $action . '&delbwrow=' . $bwidx
+ ))->removeClass('btn-primary')->addClass('btn-danger btn-sm');
+
+ if($row == $numrows)
+ $group->setHelp('Bandwidth is the rate (e.g. Mbit/s) to which traffic in this limiter will be restricted.');
+
+ $section->add($group);
+ $row++;
+ }
+ }
+ else { // The $bandwidth array exists, but is empty
+ $section->addInput(new Form_StaticText(
+ 'Bandwidth',
+ 'No schedules configured for this limiter.'
+ ));
+ }
+
+ $section->addInput(new Form_Button(
+ 'addsched',
+ 'Add new schedule',
+ 'firewall_shaper_vinterface.php?pipe=' . $pipe . '&queue=' . $qname . '&action=' . $action . '&newbwrow=yes'
+ ))->removeClass('btn-primary')->addClass('btn-success btn-sm');
+ }
+
+ $mask = $this->GetMask();
+ $section->addInput(new Form_Select(
+ 'scheduler',
+ 'Mask',
+ $mask['type'],
+ array('none' => 'None', 'srcaddress' => 'Source addresses', 'dstaddress' => 'Destination addresses')
+ ))->setHelp('If "source" or "destination" slots is chosen a dynamic pipe with the bandwidth, delay, packet loss ' .
+ 'and queue size given above will be created for each source/destination IP address encountered, respectively. ' .
+ 'This makes it possible to easily specify bandwidth limits per host.');
+
+ $group = new Form_Group(null);
+
+ $group->add(new Form_Select(
+ 'maskbits',
+ null,
+ $mask['bits'],
+ array_combine(range(32, 1, -1), range(32, 1, -1))
+ ))->setHelp('IPV4 mask bits' . '<br />' . '255.255.255.255/?');
+
+ $group->add(new Form_Select(
+ 'maskbitsv6',
+ null,
+ $mask['bitsv6'],
+ array_combine(range(128, 1, -1), range(128, 1, -1))
+ ))->setHelp('IPV6 mask bits' . '<br />' . '<font face="consolas">ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/?</font>');
+
+ $section->add($group);
+
+ $section->addInput(new Form_Input(
+ 'description',
+ 'Description',
+ 'text',
+ $this->GetDescription()
+ ))->setHelp('You may enter a description here for your reference (not parsed).');
+
+ $sform->add($section);
+
+ $section = new Form_Section('Advanced options');
+
+ $section->addInput(new Form_Input(
+ 'weight',
+ 'Weight',
+ 'number',
+ $this->GetWeight(),
+ ['min' => '1', 'max' => '100']
+ ))->setHelp('For queues under the same parent this specifies the share that a queue gets(values range from 1 to 100),' .
+ ' you can leave it blank otherwise');
+
+ $section->addInput(new Form_Input(
+ 'plr',
+ 'Packet Loss Rate',
+ 'number',
+ $this->GetPlr(),
+ ['step' => '0.001', 'min' => '0.000']
+ ))->setHelp('In most cases, you should specify 0 here (or leave the field empty). ' .
+ 'A value of 0.001 means one packet in 1000 gets dropped');
+
+ $section->addInput(new Form_Input(
+ 'qlimit',
+ 'Queue size (slots)',
+ 'number',
+ $this->GetQlimit()
+ ))->setHelp('In most cases, you should leave the field empty. All packets in this pipe are placed into a fixed-size queue first, ' .
+ 'then they are delayed by value specified in the Delay field, and then they are delivered to their destination.');
+
+ $section->addInput(new Form_Input(
+ 'buckets',
+ 'Bucket size (slots)',
+ 'number',
+ $this->GetBuckets()
+ ))->setHelp('In most cases, you should leave this field empty. It increases the hash size set');
+
+ $section->addInput(new Form_Input(
+ 'pipe',
+ null,
+ 'hidden',
+ $this->GetPipe()
+ ));
+
+ $sform->add($section);
+
+ return($sform);
}
function update_dn_data(&$data) {
@@ -4263,28 +4433,37 @@ class layer7 {
}
function build_form() {
- $form = "<tr><td valign=\"middle\" class=\"vncellreq\"><br />";
- $form .= gettext("Enable/Disable");
- $form .= "</td><td class=\"vncellreq\">";
- $form .= " <input type=\"checkbox\" id=\"enabled\" name=\"enabled\" value=\"on\" ";
- if ($this->GetREnabled() == "on") {
- $form .= "checked=\"checked\"";
- }
- $form .= " /><span class=\"vexpl\"> " . gettext("Enable/Disable layer7 Container") . "</span>";
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\"><br /><span class=\"vexpl\">" . gettext("Name") . "</span></td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<input type=\"text\" id=\"container\" name=\"container\" value=\"";
- $form .= $this->GetRName()."\" />";
- $form .= "</td></tr>";
- $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Description") . "</td>";
- $form .= "<td class=\"vncellreq\">";
- $form .= "<input type=\"text\" class=\"formfld unknown\" size=\"40\" id=\"description\" name=\"description\" value=\"";
- $form .= htmlspecialchars($this->GetRDescription());
- $form .= "\" />";
- $form .= "<br /> <span class=\"vexpl\">";
- $form .= gettext("You may enter a description here for your reference (not parsed).") . "</span>";
- $form .= "</td></tr>";
+
+ $form = new Form(new Form_Button(
+ 'Submit',
+ 'Save'
+ ));
+
+ $section = new Form_Section('Traffic Shaper');
+
+ $section->addInput(new Form_Checkbox(
+ 'enabled',
+ 'Enable/Disable',
+ 'Enable/disable discipline and its children',
+ ($this->GetREnabled() == "on"),
+ 'on'
+ ));
+
+ $section->addInput(new Form_Input(
+ 'container',
+ 'Name',
+ 'text',
+ $this->GetRName()
+ ));
+
+ $section->addInput(new Form_Input(
+ 'description',
+ 'Description',
+ 'text',
+ $this->GetRDescription()
+ ))->setHelp('You may enter a description here for your reference (not parsed).');
+
+ $form->add($section);
return $form;
}
@@ -4483,7 +4662,7 @@ function read_layer7_config() {
continue; /* XXX: grrrrrr at php */
}
$root =& new layer7();
- $root->ReadConfig($conf['name'], $conf);
+ $root->ReadConfig($conf['name'],$conf);
$layer7_rules_list[$root->GetRName()] = &$root;
}
}
@@ -4524,8 +4703,8 @@ function generate_layer7_files() {
$rules = $l7rules->build_l7_rules();
- $fp = fopen($path, 'w');
- fwrite($fp, $rules);
+ $fp = fopen($path,'w');
+ fwrite($fp,$rules);
fclose($fp);
}
}
@@ -4780,7 +4959,7 @@ function read_dummynet_config() {
$dummynet_pipe_list = array();
if (!is_array($config['dnshaper']['queue']) ||
- !count($config['dnshaper']['queue'])) {
+ !count($config['dnshaper']['queue'])) {
return;
}
@@ -4816,7 +4995,7 @@ function get_interface_list_to_show() {
foreach ($shaperIFlist as $shif => $shDescr) {
if ($altq_list_queues[$shif]) {
continue;
- } else {
+ } else {
if (!is_altq_capable(get_real_interface($shif))) {
continue;
}
@@ -4933,37 +5112,40 @@ function build_iface_without_this_queue($iface, $qname) {
global $shaperIFlist;
$altq =& $altq_list_queues[$iface];
+
if ($altq) {
- $scheduler = ": " . $altq->GetScheduler();
- }
- $form = "<tr><td width=\"20%\" >";
- $form .= "<a href=\"firewall_shaper.php?interface=" . $iface . "&amp;queue=" . $iface."&amp;action=show\">". $shaperIFlist[$iface] . $scheduler."</a>";
- $form .= "</td></tr>";
- $form .= "<tr><td width=\"100%\" class=\"vncellreq\">";
- $form .= "<a href=\"firewall_shaper_queues.php?interface=";
- $form .= $iface . "&amp;queue=". $qname . "&amp;action=add\">";
- $form .= "<img src=\"";
- $form .= "./themes/".$g['theme']."/images/icons/icon_plus.gif\"";
- $form .= " width=\"17\" height=\"17\" border=\"0\" title=\"Clone shaper/queue on this interface\" alt=\"clone\" />";
- $form .= gettext(" Clone shaper/queue on this interface") . "</a></td></tr>";
+ $scheduler = $altq->GetScheduler();
+ }
+
+ $form = '<dl class="dl-horizontal">';
+
+ $form .= ' <dt>';
+ $form .= ' <a href="firewall_shaper.php?interface=' . $iface . '&amp;queue=' . $iface . '&amp;action=show">' . $shaperIFlist[$iface] . '</a>';
+ $form .= ' </dt>';
+ $form .= ' <dd>';
+ $form .= $scheduler;
+ $form .= ' </dd>';
+
+ $form .= ' <dt>';
+ $form .= 'Clone';
+ $form .= ' </dt>';
+ $form .= ' <dd>';
+ $form .= '<a class="btn btn-info btn-xs" href="firewall_shaper_queues.php?interface=';
+ $form .= $iface . '&amp;queue=';
+ $form .= $qname . '&amp;action=add">';
+ $form .= gettext("Clone shaper on the I/F") . '</a>';
+ $form .= ' </dd>';
+
+ $form .= '</dl>';
return $form;
}
+$default_shaper_msg = sprintf(gettext("Welcome to the %s Traffic Shaper."), $g['product_name']) . "</b><br />";
+$default_shaper_msg .= gettext("The tree on the left helps you navigate through the queues.<br />"
+ . "Buttons at the bottom represent queue actions and are activated accordingly.");
-$default_shaper_msg = "<tr><td align=\"center\" width=\"80%\">";
-$default_shaper_msg .= "<span class=\"vexpl\"><strong><b>" . sprintf(gettext("Welcome to the %s Traffic Shaper."), $g['product_name']) . "</b><br />";
-$default_shaper_msg .= gettext("The tree on the left helps you navigate through the queues <br />"
- . "buttons at the bottom represent queue actions and are activated accordingly.");
-$default_shaper_msg .= "</strong></span>";
-$default_shaper_msg .= "</td></tr>";
-
-$dn_default_shaper_msg = "<tr><td align=\"center\" width=\"80%\">";
-$dn_default_shaper_msg .= "<span class=\"vexpl\"><strong><b>" . sprintf(gettext("Welcome to the %s Traffic Shaper."), $g['product_name']) . "</b><br />";
-$dn_default_shaper_msg .= gettext("The tree on the left helps you navigate through the queues <br />"
- . "buttons at the bottom represent queue actions and are activated accordingly.");
-$dn_default_shaper_msg .= "</strong></span>";
-$dn_default_shaper_msg .= "</td></tr>";
+$dn_default_shaper_msg = $default_shaper_msg;
?>
diff --git a/src/etc/inc/simplepie/simplepie.inc b/src/etc/inc/simplepie/simplepie.inc
index 7052eb4..32f158e 100644
--- a/src/etc/inc/simplepie/simplepie.inc
+++ b/src/etc/inc/simplepie/simplepie.inc
@@ -4010,16 +4010,16 @@ class SimplePie_Item
$temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
if (sizeof($temp) > 0)
{
- (int) $seconds = array_pop($temp);
+ $seconds = (int)array_pop($temp);
}
if (sizeof($temp) > 0)
{
- (int) $minutes = array_pop($temp);
+ $minutes = (int)array_pop($temp);
$seconds += $minutes * 60;
}
if (sizeof($temp) > 0)
{
- (int) $hours = array_pop($temp);
+ $hours = (int)array_pop($temp);
$seconds += $hours * 3600;
}
unset($temp);
@@ -9132,8 +9132,6 @@ class SimplePie_Misc
return 'Adobe-Symbol-Encoding';
case 'ami1251':
- case 'ami1251':
- case 'amiga1251':
case 'amiga1251':
return 'Amiga-1251';
@@ -9228,7 +9226,6 @@ class SimplePie_Misc
case 'csiso646danish':
case 'dk':
case 'ds2089':
- case 'ds2089':
case 'iso646dk':
return 'DS_2089';
@@ -9725,7 +9722,6 @@ class SimplePie_Misc
return 'IBM1026';
case 'ibm1047':
- case 'ibm1047':
return 'IBM1047';
case 'csiso143iecp271':
@@ -9891,7 +9887,6 @@ class SimplePie_Misc
return 'ISO-8859-14';
case 'iso885915':
- case 'iso885915':
case 'latin9':
return 'ISO-8859-15';
@@ -10439,9 +10434,6 @@ class SimplePie_Misc
case 'windows1254':
return 'Windows-1254';
- case 'windows1254':
- return 'windows-1254';
-
case 'windows1255':
return 'windows-1255';
@@ -11152,7 +11144,6 @@ class SimplePie_Decode_HTML_Entities
case "\x09":
case "\x0A":
case "\x0B":
- case "\x0B":
case "\x0C":
case "\x20":
case "\x3C":
diff --git a/src/etc/inc/upgrade_config.inc b/src/etc/inc/upgrade_config.inc
index 200b3a6..f5268d2 100644
--- a/src/etc/inc/upgrade_config.inc
+++ b/src/etc/inc/upgrade_config.inc
@@ -743,7 +743,7 @@ function upgrade_042_to_043() {
$gateways = array();
$i = 0;
foreach ($iflist as $ifname => $interface) {
- if (!interface_has_gateway($ifname)) {
+ if (! interface_has_gateway($ifname)) {
continue;
}
$config['gateways']['gateway_item'][$i] = array();
@@ -1087,7 +1087,7 @@ function upgrade_046_to_047() {
$type = $tunnel['local-subnet']['network'];
}
if ($tunnel['local-subnet']['address']) {
- list($address, $netbits) = explode("/", $tunnel['local-subnet']['address']);
+ list($address,$netbits) = explode("/",$tunnel['local-subnet']['address']);
if (is_null($netbits)) {
$type = "address";
} else {
@@ -1097,18 +1097,18 @@ function upgrade_046_to_047() {
switch ($type) {
case "address":
- $ph2ent['localid'] = array('type' => $type, 'address' => $address);
+ $ph2ent['localid'] = array('type' => $type,'address' => $address);
break;
case "network":
- $ph2ent['localid'] = array('type' => $type, 'address' => $address, 'netbits' => $netbits);
+ $ph2ent['localid'] = array('type' => $type,'address' => $address,'netbits' => $netbits);
break;
default:
$ph2ent['localid'] = array('type' => $type);
break;
}
- list($address, $netbits) = explode("/", $tunnel['remote-subnet']);
- $ph2ent['remoteid'] = array('type' => 'network', 'address' => $address, 'netbits' => $netbits);
+ list($address,$netbits) = explode("/",$tunnel['remote-subnet']);
+ $ph2ent['remoteid'] = array('type' => 'network','address' => $address,'netbits' => $netbits);
$ph2ent['protocol'] = $tunnel['p2']['protocol'];
@@ -1407,7 +1407,7 @@ function upgrade_048_to_049() {
$group['member'] = array();
foreach ($config['system']['user'] as & $user) {
$groupnames = explode(",", $user['groupname']);
- if (in_array($group['name'], $groupnames)) {
+ if (in_array($group['name'],$groupnames)) {
$group['member'][] = $user['uid'];
}
}
@@ -1429,7 +1429,7 @@ function upgrade_048_to_049() {
/* insert new all group */
$groups = Array();
$groups[] = $all;
- $groups = array_merge($config['system']['group'], $groups);
+ $groups = array_merge($config['system']['group'],$groups);
$config['system']['group'] = $groups;
}
@@ -1682,7 +1682,7 @@ function upgrade_051_to_052() {
$tmpstr = "";
foreach ($tmpcstmopts as $tmpcstmopt) {
$tmpstr = str_replace(" ", "", $tmpcstmopt);
- if (substr($tmpstr, 0, 6) == "devtun") {
+ if (substr($tmpstr,0 ,6) == "devtun") {
$assigned_if = substr($tmpstr, 3);
continue;
} else if (substr($tmpstr, 0, 5) == "local") {
@@ -1787,7 +1787,7 @@ function upgrade_051_to_052() {
$tmpstr = "";
foreach ($tmpcstmopts as $tmpcstmopt) {
$tmpstr = str_replace(" ", "", $tmpcstmopt);
- if (substr($tmpstr, 0, 6) == "devtun") {
+ if (substr($tmpstr,0 ,6) == "devtun") {
$assigned_if = substr($tmpstr, 3);
continue;
} else if (substr($tmpstr, 0, 5) == "local") {
@@ -1965,7 +1965,7 @@ function upgrade_053_to_054() {
$gateway_group_arr = array();
$gateways = return_gateways_array();
$group_name_changes = array();
- if (!is_array($config['gateways']['gateway_item'])) {
+ if (! is_array($config['gateways']['gateway_item'])) {
$config['gateways']['gateway_item'] = array();
}
@@ -2415,7 +2415,7 @@ function upgrade_062_to_063() {
function upgrade_063_to_064() {
global $config;
- $j = 0;
+ $j=0;
$ifcfg = &$config['interfaces'];
if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
@@ -2448,7 +2448,7 @@ function upgrade_063_to_064() {
if (isset($ifinfo['ptpid'])) {
continue;
}
- $ppp['ptpid'] = $j;
+ $ppp['ptpid'] = $j;
$ppp['type'] = $ifinfo['ipaddr'];
$ppp['if'] = $ifinfo['ipaddr'].$j;
$ppp['ports'] = $ifinfo['if'];
@@ -3606,7 +3606,6 @@ function upgrade_110_to_111() {
"active_interface" => "network_interface",
"query_interface" => "outgoing_interface",
"unbound_verbosity" => "log_verbosity",
- "unbound_verbosity" => "log_verbosity",
"msg_cache_size" => "msgcachesize",
"outgoing_num_tcp" => "outgoing_num_tcp",
"incoming_num_tcp" => "incoming_num_tcp",
diff --git a/src/usr/local/www/bandwidth_by_ip.php b/src/usr/local/www/bandwidth_by_ip.php
index 39f9a01..9f8cc6c 100755
--- a/src/usr/local/www/bandwidth_by_ip.php
+++ b/src/usr/local/www/bandwidth_by_ip.php
@@ -1,6 +1,8 @@
<?php
/*
- bandwidth_by_ip.php
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ *
*/
/*
@@ -109,8 +111,8 @@ for ($x=2; $x<12; $x++) {
if ($bandwidthinfo != "") {
$infoarray = explode (":", $bandwidthinfo);
if (($filter == "all") ||
- (($filter == "local") && (ip_in_subnet($infoarray[0], $intsubnet))) ||
- (($filter == "remote") && (!ip_in_subnet($infoarray[0], $intsubnet)))) {
+ (($filter == "local") && (ip_in_subnet($infoarray[0], $intsubnet))) ||
+ (($filter == "remote") && (!ip_in_subnet($infoarray[0], $intsubnet)))) {
if ($hostipformat == "") {
// pass back just the raw IP address
$addrdata = $infoarray[0];
@@ -144,7 +146,7 @@ unset($bandwidthinfo, $_grb);
unset($listedIPs);
//no bandwidth usage found
-if ($someinfo == false) {
+if ($someinfo == false)
echo gettext("no info");
-}
-?>
+
+?> \ No newline at end of file
diff --git a/src/usr/local/www/bootstrap/css/bootstrap-theme.min.css b/src/usr/local/www/bootstrap/css/bootstrap-theme.min.css
new file mode 100644
index 0000000..cefa3d1
--- /dev/null
+++ b/src/usr/local/www/bootstrap/css/bootstrap-theme.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary:disabled,.btn-primary[disabled]{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file
diff --git a/src/usr/local/www/bootstrap/css/bootstrap.min.css b/src/usr/local/www/bootstrap/css/bootstrap.min.css
new file mode 100644
index 0000000..cd1c616
--- /dev/null
+++ b/src/usr/local/www/bootstrap/css/bootstrap.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file
diff --git a/src/usr/local/www/bootstrap/css/pfSense.css b/src/usr/local/www/bootstrap/css/pfSense.css
new file mode 100644
index 0000000..1384543
--- /dev/null
+++ b/src/usr/local/www/bootstrap/css/pfSense.css
@@ -0,0 +1,150 @@
+@import url("/bootstrap/css/bootstrap.min.css");
+@import url("/bootstrap/css/bootstrap-theme.min.css");
+@import url("/bootstrap/glyphicons/glyphicons-halflings.css");
+
+html {
+ position: relative;
+ min-height: 100%;
+}
+
+body {
+ padding-top: 0px;
+ margin-bottom: 80px;
+}
+
+.navbar-brand {
+ padding-top: 0;
+}
+
+body.no-menu #jumbotron {
+ padding: 100px 0;
+ background-image: linear-gradient(to bottom,#3c3c3c 0,#222 100%)
+}
+
+body.no-menu {
+ background: url("/logo-black.png") no-repeat center 30px;
+ padding-top: 70px;
+}
+
+body.no-menu #jumbotron {
+ margin-top: 75px;
+}
+
+body#index .icons {
+ float: right;
+}
+
+.ui-sortable-handle {
+ cursor: move;
+}
+
+tr.disabled td,
+tr.disabled th {
+ opacity: .5;
+}
+
+.contains-table table {
+ border: 1px solid #ddd;
+}
+
+.nav-pills {
+ margin-bottom: 20px;
+}
+
+/** Content structure */
+.table-responsive {
+ clear: both;
+ margin-bottom: 0px;
+}
+
+.form-horizontal {
+ margin-bottom: 20px;
+ overflow: hidden;
+}
+
+.action-buttons {
+ text-align: right;
+ margin-bottom: 20px;
+}
+
+/** Form validation */
+.input-errors ul {
+ margin-top: 20px;
+}
+
+/** Page header with title and breadcrumb */
+.header {
+ position: relative;
+}
+
+.header .page-header {
+ margin-top: 0;
+}
+
+.header .context-links {
+ position: absolute;
+ right: 0;
+ top: 15px;
+}
+
+.header .context-links li {
+ float: left;
+ display: inline;
+ margin-left: 10px;
+}
+
+/** Form tweaks */
+form .btn + .btn {
+ margin-left: 5px;
+}
+
+.input-group-inbetween {
+ border-left: 0;
+}
+
+.user-duplication .controls {
+ margin-top: 10px;
+}
+
+.checkbox.multi label {
+ display: block;
+}
+
+.checkbox.multi .btn {
+ margin-top: 5px;
+}
+
+.col-sm-10 .form-control {
+ width: calc(50% - 15px); /* substract 15px to match a .col-sm-5; which satisfies my OCD */
+}
+
+@media (max-width: 991px) {
+ .col-sm-10 .form-control {
+ width: 100%;
+ }
+}
+
+/** Page footer */
+.footer {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 60px;
+ background-color: #f5f5f5;
+ padding-top: 21px;
+ text-align: center;
+}
+
+/** Homepage / dashboard */
+#widgetSequence {
+ position: fixed;
+ left: 0;
+ bottom: 0;
+ padding: 20px 0;
+ width: 100%;
+ z-index: 100;
+ text-align: center;
+ background: rgba(255, 255, 255, 0.6);
+ border-top: 1px solid #ddd;
+} \ No newline at end of file
diff --git a/src/usr/local/www/bootstrap/glyphicons/glyphicons-halflings.css b/src/usr/local/www/bootstrap/glyphicons/glyphicons-halflings.css
new file mode 100644
index 0000000..3794571
--- /dev/null
+++ b/src/usr/local/www/bootstrap/glyphicons/glyphicons-halflings.css
@@ -0,0 +1,582 @@
+/*
+manual-cp-man strikes again
+
+http://getbootstrap.com/2.3.2/assets/css/bootstrap.css
+*/
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline-block;
+ width: 14px;
+ height: 14px;
+ margin-top: 1px;
+ *margin-right: .3em;
+ line-height: 14px;
+ vertical-align: text-top;
+ background-image: url("/bootstrap/glyphicons/glyphicons-halflings.png");
+ background-position: 14px 14px;
+ background-repeat: no-repeat;
+}
+
+.icon-glass {
+ background-position: 0 0;
+}
+
+.icon-music {
+ background-position: -24px 0;
+}
+
+.icon-search {
+ background-position: -48px 0;
+}
+
+.icon-envelope {
+ background-position: -72px 0;
+}
+
+.icon-heart {
+ background-position: -96px 0;
+}
+
+.icon-star {
+ background-position: -120px 0;
+}
+
+.icon-star-empty {
+ background-position: -144px 0;
+}
+
+.icon-user {
+ background-position: -168px 0;
+}
+
+.icon-film {
+ background-position: -192px 0;
+}
+
+.icon-th-large {
+ background-position: -216px 0;
+}
+
+.icon-th {
+ background-position: -240px 0;
+}
+
+.icon-th-list {
+ background-position: -264px 0;
+}
+
+.icon-ok {
+ background-position: -288px 0;
+}
+
+.icon-remove {
+ background-position: -312px 0;
+}
+
+.icon-zoom-in {
+ background-position: -336px 0;
+}
+
+.icon-zoom-out {
+ background-position: -360px 0;
+}
+
+.icon-off {
+ background-position: -384px 0;
+}
+
+.icon-signal {
+ background-position: -408px 0;
+}
+
+.icon-cog {
+ background-position: -432px 0;
+}
+
+.icon-trash {
+ background-position: -456px 0;
+}
+
+.icon-home {
+ background-position: 0 -24px;
+}
+
+.icon-file {
+ background-position: -24px -24px;
+}
+
+.icon-time {
+ background-position: -48px -24px;
+}
+
+.icon-road {
+ background-position: -72px -24px;
+}
+
+.icon-download-alt {
+ background-position: -96px -24px;
+}
+
+.icon-download {
+ background-position: -120px -24px;
+}
+
+.icon-upload {
+ background-position: -144px -24px;
+}
+
+.icon-inbox {
+ background-position: -168px -24px;
+}
+
+.icon-play-circle {
+ background-position: -192px -24px;
+}
+
+.icon-repeat {
+ background-position: -216px -24px;
+}
+
+.icon-refresh {
+ background-position: -240px -24px;
+}
+
+.icon-list-alt {
+ background-position: -264px -24px;
+}
+
+.icon-lock {
+ background-position: -287px -24px;
+}
+
+.icon-flag {
+ background-position: -312px -24px;
+}
+
+.icon-headphones {
+ background-position: -336px -24px;
+}
+
+.icon-volume-off {
+ background-position: -360px -24px;
+}
+
+.icon-volume-down {
+ background-position: -384px -24px;
+}
+
+.icon-volume-up {
+ background-position: -408px -24px;
+}
+
+.icon-qrcode {
+ background-position: -432px -24px;
+}
+
+.icon-barcode {
+ background-position: -456px -24px;
+}
+
+.icon-tag {
+ background-position: 0 -48px;
+}
+
+.icon-tags {
+ background-position: -25px -48px;
+}
+
+.icon-book {
+ background-position: -48px -48px;
+}
+
+.icon-bookmark {
+ background-position: -72px -48px;
+}
+
+.icon-print {
+ background-position: -96px -48px;
+}
+
+.icon-camera {
+ background-position: -120px -48px;
+}
+
+.icon-font {
+ background-position: -144px -48px;
+}
+
+.icon-bold {
+ background-position: -167px -48px;
+}
+
+.icon-italic {
+ background-position: -192px -48px;
+}
+
+.icon-text-height {
+ background-position: -216px -48px;
+}
+
+.icon-text-width {
+ background-position: -240px -48px;
+}
+
+.icon-align-left {
+ background-position: -264px -48px;
+}
+
+.icon-align-center {
+ background-position: -288px -48px;
+}
+
+.icon-align-right {
+ background-position: -312px -48px;
+}
+
+.icon-align-justify {
+ background-position: -336px -48px;
+}
+
+.icon-list {
+ background-position: -360px -48px;
+}
+
+.icon-indent-left {
+ background-position: -384px -48px;
+}
+
+.icon-indent-right {
+ background-position: -408px -48px;
+}
+
+.icon-facetime-video {
+ background-position: -432px -48px;
+}
+
+.icon-picture {
+ background-position: -456px -48px;
+}
+
+.icon-pencil {
+ background-position: 0 -72px;
+}
+
+.icon-map-marker {
+ background-position: -24px -72px;
+}
+
+.icon-adjust {
+ background-position: -48px -72px;
+}
+
+.icon-tint {
+ background-position: -72px -72px;
+}
+
+.icon-edit {
+ background-position: -96px -72px;
+}
+
+.icon-share {
+ background-position: -120px -72px;
+}
+
+.icon-check {
+ background-position: -144px -72px;
+}
+
+.icon-move {
+ background-position: -168px -72px;
+}
+
+.icon-step-backward {
+ background-position: -192px -72px;
+}
+
+.icon-fast-backward {
+ background-position: -216px -72px;
+}
+
+.icon-backward {
+ background-position: -240px -72px;
+}
+
+.icon-play {
+ background-position: -264px -72px;
+}
+
+.icon-pause {
+ background-position: -288px -72px;
+}
+
+.icon-stop {
+ background-position: -312px -72px;
+}
+
+.icon-forward {
+ background-position: -336px -72px;
+}
+
+.icon-fast-forward {
+ background-position: -360px -72px;
+}
+
+.icon-step-forward {
+ background-position: -384px -72px;
+}
+
+.icon-eject {
+ background-position: -408px -72px;
+}
+
+.icon-chevron-left {
+ background-position: -432px -72px;
+}
+
+.icon-chevron-right {
+ background-position: -456px -72px;
+}
+
+.icon-plus-sign {
+ background-position: 0 -96px;
+}
+
+.icon-minus-sign {
+ background-position: -24px -96px;
+}
+
+.icon-remove-sign {
+ background-position: -48px -96px;
+}
+
+.icon-ok-sign {
+ background-position: -72px -96px;
+}
+
+.icon-question-sign {
+ background-position: -96px -96px;
+}
+
+.icon-info-sign {
+ background-position: -120px -96px;
+}
+
+.icon-screenshot {
+ background-position: -144px -96px;
+}
+
+.icon-remove-circle {
+ background-position: -168px -96px;
+}
+
+.icon-ok-circle {
+ background-position: -192px -96px;
+}
+
+.icon-ban-circle {
+ background-position: -216px -96px;
+}
+
+.icon-arrow-left {
+ background-position: -240px -96px;
+}
+
+.icon-arrow-right {
+ background-position: -264px -96px;
+}
+
+.icon-arrow-up {
+ background-position: -289px -96px;
+}
+
+.icon-arrow-down {
+ background-position: -312px -96px;
+}
+
+.icon-share-alt {
+ background-position: -336px -96px;
+}
+
+.icon-resize-full {
+ background-position: -360px -96px;
+}
+
+.icon-resize-small {
+ background-position: -384px -96px;
+}
+
+.icon-plus {
+ background-position: -408px -96px;
+}
+
+.icon-minus {
+ background-position: -433px -96px;
+}
+
+.icon-asterisk {
+ background-position: -456px -96px;
+}
+
+.icon-exclamation-sign {
+ background-position: 0 -120px;
+}
+
+.icon-gift {
+ background-position: -24px -120px;
+}
+
+.icon-leaf {
+ background-position: -48px -120px;
+}
+
+.icon-fire {
+ background-position: -72px -120px;
+}
+
+.icon-eye-open {
+ background-position: -96px -120px;
+}
+
+.icon-eye-close {
+ background-position: -120px -120px;
+}
+
+.icon-warning-sign {
+ background-position: -144px -120px;
+}
+
+.icon-plane {
+ background-position: -168px -120px;
+}
+
+.icon-calendar {
+ background-position: -192px -120px;
+}
+
+.icon-random {
+ width: 16px;
+ background-position: -216px -120px;
+}
+
+.icon-comment {
+ background-position: -240px -120px;
+}
+
+.icon-magnet {
+ background-position: -264px -120px;
+}
+
+.icon-chevron-up {
+ background-position: -288px -120px;
+}
+
+.icon-chevron-down {
+ background-position: -313px -119px;
+}
+
+.icon-retweet {
+ background-position: -336px -120px;
+}
+
+.icon-shopping-cart {
+ background-position: -360px -120px;
+}
+
+.icon-folder-close {
+ width: 16px;
+ background-position: -384px -120px;
+}
+
+.icon-folder-open {
+ width: 16px;
+ background-position: -408px -120px;
+}
+
+.icon-resize-vertical {
+ background-position: -432px -119px;
+}
+
+.icon-resize-horizontal {
+ background-position: -456px -118px;
+}
+
+.icon-hdd {
+ background-position: 0 -144px;
+}
+
+.icon-bullhorn {
+ background-position: -24px -144px;
+}
+
+.icon-bell {
+ background-position: -48px -144px;
+}
+
+.icon-certificate {
+ background-position: -72px -144px;
+}
+
+.icon-thumbs-up {
+ background-position: -96px -144px;
+}
+
+.icon-thumbs-down {
+ background-position: -120px -144px;
+}
+
+.icon-hand-right {
+ background-position: -144px -144px;
+}
+
+.icon-hand-left {
+ background-position: -168px -144px;
+}
+
+.icon-hand-up {
+ background-position: -192px -144px;
+}
+
+.icon-hand-down {
+ background-position: -216px -144px;
+}
+
+.icon-circle-arrow-right {
+ background-position: -240px -144px;
+}
+
+.icon-circle-arrow-left {
+ background-position: -264px -144px;
+}
+
+.icon-circle-arrow-up {
+ background-position: -288px -144px;
+}
+
+.icon-circle-arrow-down {
+ background-position: -312px -144px;
+}
+
+.icon-globe {
+ background-position: -336px -144px;
+}
+
+.icon-wrench {
+ background-position: -360px -144px;
+}
+
+.icon-tasks {
+ background-position: -384px -144px;
+}
+
+.icon-filter {
+ background-position: -408px -144px;
+}
+
+.icon-briefcase {
+ background-position: -432px -144px;
+}
+
+.icon-fullscreen {
+ background-position: -456px -144px;
+}
+
diff --git a/src/usr/local/www/bootstrap/glyphicons/glyphicons-halflings.png b/src/usr/local/www/bootstrap/glyphicons/glyphicons-halflings.png
new file mode 100644
index 0000000..a996999
--- /dev/null
+++ b/src/usr/local/www/bootstrap/glyphicons/glyphicons-halflings.png
Binary files differ
diff --git a/src/usr/local/www/bootstrap/js/bootstrap.min.js b/src/usr/local/www/bootstrap/js/bootstrap.min.js
new file mode 100644
index 0000000..c8f82e5
--- /dev/null
+++ b/src/usr/local/www/bootstrap/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){
+var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file
diff --git a/src/usr/local/www/carp_status.php b/src/usr/local/www/carp_status.php
index 5f863e2..6ba07fa 100644
--- a/src/usr/local/www/carp_status.php
+++ b/src/usr/local/www/carp_status.php
@@ -1,31 +1,59 @@
<?php
+/* $Id$ */
/*
carp_status.php
- Copyright (C) 2004 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
##|+PRIV
##|*IDENT=page-status-carp
@@ -125,11 +153,7 @@ if (!empty($_POST['resetdemotion'])) {
$pgtitle = array(gettext("Status"), gettext("CARP"));
$shortcut_section = "carp";
include("head.inc");
-
?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
<form action="carp_status.php" method="post">
<?php if ($savemsg) print_info_box($savemsg); ?>
@@ -149,104 +173,72 @@ include("head.inc");
} ?>
-<div id="mainlevel">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="carp status">
- <tr>
- <td>
<?php
- $carpcount = 0;
- if (is_array($config['virtualip']['vip'])) {
- foreach ($config['virtualip']['vip'] as $carp) {
- if ($carp['mode'] == "carp") {
- $carpcount++;
- break;
- }
- }
- }
- if ($carpcount > 0) {
- if ($status > 0) {
- $carp_enabled = true;
- echo "<input type=\"submit\" name=\"disablecarp\" id=\"disablecarp\" value=\"" . gettext("Temporarily Disable CARP") . "\" />";
- } else {
- $carp_enabled = false;
- echo "<input type=\"submit\" name=\"disablecarp\" id=\"disablecarp\" value=\"" . gettext("Enable CARP") . "\" />";
- }
- if (isset($config["virtualip_carp_maintenancemode"])) {
- echo "<input type=\"submit\" name=\"carp_maintenancemode\" id=\"carp_maintenancemode\" value=\"" . gettext("Leave Persistent CARP Maintenance Mode") . "\" />";
- } else {
- echo "<input type=\"submit\" name=\"carp_maintenancemode\" id=\"carp_maintenancemode\" value=\"" . gettext("Enter Persistent CARP Maintenance Mode") . "\" />";
- }
- }
+$carpcount = 0;
+if(is_array($config['virtualip']['vip'])) {
+ foreach($config['virtualip']['vip'] as $carp) {
+ if ($carp['mode'] == "carp") {
+ $carpcount++;
+ break;
+ }
+ }
+}
+if ($carpcount > 0):
+ $carp_enabled = ($status > 0);
?>
-
- <br/><br/>
- <table class="tabcont sortable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="results">
- <tr>
- <td class="listhdrr" align="center"><?=gettext("CARP Interface"); ?></td>
- <td class="listhdrr" align="center"><?=gettext("Virtual IP"); ?></td>
- <td class="listhdrr" align="center"><?=gettext("Status"); ?></td>
- </tr>
+ <input type="submit" name="disablecarp" value="<?=($carp_enabled ? gettext("Temporarily Disable CARP") : gettext("Enable CARP"))?>" />
+ <input type="submit" name="carp_maintenancemode" value="<?=($config["virtualip_carp_maintenancemode"] ? gettext("Leave Persistent CARP Maintenance Mode") : gettext("Enter Persistent CARP Maintenance Mode"))?>" />
+<?php elseif ($carpcount == 0): ?>
+ <div class="alert alert-info" role="alert">
+ <p>
+ <?=gettext("Could not locate any defined CARP interfaces.")?><br/>
+ <a href="system_hasync.php" class="alert-link"><?=gettext("You can configure high availability sync settings here")?></a>.
+ </p>
+ </div>
+<?php else: ?>
+<table>
+ <tr>
+ <td><?=gettext("CARP Interface")?></td>
+ <td><?=gettext("Virtual IP")?></td>
+ <td><?=gettext("Status")?></td>
+ </tr>
<?php
- if ($carpcount == 0) {
- echo "</table></td></tr></table></div></form><center><br />" . gettext("Could not locate any defined CARP interfaces.");
- echo "</center>";
-
- include("fend.inc");
- echo "</body></html>";
- return;
- }
- if (is_array($config['virtualip']['vip'])) {
- foreach ($config['virtualip']['vip'] as $carp) {
- if ($carp['mode'] != "carp") {
- continue;
- }
- $ipaddress = $carp['subnet'];
- $vhid = $carp['vhid'];
- $status = get_carp_interface_status("_vip{$carp['uniqid']}");
- echo "<tr>";
- $align = "style=\"vertical-align:middle\"";
- if ($carp_enabled == false) {
- $icon = "<img {$align} src=\"/themes/".$g['theme']."/images/icons/icon_block.gif\" alt=\"disabled\" />";
- $status = "DISABLED";
- } else {
- if ($status == "MASTER") {
- $icon = "<img {$align} src=\"/themes/".$g['theme']."/images/icons/icon_pass.gif\" alt=\"master\" />";
- } else if ($status == "BACKUP") {
- $icon = "<img {$align} src=\"/themes/".$g['theme']."/images/icons/icon_pass_d.gif\" alt=\"backup\" />";
- } else if ($status == "INIT") {
- $icon = "<img {$align} src=\"/themes/".$g['theme']."/images/icons/icon_log.gif\" alt=\"init\" />";
- } else {
- $icon = "";
- }
- }
- echo "<td class=\"listlr\" align=\"center\">" . convert_friendly_interface_to_friendly_descr($carp['interface']) . "@{$vhid} &nbsp;</td>";
- echo "<td class=\"listlr\" align=\"center\">" . $ipaddress . "&nbsp;</td>";
- echo "<td class=\"listlr\" align=\"center\">{$icon}&nbsp;&nbsp;" . $status . "&nbsp;</td>";
- echo "</tr>";
- }
- }
+ foreach($config['virtualip']['vip'] as $carp) {
+ if ($carp['mode'] != "carp")
+ continue;
+ $ipaddress = $carp['subnet'];
+ $vhid = $carp['vhid'];
+ $status = get_carp_interface_status("{$carp['interface']}_vip{$carp['vhid']}");
+ if($carp_enabled == false) {
+ $icon = 'remove-sign';
+ $status = "DISABLED";
+ } else {
+ if($status == "MASTER") {
+ $icon = 'ok-sign';
+ } else if($status == "BACKUP") {
+ $icon = 'ok-circle';
+ } else if($status == "INIT") {
+ $icon = 'question-sign';
+ }
+ }
?>
- </table>
- </td>
- </tr>
- </table>
-</div>
+ <tr>
+ <td>
+ <td><?=convert_friendly_interface_to_friendly_descr($carp['interface'])?>@<?=$vhid?></td>
+ <td><?=$ipaddress?></td>
+ <td><i class="icon icon-<?=$icon?>">$status</i></td>
+ </tr>
+<?php }?>
+</table>
</form>
+<?php endif?>
-<p class="vexpl">
-<span class="red"><strong><?=gettext("Note"); ?>:</strong></span>
-<br />
-<?=gettext("You can configure high availability sync settings"); ?> <a href="system_hasync.php"><?=gettext("here"); ?></a>.
-</p>
-
+<h4><?=gettext("pfSync nodes")?></h4>
+<ul>
<?php
- echo "<br />" . gettext("pfSync nodes") . ":<br />";
- echo "<pre>";
- system("/sbin/pfctl -vvss | /usr/bin/grep creator | /usr/bin/cut -d\" \" -f7 | /usr/bin/sort -u");
- echo "</pre>";
+ foreach (explode("\n", exec_command("/sbin/pfctl -vvss | /usr/bin/grep creator | /usr/bin/cut -d\" \" -f7 | /usr/bin/sort -u")) as $node)
+ echo '<li>'. $node .'</li>';
?>
+</ul>
-<?php include("fend.inc"); ?>
-
-</body>
-</html>
+<?php include("foot.inc")?>
diff --git a/src/usr/local/www/classes/Form.class.php b/src/usr/local/www/classes/Form.class.php
new file mode 100644
index 0000000..b489a72
--- /dev/null
+++ b/src/usr/local/www/classes/Form.class.php
@@ -0,0 +1,126 @@
+<?php
+/*
+ Form.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+
+require_once('classes/Form/Element.class.php');
+require_once('classes/Form/Input.class.php');
+foreach (glob('classes/Form/*.class.php') as $file)
+ require_once($file);
+
+class Form extends Form_Element
+{
+ const LABEL_WIDTH = 2;
+ const MAX_INPUT_WIDTH = 10;
+ protected $_tagName = 'form';
+ protected $_attributes = array(
+ 'class' => array('form-horizontal' => true),
+ 'method' => 'post',
+ // Empty is interpreted by all browsers to submit to the current URI
+ 'action' => '',
+ );
+ protected $_sections = array();
+ protected $_global = array();
+
+ public function __construct($submit = null)
+ {
+ if (!isset($submit))
+ $submit = 'Save';
+
+ if (gettype($submit) == 'string')
+ $submit = new Form_Button(
+ 'save',
+ $submit
+ );
+
+ if (false !== $submit)
+ $this->addGlobal($submit);
+ }
+
+ public function add(Form_Section $section)
+ {
+ array_push($this->_sections, $section);
+ $section->_setParent($this);
+
+ return $section;
+ }
+
+ public function setAction($url)
+ {
+ $this->_attributes['action'] = $url;
+
+ return $this;
+ }
+
+ public function addGlobal(Form_Input $input)
+ {
+ array_push($this->_global, $input);
+
+ return $input;
+ }
+
+ public function setMultipartEncoding()
+ {
+ $this->_attributes['enctype'] = 'multipart/form-data';
+
+ return $this;
+ }
+
+ protected function _setParent()
+ {
+ throw new Exception('Form does not have a parent');
+ }
+
+ public function __toString()
+ {
+ $element = parent::__toString();
+ $html = implode('', $this->_sections);
+ $buttons = '';
+
+ foreach ($this->_global as $global)
+ {
+ if ($global instanceof Form_Button)
+ $buttons .= $global;
+ else
+ $html .= $global;
+ }
+
+ if (!empty($buttons))
+ {
+ $group = new Form_Element;
+ $group->addClass('col-sm-'. Form::MAX_INPUT_WIDTH, 'col-sm-offset-'. Form::LABEL_WIDTH);
+
+ $html .= $group . $buttons .'</div>';
+ }
+
+ return <<<EOT
+ {$element}
+ {$html}
+ </form>
+EOT;
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Form/Button.class.php b/src/usr/local/www/classes/Form/Button.class.php
new file mode 100644
index 0000000..32876a7
--- /dev/null
+++ b/src/usr/local/www/classes/Form/Button.class.php
@@ -0,0 +1,68 @@
+<?php
+/*
+ Button.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+class Form_Button extends Form_Input
+{
+ protected $_tagSelfClosing = false;
+ protected $_attributes = array(
+ 'class' => array(
+ 'btn' => true,
+ ),
+ 'type' => 'submit',
+ );
+
+ public function __construct($name, $title, $link = null)
+ {
+ // If we have a link; we're actually an <a class='btn'>
+ if (isset($link))
+ {
+ $this->_attributes['href'] = $link;
+ $this->_tagName = 'a';
+ $this->addClass('btn-default');
+ unset($this->_attributes['type']);
+ }
+ else
+ {
+ $this->_tagSelfClosing = true;
+ $this->_attributes['value'] = $title;
+ $this->addClass('btn-primary');
+ }
+
+ parent::__construct($name, $title, null);
+ }
+
+ protected function _getInput()
+ {
+ $input = parent::_getInput();
+
+ if (!isset($this->_attributes['href']))
+ return $input;
+
+ return $input . htmlspecialchars($this->_title) .'</a>';
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Form/Checkbox.class.php b/src/usr/local/www/classes/Form/Checkbox.class.php
new file mode 100644
index 0000000..e0734de
--- /dev/null
+++ b/src/usr/local/www/classes/Form/Checkbox.class.php
@@ -0,0 +1,65 @@
+<?php
+/*
+ Checkbox.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+
+class Form_Checkbox extends Form_Input
+{
+ protected $_attributes = array(
+ 'class' => array(),
+ );
+ protected $_description;
+
+ public function __construct($name, $title, $description, $checked, $value = 'yes')
+ {
+ parent::__construct($name, $title, 'checkbox', $value);
+
+ $this->_description = $description;
+
+ if ($checked)
+ $this->_attributes['checked'] = 'checked';
+
+ $this->column->addClass('checkbox');
+ }
+
+ public function displayAsRadio()
+ {
+ $this->_attributes['type'] = 'radio';
+
+ return $this;
+ }
+
+ protected function _getInput()
+ {
+ $input = parent::_getInput();
+
+ if (!isset($this->_description))
+ return $input;
+
+ return '<label>'. $input .' '. htmlspecialchars(gettext($this->_description)) .'</label>';
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Form/Element.class.php b/src/usr/local/www/classes/Form/Element.class.php
new file mode 100644
index 0000000..d3ad142
--- /dev/null
+++ b/src/usr/local/www/classes/Form/Element.class.php
@@ -0,0 +1,94 @@
+<?php
+/*
+ Element.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+
+class Form_Element
+{
+ protected $_tagName;
+ protected $_tagSelfClosing;
+ protected $_attributes;
+ protected $_parent;
+
+ public function __construct($tagName = 'div', $selfClose = false, $attributes = array('class' => array()))
+ {
+ $this->_tagName = $tagName;
+ $this->_tagSelfClosing = $selfClose;
+ $this->_attributes = $attributes;
+ }
+
+ public function addClass()
+ {
+ foreach (func_get_args() as $class)
+ $this->_attributes['class'][$class] = true;
+
+ return $this;
+ }
+
+ public function removeClass($class)
+ {
+ unset($this->_attributes['class'][$class]);
+
+ return $this;
+ }
+
+ public function setAttribute($key, $value = null)
+ {
+ $this->_attributes[ $key ] = $value;
+ return $this;
+ }
+
+ public function __toString()
+ {
+ $attributes = '';
+ foreach ($this->_attributes as $key => $value)
+ {
+ if (is_array($value))
+ {
+ // Used for classes. If it's empty, we don't want the attribute at all
+ if (!empty($value))
+ $value = implode(' ', array_keys($value));
+ else
+ $value = null;
+ }
+
+ if ($value === null)
+ continue;
+
+ $attributes .= ' '. $key;
+ if ($value !== true)
+ $attributes .= '="' . htmlspecialchars($value) . '"';
+ }
+
+ return '<'. $this->_tagName . $attributes . ($this->_tagSelfClosing ? '/' : '') .'>';
+ }
+
+ protected function _setParent(Form_Element $parent)
+ {
+ $this->_parent = $parent;
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Form/Group.class.php b/src/usr/local/www/classes/Form/Group.class.php
new file mode 100644
index 0000000..4ddf70d
--- /dev/null
+++ b/src/usr/local/www/classes/Form/Group.class.php
@@ -0,0 +1,152 @@
+<?php
+/*
+ Group.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+class Form_Group extends Form_Element
+{
+ protected $_tagName = 'div';
+ protected $_attributes = array(
+ 'class' => array('form-group' => true),
+ );
+ protected $_title;
+ protected $_inputs = array();
+ protected $_labelTarget;
+ protected $_help;
+ protected $_helpParams = array();
+
+ public function __construct($title)
+ {
+ $this->_title = $title;
+ }
+
+ public function add(Form_Input $input)
+ {
+ array_push($this->_inputs, $input);
+ $input->_setParent($this);
+
+ // Defaults to first input
+ if (!isset($this->_labelTarget))
+ $this->_labelTarget = $input;
+
+ return $input;
+ }
+
+ public function setLabelTarget(Form_Input $input)
+ {
+ $this->_labelTarget = $input;
+ }
+
+ public function setHelp($help, array $params = array())
+ {
+ $this->_help = $help;
+ $this->_helpParams = $params;
+
+ return $this;
+ }
+
+ public function enableDuplication($max = null, $horiz = false)
+ {
+ if($horiz)
+ $this->addClass('user-duplication-horiz'); // added buttons are 2 cols wide with no offset
+ else
+ $this->addClass('user-duplication'); // added buttons 10 cols wide with 2 col offset
+
+ if (isset($max))
+ $this->_attributes('data-duplicate-max', $max);
+
+ foreach ($this->_inputs as $input)
+ $input->setIsRepeated();
+
+ return $this;
+ }
+
+ protected function _getHelp()
+ {
+ if (!isset($this->_help))
+ return null;
+
+ $group = new Form_Element;
+ $group->addClass('col-sm-'. Form::MAX_INPUT_WIDTH, 'col-sm-offset-'. Form::LABEL_WIDTH);
+
+ $help = gettext($this->_help);
+
+ if (!empty($this->_helpParams))
+ $help = call_user_func_array('sprintf', array_merge([$help], $this->_helpParams));
+
+ return <<<EOT
+ {$group}
+ <span class="help-block">
+ {$help}
+ </span>
+ </div>
+EOT;
+ }
+
+ public function __toString()
+ {
+ $element = parent::__toString();
+
+ // Automatically determine width for inputs without explicit set
+ $spaceLeft = Form::MAX_INPUT_WIDTH;
+ $missingWidth = array();
+
+ foreach ($this->_inputs as $input)
+ {
+ if (count($this->_inputs) > 1 && !$input->hasAttribute('placeholder'))
+ $input->setPlaceholder($input->getTitle());
+
+ $width = $input->getWidth();
+
+ if (isset($width))
+ $spaceLeft -= $width;
+ else
+ array_push($missingWidth, $input);
+ }
+
+ foreach ($missingWidth as $input)
+ $input->setWidth($spaceLeft / count($missingWidth));
+
+ $target = $this->_labelTarget->getId();
+ $inputs = implode('', $this->_inputs);
+ $help = $this->_getHelp();
+
+ $label = new Form_Element('label', false, ['for' => $target]);
+ $label->addClass('col-sm-'.Form::LABEL_WIDTH, 'control-label');
+
+ $title = htmlspecialchars(gettext($this->_title));
+
+ return <<<EOT
+ {$element}
+ {$label}
+ {$title}
+ </label>
+ {$inputs}
+ {$help}
+ </div>
+EOT;
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Form/Input.class.php b/src/usr/local/www/classes/Form/Input.class.php
new file mode 100644
index 0000000..ec1cdca
--- /dev/null
+++ b/src/usr/local/www/classes/Form/Input.class.php
@@ -0,0 +1,200 @@
+<?php
+/*
+ Input.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+class Form_Input extends Form_Element
+{
+ public $column;
+ protected $_tagName = 'input';
+ protected $_tagSelfClosing = true;
+ protected $_attributes = array(
+ 'class' => array('form-control' => true),
+ 'name' => null,
+ 'id' => null,
+ 'title' => null,
+ );
+ protected $_title;
+ protected $_help;
+ protected $_helpParams = array();
+ protected $_columnWidth;
+
+ public function __construct($name, $title, $type = 'text', $value = null, array $attributes = array())
+ {
+ $this->column = new Form_Element;
+
+ $this->_attributes['name'] = $name;
+ $this->_attributes['id'] = $name;
+ $this->_title = $title;
+
+ if (isset($type))
+ $this->_attributes['type'] = $type;
+
+ switch ($type)
+ {
+ case 'number':
+ $attributes += array('min' => 1, 'step' => 1);
+ break;
+ case 'file':
+ unset($this->_attributes['class']['form-control']);
+ break;
+ }
+
+ if (isset($value))
+ $this->_attributes['value'] = $value;
+
+ foreach ($attributes as $name => $value)
+ $this->_attributes[$name] = $value;
+ }
+
+ public function getTitle()
+ {
+ return $this->_title;
+ }
+
+ public function getName()
+ {
+ return $this->_attributes['name'];
+ }
+
+ public function getId()
+ {
+ return $this->_attributes['id'];
+ }
+
+ public function setHelp($help, array $params = array())
+ {
+ $this->_help = $help;
+ $this->_helpParams = $params;
+
+ return $this;
+ }
+
+ public function getWidth()
+ {
+ return $this->_columnWidth;
+ }
+
+ public function setWidth($size)
+ {
+ if ($size < 1 || $size > Form::MAX_INPUT_WIDTH)
+ throw new Exception('Incorrect size, pass a number between 1 and '.Form::MAX_INPUT_WIDTH);
+
+ $this->column->removeClass('col-sm-'. $this->_columnWidth);
+
+ $this->_columnWidth = (int)$size;
+
+ $this->column->addClass('col-sm-'. $this->_columnWidth);
+
+ return $this;
+ }
+
+ public function setReadonly()
+ {
+ $this->_attributes['readonly'] = 'readonly';
+
+ return $this;
+ }
+
+ public function setDisabled()
+ {
+ $this->_attributes['disabled'] = 'disabled';
+
+ return $this;
+ }
+
+ public function toggles($selector = null, $type = 'collapse')
+ {
+ if (isset($selector))
+ $this->_attributes['data-target'] = $selector;
+
+ $this->_attributes['data-toggle'] = $type;
+
+ return $this;
+ }
+
+ public function setPattern($regexp)
+ {
+ $this->_attributes['pattern'] = $regexp;
+
+ return $this;
+ }
+
+ public function setPlaceholder($text)
+ {
+ $this->_attributes['placeholder'] = $text;
+
+ return $this;
+ }
+
+ public function hasAttribute($name)
+ {
+ // not strict, null should return false as well
+ return isset($this->_attributes[$name]);
+ }
+
+ public function setIsRepeated()
+ {
+ $this->_attributes['name'] .= '[]';
+ // No I don't like this. Yes it works fine
+ $this->_attributes['id'] .= ':'.substr(uniqid(), 9);
+
+ return $this;
+ }
+
+ protected function _getInput()
+ {
+ return parent::__toString();
+ }
+
+ public function __toString()
+ {
+ $input = $this->_getInput();
+ $column = (string)$this->column;
+
+ // Don't add an empty <div>, skip it instead
+ if (!isset($this->_help) && '<div>' == $column)
+ return (string)$input;
+
+ if (isset($this->_help))
+ {
+ $help = gettext($this->_help);
+
+ if (!empty($this->_helpParams))
+ $help = call_user_func_array('sprintf', array_merge([$help], $this->_helpParams));
+
+ $help = '<span class="help-block">'. $help .'</span>';
+ }
+
+ return <<<EOT
+ {$column}
+ {$input}
+
+ {$help}
+ </div>
+EOT;
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Form/IpAddress.class.php b/src/usr/local/www/classes/Form/IpAddress.class.php
new file mode 100644
index 0000000..759b65d
--- /dev/null
+++ b/src/usr/local/www/classes/Form/IpAddress.class.php
@@ -0,0 +1,76 @@
+<?php
+/*
+ IpAddress.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+
+class Form_IpAddress extends Form_Input
+{
+ protected $_mask;
+
+ public function __construct($name, $title, $value)
+ {
+ parent::__construct($name, $title, 'text', $value);
+
+ $this->_attributes['pattern'] = '[a-f0-9:.]*';
+ }
+
+ public function addMask($name, $value, $max = 128)
+ {
+ $this->_mask = new Form_Select(
+ $name,
+ null,
+ $value,
+ array_combine(range($max, 1), range($max, 1))
+ );
+
+ return $this;
+ }
+
+ public function setIsRepeated()
+ {
+ if (isset($this->_mask))
+ $this->_mask->setIsRepeated();
+
+ return parent::setIsRepeated();
+ }
+
+ protected function _getInput()
+ {
+ $input = parent::_getInput();
+
+ if (!isset($this->_mask))
+ return $input;
+
+ return <<<EOT
+ <div class="input-group">
+ $input
+ <span class="input-group-addon input-group-inbetween pfIpMask">/</span>
+ {$this->_mask}
+ </div>
+EOT;
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Form/MultiCheckbox.class.php b/src/usr/local/www/classes/Form/MultiCheckbox.class.php
new file mode 100644
index 0000000..9310977
--- /dev/null
+++ b/src/usr/local/www/classes/Form/MultiCheckbox.class.php
@@ -0,0 +1,40 @@
+<?php
+/*
+ Form_MultiCheckbox.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+class Form_MultiCheckbox extends Form_Checkbox
+{
+ public function setHelp($help, array $params = array())
+ {
+ throw new Exception('MultiCheckboxes do not support help-texts, please use $group->setHelp instead');
+ }
+
+ public function __toString()
+ {
+ return (string)$this->_getInput();
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Form/MultiCheckboxGroup.class.php b/src/usr/local/www/classes/Form/MultiCheckboxGroup.class.php
new file mode 100644
index 0000000..c04bf07
--- /dev/null
+++ b/src/usr/local/www/classes/Form/MultiCheckboxGroup.class.php
@@ -0,0 +1,64 @@
+<?php
+/*
+ Form_MultiCheckboxGroup.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+class Form_MultiCheckboxGroup extends Form_Group
+{
+ public function add(Form_MultiCheckbox $input)
+ {
+ return parent::add($input);
+ }
+
+ public function __toString()
+ {
+ $element = Form_Element::__toString();
+ $column = new Form_Element;
+ $column->addClass('checkbox', 'multi', 'col-sm-10');
+
+ $inputs = implode('', $this->_inputs);
+ $help = $this->_getHelp();
+
+ $label = new Form_Element('label');
+ $label->addClass('col-sm-'.Form::LABEL_WIDTH, 'control-label');
+
+ $title = htmlspecialchars(gettext($this->_title));
+
+ return <<<EOT
+ {$element}
+ {$label}
+ {$title}
+ </label>
+
+ {$column}
+ {$inputs}
+ </div>
+
+ {$help}
+ </div>
+EOT;
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Form/Section.class.php b/src/usr/local/www/classes/Form/Section.class.php
new file mode 100644
index 0000000..b1dfb22
--- /dev/null
+++ b/src/usr/local/www/classes/Form/Section.class.php
@@ -0,0 +1,82 @@
+<?php
+/*
+ Section.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+class Form_Section extends Form_Element
+{
+ protected $_tagName = 'div';
+ protected $_attributes = array(
+ 'class' => array(
+ 'panel' => true,
+ 'panel-default' => true,
+ ),
+ );
+ protected $_title;
+ protected $_groups = array();
+
+ public function __construct($title)
+ {
+ $this->_title = $title;
+ }
+
+ public function add(Form_Group $group)
+ {
+ array_push($this->_groups, $group);
+ $group->_setParent($this);
+
+ return $group;
+ }
+
+ // Shortcut, adds a group for the specified input
+ public function addInput(Form_Input $input)
+ {
+ $group = new Form_Group($input->getTitle());
+ $group->add($input);
+
+ $this->add($group);
+
+ return $input;
+ }
+
+ public function __toString()
+ {
+ $element = parent::__toString();
+ $title = htmlspecialchars(gettext($this->_title));
+ $body = implode('', $this->_groups);
+
+ return <<<EOT
+ {$element}
+ <div class="panel-heading">
+ <h2 class="panel-title">{$title}</h2>
+ </div>
+ <div class="panel-body">
+ {$body}
+ </div>
+ </div>
+EOT;
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Form/Select.class.php b/src/usr/local/www/classes/Form/Select.class.php
new file mode 100644
index 0000000..1c4594d
--- /dev/null
+++ b/src/usr/local/www/classes/Form/Select.class.php
@@ -0,0 +1,71 @@
+<?php
+/*
+ Select.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+
+class Form_Select extends Form_Input
+{
+ protected $_tagName = 'select';
+ protected $_values;
+ protected $_value;
+
+ public function __construct($name, $title, $value, array $values, $allowMultiple = false)
+ {
+ if ($allowMultiple)
+ $name .= '[]';
+
+ parent::__construct($name, $title, null);
+
+ if ($allowMultiple)
+ $this->_attributes['multiple'] = 'multiple';
+
+ $this->_value = $value;
+ $this->_values = $values;
+ }
+
+ protected function _getInput()
+ {
+ $element = parent::_getInput();
+
+ $options = '';
+ foreach ($this->_values as $value => $name)
+ {
+ if (isset($this->_attributes['multiple']))
+ $selected = in_array($value, (array)$this->_value);
+ else
+ $selected = ($this->_value == $value);
+
+ $options .= '<option value="'. htmlspecialchars($value) .'"'.($selected ? ' selected' : '').'>'. htmlspecialchars(gettext($name)) .'</option>';
+ }
+
+ return <<<EOT
+ {$element}
+ {$options}
+ </select>
+EOT;
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Form/StaticText.class.php b/src/usr/local/www/classes/Form/StaticText.class.php
new file mode 100644
index 0000000..b6f7983
--- /dev/null
+++ b/src/usr/local/www/classes/Form/StaticText.class.php
@@ -0,0 +1,45 @@
+<?php
+/*
+ StaticText.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+
+class Form_StaticText extends Form_Input
+{
+ protected $_text;
+
+ public function __construct($title, $text)
+ {
+ parent::__construct(null, $title);
+
+ $this->_text = $text;
+ }
+
+ protected function _getInput()
+ {
+ return $this->_text;
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Form/Textarea.class.php b/src/usr/local/www/classes/Form/Textarea.class.php
new file mode 100644
index 0000000..8c1c157
--- /dev/null
+++ b/src/usr/local/www/classes/Form/Textarea.class.php
@@ -0,0 +1,54 @@
+<?php
+/*
+ Textarea.class.php
+
+ Copyright (C) 2015 Sjon Hortensius
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR 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.
+*/
+class Form_Textarea extends Form_Input
+{
+ protected $_tagName = 'textarea';
+ protected $_value;
+ protected $_attributes = array(
+ 'rows' => 5,
+ 'class' => array('form-control' => true),
+ );
+
+ public function __construct($name, $title, $value)
+ {
+ parent::__construct($name, $title, null);
+
+ $this->_value = $value;
+ }
+
+ protected function _getInput()
+ {
+ $element = parent::_getInput();
+ $value = htmlspecialchars($this->_value);
+
+ return <<<EOT
+ {$element}{$value}</textarea>
+EOT;
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/Modal.class.php b/src/usr/local/www/classes/Modal.class.php
new file mode 100644
index 0000000..e77c608
--- /dev/null
+++ b/src/usr/local/www/classes/Modal.class.php
@@ -0,0 +1,67 @@
+<?php
+
+require_once('classes/Form.class.php');
+
+class Modal extends Form_Section
+{
+ protected $_attributes = array(
+ 'id' => null,
+ 'class' => array(
+ 'modal' => true,
+ 'fade' => true,
+ ),
+ 'role' => 'dialog',
+ 'aria-labelledby' => null,
+ 'aria-hidden' => 'true',
+ );
+ protected $_global = array();
+ protected $_isLarge;
+
+ public function __construct($title, $id, $isLarge = false, $submit = null)
+ {
+ $this->_title = $title;
+ $this->_attributes['id'] = $this->_attributes['aria-labelledby'] = $id;
+ $this->_isLarge = $isLarge;
+
+ if (gettype($submit) == 'string')
+ $submit = (new Form_Button(
+ 'save',
+ $submit
+ ))->setAttribute('data-dismiss', 'modal');
+
+ if (false !== $submit)
+ array_push($this->_global, $submit);
+ }
+
+ public function __toString()
+ {
+ $element = Form_Element::__toString();
+ $title = htmlspecialchars(gettext($this->_title));
+ $body = implode('', $this->_groups);
+ $footer = implode('', $this->_global);
+ $modalClass = $this->_isLarge ? 'modal-lg' : 'modal-sm';
+
+ return <<<EOT
+ {$element}
+ <div class="modal-dialog {$modalClass}">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ <h3 class="modal-title">{$title}</h3>
+ </div>
+ <form class="form-horizontal" action="" method="post">
+ <div class="modal-body">
+ {$html}
+ </div>
+ <div class="modal-footer">
+ {$footer}
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+EOT;
+ }
+} \ No newline at end of file
diff --git a/src/usr/local/www/classes/maintable.inc b/src/usr/local/www/classes/maintable.inc
deleted file mode 100644
index 1478de8..0000000
--- a/src/usr/local/www/classes/maintable.inc
+++ /dev/null
@@ -1,206 +0,0 @@
-<?php
-/* $Id$ */
-/*
- part of pfSense (https://www.pfsense.org/)
-
- Copyright (C) 2008 Bill Marquette <bill.marquette@gmail.com>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- pfSense_MODULE: guiutils
-*/
-
-
-class MainTable {
- private $headers = array();
-// private $columns = array();
- private $columns = 0;
- private $rows = 0;
- private $content = array();
- private $edit_uri = '';
- private $my_uri = '';
- private $buttons = array('move' => false, 'edit' => false, 'del' => false, 'dup' => false);
-
- function add_column($header, $cname, $width) {
-// $this->column[] = array('header' => $header, 'cname' => $cname, 'width' => $width)
- $this->headers[] = $header;
- $this->cname[] = $cname;
- $this->width[] = $width;
- $this->columns++;
- }
-
- function add_content_array($rows) {
- foreach ($rows as $row) {
- $this->content[] = $row;
- $this->rows++;
- }
- }
- function add_button($name) {
- if (isset($this->buttons[$name])) {
- $this->buttons[$name] = true;
- }
- }
- function edit_uri($uri) {
- $this->edit_uri = $uri;
- }
-
- function my_uri($uri) {
- $this->my_uri = $uri;
- }
-
- function display() {
- echo "<!-- begin content table -->\n";
- echo "<table class=\"tabcont\" width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" summary=\"display\">\n";
- echo " <!-- begin content table header -->\n";
- echo $this->display_header();
- echo " <!-- end content table header -->\n";
- echo " <!-- begin content table rows -->\n";
- echo $this->display_rows();
- echo " <!-- end content table rows -->\n";
- echo " <!-- begin content table footer -->\n";
- echo $this->display_footer();
- echo " <!-- end content table footer -->\n";
- echo "</table>\n";
- echo "<!-- end content table -->\n";
- }
-
- private function display_header() {
- global $g;
- echo "<tr>\n";
- for ($col = 0; $col < $this->columns - 1; $col++) {
- echo " <td width=\"{$this->width[$col]}%\" class=\"listhdrr\">{$this->headers[$col]}</td>\n";
- }
- echo " <td width=\"{$this->width[$this->columns - 1]}%\" class=\"listhdr\">{$this->headers[$this->columns - 1]}</td>\n";
- echo " <td width=\"10%\" class=\"list\">\n";
- echo " <table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" summary=\"display header\">\n";
- echo " <tr>\n";
- echo " <td width=\"17\"></td>\n";
- echo " <td valign=\"middle\"><a href=\"{$this->edit_uri}\"><img src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" width=\"17\" height=\"17\" border=\"0\" alt=\"plus\" /></a></td>\n";
- echo " </tr>\n";
- echo " </table>\n";
- echo " </td>\n";
- echo "</tr>\n";
-
- }
- private function display_rows() {
- global $g;
- $cur_row = 0;
- $encode_cols = array("name", "descr");
- foreach ($this->content as $row) {
- echo "<tr>\n";
- for ($col = 0; $col < $this->columns - 1; $col++) {
- if ($col == 0) {
- $cl = 'listlr';
- } else {
- $cl = 'listr';
- }
- echo " <td class=\"{$cl}\" onclick=\"fr_toggle({$cur_row})\" id=\"frd{$cur_row}\" ondblclick=\"document.location='{$this->edit_uri}?id={$cur_row}'\">\n";
- if (is_array($row[$this->cname[$col]])) {
- foreach ($row[$this->cname[$col]] as $data) {
- if (in_array($this->cname[$col], $encode_cols)) {
- $data = htmlspecialchars($data);
- }
- echo " {$data}<br />\n";
- }
- } else {
- if (in_array($this->cname[$col], $encode_cols)) {
- $row[$this->cname[$col]] = htmlspecialchars($row[$this->cname[$col]]);
- }
- echo " " . $row[$this->cname[$col]] . "\n";
- }
- echo " </td>\n";
- }
- echo " <td class=\"listbg\" onclick=\"fr_toggle({$cur_row})\" id=\"frd{$cur_row}\" ondblclick=\"document.location='{$this->edit_uri}?id={$cur_row}'\">\n";
- echo " <font color=\"#FFFFFF\">" . htmlspecialchars($row[$this->cname[$this->columns - 1]]) . "</font>\n";
- echo " </td>\n";
- echo " <td class=\"list nowrap\">\n";
- $this->display_buttons($cur_row);
- echo " </td>\n";
- echo "</tr>\n";
-
- $cur_row++;
- }
- }
- private function display_footer() {
- global $g;
- echo "<tr>\n";
- echo " <td class=\"list\" colspan=\"{$this->columns}\"></td>\n";
- echo " <td class=\"list\">\n";
- echo " <table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" summary=\"display footer\">\n";
- echo " <tr>\n";
- echo " <td width=\"17\"></td>\n";
- echo " <td valign=\"middle\"><a href=\"{$this->edit_uri}\"><img src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" width=\"17\" height=\"17\" border=\"0\" alt=\"plus\" /></a></td>\n";
- echo " </tr>\n";
- echo " </table>\n";
- echo " </td>\n";
- echo "</tr>\n";
- }
- private function display_buttons($row) {
- echo " <table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" summary=\"display buttons\">\n";
- echo " <tr>\n";
- if ($this->buttons['move']) {
- echo $this->display_button('move', $row);
- }
- if ($this->buttons['edit']) {
- echo $this->display_button('edit', $row);
- }
- echo " </tr>\n";
- echo " <tr>\n";
- if ($this->buttons['del']) {
- echo $this->display_button('del', $row);
- }
- if ($this->buttons['dup']) {
- echo $this->display_button('dup', $row);
- }
- echo " </tr>\n";
- echo " </table>\n";
- }
- private function display_button($button, $row) {
- global $g;
- echo "<td valign=\"middle\">";
- switch ($button) {
- case "move": {
- echo "<input name=\"move_{$row}\" type=\"image\" src=\"./themes/{$g['theme']}/images/icons/icon_left.gif\" width=\"17\" height=\"17\" title=\"Move selected entries before this entry\" onmouseover=\"fr_insline({$row}, true)\" onmouseout=\"fr_insline({$row}, false)\" />";
- break;
- }
- case "edit": {
- echo "<a href=\"{$this->edit_uri}?id={$row}\"><img src=\"/themes/{$g['theme']}/images/icons/icon_e.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"Edit entry\" alt=\"edit\" /></a>";
- break;
- }
- case "del": {
- echo "<a href=\"{$this->my_uri}?act=del&amp;id={$row}\" onclick=\"return confirm('Do you really want to delete this entry?')\"><img src=\"/themes/{$g['theme']}/images/icons/icon_x.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"Delete entry\" alt=\"delete\" /></a>";
- break;
- }
- case "dup": {
- echo "<a href=\"{$this->edit_uri}?act=dup&amp;id={$row}\"><img src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"Duplicate entry\" alt=\"duplicate\" /></a>";
- break;
- }
- }
- echo "</td>";
- }
-
-}
-
-?> \ No newline at end of file
diff --git a/src/usr/local/www/code-syntax-highlighter/SyntaxHighlighter.css b/src/usr/local/www/code-syntax-highlighter/SyntaxHighlighter.css
deleted file mode 100644
index 413a034..0000000
--- a/src/usr/local/www/code-syntax-highlighter/SyntaxHighlighter.css
+++ /dev/null
@@ -1,166 +0,0 @@
-
-/* Main style for the table */
-
-.dp-highlighter {
- width: 100%;
- overflow: auto;
- line-height: 100% !important;
- margin: 18px 0px 18px 0px;
-}
-
-.dp-highlighter table {
- width: 100%;
- margin: 2px 0px 2px 0px;
- border-collapse: collapse;
- border-bottom: 2px solid #eee;
- background-color: #fff;
-}
-
-.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 0px;
- border-bottom: 1px solid gray;
- font: 9px Verdana, Geneva, Arial, Helvetica, sans-serif;
- color: silver;
-}
-
-.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 .line {
- padding-left: 10px;
- border-bottom: 1px solid #F7F7F7;
- white-space:nowrap;
-}
-
-/* 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; }
diff --git a/src/usr/local/www/code-syntax-highlighter/gpl.txt b/src/usr/local/www/code-syntax-highlighter/gpl.txt
deleted file mode 100644
index 5b6e7c6..0000000
--- a/src/usr/local/www/code-syntax-highlighter/gpl.txt
+++ /dev/null
@@ -1,340 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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.
-
- <signature of Ty Coon>, 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 Library General
-Public License instead of this License.
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushCSharp.js b/src/usr/local/www/code-syntax-highlighter/shBrushCSharp.js
deleted file mode 100644
index 5743b93..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shBrushCSharp.js
+++ /dev/null
@@ -1,30 +0,0 @@
-dp.sh.Brushes.CSharp = function()
-{
- var keywords = 'abstract as base bool break byte case catch char checked class const ' +
- 'continue decimal default delegate do double else enum event explicit ' +
- 'extern false finally fixed float for foreach get goto if implicit in int ' +
- 'interface internal is lock long namespace new null object operator out ' +
- 'override params private protected public readonly ref return sbyte sealed set ' +
- 'short sizeof stackalloc static string struct switch this throw true try ' +
- 'typeof uint ulong unchecked unsafe ushort using virtual void while';
-
- this.regexList = [
- // There's a slight problem with matching single line comments and figuring out
- // a difference between // and ///. Using lookahead and lookbehind solves the
- // problem, unfortunately JavaScript doesn't support lookbehind. So I'm at a
- // loss how to translate that regular expression to JavaScript compatible one.
-// { regex: new RegExp('(?<!/)//(?!/).*$|(?<!/)////(?!/).*$|/\\*[^\\*]*(.)*?\\*/', 'gm'), css: 'comment' }, // one line comments starting with anything BUT '///' and multiline comments
-// { regex: new RegExp('(?<!/)///(?!/).*$', 'gm'), css: 'comments' }, // XML comments starting with ///
-
- { regex: new RegExp('//.*$', 'gm'), css: 'comment' }, // one line comments
- { regex: new RegExp('/\\*[\\s\\S]*?\\*/', 'g'), css: 'comment' }, // multiline comments
- { regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'), css: 'string' }, // strings
- { regex: new RegExp('^\\s*#.*', 'gm'), css: 'preprocessor' }, // preprocessor tags like #region and #endregion
- { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' } // c# keyword
- ];
-
- this.CssClass = 'dp-c';
-}
-
-dp.sh.Brushes.CSharp.prototype = new dp.sh.Highlighter();
-dp.sh.Brushes.CSharp.Aliases = ['c#', 'c-sharp', 'csharp'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushCpp.js b/src/usr/local/www/code-syntax-highlighter/shBrushCpp.js
deleted file mode 100644
index 09570d5..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shBrushCpp.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Code Syntax Highlighter for C++(Windows Platform).
- * Version 0.0.1
- * Copyright (C) 2006 Shin, YoungJin.
- * http://www.jiniya.net/lecture/techbox/test.html
- *
- * 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
- */
-
-dp.sh.Brushes.Cpp = function()
-{
- var datatypes =
- 'ATOM BOOL BOOLEAN BYTE CHAR COLORREF DWORD DWORDLONG DWORD_PTR ' +
- 'DWORD32 DWORD64 FLOAT HACCEL HALF_PTR HANDLE HBITMAP HBRUSH ' +
- 'HCOLORSPACE HCONV HCONVLIST HCURSOR HDC HDDEDATA HDESK HDROP HDWP ' +
- 'HENHMETAFILE HFILE HFONT HGDIOBJ HGLOBAL HHOOK HICON HINSTANCE HKEY ' +
- 'HKL HLOCAL HMENU HMETAFILE HMODULE HMONITOR HPALETTE HPEN HRESULT ' +
- 'HRGN HRSRC HSZ HWINSTA HWND INT INT_PTR INT32 INT64 LANGID LCID LCTYPE ' +
- 'LGRPID LONG LONGLONG LONG_PTR LONG32 LONG64 LPARAM LPBOOL LPBYTE LPCOLORREF ' +
- 'LPCSTR LPCTSTR LPCVOID LPCWSTR LPDWORD LPHANDLE LPINT LPLONG LPSTR LPTSTR ' +
- 'LPVOID LPWORD LPWSTR LRESULT PBOOL PBOOLEAN PBYTE PCHAR PCSTR PCTSTR PCWSTR ' +
- 'PDWORDLONG PDWORD_PTR PDWORD32 PDWORD64 PFLOAT PHALF_PTR PHANDLE PHKEY PINT ' +
- 'PINT_PTR PINT32 PINT64 PLCID PLONG PLONGLONG PLONG_PTR PLONG32 PLONG64 POINTER_32 ' +
- 'POINTER_64 PSHORT PSIZE_T PSSIZE_T PSTR PTBYTE PTCHAR PTSTR PUCHAR PUHALF_PTR ' +
- 'PUINT PUINT_PTR PUINT32 PUINT64 PULONG PULONGLONG PULONG_PTR PULONG32 PULONG64 ' +
- 'PUSHORT PVOID PWCHAR PWORD PWSTR SC_HANDLE SC_LOCK SERVICE_STATUS_HANDLE SHORT ' +
- 'SIZE_T SSIZE_T TBYTE TCHAR UCHAR UHALF_PTR UINT UINT_PTR UINT32 UINT64 ULONG ' +
- 'ULONGLONG ULONG_PTR ULONG32 ULONG64 USHORT USN VOID WCHAR WORD WPARAM WPARAM WPARAM ' +
- 'char bool short int __int32 __int64 __int8 __int16 long float double __wchar_t ' +
- 'clock_t _complex _dev_t _diskfree_t div_t ldiv_t _exception _EXCEPTION_POINTERS ' +
- 'FILE _finddata_t _finddatai64_t _wfinddata_t _wfinddatai64_t __finddata64_t ' +
- '__wfinddata64_t _FPIEEE_RECORD fpos_t _HEAPINFO _HFILE lconv intptr_t ' +
- 'jmp_buf mbstate_t _off_t _onexit_t _PNH ptrdiff_t _purecall_handler ' +
- 'sig_atomic_t size_t _stat __stat64 _stati64 terminate_function ' +
- 'time_t __time64_t _timeb __timeb64 tm uintptr_t _utimbuf ' +
- 'va_list wchar_t wctrans_t wctype_t wint_t signed';
-
- var keywords =
- 'break case catch class const __finally __exception __try ' +
- 'const_cast continue private public protected __declspec ' +
- 'default delete deprecated dllexport dllimport do dynamic_cast ' +
- 'else enum explicit extern if for friend goto inline ' +
- 'mutable naked namespace new noinline noreturn nothrow ' +
- 'register reinterpret_cast return selectany ' +
- 'sizeof static static_cast struct switch template this ' +
- 'thread throw true false try typedef typeid typename union ' +
- 'using uuid virtual void volatile whcar_t while';
-
- this.regexList = [
- { regex: dp.sh.RegexLib.SingleLineCComments, css: 'comment' }, // one line comments
- { regex: dp.sh.RegexLib.MultiLineCComments, css: 'comment' }, // multiline comments
- { regex: dp.sh.RegexLib.DoubleQuotedString, css: 'string' }, // strings
- { regex: dp.sh.RegexLib.SingleQuotedString, css: 'string' }, // strings
- { regex: new RegExp('^ *#.*', 'gm'), css: 'preprocessor' },
- { regex: new RegExp(this.GetKeywords(datatypes), 'gm'), css: 'datatypes' },
- { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' }
- ];
-
- this.CssClass = 'dp-cpp';
-}
-
-dp.sh.Brushes.Cpp.prototype = new dp.sh.Highlighter();
-dp.sh.Brushes.Cpp.Aliases = ['cpp', 'c', 'c++'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushCss.js b/src/usr/local/www/code-syntax-highlighter/shBrushCss.js
deleted file mode 100644
index 6d3f0de..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shBrushCss.js
+++ /dev/null
@@ -1,50 +0,0 @@
-dp.sh.Brushes.CSS = function()
-{
- var keywords = 'ascent azimuth background-attachment background-color background-image background-position ' +
- 'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
- 'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
- 'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
- 'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
- 'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
- 'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
- 'height letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
- 'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
- 'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
- 'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
- 'quotes richness right size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
- 'table-layout text-align text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
- 'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
-
- var values = 'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
- 'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
- 'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double '+
- 'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
- 'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
- 'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
- 'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
- 'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
- 'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
- 'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
- 'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
- 'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
- 'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
- 'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
-
- var fonts = '[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif';
-
- this.regexList = [
- { regex: dp.sh.RegexLib.MultiLineCComments, css: 'comment' }, // multiline comments
- { regex: dp.sh.RegexLib.DoubleQuotedString, css: 'string' }, // double quoted strings
- { regex: dp.sh.RegexLib.SingleQuotedString, css: 'string' }, // single quoted strings
- { regex: new RegExp('\\#[a-zA-Z0-9]{3,6}', 'g'), css: 'colors' }, // html colors
- { regex: new RegExp('(\\d+)(px|pt|\:)', 'g'), css: 'string' }, // size specifications
- { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' }, // keywords
- { regex: new RegExp(this.GetKeywords(values), 'g'), css: 'string' }, // values
- { regex: new RegExp(this.GetKeywords(fonts), 'g'), css: 'string' } // fonts
- ];
-
- this.CssClass = 'dp-css';
-}
-
-dp.sh.Brushes.CSS.prototype = new dp.sh.Highlighter();
-dp.sh.Brushes.CSS.Aliases = ['css'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushDelphi.js b/src/usr/local/www/code-syntax-highlighter/shBrushDelphi.js
deleted file mode 100644
index efb0601..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shBrushDelphi.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Delphi brush is contributed by Eddie Shipman */
-dp.sh.Brushes.Delphi = function()
-{
- var keywords = 'abs addr and ansichar ansistring array as asm begin boolean byte cardinal ' +
- 'case char class comp const constructor currency destructor div do double ' +
- 'downto else end except exports extended false file finalization finally ' +
- 'for function goto if implementation in inherited int64 initialization ' +
- 'integer interface is label library longint longword mod nil not object ' +
- 'of on or packed pansichar pansistring pchar pcurrency pdatetime pextended ' +
- 'pint64 pointer private procedure program property pshortstring pstring ' +
- 'pvariant pwidechar pwidestring protected public published raise real real48 ' +
- 'record repeat set shl shortint shortstring shr single smallint string then ' +
- 'threadvar to true try type unit until uses val var varirnt while widechar ' +
- 'widestring with word write writeln xor';
-
- this.regexList = [
- { regex: new RegExp('\\(\\*[\\s\\S]*?\\*\\)', 'gm'), css: 'comment' }, // multiline comments (* *)
- { regex: new RegExp('{(?!\\$)[\\s\\S]*?}', 'gm'), css: 'comment' }, // multiline comments { }
- { regex: new RegExp('//.*$', 'gm'), css: 'comment' }, // one line
- { regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'), css: 'string' }, // strings
- { regex: new RegExp('\\{\\$[a-zA-Z]+ .+\\}', 'g'), css: 'directive' }, // Compiler Directives and Region tags
- { regex: new RegExp('\\b[\\d\\.]+\\b', 'g'), css: 'number' }, // numbers 12345
- { regex: new RegExp('\\$[a-zA-Z0-9]+\\b', 'g'), css: 'number' }, // numbers $F5D3
- { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' } // keyword
- ];
-
- this.CssClass = 'dp-delphi';
-}
-
-dp.sh.Brushes.Delphi.prototype = new dp.sh.Highlighter();
-dp.sh.Brushes.Delphi.Aliases = ['delphi', 'pascal'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushJScript.js b/src/usr/local/www/code-syntax-highlighter/shBrushJScript.js
deleted file mode 100644
index c68a2a5..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shBrushJScript.js
+++ /dev/null
@@ -1,22 +0,0 @@
-dp.sh.Brushes.JScript = function()
-{
- var keywords = 'abstract boolean break byte case catch char class const continue debugger ' +
- 'default delete do double else enum export extends false final finally float ' +
- 'for function goto if implements import in instanceof int interface long native ' +
- 'new null package private protected public return short static super switch ' +
- 'synchronized this throw throws transient true try typeof var void volatile while with';
-
- this.regexList = [
- { regex: new RegExp('//.*$', 'gm'), css: 'comment' }, // one line comments
- { regex: new RegExp('/\\*[\\s\\S]*?\\*/', 'g'), css: 'comment' }, // multiline comments
- { regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'), css: 'string' }, // double quoted strings
- { regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'), css: 'string' }, // single quoted strings
- { regex: new RegExp('^\\s*#.*', 'gm'), css: 'preprocessor' }, // preprocessor tags like #region and #endregion
- { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' } // keywords
- ];
-
- this.CssClass = 'dp-c';
-}
-
-dp.sh.Brushes.JScript.prototype = new dp.sh.Highlighter();
-dp.sh.Brushes.JScript.Aliases = ['js', 'jscript', 'javascript'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushJava.js b/src/usr/local/www/code-syntax-highlighter/shBrushJava.js
deleted file mode 100644
index f18aaad..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shBrushJava.js
+++ /dev/null
@@ -1,26 +0,0 @@
-dp.sh.Brushes.Java = function()
-{
- var keywords = 'abstract assert boolean break byte case catch char class const ' +
- 'continue default do double else enum extends ' +
- 'false final finally float for goto if implements import ' +
- 'instanceof int interface long native new null ' +
- 'package private protected public return ' +
- 'short static strictfp super switch synchronized this throw throws true ' +
- 'transient try void volatile while';
-
- this.regexList = [
- { regex: dp.sh.RegexLib.SingleLineCComments, css: 'comment' }, // one line comments
- { regex: dp.sh.RegexLib.MultiLineCComments, css: 'comment' }, // multiline comments
- { regex: dp.sh.RegexLib.DoubleQuotedString, css: 'string' }, // strings
- { regex: dp.sh.RegexLib.SingleQuotedString, css: 'string' }, // strings
- { regex: new RegExp('\\b([\\d]+(\\.[\\d]+)?|0x[a-f0-9]+)\\b', 'gi'), css: 'number' }, // numbers
- { regex: new RegExp('(?!\\@interface\\b)\\@[\\$\\w]+\\b', 'g'), css: 'annotation' }, // annotation @anno
- { regex: new RegExp('\\@interface\\b', 'g'), css: 'keyword' }, // @interface keyword
- { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' } // java keyword
- ];
-
- this.CssClass = 'dp-j';
-}
-
-dp.sh.Brushes.Java.prototype = new dp.sh.Highlighter();
-dp.sh.Brushes.Java.Aliases = ['java'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushPhp.js b/src/usr/local/www/code-syntax-highlighter/shBrushPhp.js
deleted file mode 100644
index bcc3e3f..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shBrushPhp.js
+++ /dev/null
@@ -1,23 +0,0 @@
-dp.sh.Brushes.Php = function()
-{
- var keywords = 'and or xor __FILE__ __LINE__ array as break case ' +
- 'cfunction class const continue declare default die do echo else ' +
- 'elseif empty enddeclare endfor endforeach endif endswitch endwhile eval exit ' +
- 'extends for foreach function global if include include_once isset list ' +
- 'new old_function print require require_once return static switch unset use ' +
- 'var while __FUNCTION__ __CLASS__';
-
- this.regexList = [
- { regex: new RegExp('//.*$', 'gm'), css: 'comment' }, // one line comments
- { regex: new RegExp('/\\*[\\s\\S]*?\\*/', 'g'), css: 'comment' }, // multiline comments
- { regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'), css: 'string' }, // double quoted strings
- { regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'), css: 'string' }, // single quoted strings
- { regex: new RegExp('\\$\\w+', 'g'), css: 'vars' }, // variables
- { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' } // keyword
- ];
-
- this.CssClass = 'dp-c';
-}
-
-dp.sh.Brushes.Php.prototype = new dp.sh.Highlighter();
-dp.sh.Brushes.Php.Aliases = ['php'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushPython.js b/src/usr/local/www/code-syntax-highlighter/shBrushPython.js
deleted file mode 100644
index 96d2196..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shBrushPython.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Python 2.3 syntax contributed by Gheorghe Milas */
-dp.sh.Brushes.Python = function()
-{
- var keywords = 'and assert break class continue def del elif else except exec ' +
- 'finally for from global if import in is lambda not or object pass print ' +
- 'raise return try yield while';
-
- var builtins = 'self __builtin__ __dict__ __future__ __methods__ __members__ __author__ __email__ __version__' +
- '__class__ __bases__ __import__ __main__ __name__ __doc__ __self__ __debug__ __slots__ ' +
- 'abs append apply basestring bool buffer callable chr classmethod clear close cmp coerce compile complex ' +
- 'conjugate copy count delattr dict dir divmod enumerate Ellipsis eval execfile extend False file fileno filter float flush ' +
- 'get getattr globals has_key hasarttr hash hex id index input insert int intern isatty isinstance isubclass ' +
- 'items iter keys len list locals long map max min mode oct open ord pop pow property range ' +
- 'raw_input read readline readlines reduce reload remove repr reverse round seek setattr slice sum ' +
- 'staticmethod str super tell True truncate tuple type unichr unicode update values write writelines xrange zip';
-
- var magicmethods = '__abs__ __add__ __and__ __call__ __cmp__ __coerce__ __complex__ __concat__ __contains__ __del__ __delattr__ __delitem__ ' +
- '__delslice__ __div__ __divmod__ __float__ __getattr__ __getitem__ __getslice__ __hash__ __hex__ __eq__ __le__ __lt__ __gt__ __ge__ ' +
- '__iadd__ __isub__ __imod__ __idiv__ __ipow__ __iand__ __ior__ __ixor__ __ilshift__ __irshift__ ' +
- '__invert__ __init__ __int__ __inv__ __iter__ __len__ __long__ __lshift__ __mod__ __mul__ __new__ __neg__ __nonzero__ __oct__ __or__ ' +
- '__pos__ __pow__ __radd__ __rand__ __rcmp__ __rdiv__ __rdivmod__ __repeat__ __repr__ __rlshift__ __rmod__ __rmul__ ' +
- '__ror__ __rpow__ __rrshift__ __rshift__ __rsub__ __rxor__ __setattr__ __setitem__ __setslice__ __str__ __sub__ __xor__';
-
- var exceptions = 'Exception StandardError ArithmeticError LookupError EnvironmentError AssertionError AttributeError EOFError ' +
- 'FutureWarning IndentationError OverflowWarning PendingDeprecationWarning ReferenceError RuntimeWarning ' +
- 'SyntaxWarning TabError UnicodeDecodeError UnicodeEncodeError UnicodeTranslateError UserWarning Warning ' +
- 'IOError ImportError IndexError KeyError KeyboardInterrupt MemoryError NameError NotImplementedError OSError ' +
- 'RuntimeError StopIteration SyntaxError SystemError SystemExit TypeError UnboundLocalError UnicodeError ValueError ' +
- 'FloatingPointError OverflowError WindowsError ZeroDivisionError';
-
- var types = 'NoneType TypeType IntType LongType FloatType ComplexType StringType UnicodeType BufferType TupleType ListType ' +
- 'DictType FunctionType LambdaType CodeType ClassType UnboundMethodType InstanceType MethodType BuiltinFunctionType BuiltinMethodType ' +
- 'ModuleType FileType XRangeType TracebackType FrameType SliceType EllipsisType';
-
- var commonlibs = 'anydbm array asynchat asyncore AST base64 binascii binhex bisect bsddb buildtools bz2 ' +
- 'BaseHTTPServer Bastion calendar cgi cmath cmd codecs codeop commands compiler copy copy_reg ' +
- 'cPickle crypt cStringIO csv curses Carbon CGIHTTPServer ConfigParser Cookie datetime dbhash ' +
- 'dbm difflib dircache distutils doctest DocXMLRPCServer email encodings errno exceptions fcntl ' +
- 'filecmp fileinput ftplib gc gdbm getopt getpass glob gopherlib gzip heapq htmlentitydefs ' +
- 'htmllib httplib HTMLParser imageop imaplib imgfile imghdr imp inspect itertools jpeg keyword ' +
- 'linecache locale logging mailbox mailcap marshal math md5 mhlib mimetools mimetypes mimify mmap ' +
- 'mpz multifile mutex MimeWriter netrc new nis nntplib nsremote operator optparse os parser pickle pipes ' +
- 'popen2 poplib posix posixfile pprint preferences profile pstats pwd pydoc pythonprefs quietconsole ' +
- 'quopri Queue random re readline resource rexec rfc822 rgbimg sched select sets sgmllib sha shelve shutil ' +
- 'signal site smtplib socket stat statcache string struct symbol sys syslog SimpleHTTPServer ' +
- 'SimpleXMLRPCServer SocketServer StringIO tabnanny tarfile telnetlib tempfile termios textwrap ' +
- 'thread threading time timeit token tokenize traceback tty types Tkinter unicodedata unittest ' +
- 'urllib urllib2 urlparse user UserDict UserList UserString warnings weakref webbrowser whichdb ' +
- 'xml xmllib xmlrpclib xreadlines zipfile zlib';
-
- this.regexList = [
- { regex: new RegExp('#.*$', 'gm'), css: 'comment' }, // comments
- { regex: new RegExp('^\\s*"""(.|\n)*?"""\\s*$', 'gm'), css: 'docstring' }, // documentation string "
- { regex: new RegExp('^\\s*\'\'\'(.|\n)*?\'\'\'\\s*$', 'gm'), css: 'docstring' }, // documentation string '
- { regex: new RegExp('"""(.|\n)*?"""', 'g'), css: 'string' }, // multi-line strings "
- { regex: new RegExp('\'\'\'(.|\n)*?\'\'\'', 'g'), css: 'string' }, // multi-line strings '
- { regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'), css: 'string' }, // strings "
- { regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'), css: 'string' }, // strings '
- { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' }, // keywords
- { regex: new RegExp(this.GetKeywords(builtins), 'gm'), css: 'builtins' }, // builtin objects, functions, methods, magic attributes
- { regex: new RegExp(this.GetKeywords(magicmethods), 'gm'), css: 'magicmethods' }, // special methods
- { regex: new RegExp(this.GetKeywords(exceptions), 'gm'), css: 'exceptions' }, // standard exception classes
- { regex: new RegExp(this.GetKeywords(types), 'gm'), css: 'types' }, // types from types.py
- { regex: new RegExp(this.GetKeywords(commonlibs), 'gm'), css: 'commonlibs' } // common standard library modules
- ];
-
- this.CssClass = 'dp-py';
-}
-
-dp.sh.Brushes.Python.prototype = new dp.sh.Highlighter();
-dp.sh.Brushes.Python.Aliases = ['py', 'python'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushRuby.js b/src/usr/local/www/code-syntax-highlighter/shBrushRuby.js
deleted file mode 100644
index fdc5e34..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shBrushRuby.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Ruby 1.8.4 syntax contributed by Erik Peterson */
-dp.sh.Brushes.Ruby = function()
-{
- var keywords = 'alias and BEGIN begin break case class def define_method defined do each else elsif ' +
- 'END end ensure false for if in module new next nil not or raise redo rescue retry return ' +
- 'self super then throw true undef unless until when while yield';
-
- var builtins = 'Array Bignum Binding Class Continuation Dir Exception FalseClass File::Stat File Fixnum Fload ' +
- 'Hash Integer IO MatchData Method Module NilClass Numeric Object Proc Range Regexp String Struct::TMS Symbol ' +
- 'ThreadGroup Thread Time TrueClass'
-
- this.regexList = [
- { regex: dp.sh.RegexLib.SingleLinePerlComments, css: 'comment' }, // one line comments
- { regex: dp.sh.RegexLib.DoubleQuotedString, css: 'string' }, // double quoted strings
- { regex: dp.sh.RegexLib.SingleQuotedString, css: 'string' }, // single quoted strings
- { regex: new RegExp(':[a-z][A-Za-z0-9_]*', 'g'), css: 'symbol' }, // symbols
- { regex: new RegExp('[\\$|@|@@]\\w+', 'g'), css: 'variable' }, // $global, @instance, and @@class variables
- { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' }, // keywords
- { regex: new RegExp(this.GetKeywords(builtins), 'gm'), css: 'builtin' } // builtins
- ];
-
- this.CssClass = 'dp-rb';
-}
-
-dp.sh.Brushes.Ruby.prototype = new dp.sh.Highlighter();
-dp.sh.Brushes.Ruby.Aliases = ['ruby', 'rails'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushSql.js b/src/usr/local/www/code-syntax-highlighter/shBrushSql.js
deleted file mode 100644
index b52543e..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shBrushSql.js
+++ /dev/null
@@ -1,40 +0,0 @@
-dp.sh.Brushes.Sql = function()
-{
- var funcs = 'abs avg case cast coalesce convert count current_timestamp ' +
- 'current_user day isnull left lower month nullif replace right ' +
- 'session_user space substring sum system_user upper user year';
-
- var keywords = 'absolute action add after alter as asc at authorization begin bigint ' +
- 'binary bit by cascade char character check checkpoint close collate ' +
- 'column commit committed connect connection constraint contains continue ' +
- 'create cube current current_date current_time cursor database date ' +
- 'deallocate dec decimal declare default delete desc distinct double drop ' +
- 'dynamic else end end-exec escape except exec execute false fetch first ' +
- 'float for force foreign forward free from full function global goto grant ' +
- 'group grouping having hour ignore index inner insensitive insert instead ' +
- 'int integer intersect into is isolation key last level load local max min ' +
- 'minute modify move name national nchar next no numeric of off on only ' +
- 'open option order out output partial password precision prepare primary ' +
- 'prior privileges procedure public read real references relative repeatable ' +
- 'restrict return returns revoke rollback rollup rows rule schema scroll ' +
- 'second section select sequence serializable set size smallint static ' +
- 'statistics table temp temporary then time timestamp to top transaction ' +
- 'translation trigger true truncate uncommitted union unique update values ' +
- 'varchar varying view when where with work';
-
- var operators = 'all and any between cross in join like not null or outer some';
-
- this.regexList = [
- { regex: new RegExp('--(.*)$', 'gm'), css: 'comment' }, // one line and multiline comments
- { regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'), css: 'string' }, // strings
- { regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'), css: 'string' }, // strings
- { regex: new RegExp(this.GetKeywords(funcs), 'gmi'), css: 'func' }, // functions
- { regex: new RegExp(this.GetKeywords(operators), 'gmi'), css: 'op' }, // operators and such
- { regex: new RegExp(this.GetKeywords(keywords), 'gmi'), css: 'keyword' } // keyword
- ];
-
- this.CssClass = 'dp-sql';
-}
-
-dp.sh.Brushes.Sql.prototype = new dp.sh.Highlighter();
-dp.sh.Brushes.Sql.Aliases = ['sql'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushVb.js b/src/usr/local/www/code-syntax-highlighter/shBrushVb.js
deleted file mode 100644
index 197adcc..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shBrushVb.js
+++ /dev/null
@@ -1,29 +0,0 @@
-dp.sh.Brushes.Vb = function()
-{
- var keywords = 'AddHandler AddressOf AndAlso Alias And Ansi As Assembly Auto ' +
- 'Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate ' +
- 'CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType ' +
- 'Date Decimal Declare Default Delegate Dim DirectCast Do Double Each ' +
- 'Else ElseIf End Enum Erase Error Event Exit False Finally For Friend ' +
- 'Function Get GetType GoSub GoTo Handles If Implements Imports In ' +
- 'Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module ' +
- 'MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing ' +
- 'NotInheritable NotOverridable Object On Option Optional Or OrElse ' +
- 'Overloads Overridable Overrides ParamArray Preserve Private Property ' +
- 'Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume ' +
- 'Return Select Set Shadows Shared Short Single Static Step Stop String ' +
- 'Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until ' +
- 'Variant When While With WithEvents WriteOnly Xor';
-
- this.regexList = [
- { regex: new RegExp('\'.*$', 'gm'), css: 'comment' }, // one line comments
- { regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'), css: 'string' }, // strings
- { regex: new RegExp('^\\s*#.*', 'gm'), css: 'preprocessor' }, // preprocessor tags like #region and #endregion
- { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' } // c# keyword
- ];
-
- this.CssClass = 'dp-vb';
-}
-
-dp.sh.Brushes.Vb.prototype = new dp.sh.Highlighter();
-dp.sh.Brushes.Vb.Aliases = ['vb', 'vb.net'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushXml.js b/src/usr/local/www/code-syntax-highlighter/shBrushXml.js
deleted file mode 100644
index 0286082..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shBrushXml.js
+++ /dev/null
@@ -1,61 +0,0 @@
-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:
-
- (<!\[CDATA\[\s*.*\s*\]\]>)
- | (<!--\s*.*\s*?-->)
- | (<)*(\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
- // <!--\s*.*\s*?-->
- this.GetMatches(new RegExp('<!--\\s*.*\\s*?-->', '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
- // </*\?*\s*(\w+)
- regex = new RegExp('</*\\?*\\s*([\\w-\.]+)', 'gm');
- while((match = regex.exec(this.code)) != null)
- {
- push(this.matches, new dp.sh.Match(match[1], match.index + match[0].indexOf(match[1]), 'tag-name'));
- }
-}
diff --git a/src/usr/local/www/code-syntax-highlighter/shCore.js b/src/usr/local/www/code-syntax-highlighter/shCore.js
deleted file mode 100644
index e830438..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shCore.js
+++ /dev/null
@@ -1,589 +0,0 @@
-/**
- * Code Syntax Highlighter. Version 1.1.0
- * Copyright (C) 2004 Dream Projections Inc.
- *
- * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- **
- * Usage example:
- *
- * <script src="shCore.js" type="text/javascript"></script>
- * <script src="shBrushXml.js" type="text/javascript"></script>
- *
- * <textarea name="code" language="html">
- * <img src="myimage.gif" border="0">
- * </textarea>
- *
- * <script>dp.SyntaxHighlighter.HighlightAll('code', 'value');</script>
- *
- **
- * History:
- * 1.1.0 - March 23rd, 2005
- * - split brushes into separate files
- * - now works in Safari
- * - added missing strings to PHP matches
- *
- * 1.0.4 - February 2nd, 2005
- * - added Delphi & Python
- * - multi-line comments fixed
- * - language name can be set through w3c valid 'class' attribute
- * - HighlightAll(name, [showGutter], [showTools])
- *
- * 1.0.3 - December 31th, 2004 (added PHP & SQL)
- * 1.0.2 - December 28th, 2004 (refactoring with namespaces)
- * 1.0.1 - December 14th, 2004
- * 1.0.0 - November 13th, 2004
- */
-
-// create namespaces
-var dp = {
- sh : // dp.sh
- {
- Utils : {}, // dp.sh.Utils
- Brushes : {} // dp.sh.Brushes
- }
-};
-
-dp.sh.Config = {
- Version : '1.1.0',
- About : '<html><head><title>About...</title></head><body class="dp-about"><table cellspacing="0"><tr><td class="copy"><div class="para title">dp.SyntaxHighlighter</div><div class="para">Version: {V}</div><div class="para"><a href="http://www.dreamprojections.com/sh/?ref=about" target="_blank">http://www.dreamprojections.com/SyntaxHighlighter</a></div>&copy;2004-2005 Dream Projections Inc. All right reserved.</td></tr><tr><td class="footer"><input type="button" class="close" value="OK" onClick="window.close()"/></td></tr></table></body></html>'
-};
-
-dp.SyntaxHighlighter = dp.sh;
-
-
-
-// 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(/</g, '&lt;');
-
- wnd.document.write('<pre>' + code + '</pre>');
- 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('The code is in your clipboard now.');
- }
-}
-
-// 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(/</g, '&lt;');
-
- doc.open();
- doc.write('<pre>' + code + '</pre>');
- 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');
- var doc = wnd.document;
-
- var styles = document.getElementsByTagName('style');
- var links = document.getElementsByTagName('link');
-
- doc.write(dp.sh.Config.About.replace('{V}', dp.sh.Config.Version));
-
- // copy over ALL the styles from the parent page
- for(var i = 0; i < styles.length; i++)
- doc.write('<style>' + styles[i].innerHTML + '</style>');
-
- for(var i = 0; i < links.length; i++)
- if(links[i].rel.toLowerCase() == 'stylesheet')
- doc.write('<link type="text/css" rel="stylesheet" href="' + links[i].href + '"></link>');
-
- doc.close();
- wnd.focus();
-}
-
-
-
-
-
-// creates a new match object
-dp.sh.Match = function(value, index, css)
-{
- this.value = value;
- this.index = index;
- this.length = value.length;
- this.css = css;
-}
-
-
-
-
-
-dp.sh.Highlighter = function()
-{
- this.addGutter = true;
- this.addControls = true;
- 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, '&amp;');
- str = str.replace(/ /g, '&nbsp;');
- str = str.replace(/</g, '&lt;');
- str = str.replace(/\n/gm, '&nbsp;<br />');
-
- // 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('<br />', 'gi');
-
- if(regex.test(str))
- {
- var lines = str.split('&nbsp;<br />');
-
- 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 <br /> 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 another
-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++)
- {
- var line = lines[i];
- result += ProcessLine(line, tabSize) + '\n';
- }
-
- return result;
-}
-
-dp.sh.Highlighter.prototype.SwitchToTable = function()
-{
- // Safari fix: for some reason lowercase <br /> isn't getting picked up, even though 'i' is set
- var lines = this.div.innerHTML.split(/<br \/>/gi);
- var row = null;
- var cell = null;
- var html = '';
- var pipe = ' | ';
-
- // creates an anchor to a utility
- function UtilHref(util, text)
- {
- return '<a href="#" onclick="dp.sh.Utils.' + util + '(this); return false;">' + text + '</a>';
- }
-
- row = this.table.insertRow(-1);
-
- if(this.addGutter == true)
- {
- cell = row.insertCell(-1);
- cell.className = 'tools-corner';
- }
-
- if(this.addControls == true)
- {
- cell = row.insertCell(-1);
-
- cell.originalCode = this.originalCode;
- cell.processedCode = this.code;
-
- cell.className = 'tools';
- cell.innerHTML = UtilHref('ViewSource', 'view plain') + pipe + UtilHref('PrintSource', 'print');
-
- if(window.clipboardData)
- {
- cell.innerHTML += pipe + UtilHref('ToClipboard', 'copy to clipboard');
- }
-
- cell.innerHTML += pipe + UtilHref('About', '?');
- }
-
- for(var i = 0; i < lines.length - 1; i++)
- {
- row = this.table.insertRow(-1);
-
- if(this.addGutter == true)
- {
- cell = row.insertCell(-1);
- cell.className = 'gutter';
- cell.innerHTML = i + 1;
- }
-
- cell = row.insertCell(-1);
- cell.className = 'line';
- cell.innerHTML = lines[i];
- }
-
- this.div.innerHTML = '';
-}
-
-dp.sh.Highlighter.prototype.Highlight = function(code)
-{
- // This function strips all new lines and spaces
- // from the beging and end of the string .
- function Trim(str)
- {
- var begining = new RegExp('^[\\s\\n]', 'g');
- var end = new RegExp('[\\s\\n]$', 'g');
-
- while(begining.test(str))
- {
- str = str.substr(1);
- }
-
- while(end.test(str))
- {
- str = str.substr(0, str.length - 1);
- }
-
- return str;
- }
-
- // 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 = Trim(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, do nothing
- if(this.matches.length == 0)
- {
- 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 */)
-{
- var elements = document.getElementsByName(name);
- var highlighter = null;
- var registered = new Object();
- var propertyName = 'value';
-
- function FindValue()
- {
- var a = arguments;
-
- for(var i = 0; i < a.length; i++)
- if(a[i] != null && ((typeof(a[i]) == 'string' && a[i] != '') || (typeof(a[i]) == 'object' && a[i].value != '')))
- return a[i];
-
- return null;
- }
-
- if(elements == null)
- {
- return;
- }
-
- // if showGutter isn't set, default to TRUE
- if(showGutter == null)
- {
- showGutter = true;
- }
-
- // if showControls isn't set, default to TRUE
- if(showControls == null)
- {
- showControls = true;
- }
-
- // 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 language = FindValue(element.attributes['class'], element.className, element.attributes['language'], element.language);
-
- if(language == null)
- continue;
-
- if(language.value)
- language = language.value;
-
- language = (language + '').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;
- highlighter.addControls = showControls;
- 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);
- }
-}
diff --git a/src/usr/local/www/code-syntax-highlighter/shCore.uncompressed.js b/src/usr/local/www/code-syntax-highlighter/shCore.uncompressed.js
deleted file mode 100644
index 8d92721..0000000
--- a/src/usr/local/www/code-syntax-highlighter/shCore.uncompressed.js
+++ /dev/null
@@ -1,636 +0,0 @@
-/**
- * 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 :
- {
- Toolbar : {},
- Utils : {},
- RegexLib: {},
- Brushes : {},
- Strings : {},
- Version : '1.4.1'
- }
-};
-
-dp.sh.Strings = {
- AboutDialog : '<html><head><title>About...</title></head><body class="dp-about"><table cellspacing="0"><tr><td class="copy"><p class="title">dp.SyntaxHighlighter</div><div class="para">Version: {V}</p><p><a href="http://www.dreamprojections.com/syntaxhighlighter/?ref=about" target="_blank">http://www.dreamprojections.com/SyntaxHighlighter</a></p>&copy;2004-2005 Alex Gorbatchev. All right reserved.</td></tr><tr><td class="footer"><input type="button" class="close" value="OK" onClick="window.close()"/></td></tr></table></body></html>'
-};
-
-dp.SyntaxHighlighter = dp.sh;
-
-//
-// Toolbar functions
-//
-
-dp.sh.Toolbar.Commands = {
- ExpandSource: {
- label: '+ expand source',
- check: function(highlighter) { return highlighter.collapse; },
- func: function(sender, highlighter)
- {
- sender.parentNode.removeChild(sender);
- highlighter.div.className = highlighter.div.className.replace('collapsed', '');
- }
- },
-
- // opens a new windows and puts the original unformatted source code inside.
- ViewSource: {
- label: 'view plain',
- func: function(sender, highlighter)
- {
- var code = highlighter.originalCode.replace(/</g, '&lt;');
- var wnd = window.open('', '_blank', 'width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=1');
- wnd.document.write('<textarea style="width:99%;height:99%">' + code + '</textarea>');
- wnd.document.close();
- }
- },
-
- // copies the original source code in to the clipboard (IE only)
- CopyToClipboard: {
- label: 'copy to clipboard',
- check: function() { return window.clipboardData != null; },
- func: function(sender, highlighter)
- {
- window.clipboardData.setData('text', highlighter.originalCode);
- alert('The code is in your clipboard now');
- }
- },
-
- // creates an invisible iframe, puts the original source code inside and prints it
- PrintSource: {
- label: 'print',
- func: function(sender, highlighter)
- {
- var iframe = document.createElement('IFRAME');
- var doc = null;
-
- // this hides the iframe
- iframe.style.cssText = 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;';
-
- document.body.appendChild(iframe);
- doc = iframe.contentWindow.document;
-
- dp.sh.Utils.CopyStyles(doc, window.document);
- doc.write('<div class="' + highlighter.div.className.replace('collapsed', '') + ' printing">' + highlighter.div.innerHTML + '</div>');
- doc.close();
-
- iframe.contentWindow.focus();
- iframe.contentWindow.print();
-
- alert('Printing...');
-
- document.body.removeChild(iframe);
- }
- },
-
- About: {
- label: '?',
- func: function(highlighter)
- {
- var wnd = window.open('', '_blank', 'dialog,width=300,height=150,scrollbars=0');
- var doc = wnd.document;
-
- dp.sh.Utils.CopyStyles(doc, window.document);
-
- doc.write(dp.sh.Strings.AboutDialog.replace('{V}', dp.sh.Version));
- doc.close();
- wnd.focus();
- }
- }
-};
-
-// creates a <div /> with all toolbar links
-dp.sh.Toolbar.Create = function(highlighter)
-{
- var div = document.createElement('div');
-
- div.className = 'tools';
-
- for(var name in dp.sh.Toolbar.Commands)
- {
- var cmd = dp.sh.Toolbar.Commands[name];
-
- if(cmd.check != null && !cmd.check(highlighter))
- continue;
-
- div.innerHTML += '<a href="#" onclick="dp.sh.Toolbar.Command(\'' + name + '\',this);return false;">' + cmd.label + '</a>';
- }
-
- return div;
-}
-
-// executes toolbar command by name
-dp.sh.Toolbar.Command = function(name, sender)
-{
- var n = sender;
-
- while(n != null && n.className.indexOf('dp-highlighter') == -1)
- n = n.parentNode;
-
- if(n != null)
- dp.sh.Toolbar.Commands[name].func(sender, n.highlighter);
-}
-
-// copies all <link rel="stylesheet" /> from 'target' window to 'dest'
-dp.sh.Utils.CopyStyles = function(destDoc, sourceDoc)
-{
- var links = sourceDoc.getElementsByTagName('link');
-
- for(var i = 0; i < links.length; i++)
- if(links[i].rel.toLowerCase() == 'stylesheet')
- destDoc.write('<link type="text/css" rel="stylesheet" href="' + links[i].href + '"></link>');
-}
-
-//
-// Common reusable regular expressions
-//
-dp.sh.RegexLib = {
- MultiLineCComments : new RegExp('/\\*[\\s\\S]*?\\*/', 'gm'),
- SingleLineCComments : new RegExp('//.*$', 'gm'),
- SingleLinePerlComments : new RegExp('#.*$', 'gm'),
- DoubleQuotedString : new RegExp('"(?:\\.|(\\\\\\")|[^\\""])*"','g'),
- SingleQuotedString : new RegExp("'(?:\\.|(\\\\\\')|[^\\''])*'", 'g')
-};
-
-//
-// 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.noGutter = false;
- this.addControls = true;
- this.collapse = false;
- this.tabsToSpaces = true;
- this.wrapColumn = 80;
- this.showColumns = 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;
-}
-
-dp.sh.Highlighter.prototype.createElement = function(name)
-{
- var result = document.createElement(name);
- result.highlighter = this;
- return result;
-}
-
-// 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)
-{
- if(str == null || str.length == 0)
- return;
-
- var span = this.createElement('span');
-
- str = str.replace(/&/g, '&amp;');
- str = str.replace(/ /g, '&nbsp;');
- str = str.replace(/</g, '&lt;');
- str = str.replace(/\n/gm, '&nbsp;<br />');
-
- // 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('<br />', 'gi');
-
- if(regex.test(str))
- {
- var lines = str.split('&nbsp;<br />');
-
- str = '';
-
- for(var i = 0; i < lines.length; i++)
- {
- span = this.createElement('span');
- span.className = css;
- span.innerHTML = lines[i];
-
- this.div.appendChild(span);
-
- // don't add a <br /> for the last line
- if(i + 1 < lines.length)
- this.div.appendChild(this.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 false;
-
- 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.SwitchToList = function()
-{
- // thanks to Lachlan Donald from SitePoint.com for this <br /> tag fix.
- var html = this.div.innerHTML.replace(/<(br)\/?>/gi, '\n');
- var lines = html.split('\n');
-
- if(this.addControls == true)
- this.bar.appendChild(dp.sh.Toolbar.Create(this));
-
- // add columns ruler
- if(this.showColumns)
- {
- var div = this.createElement('div');
- var columns = this.createElement('div');
- var showEvery = 10;
- var i = 1;
-
- while(i <= 150)
- {
- if(i % showEvery == 0)
- {
- div.innerHTML += i;
- i += (i + '').length;
- }
- else
- {
- div.innerHTML += '&middot;';
- i++;
- }
- }
-
- columns.className = 'columns';
- columns.appendChild(div);
- this.bar.appendChild(columns);
- }
-
- for(var i = 0, lineIndex = this.firstLine; i < lines.length - 1; i++, lineIndex++)
- {
- var li = this.createElement('li');
- var span = this.createElement('span');
-
- // uses .line1 and .line2 css styles for alternating lines
- li.className = (i % 2 == 0) ? 'alt' : '';
- span.innerHTML = lines[i] + '&nbsp;';
-
- li.appendChild(span);
- this.ol.appendChild(li);
- }
-
- 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 = this.createElement('div');
- this.bar = this.createElement('div');
- this.ol = this.createElement('ol');
- this.matches = new Array();
-
- this.div.className = 'dp-highlighter';
- this.div.highlighter = this;
-
- this.bar.className = 'bar';
-
- // set the first line
- this.ol.start = this.firstLine;
-
- if(this.CssClass != null)
- this.ol.className = this.CssClass;
-
- if(this.collapse)
- this.div.className += ' collapsed';
-
- if(this.noGutter)
- this.div.className += ' nogutter';
-
- // replace tabs with spaces
- if(this.tabsToSpaces == true)
- this.code = this.ProcessSmartTabs(this.code);
-
- this.ProcessRegexList();
-
- // if no matches found, add entire code as plain text
- if(this.matches.length == 0)
- {
- this.AddBit(this.code, null);
- this.SwitchToList();
- this.div.appendChild(this.ol);
- 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 highligted 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.SwitchToList();
- this.div.appendChild(this.bar);
- this.div.appendChild(this.ol);
-}
-
-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 */, showColumns /* 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.noGutter = (showGutter == null) ? IsOptionSet('nogutter', options) : !showGutter;
- highlighter.addControls = (showControls == null) ? !IsOptionSet('nocontrols', options) : showControls;
- highlighter.collapse = (collapseAll == null) ? IsOptionSet('collapse', options) : collapseAll;
- highlighter.showColumns = (showColumns == null) ? IsOptionSet('showcolumns', options) : showColumns;
-
- // first line idea comes from Andrew Collington, thanks!
- highlighter.firstLine = (firstLine == null) ? parseInt(GetOptionValue('firstline', options, 1)) : firstLine;
-
- highlighter.Highlight(element[propertyName]);
-
- element.parentNode.insertBefore(highlighter.div, element);
- }
-}
diff --git a/src/usr/local/www/copyright-master.txt b/src/usr/local/www/copyright-master.txt
new file mode 100644
index 0000000..5bfc17c
--- /dev/null
+++ b/src/usr/local/www/copyright-master.txt
@@ -0,0 +1,51 @@
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */ \ No newline at end of file
diff --git a/src/usr/local/www/crash_reporter.php b/src/usr/local/www/crash_reporter.php
index 3b00e47..dc0a7c9 100644
--- a/src/usr/local/www/crash_reporter.php
+++ b/src/usr/local/www/crash_reporter.php
@@ -2,32 +2,58 @@
/* $Id$ */
/*
crash_reporter.php
- part of pfSense
- Copyright (C) 2011 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: header
*/
@@ -49,7 +75,7 @@ function upload_crash_report($files) {
global $g;
$post = array();
$counter = 0;
- foreach ($files as $file) {
+ foreach($files as $file) {
$post["file{$counter}"] = "@{$file}";
$counter++;
}
@@ -60,23 +86,12 @@ function upload_crash_report($files) {
curl_setopt($ch, CURLOPT_USERAGENT, $g['product_name'] . '/' . $g['product_version']);
curl_setopt($ch, CURLOPT_URL, $g['crashreporterurl']);
curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$response = curl_exec($ch);
return $response;
}
-function output_crash_reporter_html($crash_reports) {
- echo "<p><strong>" . gettext("Unfortunately we have detected a programming bug.") . "</strong></p>";
- echo "<p>" . gettext("Would you like to submit the programming debug logs to the pfSense developers for inspection?") . "</p>";
- echo "<p><i>" . gettext("Please double check the contents to ensure you are comfortable sending this information before clicking Yes.") . "</i></p>";
- echo "<p>" . gettext("Contents of crash reports") . ":<br />";
- echo "<textarea readonly=\"readonly\" rows=\"40\" cols=\"65\" name=\"crashreports\">{$crash_reports}</textarea></p>";
- echo "<p><input name=\"Submit\" type=\"submit\" class=\"formbtn\" value=\"" . gettext("Yes") . "\" />" . gettext(" - Submit this to the developers for inspection") . "</p>";
- echo "<p><input name=\"Submit\" type=\"submit\" class=\"formbtn\" value=\"" . gettext("No") . "\" />" . gettext(" - Just delete the crash report and take me back to the Dashboard") . "</p>";
- echo "</form>";
-}
-
-$pgtitle = array(gettext("Diagnostics"), gettext("Crash reporter"));
+$pgtitle = array(gettext("Diagnostics"),gettext("Crash reporter"));
include('head.inc');
$crash_report_header = "Crash report begins. Anonymous machine information:\n\n";
@@ -86,15 +101,7 @@ $crash_report_header .= php_uname("v") . "\n";
$crash_report_header .= "\nCrash report details:\n";
exec("/usr/bin/grep -vi warning /tmp/PHP_errors.log", $php_errors);
-
?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-
-<?php include("fbegin.inc"); ?>
-
- <form action="crash_reporter.php" method="post">
-
<?php
if (gettext($_POST['Submit']) == "Yes") {
echo gettext("Processing...");
@@ -112,7 +119,7 @@ exec("/usr/bin/grep -vi warning /tmp/PHP_errors.log", $php_errors);
echo gettext("Uploading...");
ob_flush();
flush();
- if (is_array($files_to_upload)) {
+ if(is_array($files_to_upload)) {
$resp = upload_crash_report($files_to_upload);
array_map('unlink', glob("/var/crash/*"));
// Erase the contents of the PHP error log
@@ -123,7 +130,7 @@ exec("/usr/bin/grep -vi warning /tmp/PHP_errors.log", $php_errors);
} else {
echo "Could not find any crash files.";
}
- } else if (gettext($_POST['Submit']) == "No") {
+ } else if(gettext($_POST['Submit']) == "No") {
array_map('unlink', glob("/var/crash/*"));
// Erase the contents of the PHP error log
fclose(fopen("/tmp/PHP_errors.log", 'w'));
@@ -136,9 +143,9 @@ exec("/usr/bin/grep -vi warning /tmp/PHP_errors.log", $php_errors);
$crash_reports .= "\nPHP Errors:\n";
$crash_reports .= implode("\n", $php_errors) . "\n\n";
}
- if (is_array($crash_files)) {
- foreach ($crash_files as $cf) {
- if (filesize($cf) < FILE_SIZE) {
+ if(is_array($crash_files)) {
+ foreach($crash_files as $cf) {
+ if(filesize($cf) < FILE_SIZE) {
$crash_reports .= "\nFilename: {$cf}\n";
$crash_reports .= file_get_contents($cf);
}
@@ -146,11 +153,26 @@ exec("/usr/bin/grep -vi warning /tmp/PHP_errors.log", $php_errors);
} else {
echo "Could not locate any crash data.";
}
- output_crash_reporter_html($crash_reports);
+?>
+ <div class="jumbotron">
+ <div class="panel panel-default">
+ <div class="panel-heading"><h3><?=gettext("Unfortunately we have detected a programming bug.")?></h3></div>
+ <div class="panel-body">
+ <p>
+ <?=gettext("Would you like to submit the programming debug logs to the pfSense developers for inspection?")?>
+ <i><?=gettext("Please double check the contents to ensure you are comfortable sending this information before clicking Yes.")?></i>
+ </p>
+ <textarea readonly="readonly" style="width: 100%; height: 350px;">
+ <?=$crash_reports?>
+ </textarea>
+ <form action="crash_reporter.php" method="post">
+ <button class="btn btn-primary" name="Submit" type="submit" value="Yes"><?=gettext("Yes")?> - <?=gettext("Submit this to the developers for inspection")?></button>
+ <button class="btn btn-default" name="Submit" type="submit" value="No"><?=gettext("No")?> - <?=gettext("Just delete the crash report and take me back to the Dashboard")?></button>
+ </form>
+ </div>
+ </div>
+<?php
}
?>
-<?php include("fend.inc"); ?>
-
-</body>
-</html>
+<?php include("foot.inc")?> \ No newline at end of file
diff --git a/src/usr/local/www/css/table.css b/src/usr/local/www/css/table.css
deleted file mode 100644
index 3393db3..0000000
--- a/src/usr/local/www/css/table.css
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Element CSS Definitions for (MultiRow-)tables
-if theme changes are needed include a table.css in the /themes/yourtheme/ */
-.listMR {
- background-color: #DDD;
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listMRlr {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listMRr {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listMRodd {
- background-color: #FFFFFF;
-}
-.listMReven {
- background-color: #F0F0F0;
-}
-.listMRDescriptionL {
- border-right: none;
- border-bottom: 2px solid #999999;
-}
-.listMRDescriptionR {
- border-left: none;
- border-bottom: 2px solid #999999;
-}
-.ellipsis {
- overflow: hidden;
- text-overflow: ellipsis;
-}
diff --git a/src/usr/local/www/d3pie/d3.min.js b/src/usr/local/www/d3pie/d3.min.js
new file mode 100644
index 0000000..7b7b9b1
--- /dev/null
+++ b/src/usr/local/www/d3pie/d3.min.js
@@ -0,0 +1,5 @@
+!function(){function n(n,t){return t>n?-1:n>t?1:n>=t?0:0/0}function t(n){return null!=n&&!isNaN(n)}function e(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function r(n){return n.length}function u(n){for(var t=1;n*t%1;)t*=10;return t}function i(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function o(){}function a(n){return ha+n in this}function c(n){return n=ha+n,n in this&&delete this[n]}function s(){var n=[];return this.forEach(function(t){n.push(t)}),n}function l(){var n=0;for(var t in this)t.charCodeAt(0)===ga&&++n;return n}function f(){for(var n in this)if(n.charCodeAt(0)===ga)return!1;return!0}function h(){}function g(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function p(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=pa.length;r>e;++e){var u=pa[e]+t;if(u in n)return u}}function v(){}function d(){}function m(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new o;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function y(){Go.event.preventDefault()}function x(){for(var n,t=Go.event;n=t.sourceEvent;)t=n;return t}function M(n){for(var t=new d,e=0,r=arguments.length;++e<r;)t[arguments[e]]=m(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=Go.event;u.target=n,Go.event=u,t[u.type].apply(e,r)}finally{Go.event=i}}},t}function _(n){return da(n,_a),n}function b(n){return"function"==typeof n?n:function(){return ma(n,this)}}function w(n){return"function"==typeof n?n:function(){return ya(n,this)}}function S(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=Go.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function k(n){return n.trim().replace(/\s+/g," ")}function E(n){return new RegExp("(?:^|\\s+)"+Go.requote(n)+"(?:\\s+|$)","g")}function N(n){return n.trim().split(/^|\s+/)}function A(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=N(n).map(C);var u=n.length;return"function"==typeof t?r:e}function C(n){var t=E(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",k(u+" "+n))):e.setAttribute("class",k(u.replace(t," ")))}}function L(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function T(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function q(n){return"function"==typeof n?n:(n=Go.ns.qualify(n)).local?function(){return this.ownerDocument.createElementNS(n.space,n.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,n)}}function z(n){return{__data__:n}}function R(n){return function(){return Ma(this,n)}}function D(t){return arguments.length||(t=n),function(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}}function P(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function U(n){return da(n,wa),n}function j(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function H(){var n=this.__transition__;n&&++n.active}function F(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=c(t,Qo(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+Go.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),c=O;a>0&&(n=n.substring(0,a));var s=ka.get(n);return s&&(n=s,c=Y),a?t?u:r:t?v:i}function O(n,t){return function(e){var r=Go.event;Go.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{Go.event=r}}}function Y(n,t){var e=O(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function I(){var n=".dragsuppress-"+ ++Na,t="click"+n,e=Go.select(ea).on("touchmove"+n,y).on("dragstart"+n,y).on("selectstart"+n,y);if(Ea){var r=ta.style,u=r[Ea];r[Ea]="none"}return function(i){function o(){e.on(t,null)}e.on(n,null),Ea&&(r[Ea]=u),i&&(e.on(t,function(){y(),o()},!0),setTimeout(o,0))}}function Z(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();return r.x=t.clientX,r.y=t.clientY,r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var u=n.getBoundingClientRect();return[t.clientX-u.left-n.clientLeft,t.clientY-u.top-n.clientTop]}function V(){return Go.event.changedTouches[0].identifier}function $(){return Go.event.target}function X(){return ea}function B(n){return n>0?1:0>n?-1:0}function J(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function W(n){return n>1?0:-1>n?Aa:Math.acos(n)}function G(n){return n>1?La:-1>n?-La:Math.asin(n)}function K(n){return((n=Math.exp(n))-1/n)/2}function Q(n){return((n=Math.exp(n))+1/n)/2}function nt(n){return((n=Math.exp(2*n))-1)/(n+1)}function tt(n){return(n=Math.sin(n/2))*n}function et(){}function rt(n,t,e){return new ut(n,t,e)}function ut(n,t,e){this.h=n,this.s=t,this.l=e}function it(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,yt(u(n+120),u(n),u(n-120))}function ot(n,t,e){return new at(n,t,e)}function at(n,t,e){this.h=n,this.c=t,this.l=e}function ct(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),st(e,Math.cos(n*=za)*t,Math.sin(n)*t)}function st(n,t,e){return new lt(n,t,e)}function lt(n,t,e){this.l=n,this.a=t,this.b=e}function ft(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=gt(u)*Za,r=gt(r)*Va,i=gt(i)*$a,yt(vt(3.2404542*u-1.5371385*r-.4985314*i),vt(-.969266*u+1.8760108*r+.041556*i),vt(.0556434*u-.2040259*r+1.0572252*i))}function ht(n,t,e){return n>0?ot(Math.atan2(e,t)*Ra,Math.sqrt(t*t+e*e),n):ot(0/0,0/0,n)}function gt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function pt(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function vt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function dt(n){return yt(n>>16,255&n>>8,255&n)}function mt(n){return dt(n)+""}function yt(n,t,e){return new xt(n,t,e)}function xt(n,t,e){this.r=n,this.g=t,this.b=e}function Mt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _t(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(kt(u[0]),kt(u[1]),kt(u[2]))}return(i=Ja.get(n))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.substring(1),16))||(4===n.length?(o=(3840&i)>>4,o=o>>4|o,a=240&i,a=a>>4|a,c=15&i,c=c<<4|c):7===n.length&&(o=(16711680&i)>>16,a=(65280&i)>>8,c=255&i)),t(o,a,c))}function bt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),rt(r,u,c)}function wt(n,t,e){n=St(n),t=St(t),e=St(e);var r=pt((.4124564*n+.3575761*t+.1804375*e)/Za),u=pt((.2126729*n+.7151522*t+.072175*e)/Va),i=pt((.0193339*n+.119192*t+.9503041*e)/$a);return st(116*u-16,500*(r-u),200*(u-i))}function St(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function kt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function Et(n){return"function"==typeof n?n:function(){return n}}function Nt(n){return n}function At(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Ct(t,e,n,r)}}function Ct(n,t,e,r){function u(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=Go.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,s=null;return!ea.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=Go.event;Go.event=n;try{o.progress.call(i,c)}finally{Go.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(s=n,i):s},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Qo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var l in a)c.setRequestHeader(l,a[l]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=s&&(c.responseType=s),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},Go.rebind(i,o,"on"),null==r?i:i.get(Lt(r))}function Lt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Tt(){var n=qt(),t=zt()-n;t>24?(isFinite(t)&&(clearTimeout(Qa),Qa=setTimeout(Tt,t)),Ka=0):(Ka=1,tc(Tt))}function qt(){var n=Date.now();for(nc=Wa;nc;)n>=nc.t&&(nc.f=nc.c(n-nc.t)),nc=nc.n;return n}function zt(){for(var n,t=Wa,e=1/0;t;)t.f?t=n?n.n=t.n:Wa=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return Ga=n,e}function Rt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Dt(n,t){var e=Math.pow(10,3*fa(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Pt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r?function(n){for(var t=n.length,u=[],i=0,o=r[0];t>0&&o>0;)u.push(n.substring(t-=o,t+o)),o=r[i=(i+1)%r.length];return u.reverse().join(e)}:Nt;return function(n){var e=rc.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"",c=e[4]||"",s=e[5],l=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1;switch(h&&(h=+h.substring(1)),(s||"0"===r&&"="===o)&&(s=r="0",o="=",f&&(l-=Math.floor((l-1)/4))),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=uc.get(g)||Ut;var y=s&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):a;if(0>p){var c=Go.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x=n.lastIndexOf("."),M=0>x?n:n.substring(0,x),_=0>x?"":t+n.substring(x+1);!s&&f&&(M=i(M));var b=v.length+M.length+_.length+(y?0:u.length),w=l>b?new Array(b=l-b+1).join(r):"";return y&&(M=i(w+M)),u+=v,n=M+_,("<"===o?u+n+w:">"===o?w+u+n:"^"===o?w.substring(0,b>>=1)+u+n+w.substring(b):u+(y?n:w+n))+e}}}function Ut(n){return n+""}function jt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ht(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new oc(e-1)),1),e}function i(n,e){return t(n=new oc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{oc=jt;var r=new jt;return r._=n,o(r,t,e)}finally{oc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Ft(n);return c.floor=c,c.round=Ft(r),c.ceil=Ft(u),c.offset=Ft(i),c.range=a,n}function Ft(n){return function(t,e){try{oc=jt;var r=new jt;return r._=t,n(r,e)._}finally{oc=Date}}}function Ot(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.substring(c,a)),null!=(u=cc[e=n.charAt(++a)])&&(e=n.charAt(++a)),(i=A[e])&&(e=i(t,null==u?"e"===e?" ":"0":u)),o.push(e),c=a+1);return o.push(n.substring(c,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&oc!==jt,o=new(i?jt:oc);return"j"in r?o.setFullYear(r.y,0,r.j):"w"in r&&("W"in r||"U"in r)?(o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+Math.floor(r.Z/100),r.M+r.Z%100,r.S,r.L),i?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,o,a=0,c=t.length,s=e.length;c>a;){if(r>=s)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=C[o in cc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){b.lastIndex=0;var r=b.exec(t.substring(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){M.lastIndex=0;var r=M.exec(t.substring(e));return r?(n.w=_.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.substring(e));return r?(n.m=N.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.substring(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}function c(n,t,r){return e(n,A.x.toString(),t,r)}function s(n,t,r){return e(n,A.X.toString(),t,r)}function l(n,t,e){var r=x.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{oc=jt;var t=new oc;return t._=n,r(t)}finally{oc=Date}}var r=t(n);return e.parse=function(n){try{oc=jt;var t=r.parse(n);return t&&t._}finally{oc=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ae;var x=Go.map(),M=It(v),_=Zt(v),b=It(d),w=Zt(d),S=It(m),k=Zt(m),E=It(y),N=Zt(y);p.forEach(function(n,t){x.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Yt(n.getDate(),t,2)},e:function(n,t){return Yt(n.getDate(),t,2)},H:function(n,t){return Yt(n.getHours(),t,2)},I:function(n,t){return Yt(n.getHours()%12||12,t,2)},j:function(n,t){return Yt(1+ic.dayOfYear(n),t,3)},L:function(n,t){return Yt(n.getMilliseconds(),t,3)},m:function(n,t){return Yt(n.getMonth()+1,t,2)},M:function(n,t){return Yt(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Yt(n.getSeconds(),t,2)},U:function(n,t){return Yt(ic.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Yt(ic.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Yt(n.getFullYear()%100,t,2)},Y:function(n,t){return Yt(n.getFullYear()%1e4,t,4)},Z:ie,"%":function(){return"%"}},C={a:r,A:u,b:i,B:o,c:a,d:Qt,e:Qt,H:te,I:te,j:ne,L:ue,m:Kt,M:ee,p:l,S:re,U:$t,w:Vt,W:Xt,x:c,X:s,y:Jt,Y:Bt,Z:Wt,"%":oe};return t}function Yt(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function It(n){return new RegExp("^(?:"+n.map(Go.requote).join("|")+")","i")}function Zt(n){for(var t=new o,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Vt(n,t,e){sc.lastIndex=0;var r=sc.exec(t.substring(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function $t(n,t,e){sc.lastIndex=0;var r=sc.exec(t.substring(e));return r?(n.U=+r[0],e+r[0].length):-1}function Xt(n,t,e){sc.lastIndex=0;var r=sc.exec(t.substring(e));return r?(n.W=+r[0],e+r[0].length):-1}function Bt(n,t,e){sc.lastIndex=0;var r=sc.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Jt(n,t,e){sc.lastIndex=0;var r=sc.exec(t.substring(e,e+2));return r?(n.y=Gt(+r[0]),e+r[0].length):-1}function Wt(n,t,e){return/^[+-]\d{4}$/.test(t=t.substring(e,e+5))?(n.Z=+t,e+5):-1}function Gt(n){return n+(n>68?1900:2e3)}function Kt(n,t,e){sc.lastIndex=0;var r=sc.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Qt(n,t,e){sc.lastIndex=0;var r=sc.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function ne(n,t,e){sc.lastIndex=0;var r=sc.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function te(n,t,e){sc.lastIndex=0;var r=sc.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ee(n,t,e){sc.lastIndex=0;var r=sc.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function re(n,t,e){sc.lastIndex=0;var r=sc.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ue(n,t,e){sc.lastIndex=0;var r=sc.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ie(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(fa(t)/60),u=fa(t)%60;return e+Yt(r,"0",2)+Yt(u,"0",2)}function oe(n,t,e){lc.lastIndex=0;var r=lc.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function ae(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function ce(){}function se(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function le(n,t){n&&pc.hasOwnProperty(n.type)&&pc[n.type](n,t)}function fe(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function he(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)fe(n[e],t,1);t.polygonEnd()}function ge(){function n(n,t){n*=za,t=t*za/2+Aa/4;var e=n-r,o=e>=0?1:-1,a=o*e,c=Math.cos(t),s=Math.sin(t),l=i*s,f=u*c+l*Math.cos(a),h=l*o*Math.sin(a);dc.add(Math.atan2(h,f)),r=n,u=c,i=s}var t,e,r,u,i;mc.point=function(o,a){mc.point=n,r=(t=o)*za,u=Math.cos(a=(e=a)*za/2+Aa/4),i=Math.sin(a)},mc.lineEnd=function(){n(t,e)}}function pe(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function ve(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function de(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function me(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function ye(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function xe(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function Me(n){return[Math.atan2(n[1],n[0]),G(n[2])]}function _e(n,t){return fa(n[0]-t[0])<Ta&&fa(n[1]-t[1])<Ta}function be(n,t){n*=za;var e=Math.cos(t*=za);we(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function we(n,t,e){++yc,Mc+=(n-Mc)/yc,_c+=(t-_c)/yc,bc+=(e-bc)/yc}function Se(){function n(n,u){n*=za;var i=Math.cos(u*=za),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),s=Math.atan2(Math.sqrt((s=e*c-r*a)*s+(s=r*o-t*c)*s+(s=t*a-e*o)*s),t*o+e*a+r*c);xc+=s,wc+=s*(t+(t=o)),Sc+=s*(e+(e=a)),kc+=s*(r+(r=c)),we(t,e,r)}var t,e,r;Cc.point=function(u,i){u*=za;var o=Math.cos(i*=za);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),Cc.point=n,we(t,e,r)}}function ke(){Cc.point=be}function Ee(){function n(n,t){n*=za;var e=Math.cos(t*=za),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),s=u*c-i*a,l=i*o-r*c,f=r*a-u*o,h=Math.sqrt(s*s+l*l+f*f),g=r*o+u*a+i*c,p=h&&-W(g)/h,v=Math.atan2(h,g);Ec+=p*s,Nc+=p*l,Ac+=p*f,xc+=v,wc+=v*(r+(r=o)),Sc+=v*(u+(u=a)),kc+=v*(i+(i=c)),we(r,u,i)}var t,e,r,u,i;Cc.point=function(o,a){t=o,e=a,Cc.point=n,o*=za;var c=Math.cos(a*=za);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),we(r,u,i)},Cc.lineEnd=function(){n(t,e),Cc.lineEnd=ke,Cc.point=be}}function Ne(){return!0}function Ae(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(_e(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new Le(e,n,null,!0),s=new Le(e,null,c,!1);c.o=s,i.push(c),o.push(s),c=new Le(r,n,null,!1),s=new Le(r,null,c,!0),c.o=s,i.push(c),o.push(s)}}),o.sort(t),Ce(i),Ce(o),i.length){for(var a=0,c=e,s=o.length;s>a;++a)o[a].e=c=!c;for(var l,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;l=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,s=l.length;s>a;++a)u.point((f=l[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){l=g.p.z;for(var a=l.length-1;a>=0;--a)u.point((f=l[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,l=g.z,p=!p}while(!g.v);u.lineEnd()}}}function Ce(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function Le(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Te(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function s(){y.point=o,d.lineEnd()}function l(n,t){v.push([n,t]);var e=u(n,t);M.point(e[0],e[1])}function f(){M.lineStart(),v=[]}function h(){l(v[0][0],v[0][1]),M.lineEnd();var n,t=M.clean(),e=x.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r){if(1&t){n=e[0];var u,r=n.length-1,o=-1;for(i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);return i.lineEnd(),void 0}r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(qe))}}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:s,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=s,g=Go.merge(g);var n=De(m,p);g.length?Ae(g,Re,n,e,i):n&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=ze(),M=t(x);return y}}function qe(n){return n.length>1}function ze(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:v,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Re(n,t){return((n=n.x)[0]<0?n[1]-La-Ta:La-n[1])-((t=t.x)[0]<0?t[1]-La-Ta:La-t[1])}function De(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;dc.reset();for(var a=0,c=t.length;c>a;++a){var s=t[a],l=s.length;if(l)for(var f=s[0],h=f[0],g=f[1]/2+Aa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===l&&(d=0),n=s[d];var m=n[0],y=n[1]/2+Aa/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=_>=0?1:-1,w=b*_,S=w>Aa,k=p*x;if(dc.add(Math.atan2(k*b*Math.sin(w),v*M+k*Math.cos(w))),i+=S?_+b*Ca:_,S^h>=e^m>=e){var E=de(pe(f),pe(n));xe(E);var N=de(u,E);xe(N);var A=(S^_>=0?-1:1)*G(N[2]);(r>A||r===A&&(E[0]||E[1]))&&(o+=S^_>=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-Ta>i||Ta>i&&0>dc)^1&o}function Pe(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?Aa:-Aa,c=fa(i-e);fa(c-Aa)<Ta?(n.point(e,r=(r+o)/2>0?La:-La),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=Aa&&(fa(e-u)<Ta&&(e-=u*Ta),fa(i-a)<Ta&&(i-=a*Ta),r=Ue(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function Ue(n,t,e,r){var u,i,o=Math.sin(n-e);return fa(o)>Ta?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function je(n,t,e,r){var u;if(null==n)u=e*La,r.point(-Aa,u),r.point(0,u),r.point(Aa,u),r.point(Aa,0),r.point(Aa,-u),r.point(0,-u),r.point(-Aa,-u),r.point(-Aa,0),r.point(-Aa,u);else if(fa(n[0]-t[0])>Ta){var i=n[0]<t[0]?Aa:-Aa;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function He(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,s,l;return{lineStart:function(){s=c=!1,l=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?Aa:-Aa),h):0;if(!e&&(s=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(_e(e,g)||_e(p,g))&&(p[0]+=Ta,p[1]+=Ta,v=t(p[0],p[1]))),v!==c)l=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(l=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&_e(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return l|(s&&c)<<1}}}function r(n,t,e){var r=pe(n),u=pe(t),o=[1,0,0],a=de(r,u),c=ve(a,a),s=a[0],l=c-s*s;if(!l)return!e&&n;var f=i*c/l,h=-i*s/l,g=de(o,a),p=ye(o,f),v=ye(a,h);me(p,v);var d=g,m=ve(p,d),y=ve(d,d),x=m*m-y*(ve(p,p)-1);if(!(0>x)){var M=Math.sqrt(x),_=ye(d,(-m-M)/y);if(me(_,p),_=Me(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(b=w,w=S,S=b);var N=S-w,A=fa(N-Aa)<Ta,C=A||Ta>N;if(!A&&k>E&&(b=k,k=E,E=b),C?A?k+E>0^_[1]<(fa(_[0]-w)<Ta?k:E):k<=_[1]&&_[1]<=E:N>Aa^(w<=_[0]&&_[0]<=S)){var L=ye(d,(-m+M)/y);return me(L,p),[_,Me(L)]}}}function u(t,e){var r=o?n:Aa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=fa(i)>Ta,c=gr(n,6*za);return Te(t,e,c,o?[0,-n]:[-Aa,n-Aa])}function Fe(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,s=o.y,l=a.x,f=a.y,h=0,g=1,p=l-c,v=f-s;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-s,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-s,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:s+h*v}),1>g&&(u.b={x:c+g*p,y:s+g*v}),u}}}}}}function Oe(n,t,e,r){function u(r,u){return fa(r[0]-n)<Ta?u>0?0:3:fa(r[0]-e)<Ta?u>0?2:1:fa(r[1]-t)<Ta?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,s=a[0];c>o;++o)i=a[o],s[1]<=r?i[1]>r&&J(s,i,n)>0&&++t:i[1]<=r&&J(s,i,n)<0&&--t,s=i;return 0!==t}function s(i,a,c,s){var l=0,f=0;if(null==i||(l=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do s.point(0===l||3===l?n:e,l>1?r:t);while((l=(l+c+4)%4)!==f)}else s.point(a[0],a[1])}function l(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){l(n,t)&&a.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,_=b=0/0}function g(){v&&(p(y,x),M&&w&&N.rejoin(),v.push(N.buffer())),C.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Tc,Math.min(Tc,n)),t=Math.max(-Tc,Math.min(Tc,t));var e=l(n,t);if(d&&m.push([n,t]),S)y=n,x=t,M=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:_,y:b},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}_=n,b=t,w=e}var v,d,m,y,x,M,_,b,w,S,k,E=a,N=ze(),A=Fe(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=N,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=Go.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),s(null,null,1,a),a.lineEnd()),u&&Ae(v,i,t,s,a),a.polygonEnd()),v=d=m=null}};return C}}function Ye(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function Ie(n){var t=0,e=Aa/3,r=ir(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*Aa/180,e=n[1]*Aa/180):[180*(t/Aa),180*(e/Aa)]},u}function Ze(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,G((i-(n*n+e*e)*u*u)/(2*u))]},e}function Ve(){function n(n,t){zc+=u*n-r*t,r=n,u=t}var t,e,r,u;jc.point=function(i,o){jc.point=n,t=r=i,e=u=o},jc.lineEnd=function(){n(t,e)}}function $e(n,t){Rc>n&&(Rc=n),n>Pc&&(Pc=n),Dc>t&&(Dc=t),t>Uc&&(Uc=t)}function Xe(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Be(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Be(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Be(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Je(n,t){Mc+=n,_c+=t,++bc}function We(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);wc+=o*(t+n)/2,Sc+=o*(e+r)/2,kc+=o,Je(t=n,e=r)}var t,e;Fc.point=function(r,u){Fc.point=n,Je(t=r,e=u)}}function Ge(){Fc.point=Je}function Ke(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);wc+=o*(r+n)/2,Sc+=o*(u+t)/2,kc+=o,o=u*n-r*t,Ec+=o*(r+n),Nc+=o*(u+t),Ac+=3*o,Je(r=n,u=t)}var t,e,r,u;Fc.point=function(i,o){Fc.point=n,Je(t=r=i,e=u=o)},Fc.lineEnd=function(){n(t,e)}}function Qe(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,Ca)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:v};return a}function nr(n){function t(n){return(a?r:e)(n)}function e(t){return rr(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=pe([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=s,S.lineEnd=l}function s(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function l(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,s,l,f,h,g,p,v,d,m){var y=l-t,x=f-e,M=y*y+x*x;if(M>4*i&&d--){var _=a+g,b=c+p,w=s+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=fa(fa(w)-1)<Ta||fa(r-h)<Ta?(r+h)/2:Math.atan2(b,_),N=n(E,k),A=N[0],C=N[1],L=A-t,T=C-e,q=x*L-y*T;(q*q/M>i||fa((y*L+x*T)/M-.5)>.3||o>a*g+c*p+s*v)&&(u(t,e,r,a,c,s,A,C,E,_/=S,b/=S,w,d,m),m.point(A,C),u(A,C,E,_,b,w,l,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*za),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function tr(n){var t=nr(function(t,e){return n([t*Ra,e*Ra])});return function(n){return or(t(n))}}function er(n){this.stream=n}function rr(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ur(n){return ir(function(){return n})()}function ir(n){function t(n){return n=a(n[0]*za,n[1]*za),[n[0]*h+c,s-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(s-n[1])/h),n&&[n[0]*Ra,n[1]*Ra]}function r(){a=Ye(o=sr(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,s=p+n[1]*h,u()}function u(){return l&&(l.valid=!1,l=null),t}var i,o,a,c,s,l,f=nr(function(n,t){return n=i(n,t),[n[0]*h+c,s-n[1]*h]
+}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=Lc,_=Nt,b=null,w=null;return t.stream=function(n){return l&&(l.valid=!1),l=or(M(o,f(_(n)))),l.valid=!0,l},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,Lc):He((b=+n)*za),u()):b},t.clipExtent=function(n){return arguments.length?(w=n,_=n?Oe(n[0][0],n[0][1],n[1][0],n[1][1]):Nt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*za,d=n[1]%360*za,r()):[v*Ra,d*Ra]},t.rotate=function(n){return arguments.length?(m=n[0]%360*za,y=n[1]%360*za,x=n.length>2?n[2]%360*za:0,r()):[m*Ra,y*Ra,x*Ra]},Go.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function or(n){return rr(n,function(t,e){n.point(t*za,e*za)})}function ar(n,t){return[n,t]}function cr(n,t){return[n>Aa?n-Ca:-Aa>n?n+Ca:n,t]}function sr(n,t,e){return n?t||e?Ye(fr(n),hr(t,e)):fr(n):t||e?hr(t,e):cr}function lr(n){return function(t,e){return t+=n,[t>Aa?t-Ca:-Aa>t?t+Ca:t,e]}}function fr(n){var t=lr(n);return t.invert=lr(-n),t}function hr(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*r+a*u;return[Math.atan2(c*i-l*o,a*r-s*u),G(l*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*i-c*o;return[Math.atan2(c*i+s*o,a*r+l*u),G(l*r-a*u)]},e}function gr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=pr(e,u),i=pr(e,i),(o>0?i>u:u>i)&&(u+=o*Ca)):(u=n+o*Ca,i=n-.5*c);for(var s,l=u;o>0?l>i:i>l;l-=c)a.point((s=Me([e,-r*Math.cos(l),-r*Math.sin(l)]))[0],s[1])}}function pr(n,t){var e=pe(t);e[0]-=n,xe(e);var r=W(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ta)%(2*Math.PI)}function vr(n,t,e){var r=Go.range(n,t-Ta,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function dr(n,t,e){var r=Go.range(n,t-Ta,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function mr(n){return n.source}function yr(n){return n.target}function xr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),s=u*Math.sin(n),l=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(tt(r-t)+u*o*tt(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*l,u=e*s+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Ra,Math.atan2(o,Math.sqrt(r*r+u*u))*Ra]}:function(){return[n*Ra,t*Ra]};return p.distance=h,p}function Mr(){function n(n,u){var i=Math.sin(u*=za),o=Math.cos(u),a=fa((n*=za)-t),c=Math.cos(a);Oc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;Yc.point=function(u,i){t=u*za,e=Math.sin(i*=za),r=Math.cos(i),Yc.point=n},Yc.lineEnd=function(){Yc.point=Yc.lineEnd=v}}function _r(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function br(n,t){function e(n,t){o>0?-La+Ta>t&&(t=-La+Ta):t>La-Ta&&(t=La-Ta);var e=o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(Aa/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=B(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-La]},e):Sr}function wr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return fa(u)<Ta?ar:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-B(u)*Math.sqrt(n*n+e*e)]},e)}function Sr(n,t){return[n,Math.log(Math.tan(Aa/4+t/2))]}function kr(n){var t,e=ur(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=Aa*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Er(n,t){return[Math.log(Math.tan(Aa/4+t/2)),-n]}function Nr(n){return n[0]}function Ar(n){return n[1]}function Cr(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&J(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function Lr(n,t){return n[0]-t[0]||n[1]-t[1]}function Tr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function qr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],s=e[1],l=t[1]-c,f=r[1]-s,h=(a*(c-s)-f*(u-i))/(f*o-a*l);return[u+h*o,c+h*l]}function zr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Rr(){tu(this),this.edge=this.site=this.circle=null}function Dr(n){var t=ns.pop()||new Rr;return t.site=n,t}function Pr(n){$r(n),Gc.remove(n),ns.push(n),tu(n)}function Ur(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Pr(n);for(var c=i;c.circle&&fa(e-c.circle.x)<Ta&&fa(r-c.circle.cy)<Ta;)i=c.P,a.unshift(c),Pr(c),c=i;a.unshift(c),$r(c);for(var s=o;s.circle&&fa(e-s.circle.x)<Ta&&fa(r-s.circle.cy)<Ta;)o=s.N,a.push(s),Pr(s),s=o;a.push(s),$r(s);var l,f=a.length;for(l=1;f>l;++l)s=a[l],c=a[l-1],Kr(s.edge,c.site,s.site,u);c=a[0],s=a[f-1],s.edge=Wr(c.site,s.site,null,u),Vr(c),Vr(s)}function jr(n){for(var t,e,r,u,i=n.x,o=n.y,a=Gc._;a;)if(r=Hr(a,o)-i,r>Ta)a=a.L;else{if(u=i-Fr(a,o),!(u>Ta)){r>-Ta?(t=a.P,e=a):u>-Ta?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Dr(n);if(Gc.insert(t,c),t||e){if(t===e)return $r(t),e=Dr(t.site),Gc.insert(c,e),c.edge=e.edge=Wr(t.site,c.site),Vr(t),Vr(e),void 0;if(!e)return c.edge=Wr(t.site,c.site),void 0;$r(t),$r(e);var s=t.site,l=s.x,f=s.y,h=n.x-l,g=n.y-f,p=e.site,v=p.x-l,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+l,y:(h*x-v*y)/m+f};Kr(e.edge,s,p,M),c.edge=Wr(s,n,null,M),e.edge=Wr(n,p,null,M),Vr(t),Vr(e)}}function Hr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,s=c-t;if(!s)return a;var l=a-r,f=1/i-1/s,h=l/s;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*s)-c+s/2+u-i/2)))/f+r:(r+a)/2}function Fr(n,t){var e=n.N;if(e)return Hr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Or(n){this.site=n,this.edges=[]}function Yr(n){for(var t,e,r,u,i,o,a,c,s,l,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Wc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)l=a[o].end(),r=l.x,u=l.y,s=a[++o%c].start(),t=s.x,e=s.y,(fa(r-t)>Ta||fa(u-e)>Ta)&&(a.splice(o,0,new Qr(Gr(i.site,l,fa(r-f)<Ta&&p-u>Ta?{x:f,y:fa(t-f)<Ta?e:p}:fa(u-p)<Ta&&h-r>Ta?{x:fa(e-p)<Ta?t:h,y:p}:fa(r-h)<Ta&&u-g>Ta?{x:h,y:fa(t-h)<Ta?e:g}:fa(u-g)<Ta&&r-f>Ta?{x:fa(e-g)<Ta?t:f,y:g}:null),i.site,null)),++c)}function Ir(n,t){return t.angle-n.angle}function Zr(){tu(this),this.x=this.y=this.arc=this.site=this.cy=null}function Vr(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,s=r.y-a,l=i.x-o,f=i.y-a,h=2*(c*f-s*l);if(!(h>=-qa)){var g=c*c+s*s,p=l*l+f*f,v=(f*g-s*p)/h,d=(c*p-l*g)/h,f=d+a,m=ts.pop()||new Zr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=Qc._;x;)if(m.y<x.y||m.y===x.y&&m.x<=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}Qc.insert(y,m),y||(Kc=m)}}}}function $r(n){var t=n.circle;t&&(t.P||(Kc=t.N),Qc.remove(t),ts.push(t),tu(t),n.circle=null)}function Xr(n){for(var t,e=Jc,r=Fe(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Br(t,n)||!r(t)||fa(t.a.x-t.b.x)<Ta&&fa(t.a.y-t.b.y)<Ta)&&(t.a=t.b=null,e.splice(u,1))}function Br(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],s=t[1][1],l=n.l,f=n.r,h=l.x,g=l.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=s)return}else i={x:d,y:c};e={x:d,y:s}}else{if(i){if(i.y<c)return}else i={x:d,y:s};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=s)return}else i={x:(c-u)/r,y:c};e={x:(s-u)/r,y:s}}else{if(i){if(i.y<c)return}else i={x:(s-u)/r,y:s};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function Jr(n,t){this.l=n,this.r=t,this.a=this.b=null}function Wr(n,t,e,r){var u=new Jr(n,t);return Jc.push(u),e&&Kr(u,n,t,e),r&&Kr(u,t,n,r),Wc[n.i].edges.push(new Qr(u,n,t)),Wc[t.i].edges.push(new Qr(u,t,n)),u}function Gr(n,t,e){var r=new Jr(n,null);return r.a=t,r.b=e,Jc.push(r),r}function Kr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function Qr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function nu(){this._=null}function tu(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function eu(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function ru(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function uu(n){for(;n.L;)n=n.L;return n}function iu(n,t){var e,r,u,i=n.sort(ou).pop();for(Jc=[],Wc=new Array(n.length),Gc=new nu,Qc=new nu;;)if(u=Kc,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Wc[i.i]=new Or(i),jr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Ur(u.arc)}t&&(Xr(t),Yr(t));var o={cells:Wc,edges:Jc};return Gc=Qc=Jc=Wc=null,o}function ou(n,t){return t.y-n.y||t.x-n.x}function au(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function cu(n){return n.x}function su(n){return n.y}function lu(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function fu(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&fu(n,c[0],e,r,o,a),c[1]&&fu(n,c[1],o,r,u,a),c[2]&&fu(n,c[2],e,a,o,i),c[3]&&fu(n,c[3],o,a,u,i)}}function hu(n,t){n=Go.rgb(n),t=Go.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+Mt(Math.round(e+i*n))+Mt(Math.round(r+o*n))+Mt(Math.round(u+a*n))}}function gu(n,t){var e,r={},u={};for(e in n)e in t?r[e]=du(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function pu(n,t){return t-=n=+n,function(e){return n+t*e}}function vu(n,t){var e,r,u,i,o,a=0,c=0,s=[],l=[];for(n+="",t+="",rs.lastIndex=0,r=0;e=rs.exec(t);++r)e.index&&s.push(t.substring(a,c=e.index)),l.push({i:s.length,x:e[0]}),s.push(null),a=rs.lastIndex;for(a<t.length&&s.push(t.substring(a)),r=0,i=l.length;(e=rs.exec(n))&&i>r;++r)if(o=l[r],o.x==e[0]){if(o.i)if(null==s[o.i+1])for(s[o.i-1]+=o.x,s.splice(o.i,1),u=r+1;i>u;++u)l[u].i--;else for(s[o.i-1]+=o.x+s[o.i+1],s.splice(o.i,2),u=r+1;i>u;++u)l[u].i-=2;else if(null==s[o.i+1])s[o.i]=o.x;else for(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1),u=r+1;i>u;++u)l[u].i--;l.splice(r,1),i--,r--}else o.x=pu(parseFloat(e[0]),parseFloat(o.x));for(;i>r;)o=l.pop(),null==s[o.i+1]?s[o.i]=o.x:(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1)),i--;return 1===s.length?null==s[0]?(o=l[0].x,function(n){return o(n)+""}):function(){return t}:function(n){for(r=0;i>r;++r)s[(o=l[r]).i]=o.x(n);return s.join("")}}function du(n,t){for(var e,r=Go.interpolators.length;--r>=0&&!(e=Go.interpolators[r](n,t)););return e}function mu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(du(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function yu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function xu(n){return function(t){return 1-n(1-t)}}function Mu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function _u(n){return n*n}function bu(n){return n*n*n}function wu(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Su(n){return function(t){return Math.pow(t,n)}}function ku(n){return 1-Math.cos(n*La)}function Eu(n){return Math.pow(2,10*(n-1))}function Nu(n){return 1-Math.sqrt(1-n*n)}function Au(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ca*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ca/t)}}function Cu(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Lu(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Tu(n,t){n=Go.hcl(n),t=Go.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return ct(e+i*n,r+o*n,u+a*n)+""}}function qu(n,t){n=Go.hsl(n),t=Go.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return it(e+i*n,r+o*n,u+a*n)+""}}function zu(n,t){n=Go.lab(n),t=Go.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ft(e+i*n,r+o*n,u+a*n)+""}}function Ru(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Du(n){var t=[n.a,n.b],e=[n.c,n.d],r=Uu(t),u=Pu(t,e),i=Uu(ju(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Ra,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Ra:0}function Pu(n,t){return n[0]*t[0]+n[1]*t[1]}function Uu(n){var t=Math.sqrt(Pu(n,n));return t&&(n[0]/=t,n[1]/=t),t}function ju(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Hu(n,t){var e,r=[],u=[],i=Go.transform(n),o=Go.transform(t),a=i.translate,c=o.translate,s=i.rotate,l=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:pu(a[0],c[0])},{i:3,x:pu(a[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),s!=l?(s-l>180?l+=360:l-s>180&&(s+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:pu(s,l)})):l&&r.push(r.pop()+"rotate("+l+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:pu(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:pu(g[0],p[0])},{i:e-2,x:pu(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function Fu(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function Ou(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function Yu(n){for(var t=n.source,e=n.target,r=Zu(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Iu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Zu(n,t){if(n===t)return n;for(var e=Iu(n),r=Iu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function Vu(n){n.fixed|=2}function $u(n){n.fixed&=-7}function Xu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Bu(n){n.fixed&=-5}function Ju(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(Ju(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var s=t*e[n.point.index];n.charge+=n.pointCharge=s,r+=s*n.point.x,u+=s*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function Wu(n,t){return Go.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=ni,n}function Gu(n){return n.children}function Ku(n){return n.value}function Qu(n,t){return t.value-n.value}function ni(n){return Go.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function ti(n){return n.x}function ei(n){return n.y}function ri(n,t,e){n.y0=t,n.y=e}function ui(n){return Go.range(n.length)}function ii(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function oi(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function ai(n){return n.reduce(ci,0)}function ci(n,t){return n+t[1]}function si(n,t){return li(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function li(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function fi(n){return[Go.min(n),Go.max(n)]}function hi(n,t){return n.parent==t.parent?1:2}function gi(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function pi(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function vi(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i<u;)t(r=vi(e[i],t),n)>0&&(n=r);return n}function di(n,t){return n.x-t.x}function mi(n,t){return t.x-n.x}function yi(n,t){return n.depth-t.depth}function xi(n,t){function e(n,r){var u=n.children;if(u&&(o=u.length))for(var i,o,a=null,c=-1;++c<o;)i=u[c],e(i,a),a=i;t(n,r)}e(n,null)}function Mi(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function _i(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function bi(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function wi(n,t){return n.value-t.value}function Si(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function ki(n,t){n._pack_next=t,t._pack_prev=n}function Ei(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Ni(n){function t(n){l=Math.min(n.x-n.r,l),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(s=e.length)){var e,r,u,i,o,a,c,s,l=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(Ai),r=e[0],r.x=-r.r,r.y=0,t(r),s>1&&(u=e[1],u.x=u.r,u.y=0,t(u),s>2))for(i=e[2],Ti(r,u,i),t(i),Si(r,i),r._pack_prev=i,Si(i,u),u=r._pack_next,o=3;s>o;o++){Ti(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(Ei(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!Ei(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?ki(r,u=a):ki(r=c,u),o--):(Si(r,i),u=i,t(i))}var m=(l+f)/2,y=(h+g)/2,x=0;for(o=0;s>o;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(Ci)}}function Ai(n){n._pack_next=n._pack_prev=n}function Ci(n){delete n._pack_next,delete n._pack_prev}function Li(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)Li(u[i],t,e,r)}function Ti(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),s=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+s*i,e.y=n.y+c*i-s*u}else e.x=n.x+r,e.y=n.y}function qi(n){return 1+Go.max(n,function(n){return n.y})}function zi(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Ri(n){var t=n.children;return t&&t.length?Ri(t[0]):n}function Di(n){var t,e=n.children;return e&&(t=e.length)?Di(e[t-1]):n}function Pi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Ui(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function ji(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Hi(n){return n.rangeExtent?n.rangeExtent():ji(n.range())}function Fi(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Oi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Yi(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ps}function Ii(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=Go.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function Zi(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Ii:Fi,c=r?Ou:Fu;return o=u(n,t,c,e),a=u(t,n,c,du),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Ru)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Bi(n,t)},i.tickFormat=function(t,e){return Ji(n,t,e)},i.nice=function(t){return $i(n,t),u()},i.copy=function(){return Zi(n,t,e,r)},u()}function Vi(n,t){return Go.rebind(n,t,"range","rangeRound","interpolate","clamp")}function $i(n,t){return Oi(n,Yi(Xi(n,t)[2]))}function Xi(n,t){null==t&&(t=10);var e=ji(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Bi(n,t){return Go.range.apply(Go,Xi(n,t))}function Ji(n,t,e){var r=Xi(n,t);if(e){var u=rc.exec(e);if(u.shift(),"s"===u[8]){var i=Go.formatPrefix(Math.max(fa(r[0]),fa(r[1])));return u[7]||(u[7]="."+Wi(i.scale(r[2]))),u[8]="f",e=Go.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+Gi(u[8],r)),e=u.join("")}else e=",."+Wi(r[2])+"f";return Go.format(e)}function Wi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Gi(n,t){var e=Wi(t[2]);return n in vs?Math.abs(e-Wi(Math.max(fa(t[0]),fa(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Ki(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Oi(r.map(u),e?Math:ms);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=ji(r),o=[],a=n[0],c=n[1],s=Math.floor(u(a)),l=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(l-s)){if(e){for(;l>s;s++)for(var h=1;f>h;h++)o.push(i(s)*h);o.push(i(s))}else for(o.push(i(s));s++<l;)for(var h=f-1;h>0;h--)o.push(i(s)*h);for(s=0;o[s]<a;s++);for(l=o.length;o[l-1]>c;l--);o=o.slice(s,l)}return o},o.tickFormat=function(n,t){if(!arguments.length)return ds;arguments.length<2?t=ds:"function"!=typeof t&&(t=Go.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return Ki(n.copy(),t,e,r)},Vi(o,n)}function Qi(n,t,e){function r(t){return n(u(t))}var u=no(t),i=no(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Bi(e,n)},r.tickFormat=function(n,t){return Ji(e,n,t)},r.nice=function(n){return r.domain($i(e,n))},r.exponent=function(o){return arguments.length?(u=no(t=o),i=no(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Qi(n.copy(),t,e)},Vi(r,n)}function no(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function to(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):0/0))-1)%i.length]}function r(t,e){return Go.range(n.length).map(function(n){return t+e*n})}var u,i,a;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new o;for(var i,a=-1,c=r.length;++a<c;)u.has(i=r[a])||u.set(i,n.push(i));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(i=n,a=0,t={t:"range",a:arguments},e):i},e.rangePoints=function(u,o){arguments.length<2&&(o=0);var c=u[0],s=u[1],l=(s-c)/(Math.max(1,n.length-1)+o);return i=r(n.length<2?(c+s)/2:c+l*o/2,l),a=0,t={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,o,c){arguments.length<2&&(o=0),arguments.length<3&&(c=o);var s=u[1]<u[0],l=u[s-0],f=u[1-s],h=(f-l)/(n.length-o+2*c);return i=r(l+h*c,h),s&&i.reverse(),a=h*(1-o),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,o,c){arguments.length<2&&(o=0),arguments.length<3&&(c=o);var s=u[1]<u[0],l=u[s-0],f=u[1-s],h=Math.floor((f-l)/(n.length-o+2*c)),g=f-l-(n.length-o)*h;return i=r(l+Math.round(g/2),h),s&&i.reverse(),a=Math.round(h*(1-o)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return ji(t.a[0])},e.copy=function(){return to(n,t)},e.domain(n)}function eo(t,e){function r(){var n=0,r=e.length;for(i=[];++n<r;)i[n-1]=Go.quantile(t,n/r);return u}function u(n){return isNaN(n=+n)?void 0:e[Go.bisect(i,n)]}var i;return u.domain=function(e){return arguments.length?(t=e.filter(function(n){return!isNaN(n)}).sort(n),r()):t},u.range=function(n){return arguments.length?(e=n,r()):e},u.quantiles=function(){return i},u.invertExtent=function(n){return n=e.indexOf(n),0>n?[0/0,0/0]:[n>0?i[n-1]:t[0],n<i.length?i[n]:t[t.length-1]]},u.copy=function(){return eo(t,e)},r()}function ro(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return ro(n,t,e)},u()}function uo(n,t){function e(e){return e>=e?t[Go.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return uo(n,t)},e}function io(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Bi(n,t)},t.tickFormat=function(t,e){return Ji(n,t,e)},t.copy=function(){return io(n)},t}function oo(n){return n.innerRadius}function ao(n){return n.outerRadius}function co(n){return n.startAngle}function so(n){return n.endAngle}function lo(n){function t(t){function o(){s.push("M",i(n(l),a))}for(var c,s=[],l=[],f=-1,h=t.length,g=Et(e),p=Et(r);++f<h;)u.call(this,c=t[f],f)?l.push([+g.call(this,c,f),+p.call(this,c,f)]):l.length&&(o(),l=[]);return l.length&&o(),s.length?s.join(""):null}var e=Nr,r=Ar,u=Ne,i=fo,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=Ss.get(n)||fo).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function fo(n){return n.join("L")}function ho(n){return fo(n)+"Z"}function go(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function po(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function vo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function mo(n,t){return n.length<4?fo(n):n[1]+Mo(n.slice(1,n.length-1),_o(n,t))}function yo(n,t){return n.length<3?fo(n):n[0]+Mo((n.push(n[0]),n),_o([n[n.length-2]].concat(n,[n[1]]),t))}function xo(n,t){return n.length<3?fo(n):n[0]+Mo(n,_o(n,t))}function Mo(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return fo(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var s=2;s<t.length;s++,c++)i=n[c],a=t[s],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var l=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+l[0]+","+l[1]}return r}function _o(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function bo(n){if(n.length<3)return fo(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",Eo(Ns,o),",",Eo(Ns,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),No(c,o,a);return n.pop(),c.push("L",r),c.join("")}function wo(n){if(n.length<4)return fo(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(Eo(Ns,i)+","+Eo(Ns,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),No(e,i,o);return e.join("")}function So(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[Eo(Ns,o),",",Eo(Ns,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),No(t,o,a);return t.join("")}function ko(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,s=-1;++s<=e;)r=n[s],u=s/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return bo(n)}function Eo(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function No(n,t,e){n.push("C",Eo(ks,t),",",Eo(ks,e),",",Eo(Es,t),",",Eo(Es,e),",",Eo(Ns,t),",",Eo(Ns,e))}function Ao(n,t){return(t[1]-n[1])/(t[0]-n[0])}function Co(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=Ao(u,i);++t<e;)r[t]=(o+(o=Ao(u=i,i=n[t+1])))/2;return r[t]=o,r}function Lo(n){for(var t,e,r,u,i=[],o=Co(n),a=-1,c=n.length-1;++a<c;)t=Ao(n[a],n[a+1]),fa(t)<Ta?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function To(n){return n.length<3?fo(n):n[0]+Mo(n,Lo(n))}function qo(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]+bs,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function zo(n){function t(t){function c(){v.push("M",a(n(m),f),l,s(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,x=t.length,M=Et(e),_=Et(u),b=e===r?function(){return g}:Et(r),w=u===i?function(){return p}:Et(i);++y<x;)o.call(this,h=t[y],y)?(d.push([g=+M.call(this,h,y),p=+_.call(this,h,y)]),m.push([+b.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=Nr,r=Nr,u=0,i=Ar,o=Ne,a=fo,c=a.key,s=a,l="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=Ss.get(n)||fo).key,s=a.reverse||a,l=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Ro(n){return n.radius}function Do(n){return[n.x,n.y]}function Po(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+bs;return[e*Math.cos(r),e*Math.sin(r)]}}function Uo(){return 64}function jo(){return"circle"}function Ho(n){var t=Math.sqrt(n/Aa);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Fo(n,t){return da(n,zs),n.id=t,n}function Oo(n,t,e,r){var u=n.id;return P(n,"function"==typeof e?function(n,i,o){n.__transition__[u].tween.set(t,r(e.call(n,n.__data__,i,o)))}:(e=r(e),function(n){n.__transition__[u].tween.set(t,e)}))}function Yo(n){return null==n&&(n=""),function(){this.textContent=n}}function Io(n,t,e,r){var u=n.__transition__||(n.__transition__={active:0,count:0}),i=u[e];if(!i){var a=r.time;i=u[e]={tween:new o,time:a,ease:r.ease,delay:r.delay,duration:r.duration},++u.count,Go.timer(function(r){function o(r){return u.active>e?s():(u.active=e,i.event&&i.event.start.call(n,l,t),i.tween.forEach(function(e,r){(r=r.call(n,l,t))&&v.push(r)}),Go.timer(function(){return p.c=c(r||1)?Ne:c,1},0,a),void 0)}function c(r){if(u.active!==e)return s();for(var o=r/g,a=f(o),c=v.length;c>0;)v[--c].call(n,a);return o>=1?(i.event&&i.event.end.call(n,l,t),s()):void 0}function s(){return--u.count?delete u[e]:delete n.__transition__,1}var l=n.__data__,f=i.ease,h=i.delay,g=i.duration,p=nc,v=[];return p.t=h+a,r>=h?o(r-h):(p.c=o,void 0)
+},0,a)}}function Zo(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function Vo(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function $o(n){return n.toISOString()}function Xo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=Go.bisect(Ys,u);return i==Ys.length?[t.year,Xi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Ys[i-1]<Ys[i]/u?i-1:i]:[Vs,Xi(n,e)[2]]}return r.invert=function(t){return Bo(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Bo)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Bo(+e+1),t).length}var i=r.domain(),o=ji(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(Oi(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Bo(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Bo(+t+1);return t}}:n))},r.ticks=function(n,t){var e=ji(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Bo(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Xo(n.copy(),t,e)},Vi(r,n)}function Bo(n){return new Date(n)}function Jo(n){return JSON.parse(n.responseText)}function Wo(n){var t=na.createRange();return t.selectNode(na.body),t.createContextualFragment(n.responseText)}var Go={version:"3.4.4"};Date.now||(Date.now=function(){return+new Date});var Ko=[].slice,Qo=function(n){return Ko.call(n)},na=document,ta=na.documentElement,ea=window;try{Qo(ta.childNodes)[0].nodeType}catch(ra){Qo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{na.createElement("div").style.setProperty("opacity",0,"")}catch(ua){var ia=ea.Element.prototype,oa=ia.setAttribute,aa=ia.setAttributeNS,ca=ea.CSSStyleDeclaration.prototype,sa=ca.setProperty;ia.setAttribute=function(n,t){oa.call(this,n,t+"")},ia.setAttributeNS=function(n,t,e){aa.call(this,n,t,e+"")},ca.setProperty=function(n,t,e){sa.call(this,n,t+"",e)}}Go.ascending=n,Go.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},Go.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},Go.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},Go.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o&&!(null!=(e=u=n[i])&&e>=e);)e=u=void 0;for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o&&!(null!=(e=u=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},Go.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i<u;)isNaN(e=+n[i])||(r+=e);else for(;++i<u;)isNaN(e=+t.call(n,n[i],i))||(r+=e);return r},Go.mean=function(n,e){var r,u=n.length,i=0,o=-1,a=0;if(1===arguments.length)for(;++o<u;)t(r=n[o])&&(i+=(r-i)/++a);else for(;++o<u;)t(r=e.call(n,n[o],o))&&(i+=(r-i)/++a);return a?i:void 0},Go.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},Go.median=function(e,r){return arguments.length>1&&(e=e.map(r)),e=e.filter(t),e.length?Go.quantile(e.sort(n),.5):void 0};var la=e(n);Go.bisectLeft=la.left,Go.bisect=Go.bisectRight=la.right,Go.bisector=function(t){return e(1===t.length?function(e,r){return n(t(e),r)}:t)},Go.shuffle=function(n){for(var t,e,r=n.length;r;)e=0|Math.random()*r--,t=n[r],n[r]=n[e],n[e]=t;return n},Go.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},Go.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},Go.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,t=Go.min(arguments,r),e=new Array(t);++n<t;)for(var u,i=-1,o=e[n]=new Array(u);++i<u;)o[i]=arguments[i][n];return e},Go.transpose=function(n){return Go.zip.apply(Go,n)},Go.keys=function(n){var t=[];for(var e in n)t.push(e);return t},Go.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},Go.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},Go.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var fa=Math.abs;Go.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/e)throw new Error("infinite range");var r,i=[],o=u(fa(e)),a=-1;if(n*=o,t*=o,e*=o,0>e)for(;(r=n+e*++a)>t;)i.push(r/o);else for(;(r=n+e*++a)<t;)i.push(r/o);return i},Go.map=function(n){var t=new o;if(n instanceof o)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},i(o,{has:a,get:function(n){return this[ha+n]},set:function(n,t){return this[ha+n]=t},remove:c,keys:s,values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];return this.forEach(function(t,e){n.push({key:t,value:e})}),n},size:l,empty:f,forEach:function(n){for(var t in this)t.charCodeAt(0)===ga&&n.call(this,t.substring(1),this[t])}});var ha="\x00",ga=ha.charCodeAt(0);Go.nest=function(){function n(t,a,c){if(c>=i.length)return r?r.call(u,a):e?a.sort(e):a;for(var s,l,f,h,g=-1,p=a.length,v=i[c++],d=new o;++g<p;)(h=d.get(s=v(l=a[g])))?h.push(l):d.set(s,[l]);return t?(l=t(),f=function(e,r){l.set(e,n(t,r,c))}):(l={},f=function(e,r){l[e]=n(t,r,c)}),d.forEach(f),l}function t(n,e){if(e>=i.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],a=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(Go.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return a[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},Go.set=function(n){var t=new h;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},i(h,{has:a,add:function(n){return this[ha+n]=!0,n},remove:function(n){return n=ha+n,n in this&&delete this[n]},values:s,size:l,empty:f,forEach:function(n){for(var t in this)t.charCodeAt(0)===ga&&n.call(this,t.substring(1))}}),Go.behavior={},Go.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=g(n,t,t[e]);return n};var pa=["webkit","ms","moz","Moz","o","O"];Go.dispatch=function(){for(var n=new d,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=m(n);return n},d.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},Go.event=null,Go.requote=function(n){return n.replace(va,"\\$&")};var va=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,da={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ma=function(n,t){return t.querySelector(n)},ya=function(n,t){return t.querySelectorAll(n)},xa=ta[p(ta,"matchesSelector")],Ma=function(n,t){return xa.call(n,t)};"function"==typeof Sizzle&&(ma=function(n,t){return Sizzle(n,t)[0]||null},ya=Sizzle,Ma=Sizzle.matchesSelector),Go.selection=function(){return Sa};var _a=Go.selection.prototype=[];_a.select=function(n){var t,e,r,u,i=[];n=b(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,s=r.length;++c<s;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return _(i)},_a.selectAll=function(n){var t,e,r=[];n=w(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=Qo(n.call(e,e.__data__,a,u))),t.parentNode=e);return _(r)};var ba={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};Go.ns={prefix:ba,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.substring(0,t),n=n.substring(t+1)),ba.hasOwnProperty(e)?{space:ba[e],local:n}:n}},_a.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=Go.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(S(t,n[t]));return this}return this.each(S(n,t))},_a.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=N(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!E(n[u]).test(t))return!1;return!0}for(t in n)this.each(A(t,n[t]));return this}return this.each(A(n,t))},_a.style=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(L(e,n[e],t));return this}if(2>r)return ea.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(L(n,t,e))},_a.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(T(t,n[t]));return this}return this.each(T(n,t))},_a.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},_a.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},_a.append=function(n){return n=q(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},_a.insert=function(n,t){return n=q(n),t=b(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},_a.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},_a.data=function(n,t){function e(n,e){var r,u,i,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new o,y=new o,x=[];for(r=-1;++r<a;)d=t.call(u=n[r],u.__data__,r),m.has(d)?v[r]=u:m.set(d,u),x.push(d);for(r=-1;++r<f;)d=t.call(e,i=e[r],r),(u=m.get(d))?(g[r]=u,u.__data__=i):y.has(d)||(p[r]=z(i)),y.set(d,i),m.remove(d);for(r=-1;++r<a;)m.has(x[r])&&(v[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],i=e[r],u?(u.__data__=i,g[r]=u):p[r]=z(i);for(;f>r;++r)p[r]=z(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),s.push(g),l.push(v)}var r,u,i=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++i<a;)(u=r[i])&&(n[i]=u.__data__);return n}var c=U([]),s=_([]),l=_([]);if("function"==typeof n)for(;++i<a;)e(r=this[i],n.call(r,r.parentNode.__data__,i));else for(;++i<a;)e(r=this[i],n);return s.enter=function(){return c},s.exit=function(){return l},s},_a.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},_a.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=R(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return _(u)},_a.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},_a.sort=function(n){n=D.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},_a.each=function(n){return P(this,function(t,e,r){n.call(t,t.__data__,e,r)})},_a.call=function(n){var t=Qo(arguments);return n.apply(t[0]=this,t),this},_a.empty=function(){return!this.node()},_a.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},_a.size=function(){var n=0;return this.each(function(){++n}),n};var wa=[];Go.selection.enter=U,Go.selection.enter.prototype=wa,wa.append=_a.append,wa.empty=_a.empty,wa.node=_a.node,wa.call=_a.call,wa.size=_a.size,wa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var s=-1,l=u.length;++s<l;)(i=u[s])?(t.push(r[s]=e=n.call(u.parentNode,i.__data__,s,a)),e.__data__=i.__data__):t.push(null)}return _(o)},wa.insert=function(n,t){return arguments.length<2&&(t=j(this)),_a.insert.call(this,n,t)},_a.transition=function(){for(var n,t,e=Cs||++Rs,r=[],u=Ls||{time:Date.now(),ease:wu,delay:0,duration:250},i=-1,o=this.length;++i<o;){r.push(n=[]);for(var a=this[i],c=-1,s=a.length;++c<s;)(t=a[c])&&Io(t,c,e,u),n.push(t)}return Fo(r,e)},_a.interrupt=function(){return this.each(H)},Go.select=function(n){var t=["string"==typeof n?ma(n,na):n];return t.parentNode=ta,_([t])},Go.selectAll=function(n){var t=Qo("string"==typeof n?ya(n,na):n);return t.parentNode=ta,_([t])};var Sa=Go.select(ta);_a.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(F(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(F(n,t,e))};var ka=Go.map({mouseenter:"mouseover",mouseleave:"mouseout"});ka.forEach(function(n){"on"+n in na&&ka.remove(n)});var Ea="onselectstart"in na?null:p(ta.style,"userSelect"),Na=0;Go.mouse=function(n){return Z(n,x())},Go.touches=function(n,t){return arguments.length<2&&(t=x().touches),t?Qo(t).map(function(t){var e=Z(n,t);return e.identifier=t.identifier,e}):[]},Go.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",i)}function t(n,t,u,i,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-x[0],e=r[1]-x[1],p|=n|e,x=r,g({type:"drag",x:r[0]+s[0],y:r[1]+s[1],dx:n,dy:e}))}function c(){t(h,v)&&(m.on(i+d,null).on(o+d,null),y(p&&Go.event.target===f),g({type:"dragend"}))}var s,l=this,f=Go.event.target,h=l.parentNode,g=e.of(l,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=Go.select(u()).on(i+d,a).on(o+d,c),y=I(),x=t(h,v);r?(s=r.apply(l,arguments),s=[s.x-x[0],s.y-x[1]]):s=[0,0],g({type:"dragstart"})}}var e=M(n,"drag","dragstart","dragend"),r=null,u=t(v,Go.mouse,X,"mousemove","mouseup"),i=t(V,Go.touch,$,"touchmove","touchend");return n.origin=function(t){return arguments.length?(r=t,n):r},Go.rebind(n,e,"on")};var Aa=Math.PI,Ca=2*Aa,La=Aa/2,Ta=1e-6,qa=Ta*Ta,za=Aa/180,Ra=180/Aa,Da=Math.SQRT2,Pa=2,Ua=4;Go.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=Q(v),o=i/(Pa*h)*(e*nt(Da*t+v)-K(v));return[r+o*s,u+o*l,i*e/Q(Da*t+v)]}return[r+n*s,u+n*l,i*Math.exp(Da*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],s=o-r,l=a-u,f=s*s+l*l,h=Math.sqrt(f),g=(c*c-i*i+Ua*f)/(2*i*Pa*h),p=(c*c-i*i-Ua*f)/(2*c*Pa*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Da;return e.duration=1e3*y,e},Go.behavior.zoom=function(){function n(n){n.on(N,s).on(Fa+".zoom",f).on(A,h).on("dblclick.zoom",g).on(L,l)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&&_.domain(x.range().map(function(n){return(n-S.x)/S.k}).map(x.invert)),w&&w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:"zoomstart"})}function a(n){i(),n({type:"zoom",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:"zoomend"})}function s(){function n(){l=1,u(Go.mouse(r),g),a(s)}function e(){f.on(A,ea===r?h:null).on(C,null),p(l&&Go.event.target===i),c(s)}var r=this,i=Go.event.target,s=T.of(r,arguments),l=0,f=Go.select(ea).on(A,n).on(C,e),g=t(Go.mouse(r)),p=I();H.call(r),o(s)}function l(){function n(){var n=Go.touches(g);return h=S.k,n.forEach(function(n){n.identifier in v&&(v[n.identifier]=t(n))}),n}function e(){for(var t=Go.event.changedTouches,e=0,i=t.length;i>e;++e)v[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500>c-m){var s=o[0],l=v[s.identifier];r(2*S.k),u(s,l),y(),a(p)}m=c}else if(o.length>1){var s=o[0],f=o[1],h=s[0]-f[0],g=s[1]-f[1];d=h*h+g*g}}function i(){for(var n,t,e,i,o=Go.touches(g),c=0,s=o.length;s>c;++c,i=null)if(e=o[c],i=v[e.identifier]){if(t)break;n=e,t=i}if(i){var l=(l=e[0]-n[0])*l+(l=e[1]-n[1])*l,f=d&&Math.sqrt(l/d);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*h)}m=null,u(n,t),a(p)}function f(){if(Go.event.touches.length){for(var t=Go.event.changedTouches,e=0,r=t.length;r>e;++e)delete v[t[e].identifier];for(var u in v)return void n()}b.on(x,null),w.on(N,s).on(L,l),k(),c(p)}var h,g=this,p=T.of(g,arguments),v={},d=0,x=".zoom-"+Go.event.changedTouches[0].identifier,M="touchmove"+x,_="touchend"+x,b=Go.select(Go.event.target).on(M,i).on(_,f),w=Go.select(g).on(N,null).on(L,e),k=I();H.call(g),e(),o(p)}function f(){var n=T.of(this,arguments);d?clearTimeout(d):(H.call(this),o(n)),d=setTimeout(function(){d=null,c(n)},50),y();var e=v||Go.mouse(this);p||(p=t(e)),r(Math.pow(2,.002*ja())*S.k),u(e,p),a(n)}function h(){p=null}function g(){var n=T.of(this,arguments),e=Go.mouse(this),i=t(e),s=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,Go.event.shiftKey?Math.ceil(s)-1:Math.floor(s)+1)),u(e,i),a(n),c(n)}var p,v,d,m,x,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=Ha,N="mousedown.zoom",A="mousemove.zoom",C="mouseup.zoom",L="touchstart.zoom",T=M(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=T.of(this,arguments),t=S;Cs?Go.select(this).transition().each("start.zoom",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=Go.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each("end.zoom",function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?Ha:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(v=t&&[+t[0],+t[1]],n):v},n.size=function(t){return arguments.length?(k=t&&[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,x=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},Go.rebind(n,T,"on")};var ja,Ha=[0,1/0],Fa="onwheel"in na?(ja=function(){return-Go.event.deltaY*(Go.event.deltaMode?120:1)},"wheel"):"onmousewheel"in na?(ja=function(){return Go.event.wheelDelta},"mousewheel"):(ja=function(){return-Go.event.detail},"MozMousePixelScroll");et.prototype.toString=function(){return this.rgb()+""},Go.hsl=function(n,t,e){return 1===arguments.length?n instanceof ut?rt(n.h,n.s,n.l):_t(""+n,bt,rt):rt(+n,+t,+e)};var Oa=ut.prototype=new et;Oa.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),rt(this.h,this.s,this.l/n)},Oa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),rt(this.h,this.s,n*this.l)},Oa.rgb=function(){return it(this.h,this.s,this.l)},Go.hcl=function(n,t,e){return 1===arguments.length?n instanceof at?ot(n.h,n.c,n.l):n instanceof lt?ht(n.l,n.a,n.b):ht((n=wt((n=Go.rgb(n)).r,n.g,n.b)).l,n.a,n.b):ot(+n,+t,+e)};var Ya=at.prototype=new et;Ya.brighter=function(n){return ot(this.h,this.c,Math.min(100,this.l+Ia*(arguments.length?n:1)))},Ya.darker=function(n){return ot(this.h,this.c,Math.max(0,this.l-Ia*(arguments.length?n:1)))},Ya.rgb=function(){return ct(this.h,this.c,this.l).rgb()},Go.lab=function(n,t,e){return 1===arguments.length?n instanceof lt?st(n.l,n.a,n.b):n instanceof at?ct(n.l,n.c,n.h):wt((n=Go.rgb(n)).r,n.g,n.b):st(+n,+t,+e)};var Ia=18,Za=.95047,Va=1,$a=1.08883,Xa=lt.prototype=new et;Xa.brighter=function(n){return st(Math.min(100,this.l+Ia*(arguments.length?n:1)),this.a,this.b)},Xa.darker=function(n){return st(Math.max(0,this.l-Ia*(arguments.length?n:1)),this.a,this.b)},Xa.rgb=function(){return ft(this.l,this.a,this.b)},Go.rgb=function(n,t,e){return 1===arguments.length?n instanceof xt?yt(n.r,n.g,n.b):_t(""+n,yt,it):yt(~~n,~~t,~~e)};var Ba=xt.prototype=new et;Ba.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),yt(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):yt(u,u,u)},Ba.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),yt(~~(n*this.r),~~(n*this.g),~~(n*this.b))},Ba.hsl=function(){return bt(this.r,this.g,this.b)},Ba.toString=function(){return"#"+Mt(this.r)+Mt(this.g)+Mt(this.b)};var Ja=Go.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Ja.forEach(function(n,t){Ja.set(n,dt(t))}),Go.functor=Et,Go.xhr=At(Nt),Go.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=Ct(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(l>=s)return o;if(u)return u=!1,i;var t=l;if(34===n.charCodeAt(t)){for(var e=t;e++<s;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}l=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++l):10===r&&(u=!0),n.substring(t+1,e).replace(/""/g,'"')}for(;s>l;){var r=n.charCodeAt(l++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(l)&&(++l,++a);else if(r!==c)continue;return n.substring(t,l-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],s=n.length,l=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new h,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},Go.csv=Go.dsv(",","text/csv"),Go.tsv=Go.dsv(" ","text/tab-separated-values"),Go.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=x().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return Z(n,r)};var Wa,Ga,Ka,Qa,nc,tc=ea[p(ea,"requestAnimationFrame")]||function(n){setTimeout(n,17)};Go.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Ga?Ga.n=i:Wa=i,Ga=i,Ka||(Qa=clearTimeout(Qa),Ka=1,tc(Tt))},Go.timer.flush=function(){qt(),zt()},Go.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var ec=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Dt);Go.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=Go.round(n,Rt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),ec[8+e/3]};var rc=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,uc=Go.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=Go.round(n,Rt(n,t))).toFixed(Math.max(0,Math.min(20,Rt(n*(1+1e-15),t))))}}),ic=Go.time={},oc=Date;jt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){ac.setUTCDate.apply(this._,arguments)},setDay:function(){ac.setUTCDay.apply(this._,arguments)},setFullYear:function(){ac.setUTCFullYear.apply(this._,arguments)},setHours:function(){ac.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){ac.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){ac.setUTCMinutes.apply(this._,arguments)},setMonth:function(){ac.setUTCMonth.apply(this._,arguments)},setSeconds:function(){ac.setUTCSeconds.apply(this._,arguments)},setTime:function(){ac.setTime.apply(this._,arguments)}};var ac=Date.prototype;ic.year=Ht(function(n){return n=ic.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ic.years=ic.year.range,ic.years.utc=ic.year.utc.range,ic.day=Ht(function(n){var t=new oc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ic.days=ic.day.range,ic.days.utc=ic.day.utc.range,ic.dayOfYear=function(n){var t=ic.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ic[n]=Ht(function(n){return(n=ic.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ic.year(n).getDay();return Math.floor((ic.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ic[n+"s"]=e.range,ic[n+"s"].utc=e.utc.range,ic[n+"OfYear"]=function(n){var e=ic.year(n).getDay();return Math.floor((ic.dayOfYear(n)+(e+t)%7)/7)}}),ic.week=ic.sunday,ic.weeks=ic.sunday.range,ic.weeks.utc=ic.sunday.utc.range,ic.weekOfYear=ic.sundayOfYear;var cc={"-":"",_:" ",0:"0"},sc=/^\s*\d+/,lc=/^%/;Go.locale=function(n){return{numberFormat:Pt(n),timeFormat:Ot(n)}};var fc=Go.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});Go.format=fc.numberFormat,Go.geo={},ce.prototype={s:0,t:0,add:function(n){se(n,this.t,hc),se(hc.s,this.s,this),this.s?this.t+=hc.t:this.s=hc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var hc=new ce;Go.geo.stream=function(n,t){n&&gc.hasOwnProperty(n.type)?gc[n.type](n,t):le(n,t)};var gc={Feature:function(n,t){le(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)le(e[r].geometry,t)}},pc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){fe(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)fe(e[r],t,0)},Polygon:function(n,t){he(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)he(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)le(e[r],t)}};Go.geo.area=function(n){return vc=0,Go.geo.stream(n,mc),vc};var vc,dc=new ce,mc={sphere:function(){vc+=4*Aa},point:v,lineStart:v,lineEnd:v,polygonStart:function(){dc.reset(),mc.lineStart=ge},polygonEnd:function(){var n=2*dc;vc+=0>n?4*Aa+n:n,mc.lineStart=mc.lineEnd=mc.point=v}};Go.geo.bounds=function(){function n(n,t){x.push(M=[l=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=pe([t*za,e*za]);if(m){var u=de(m,r),i=[u[1],-u[0],0],o=de(i,u);xe(o),o=Me(o);var c=t-p,s=c>0?1:-1,v=o[0]*Ra*s,d=fa(c)>180;if(d^(v>s*p&&s*t>v)){var y=o[1]*Ra;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>s*p&&s*t>v)){var y=-o[1]*Ra;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t):h>=l?(l>t&&(l=t),t>h&&(h=t)):t>p?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=l,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=fa(r)>180?r+(r>0?360:-360):r}else v=n,d=e;mc.point(n,e),t(n,e)}function i(){mc.lineStart()}function o(){u(v,d),mc.lineEnd(),fa(y)>Ta&&(l=-(h=180)),M[0]=l,M[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function s(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var l,f,h,g,p,v,d,m,y,x,M,_={point:n,lineStart:e,lineEnd:r,polygonStart:function(){_.point=u,_.lineStart=i,_.lineEnd=o,y=0,mc.polygonStart()},polygonEnd:function(){mc.polygonEnd(),_.point=n,_.lineStart=e,_.lineEnd=r,0>dc?(l=-(h=180),f=-(g=90)):y>Ta?g=90:-Ta>y&&(f=-90),M[0]=l,M[1]=h
+}};return function(n){g=h=-(l=f=1/0),x=[],Go.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t>r;++r)e=x[r],s(e[0],u)||s(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,l=e[0],h=u[1])}return x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),Go.geo.centroid=function(n){yc=xc=Mc=_c=bc=wc=Sc=kc=Ec=Nc=Ac=0,Go.geo.stream(n,Cc);var t=Ec,e=Nc,r=Ac,u=t*t+e*e+r*r;return qa>u&&(t=wc,e=Sc,r=kc,Ta>xc&&(t=Mc,e=_c,r=bc),u=t*t+e*e+r*r,qa>u)?[0/0,0/0]:[Math.atan2(e,t)*Ra,G(r/Math.sqrt(u))*Ra]};var yc,xc,Mc,_c,bc,wc,Sc,kc,Ec,Nc,Ac,Cc={sphere:v,point:be,lineStart:Se,lineEnd:ke,polygonStart:function(){Cc.lineStart=Ee},polygonEnd:function(){Cc.lineStart=Se}},Lc=Te(Ne,Pe,je,[-Aa,-Aa/2]),Tc=1e9;Go.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Oe(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(Go.geo.conicEqualArea=function(){return Ie(Ze)}).raw=Ze,Go.geo.albers=function(){return Go.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},Go.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=Go.geo.albers(),o=Go.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=Go.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var s=i.scale(),l=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[l-.455*s,f-.238*s],[l+.455*s,f+.238*s]]).stream(c).point,r=o.translate([l-.307*s,f+.201*s]).clipExtent([[l-.425*s+Ta,f+.12*s+Ta],[l-.214*s-Ta,f+.234*s-Ta]]).stream(c).point,u=a.translate([l-.205*s,f+.212*s]).clipExtent([[l-.214*s+Ta,f+.166*s+Ta],[l-.115*s-Ta,f+.234*s-Ta]]).stream(c).point,n},n.scale(1070)};var qc,zc,Rc,Dc,Pc,Uc,jc={point:v,lineStart:v,lineEnd:v,polygonStart:function(){zc=0,jc.lineStart=Ve},polygonEnd:function(){jc.lineStart=jc.lineEnd=jc.point=v,qc+=fa(zc/2)}},Hc={point:$e,lineStart:v,lineEnd:v,polygonStart:v,polygonEnd:v},Fc={point:Je,lineStart:We,lineEnd:Ge,polygonStart:function(){Fc.lineStart=Ke},polygonEnd:function(){Fc.point=Je,Fc.lineStart=We,Fc.lineEnd=Ge}};Go.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),Go.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return qc=0,Go.geo.stream(n,u(jc)),qc},n.centroid=function(n){return Mc=_c=bc=wc=Sc=kc=Ec=Nc=Ac=0,Go.geo.stream(n,u(Fc)),Ac?[Ec/Ac,Nc/Ac]:kc?[wc/kc,Sc/kc]:bc?[Mc/bc,_c/bc]:[0/0,0/0]},n.bounds=function(n){return Pc=Uc=-(Rc=Dc=1/0),Go.geo.stream(n,u(Hc)),[[Rc,Dc],[Pc,Uc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||tr(n):Nt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Xe:new Qe(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(Go.geo.albersUsa()).context(null)},Go.geo.transform=function(n){return{stream:function(t){var e=new er(t);for(var r in n)e[r]=n[r];return e}}},er.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},Go.geo.projection=ur,Go.geo.projectionMutator=ir,(Go.geo.equirectangular=function(){return ur(ar)}).raw=ar.invert=ar,Go.geo.rotation=function(n){function t(t){return t=n(t[0]*za,t[1]*za),t[0]*=Ra,t[1]*=Ra,t}return n=sr(n[0]%360*za,n[1]*za,n.length>2?n[2]*za:0),t.invert=function(t){return t=n.invert(t[0]*za,t[1]*za),t[0]*=Ra,t[1]*=Ra,t},t},cr.invert=ar,Go.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=sr(-n[0]*za,-n[1]*za,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ra,n[1]*=Ra}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=gr((t=+r)*za,u*za),n):t},n.precision=function(r){return arguments.length?(e=gr(t*za,(u=+r)*za),n):u},n.angle(90)},Go.geo.distance=function(n,t){var e,r=(t[0]-n[0])*za,u=n[1]*za,i=t[1]*za,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),s=Math.cos(u),l=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=s*l-c*f*a)*e),c*l+s*f*a)},Go.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return Go.range(Math.ceil(i/d)*d,u,d).map(h).concat(Go.range(Math.ceil(s/m)*m,c,m).map(g)).concat(Go.range(Math.ceil(r/p)*p,e,p).filter(function(n){return fa(n%d)>Ta}).map(l)).concat(Go.range(Math.ceil(a/v)*v,o,v).filter(function(n){return fa(n%m)>Ta}).map(f))}var e,r,u,i,o,a,c,s,l,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],s=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),s>c&&(t=s,s=c,c=t),n.precision(y)):[[i,s],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,l=vr(a,o,90),f=dr(r,e,y),h=vr(s,c,90),g=dr(i,u,y),n):y},n.majorExtent([[-180,-90+Ta],[180,90-Ta]]).minorExtent([[-180,-80-Ta],[180,80+Ta]])},Go.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=mr,u=yr;return n.distance=function(){return Go.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},Go.geo.interpolate=function(n,t){return xr(n[0]*za,n[1]*za,t[0]*za,t[1]*za)},Go.geo.length=function(n){return Oc=0,Go.geo.stream(n,Yc),Oc};var Oc,Yc={sphere:v,point:v,lineStart:Mr,lineEnd:v,polygonStart:v,polygonEnd:v},Ic=_r(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(Go.geo.azimuthalEqualArea=function(){return ur(Ic)}).raw=Ic;var Zc=_r(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},Nt);(Go.geo.azimuthalEquidistant=function(){return ur(Zc)}).raw=Zc,(Go.geo.conicConformal=function(){return Ie(br)}).raw=br,(Go.geo.conicEquidistant=function(){return Ie(wr)}).raw=wr;var Vc=_r(function(n){return 1/n},Math.atan);(Go.geo.gnomonic=function(){return ur(Vc)}).raw=Vc,Sr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-La]},(Go.geo.mercator=function(){return kr(Sr)}).raw=Sr;var $c=_r(function(){return 1},Math.asin);(Go.geo.orthographic=function(){return ur($c)}).raw=$c;var Xc=_r(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(Go.geo.stereographic=function(){return ur(Xc)}).raw=Xc,Er.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-La]},(Go.geo.transverseMercator=function(){var n=kr(Er),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[-n[1],n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},n.rotate([0,0])}).raw=Er,Go.geom={},Go.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=Et(e),i=Et(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(Lr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var s=Cr(a),l=Cr(c),f=l[0]===s[0],h=l[l.length-1]===s[s.length-1],g=[];for(t=s.length-1;t>=0;--t)g.push(n[a[s[t]][2]]);for(t=+f;t<l.length-h;++t)g.push(n[a[l[t]][2]]);return g}var e=Nr,r=Ar;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},Go.geom.polygon=function(n){return da(n,Bc),n};var Bc=Go.geom.polygon.prototype=[];Bc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Bc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Bc.clip=function(n){for(var t,e,r,u,i,o,a=zr(n),c=-1,s=this.length-zr(this),l=this[s-1];++c<s;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],Tr(o,l,u)?(Tr(i,l,u)||n.push(qr(i,o,l,u)),n.push(o)):Tr(i,l,u)&&n.push(qr(i,o,l,u)),i=o;a&&n.push(n[0]),l=u}return n};var Jc,Wc,Gc,Kc,Qc,ns=[],ts=[];Or.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Ir),t.length},Qr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},nu.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=uu(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(eu(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ru(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(ru(this,e),n=e,e=n.U),e.C=!1,r.C=!0,eu(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?uu(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return n.C=!1,void 0;do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,eu(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,ru(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,eu(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,ru(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,eu(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,ru(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},Go.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return iu(e(n),a).cells.forEach(function(e,a){var c=e.edges,s=e.site,l=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):s.x>=r&&s.x<=i&&s.y>=u&&s.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];l.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ta)*Ta,y:Math.round(o(n,t)/Ta)*Ta,i:t}})}var r=Nr,u=Ar,i=r,o=u,a=es;return n?t(n):(t.links=function(n){return iu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return iu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(Ir),c=-1,s=a.length,l=a[s-1].edge,f=l.l===o?l.r:l.l;++c<s;)u=l,i=f,l=a[c].edge,f=l.l===o?l.r:l.l,r<i.i&&r<f.i&&au(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=Et(r=n),t):r},t.y=function(n){return arguments.length?(o=Et(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?es:n,t):a===es?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===es?null:a&&a[1]},t)};var es=[[-1e6,-1e6],[1e6,1e6]];Go.geom.delaunay=function(n){return Go.geom.voronoi().triangles(n)},Go.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,l=n.y;if(null!=c)if(fa(c-e)+fa(l-r)<.01)s(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,s(n,f,c,l,u,i,o,a),s(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else s(n,t,e,r,u,i,o,a)}function s(n,t,e,r,u,o,a,c){var s=.5*(u+a),l=.5*(o+c),f=e>=s,h=r>=l,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=lu()),f?u=s:a=s,h?o=l:c=l,i(n,t,e,r,u,o,a,c)}var l,f,h,g,p,v,d,m,y,x=Et(a),M=Et(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)l=n[g],l.x<v&&(v=l.x),l.y<d&&(d=l.y),l.x>m&&(m=l.x),l.y>y&&(y=l.y),f.push(l.x),h.push(l.y);else for(g=0;p>g;++g){var _=+x(l=n[g],g),b=+M(l,g);v>_&&(v=_),d>b&&(d=b),_>m&&(m=_),b>y&&(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=lu();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){fu(n,k,v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=l=null,k}var o,a=Nr,c=Ar;return(o=arguments.length)?(a=cu,c=su,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},Go.interpolateRgb=hu,Go.interpolateObject=gu,Go.interpolateNumber=pu,Go.interpolateString=vu;var rs=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;Go.interpolate=du,Go.interpolators=[function(n,t){var e=typeof t;return("string"===e?Ja.has(t)||/^(#|rgb\(|hsl\()/.test(t)?hu:vu:t instanceof et?hu:Array.isArray(t)?mu:"object"===e&&isNaN(t)?gu:pu)(n,t)}],Go.interpolateArray=mu;var us=function(){return Nt},is=Go.map({linear:us,poly:Su,quad:function(){return _u},cubic:function(){return bu},sin:function(){return ku},exp:function(){return Eu},circle:function(){return Nu},elastic:Au,back:Cu,bounce:function(){return Lu}}),os=Go.map({"in":Nt,out:xu,"in-out":Mu,"out-in":function(n){return Mu(xu(n))}});Go.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=is.get(e)||us,r=os.get(r)||Nt,yu(r(e.apply(null,Ko.call(arguments,1))))},Go.interpolateHcl=Tu,Go.interpolateHsl=qu,Go.interpolateLab=zu,Go.interpolateRound=Ru,Go.transform=function(n){var t=na.createElementNS(Go.ns.prefix.svg,"g");return(Go.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Du(e?e.matrix:as)})(n)},Du.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var as={a:1,b:0,c:0,d:1,e:0,f:0};Go.interpolateTransform=Hu,Go.layout={},Go.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Yu(n[e]));return t}},Go.layout.chord=function(){function n(){var n,s,f,h,g,p={},v=[],d=Go.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(s=0,g=-1;++g<i;)s+=u[h][g];v.push(s),m.push(Go.range(i)),n+=s}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(Ca-l*i)/n,s=0,h=-1;++h<i;){for(f=s,g=-1;++g<i;){var y=d[h],x=m[y][g],M=u[y][x],_=s,b=s+=M*n;p[y+"-"+x]={index:y,subindex:x,startAngle:_,endAngle:b,value:M}}r[y]={index:y,startAngle:f,endAngle:s,value:(s-f)/n},s+=l}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,s={},l=0;return s.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,s):u},s.padding=function(n){return arguments.length?(l=n,e=r=null,s):l},s.sortGroups=function(n){return arguments.length?(o=n,e=r=null,s):o},s.sortSubgroups=function(n){return arguments.length?(a=n,e=null,s):a},s.sortChords=function(n){return arguments.length?(c=n,e&&t(),s):c},s.chords=function(){return e||n(),e},s.groups=function(){return r||n(),r},s},Go.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=u-e,c=i*i+o*o;if(c>a*a/d){if(p>c){var s=t.charge/c;n.px-=i*s,n.py-=o*s}return!0}if(t.point&&c&&p>c){var s=t.pointCharge/c;n.px-=i*s,n.py-=o*s}}return!t.charge}}function t(n){n.px=Go.event.x,n.py=Go.event.y,a.resume()}var e,r,u,i,o,a={},c=Go.dispatch("start","tick","end"),s=[1,1],l=.9,f=cs,h=ss,g=-30,p=ls,v=.1,d=.64,m=[],y=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,x,M,_=m.length,b=y.length;for(e=0;b>e;++e)a=y[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(p=x*x+M*M)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,x*=p,M*=p,h.x-=x*(d=f.weight/(h.weight+f.weight)),h.y-=M*d,f.x+=x*(d=1-d),f.y+=M*d);if((d=r*v)&&(x=s[0]/2,M=s[1]/2,e=-1,d))for(;++e<_;)a=m[e],a.x+=(x-a.x)*d,a.y+=(M-a.y)*d;if(g)for(Ju(t=Go.geom.quadtree(m),r,o),e=-1;++e<_;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<_;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*l,a.y-=(a.py-(a.py=a.y))*l);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(y=n,a):y},a.size=function(n){return arguments.length?(s=n,a):s},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(l=+n,a):l},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),Go.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=y[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,s=o.length;++a<s;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=m.length,l=y.length,p=s[0],v=s[1];for(t=0;c>t;++t)(r=m[t]).index=t,r.weight=0;for(t=0;l>t;++t)r=y[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;l>t;++t)u[t]=+f.call(this,y[t],t);else for(t=0;l>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;l>t;++t)i[t]=+h.call(this,y[t],t);else for(t=0;l>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=Go.behavior.drag().origin(Nt).on("dragstart.force",Vu).on("drag.force",t).on("dragend.force",$u)),arguments.length?(this.on("mouseover.force",Xu).on("mouseout.force",Bu).call(e),void 0):e},Go.rebind(a,c,"on")};var cs=20,ss=1,ls=1/0;Go.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&&(s=c.length)){for(var s,l,f=-1,h=t.children=new Array(s),g=0,p=o+1;++f<s;)l=h[f]=n(c[f],p,a),l.parent=t,g+=l.value;r&&h.sort(r),i&&(t.value=g)}else delete t.children,i&&(t.value=+i.call(e,t,o)||0);return t}function t(n,r){var u=n.children,o=0;if(u&&(a=u.length))for(var a,c=-1,s=r+1;++c<a;)o+=t(u[c],s);else i&&(o=+i.call(e,n,r)||0);return i&&(n.value=o),o}function e(t){var e=[];return n(t,0,e),e}var r=Qu,u=Gu,i=Ku;return e.sort=function(n){return arguments.length?(r=n,e):r},e.children=function(n){return arguments.length?(u=n,e):u},e.value=function(n){return arguments.length?(i=n,e):i},e.revalue=function(n){return t(n,0),n},e},Go.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,s=-1;for(r=t.value?r/t.value:0;++s<o;)n(a=i[s],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=Go.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},Wu(e,r)},Go.layout.pie=function(){function n(i){var o=i.map(function(e,r){return+t.call(n,e,r)}),a=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-a)/Go.sum(o),s=Go.range(i.length);null!=e&&s.sort(e===fs?function(n,t){return o[t]-o[n]}:function(n,t){return e(i[n],i[t])});var l=[];return s.forEach(function(n){var t;l[n]={data:i[n],value:t=o[n],startAngle:a,endAngle:a+=t*c}}),l}var t=Number,e=fs,r=0,u=Ca;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n};var fs={};Go.layout.stack=function(){function n(a,c){var s=a.map(function(e,r){return t.call(n,e,r)}),l=s.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,l,c);s=Go.permute(s,f),l=Go.permute(l,f);var h,g,p,v=r.call(n,l,c),d=s.length,m=s[0].length;for(g=0;m>g;++g)for(u.call(n,s[0][g],p=v[g],l[0][g][1]),h=1;d>h;++h)u.call(n,s[h][g],p+=l[h-1][g][1],l[h][g][1]);return a}var t=Nt,e=ui,r=ii,u=ri,i=ti,o=ei;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:hs.get(t)||ui,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:gs.get(t)||ii,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var hs=Go.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(oi),i=n.map(ai),o=Go.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,s=[],l=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],s.push(e)):(c+=i[e],l.push(e));return l.reverse().concat(s)},reverse:function(n){return Go.range(n.length).reverse()},"default":ui}),gs=Go.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,s,l=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=s=0,e=1;h>e;++e){for(t=0,u=0;l>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];l>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,s>c&&(s=c)}for(e=0;h>e;++e)g[e]-=s;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ii});Go.layout.histogram=function(){function n(n,i){for(var o,a,c=[],s=n.map(e,this),l=r.call(this,s,i),f=u.call(this,l,s,i),i=-1,h=s.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=s[i],a>=l[0]&&a<=l[1]&&(o=c[Go.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=fi,u=si;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=Et(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return li(n,t)}:Et(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},Go.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&&(i=r.length)){for(var i,a,s,l=r[0],f=l,h=-1;++h<i;)s=r[h],o(s,a),f=c(s,a,f),a=s;Mi(n);var g=.5*(l._tree.prelim+s._tree.prelim);t?(u.prelim=t._tree.prelim+e(n,t),u.mod=u.prelim-g):u.prelim=g}else t&&(u.prelim=t._tree.prelim+e(n,t))}function a(n,t){n.x=n._tree.prelim+t;var e=n.children;if(e&&(r=e.length)){var r,u=-1;for(t+=n._tree.mod;++u<r;)a(e[u],t)}}function c(n,t,r){if(t){for(var u,i=n,o=n,a=t,c=n.parent.children[0],s=i._tree.mod,l=o._tree.mod,f=a._tree.mod,h=c._tree.mod;a=pi(a),i=gi(i),a&&i;)c=gi(c),o=pi(o),o._tree.ancestor=n,u=a._tree.prelim+f-i._tree.prelim-s+e(a,i),u>0&&(_i(bi(a,n,r),n,u),s+=u,l+=u),f+=a._tree.mod,s+=i._tree.mod,h+=c._tree.mod,l+=o._tree.mod;a&&!pi(o)&&(o._tree.thread=a,o._tree.mod+=f-l),i&&!gi(c)&&(c._tree.thread=i,c._tree.mod+=s-h,r=n)}return r}var s=t.call(this,n,i),l=s[0];xi(l,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(l),a(l,-l._tree.prelim);var f=vi(l,mi),h=vi(l,di),g=vi(l,yi),p=f.x-e(f,h)/2,v=h.x+e(h,f)/2,d=g.depth||1;return xi(l,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(v-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),s}var t=Go.layout.hierarchy().sort(null).value(null),e=hi,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Wu(n,t)},Go.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],s=u[1],l=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,xi(a,function(n){n.r=+l(n.value)}),xi(a,Ni),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/s))/2;xi(a,function(n){n.r+=f}),xi(a,Ni),xi(a,function(n){n.r-=f})}return Li(a,c/2,s/2,t?1:1/Math.max(2*a.r/c,2*a.r/s)),o}var t,e=Go.layout.hierarchy().sort(wi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Wu(n,e)},Go.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],s=0;xi(c,function(n){var t=n.children;t&&t.length?(n.x=zi(t),n.y=qi(t)):(n.x=o?s+=e(n,o):0,n.y=0,o=n)});var l=Ri(c),f=Di(c),h=l.x-e(l,f)/2,g=f.x+e(f,l)/2;return xi(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=Go.layout.hierarchy().sort(null).value(null),e=hi,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Wu(n,t)},Go.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,s=f(e),l=[],h=i.slice(),p=1/0,v="slice"===g?s.dx:"dice"===g?s.dy:"slice-dice"===g?1&e.depth?s.dy:s.dx:Math.min(s.dx,s.dy);for(n(h,s.dx*s.dy/e.value),l.area=0;(c=h.length)>0;)l.push(o=h[c-1]),l.area+=o.area,"squarify"!==g||(a=r(l,v))<=p?(h.pop(),p=a):(l.area-=l.pop().area,u(l,v,s,!1),v=Math.min(s.dx,s.dy),l.length=l.area=0,p=1/0);l.length&&(u(l,v,s,!0),l.length=l.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,s=e.y,l=t?c(n.area/t):0;if(t==e.dx){for((r||l>e.dy)&&(l=e.dy);++i<o;)u=n[i],u.x=a,u.y=s,u.dy=l,a+=u.dx=Math.min(e.x+e.dx-a,l?c(u.area/l):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=l,e.dy-=l}else{for((r||l>e.dx)&&(l=e.dx);++i<o;)u=n[i],u.x=a,u.y=s,u.dx=l,s+=u.dy=Math.min(e.y+e.dy-s,l?c(u.area/l):0);u.z=!1,u.dy+=e.y+e.dy-s,e.x+=l,e.dx-=l}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=s[0],i.dy=s[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=Go.layout.hierarchy(),c=Math.round,s=[1,1],l=null,f=Pi,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(s=n,i):s},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Pi(t):Ui(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Ui(t,n)}if(!arguments.length)return l;var r;return f=null==(l=n)?Pi:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},Wu(i,a)},Go.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=Go.random.normal.apply(Go,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=Go.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},Go.scale={};var ps={floor:Nt,ceil:Nt};Go.scale.linear=function(){return Zi([0,1],[0,1],du,!1)};var vs={s:1,g:1,p:1,r:1,e:1};Go.scale.log=function(){return Ki(Go.scale.linear().domain([0,1]),10,!0,[1,10])};var ds=Go.format(".0e"),ms={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};Go.scale.pow=function(){return Qi(Go.scale.linear(),1,[0,1])},Go.scale.sqrt=function(){return Go.scale.pow().exponent(.5)},Go.scale.ordinal=function(){return to([],{t:"range",a:[[]]})},Go.scale.category10=function(){return Go.scale.ordinal().range(ys)},Go.scale.category20=function(){return Go.scale.ordinal().range(xs)},Go.scale.category20b=function(){return Go.scale.ordinal().range(Ms)},Go.scale.category20c=function(){return Go.scale.ordinal().range(_s)};var ys=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(mt),xs=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(mt),Ms=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(mt),_s=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(mt);Go.scale.quantile=function(){return eo([],[])
+},Go.scale.quantize=function(){return ro(0,1,[0,1])},Go.scale.threshold=function(){return uo([.5],[0,1])},Go.scale.identity=function(){return io([0,1])},Go.svg={},Go.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+bs,a=u.apply(this,arguments)+bs,c=(o>a&&(c=o,o=a,a=c),a-o),s=Aa>c?"0":"1",l=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c>=ws?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+s+",0 "+n*l+","+n*f+"Z":"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=oo,e=ao,r=co,u=so;return n.innerRadius=function(e){return arguments.length?(t=Et(e),n):t},n.outerRadius=function(t){return arguments.length?(e=Et(t),n):e},n.startAngle=function(t){return arguments.length?(r=Et(t),n):r},n.endAngle=function(t){return arguments.length?(u=Et(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+bs;return[Math.cos(i)*n,Math.sin(i)*n]},n};var bs=-La,ws=Ca-Ta;Go.svg.line=function(){return lo(Nt)};var Ss=Go.map({linear:fo,"linear-closed":ho,step:go,"step-before":po,"step-after":vo,basis:bo,"basis-open":wo,"basis-closed":So,bundle:ko,cardinal:xo,"cardinal-open":mo,"cardinal-closed":yo,monotone:To});Ss.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var ks=[0,2/3,1/3,0],Es=[0,1/3,2/3,0],Ns=[0,1/6,2/3,1/6];Go.svg.line.radial=function(){var n=lo(qo);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},po.reverse=vo,vo.reverse=po,Go.svg.area=function(){return zo(Nt)},Go.svg.area.radial=function(){var n=zo(qo);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},Go.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),s=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,s)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,s.r,s.p0)+r(s.r,s.p1,s.a1-s.a0)+u(s.r,s.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+bs,l=s.call(n,u,r)+bs;return{r:i,a0:o,a1:l,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(l),i*Math.sin(l)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Aa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=mr,o=yr,a=Ro,c=co,s=so;return n.radius=function(t){return arguments.length?(a=Et(t),n):a},n.source=function(t){return arguments.length?(i=Et(t),n):i},n.target=function(t){return arguments.length?(o=Et(t),n):o},n.startAngle=function(t){return arguments.length?(c=Et(t),n):c},n.endAngle=function(t){return arguments.length?(s=Et(t),n):s},n},Go.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=mr,e=yr,r=Do;return n.source=function(e){return arguments.length?(t=Et(e),n):t},n.target=function(t){return arguments.length?(e=Et(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},Go.svg.diagonal.radial=function(){var n=Go.svg.diagonal(),t=Do,e=n.projection;return n.projection=function(n){return arguments.length?e(Po(t=n)):t},n},Go.svg.symbol=function(){function n(n,r){return(As.get(t.call(this,n,r))||Ho)(e.call(this,n,r))}var t=jo,e=Uo;return n.type=function(e){return arguments.length?(t=Et(e),n):t},n.size=function(t){return arguments.length?(e=Et(t),n):e},n};var As=Go.map({circle:Ho,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*qs)),e=t*qs;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/Ts),e=t*Ts/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/Ts),e=t*Ts/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});Go.svg.symbolTypes=As.keys();var Cs,Ls,Ts=Math.sqrt(3),qs=Math.tan(30*za),zs=[],Rs=0;zs.call=_a.call,zs.empty=_a.empty,zs.node=_a.node,zs.size=_a.size,Go.transition=function(n){return arguments.length?Cs?n.transition():n:Sa.transition()},Go.transition.prototype=zs,zs.select=function(n){var t,e,r,u=this.id,i=[];n=b(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]);for(var c=this[o],s=-1,l=c.length;++s<l;)(r=c[s])&&(e=n.call(r,r.__data__,s,o))?("__data__"in r&&(e.__data__=r.__data__),Io(e,s,u,r.__transition__[u]),t.push(e)):t.push(null)}return Fo(i,u)},zs.selectAll=function(n){var t,e,r,u,i,o=this.id,a=[];n=w(n);for(var c=-1,s=this.length;++c<s;)for(var l=this[c],f=-1,h=l.length;++f<h;)if(r=l[f]){i=r.__transition__[o],e=n.call(r,r.__data__,f,c),a.push(t=[]);for(var g=-1,p=e.length;++g<p;)(u=e[g])&&Io(u,g,o,i),t.push(u)}return Fo(a,o)},zs.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=R(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Fo(u,this.id)},zs.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):P(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},zs.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Hu:du,a=Go.ns.qualify(n);return Oo(this,"attr."+n,t,a.local?i:u)},zs.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=Go.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},zs.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=ea.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=du(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return Oo(this,"style."+n,t,u)},zs.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,ea.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},zs.text=function(n){return Oo(this,"text",n,Yo)},zs.remove=function(){return this.each("end.transition",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},zs.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=Go.ease.apply(Go,arguments)),P(this,function(e){e.__transition__[t].ease=n}))},zs.delay=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].delay:P(this,"function"==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},zs.duration=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].duration:P(this,"function"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},zs.each=function(n,t){var e=this.id;if(arguments.length<2){var r=Ls,u=Cs;Cs=e,P(this,function(t,r,u){Ls=t.__transition__[e],n.call(t,t.__data__,r,u)}),Ls=r,Cs=u}else P(this,function(r){var u=r.__transition__[e];(u.event||(u.event=Go.dispatch("start","end"))).on(n,t)});return this},zs.transition=function(){for(var n,t,e,r,u=this.id,i=++Rs,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],s=0,l=t.length;l>s;s++)(e=t[s])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,Io(e,s,i,r)),n.push(e)}return Fo(o,i)},Go.svg.axis=function(){function n(n){n.each(function(){var n,s=Go.select(this),l=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):Nt:t,p=s.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ta),d=Go.transition(p.exit()).style("opacity",Ta).remove(),m=Go.transition(p.order()).style("opacity",1),y=Hi(f),x=s.selectAll(".domain").data([0]),M=(x.enter().append("path").attr("class","domain"),Go.transition(x));v.append("line"),v.append("text");var _=v.select("line"),b=m.select("line"),w=p.select("text").text(g),S=v.select("text"),k=m.select("text");switch(r){case"bottom":n=Zo,_.attr("y2",u),S.attr("y",Math.max(u,0)+o),b.attr("x2",0).attr("y2",u),k.attr("x",0).attr("y",Math.max(u,0)+o),w.attr("dy",".71em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+i+"V0H"+y[1]+"V"+i);break;case"top":n=Zo,_.attr("y2",-u),S.attr("y",-(Math.max(u,0)+o)),b.attr("x2",0).attr("y2",-u),k.attr("x",0).attr("y",-(Math.max(u,0)+o)),w.attr("dy","0em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+-i+"V0H"+y[1]+"V"+-i);break;case"left":n=Vo,_.attr("x2",-u),S.attr("x",-(Math.max(u,0)+o)),b.attr("x2",-u).attr("y2",0),k.attr("x",-(Math.max(u,0)+o)).attr("y",0),w.attr("dy",".32em").style("text-anchor","end"),M.attr("d","M"+-i+","+y[0]+"H0V"+y[1]+"H"+-i);break;case"right":n=Vo,_.attr("x2",u),S.attr("x",Math.max(u,0)+o),b.attr("x2",u).attr("y2",0),k.attr("x",Math.max(u,0)+o).attr("y",0),w.attr("dy",".32em").style("text-anchor","start"),M.attr("d","M"+i+","+y[0]+"H0V"+y[1]+"H"+i)}if(f.rangeBand){var E=f,N=E.rangeBand()/2;l=f=function(n){return E(n)+N}}else l.rangeBand?l=f:d.call(n,f);v.call(n,l),m.call(n,f)})}var t,e=Go.scale.linear(),r=Ds,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Ps?t+"":Ds,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Ds="bottom",Ps={top:1,right:1,bottom:1,left:1};Go.svg.brush=function(){function n(i){i.each(function(){var i=Go.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(p,Nt);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Us[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,f=Go.transition(i),h=Go.transition(o);c&&(l=Hi(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),e(f)),s&&(l=Hi(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+l[+/e$/.test(n)]+","+f[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",l[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",l[1]-l[0])}function r(n){n.select(".extent").attr("y",f[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1]-f[0])}function u(){function u(){32==Go.event.keyCode&&(A||(x=null,L[0]-=l[1],L[1]-=f[1],A=2),y())}function p(){32==Go.event.keyCode&&2==A&&(L[0]+=l[1],L[1]+=f[1],A=0,y())}function v(){var n=Go.mouse(_),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),A||(Go.event.altKey?(x||(x=[(l[0]+l[1])/2,(f[0]+f[1])/2]),L[0]=l[+(n[0]<x[0])],L[1]=f[+(n[1]<x[1])]):x=null),E&&d(n,c,0)&&(e(S),u=!0),N&&d(n,s,1)&&(r(S),u=!0),u&&(t(S),w({type:"brush",mode:A?"move":"resize"}))}function d(n,t,e){var r,u,a=Hi(t),c=a[0],s=a[1],p=L[e],v=e?f:l,d=v[1]-v[0];return A&&(c-=p,s-=d+p),r=(e?g:h)?Math.max(c,Math.min(s,n[e])):n[e],A?u=(r+=p)+d:(x&&(p=Math.max(c,Math.min(s,2*x[e]-r))),r>p?(u=r,r=p):u=p),v[0]!=r||v[1]!=u?(e?o=null:i=null,v[0]=r,v[1]=u,!0):void 0}function m(){v(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),Go.select("body").style("cursor",null),T.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),C(),w({type:"brushend"})}var x,M,_=this,b=Go.select(Go.event.target),w=a.of(_,arguments),S=Go.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&&c,N=!/^(e|w)$/.test(k)&&s,A=b.classed("extent"),C=I(),L=Go.mouse(_),T=Go.select(ea).on("keydown.brush",u).on("keyup.brush",p);if(Go.event.changedTouches?T.on("touchmove.brush",v).on("touchend.brush",m):T.on("mousemove.brush",v).on("mouseup.brush",m),S.interrupt().selectAll("*").interrupt(),A)L[0]=l[0]-L[0],L[1]=f[0]-L[1];else if(k){var q=+/w$/.test(k),z=+/^n/.test(k);M=[l[1-q]-L[0],f[1-z]-L[1]],L[0]=l[q],L[1]=f[z]}else Go.event.altKey&&(x=L.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),Go.select("body").style("cursor",b.style("cursor")),w({type:"brushstart"}),v()}var i,o,a=M(n,"brushstart","brush","brushend"),c=null,s=null,l=[0,0],f=[0,0],h=!0,g=!0,p=js[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:l,y:f,i:i,j:o},e=this.__chart__||t;this.__chart__=t,Cs?Go.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,l=e.x,f=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=mu(l,t.x),r=mu(f,t.y);return i=o=null,function(u){l=t.x=e(u),f=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,p=js[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,p=js[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(h=!!t[0],g=!!t[1]):c?h=!!t:s&&(g=!!t),n):c&&s?[h,g]:c?h:s?g:null},n.extent=function(t){var e,r,u,a,h;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(h=e,e=r,r=h),(e!=l[0]||r!=l[1])&&(l=[e,r])),s&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],s.invert&&(u=s(u),a=s(a)),u>a&&(h=u,u=a,a=h),(u!=f[0]||a!=f[1])&&(f=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=l[0],r=l[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(h=e,e=r,r=h))),s&&(o?(u=o[0],a=o[1]):(u=f[0],a=f[1],s.invert&&(u=s.invert(u),a=s.invert(a)),u>a&&(h=u,u=a,a=h))),c&&s?[[e,u],[r,a]]:c?[e,r]:s&&[u,a])},n.clear=function(){return n.empty()||(l=[0,0],f=[0,0],i=o=null),n},n.empty=function(){return!!c&&l[0]==l[1]||!!s&&f[0]==f[1]},Go.rebind(n,a,"on")};var Us={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},js=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Hs=ic.format=fc.timeFormat,Fs=Hs.utc,Os=Fs("%Y-%m-%dT%H:%M:%S.%LZ");Hs.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?$o:Os,$o.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},$o.toString=Os.toString,ic.second=Ht(function(n){return new oc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ic.seconds=ic.second.range,ic.seconds.utc=ic.second.utc.range,ic.minute=Ht(function(n){return new oc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ic.minutes=ic.minute.range,ic.minutes.utc=ic.minute.utc.range,ic.hour=Ht(function(n){var t=n.getTimezoneOffset()/60;return new oc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ic.hours=ic.hour.range,ic.hours.utc=ic.hour.utc.range,ic.month=Ht(function(n){return n=ic.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ic.months=ic.month.range,ic.months.utc=ic.month.utc.range;var Ys=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Is=[[ic.second,1],[ic.second,5],[ic.second,15],[ic.second,30],[ic.minute,1],[ic.minute,5],[ic.minute,15],[ic.minute,30],[ic.hour,1],[ic.hour,3],[ic.hour,6],[ic.hour,12],[ic.day,1],[ic.day,2],[ic.week,1],[ic.month,1],[ic.month,3],[ic.year,1]],Zs=Hs.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",Ne]]),Vs={range:function(n,t,e){return Go.range(Math.ceil(n/e)*e,+t,e).map(Bo)},floor:Nt,ceil:Nt};Is.year=ic.year,ic.scale=function(){return Xo(Go.scale.linear(),Is,Zs)};var $s=Is.map(function(n){return[n[0].utc,n[1]]}),Xs=Fs.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",Ne]]);$s.year=ic.year.utc,ic.scale.utc=function(){return Xo(Go.scale.linear(),$s,Xs)},Go.text=At(function(n){return n.responseText}),Go.json=function(n,t){return Ct(n,"application/json",Jo,t)},Go.html=function(n,t){return Ct(n,"text/html",Wo,t)},Go.xml=At(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(Go):"object"==typeof module&&module.exports?module.exports=Go:this.d3=Go}(); \ No newline at end of file
diff --git a/src/usr/local/www/d3pie/d3pie.min.js b/src/usr/local/www/d3pie/d3pie.min.js
new file mode 100644
index 0000000..8bf6e37
--- /dev/null
+++ b/src/usr/local/www/d3pie/d3pie.min.js
@@ -0,0 +1,9 @@
+/*!
+* d3pie
+* @author Ben Keen
+* @version 0.1.8
+* @date April 2015
+* @repo http://github.com/benkeen/d3pie
+*/
+!function(a,b){"function"==typeof define&&define.amd?define([],b):"object"==typeof exports?module.exports=b(require()):a.d3pie=b(a)}(this,function(){var a="d3pie",b="0.1.6",c=0,d={header:{title:{text:"",color:"#333333",fontSize:18,font:"arial"},subtitle:{text:"",color:"#666666",fontSize:14,font:"arial"},location:"top-center",titleSubtitlePadding:8},footer:{text:"",color:"#666666",fontSize:14,font:"arial",location:"left"},size:{canvasHeight:500,canvasWidth:500,pieInnerRadius:"0%",pieOuterRadius:null},data:{sortOrder:"none",ignoreSmallSegments:{enabled:!1,valueType:"percentage",value:null},smallSegmentGrouping:{enabled:!1,value:1,valueType:"percentage",label:"Other",color:"#cccccc"},content:[]},labels:{outer:{format:"label",hideWhenLessThanPercentage:null,pieDistance:30},inner:{format:"percentage",hideWhenLessThanPercentage:null},mainLabel:{color:"#333333",font:"arial",fontSize:10},percentage:{color:"#dddddd",font:"arial",fontSize:10,decimalPlaces:0},value:{color:"#cccc44",font:"arial",fontSize:10},lines:{enabled:!0,style:"curved",color:"segment"},truncation:{enabled:!1,truncateLength:30},formatter:null},effects:{load:{effect:"default",speed:1e3},pullOutSegmentOnClick:{effect:"bounce",speed:300,size:10},highlightSegmentOnMouseover:!0,highlightLuminosity:-.2},tooltips:{enabled:!1,type:"placeholder",string:"",placeholderParser:null,styles:{fadeInSpeed:250,backgroundColor:"#000000",backgroundOpacity:.5,color:"#efefef",borderRadius:2,font:"arial",fontSize:10,padding:4}},misc:{colors:{background:null,segments:["#2484c1","#65a620","#7b6888","#a05d56","#961a1a","#d8d23a","#e98125","#d0743c","#635222","#6ada6a","#0c6197","#7d9058","#207f33","#44b9b0","#bca44a","#e4a14b","#a3acb2","#8cc3e9","#69a6f9","#5b388f","#546e91","#8bde95","#d2ab58","#273c71","#98bf6e","#4daa4b","#98abc5","#cc1010","#31383b","#006391","#c2643f","#b0a474","#a5a39c","#a9c2bc","#22af8c","#7fcecf","#987ac6","#3d3b87","#b77b1c","#c9c2b6","#807ece","#8db27c","#be66a2","#9ed3c6","#00644b","#005064","#77979f","#77e079","#9c73ab","#1f79a7"],segmentStroke:"#ffffff"},gradient:{enabled:!1,percentage:95,color:"#000000"},canvasPadding:{top:5,right:5,bottom:5,left:5},pieCenterOffset:{x:0,y:0},cssPrefix:null},callbacks:{onload:null,onMouseoverSegment:null,onMouseoutSegment:null,onClickSegment:null}},e={initialCheck:function(a){var b=a.cssPrefix,c=a.element,d=a.options;if(!window.d3||!window.d3.hasOwnProperty("version"))return console.error("d3pie error: d3 is not available"),!1;if(!(c instanceof HTMLElement||c instanceof SVGElement))return console.error("d3pie error: the first d3pie() param must be a valid DOM element (not jQuery) or a ID string."),!1;if(!/[a-zA-Z][a-zA-Z0-9_-]*$/.test(b))return console.error("d3pie error: invalid options.misc.cssPrefix"),!1;if(!f.isArray(d.data.content))return console.error("d3pie error: invalid config structure: missing data.content property."),!1;if(0===d.data.content.length)return console.error("d3pie error: no data supplied."),!1;for(var e=[],g=0;g<d.data.content.length;g++)"number"!=typeof d.data.content[g].value||isNaN(d.data.content[g].value)?console.log("not valid: ",d.data.content[g]):d.data.content[g].value<=0?console.log("not valid - should have positive value: ",d.data.content[g]):e.push(d.data.content[g]);return a.options.data.content=e,!0}},f={addSVGSpace:function(a){var b=a.element,c=a.options.size.canvasWidth,d=a.options.size.canvasHeight,e=a.options.misc.colors.background,f=d3.select(b).append("svg:svg").attr("width",c).attr("height",d);return"transparent"!==e&&f.style("background-color",function(){return e}),f},whenIdExists:function(a,b){var c=1,d=1e3,e=setInterval(function(){document.getElementById(a)&&(clearInterval(e),b()),c>d&&clearInterval(e),c++},1)},whenElementsExist:function(a,b){var c=1,d=1e3,e=setInterval(function(){for(var f=!0,g=0;g<a.length;g++)if(!document.getElementById(a[g])){f=!1;break}f&&(clearInterval(e),b()),c>d&&clearInterval(e),c++},1)},shuffleArray:function(a){for(var b,c,d=a.length;0!==d;)c=Math.floor(Math.random()*d),d-=1,b=a[d],a[d]=a[c],a[c]=b;return a},processObj:function(a,b,c){return"string"==typeof b?f.processObj(a,b.split("."),c):1===b.length&&void 0!==c?(a[b[0]]=c,a[b[0]]):0===b.length?a:f.processObj(a[b[0]],b.slice(1),c)},getDimensions:function(a){var b=document.getElementById(a),c=0,d=0;if(b){var e=b.getBBox();c=e.width,d=e.height}else console.log("error: getDimensions() "+a+" not found.");return{w:c,h:d}},rectIntersect:function(a,b){var c=b.x>a.x+a.w||b.x+b.w<a.x||b.y+b.h<a.y||b.y>a.y+a.h;return!c},getColorShade:function(a,b){a=String(a).replace(/[^0-9a-f]/gi,""),a.length<6&&(a=a[0]+a[0]+a[1]+a[1]+a[2]+a[2]),b=b||0;for(var c="#",d=0;3>d;d++){var e=parseInt(a.substr(2*d,2),16);e=Math.round(Math.min(Math.max(0,e+e*b),255)).toString(16),c+=("00"+e).substr(e.length)}return c},initSegmentColors:function(a){for(var b=a.options.data.content,c=a.options.misc.colors.segments,d=[],e=0;e<b.length;e++)d.push(b[e].hasOwnProperty("color")?b[e].color:c[e]);return d},applySmallSegmentGrouping:function(a,b){var c;"percentage"===b.valueType&&(c=h.getTotalPieSize(a));for(var d=[],e=[],f=0,g=0;g<a.length;g++)if("percentage"===b.valueType){var i=a[g].value/c*100;if(i<=b.value){e.push(a[g]),f+=a[g].value;continue}a[g].isGrouped=!1,d.push(a[g])}else{if(a[g].value<=b.value){e.push(a[g]),f+=a[g].value;continue}a[g].isGrouped=!1,d.push(a[g])}return e.length&&d.push({color:b.color,label:b.label,value:f,isGrouped:!0,groupedData:e}),d},showPoint:function(a,b,c){a.append("circle").attr("cx",b).attr("cy",c).attr("r",2).style("fill","black")},isFunction:function(a){var b={};return a&&"[object Function]"===b.toString.call(a)},isArray:function(a){return"[object Array]"===Object.prototype.toString.call(a)}},g=function(){var a,b,c,d,e,f,h=arguments[0]||{},i=1,j=arguments.length,k=!1,l=Object.prototype.toString,m=Object.prototype.hasOwnProperty,n={"[object Boolean]":"boolean","[object Number]":"number","[object String]":"string","[object Function]":"function","[object Array]":"array","[object Date]":"date","[object RegExp]":"regexp","[object Object]":"object"},o={isFunction:function(a){return"function"===o.type(a)},isArray:Array.isArray||function(a){return"array"===o.type(a)},isWindow:function(a){return null!==a&&a===a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return null===a?String(a):n[l.call(a)]||"object"},isPlainObject:function(a){if(!a||"object"!==o.type(a)||a.nodeType)return!1;try{if(a.constructor&&!m.call(a,"constructor")&&!m.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(b){return!1}var c;for(c in a);return void 0===c||m.call(a,c)}};for("boolean"==typeof h&&(k=h,h=arguments[1]||{},i=2),"object"==typeof h||o.isFunction(h)||(h={}),j===i&&(h=this,--i),i;j>i;i++)if(null!==(a=arguments[i]))for(b in a)c=h[b],d=a[b],h!==d&&(k&&d&&(o.isPlainObject(d)||(e=o.isArray(d)))?(e?(e=!1,f=c&&o.isArray(c)?c:[]):f=c&&o.isPlainObject(c)?c:{},h[b]=g(k,f,d)):void 0!==d&&(h[b]=d));return h},h={toRadians:function(a){return a*(Math.PI/180)},toDegrees:function(a){return a*(180/Math.PI)},computePieRadius:function(a){var b=a.options.size,c=a.options.misc.canvasPadding,d=b.canvasWidth-c.left-c.right,e=b.canvasHeight-c.top-c.bottom;"pie-center"!==a.options.header.location&&(e-=a.textComponents.headerHeight),a.textComponents.footer.exists&&(e-=a.textComponents.footer.h),e=0>e?0:e;var f,g,h=(e>d?d:e)/3;if(null!==b.pieOuterRadius)if(/%/.test(b.pieOuterRadius)){g=parseInt(b.pieOuterRadius.replace(/[\D]/,""),10),g=g>99?99:g,g=0>g?0:g;var i=e>d?d:e;if("none"!==a.options.labels.outer.format){var j=2*parseInt(a.options.labels.outer.pieDistance,10);i-j>0&&(i-=j)}h=Math.floor(i/100*g)/2}else h=parseInt(b.pieOuterRadius,10);/%/.test(b.pieInnerRadius)?(g=parseInt(b.pieInnerRadius.replace(/[\D]/,""),10),g=g>99?99:g,g=0>g?0:g,f=Math.floor(h/100*g)):f=parseInt(b.pieInnerRadius,10),a.innerRadius=f,a.outerRadius=h},getTotalPieSize:function(a){for(var b=0,c=0;c<a.length;c++)b+=a[c].value;return b},sortPieData:function(a){var b=a.options.data.content,c=a.options.data.sortOrder;switch(c){case"none":break;case"random":b=f.shuffleArray(b);break;case"value-asc":b.sort(function(a,b){return a.value<b.value?-1:1});break;case"value-desc":b.sort(function(a,b){return a.value<b.value?1:-1});break;case"label-asc":b.sort(function(a,b){return a.label.toLowerCase()>b.label.toLowerCase()?1:-1});break;case"label-desc":b.sort(function(a,b){return a.label.toLowerCase()<b.label.toLowerCase()?1:-1})}return b},getPieTranslateCenter:function(a){return"translate("+a.x+","+a.y+")"},calculatePieCenter:function(a){var b=a.options.misc.pieCenterOffset,c=a.textComponents.title.exists&&"pie-center"!==a.options.header.location,d=a.textComponents.subtitle.exists&&"pie-center"!==a.options.header.location,e=a.options.misc.canvasPadding.top;c&&d?e+=a.textComponents.title.h+a.options.header.titleSubtitlePadding+a.textComponents.subtitle.h:c?e+=a.textComponents.title.h:d&&(e+=a.textComponents.subtitle.h);var f=0;a.textComponents.footer.exists&&(f=a.textComponents.footer.h+a.options.misc.canvasPadding.bottom);var g=(a.options.size.canvasWidth-a.options.misc.canvasPadding.left-a.options.misc.canvasPadding.right)/2+a.options.misc.canvasPadding.left,h=(a.options.size.canvasHeight-f-e)/2+e;g+=b.x,h+=b.y,a.pieCenter={x:g,y:h}},rotate:function(a,b,c,d,e){e=e*Math.PI/180;var f=Math.cos,g=Math.sin,h=(a-c)*f(e)-(b-d)*g(e)+c,i=(a-c)*g(e)+(b-d)*f(e)+d;return{x:h,y:i}},translate:function(a,b,c,d){var e=h.toRadians(d);return{x:a+c*Math.sin(e),y:b-c*Math.cos(e)}},pointIsInArc:function(a,b,c){var d=c.innerRadius()(b),e=c.outerRadius()(b),f=c.startAngle()(b),g=c.endAngle()(b),h=a.x*a.x+a.y*a.y,i=Math.atan2(a.x,-a.y);return i=0>i?i+2*Math.PI:i,h>=d*d&&e*e>=h&&i>=f&&g>=i}},i={add:function(a,b,c){var d=i.getIncludes(c),e=a.options.labels,f=a.svg.insert("g","."+a.cssPrefix+"labels-"+b).attr("class",a.cssPrefix+"labels-"+b),g=f.selectAll("."+a.cssPrefix+"labelGroup-"+b).data(a.options.data.content).enter().append("g").attr("id",function(c,d){return a.cssPrefix+"labelGroup"+d+"-"+b}).attr("data-index",function(a,b){return b}).attr("class",a.cssPrefix+"labelGroup-"+b).style("opacity",0),h={section:b,sectionDisplayType:c};d.mainLabel&&g.append("text").attr("id",function(c,d){return a.cssPrefix+"segmentMainLabel"+d+"-"+b}).attr("class",a.cssPrefix+"segmentMainLabel-"+b).text(function(a,b){var c=a.label;return e.formatter?(h.index=b,h.part="mainLabel",h.value=a.value,h.label=c,c=e.formatter(h)):e.truncation.enabled&&a.label.length>e.truncation.truncateLength&&(c=a.label.substring(0,e.truncation.truncateLength)+"..."),c}).style("font-size",e.mainLabel.fontSize+"px").style("font-family",e.mainLabel.font).style("fill",e.mainLabel.color),d.percentage&&g.append("text").attr("id",function(c,d){return a.cssPrefix+"segmentPercentage"+d+"-"+b}).attr("class",a.cssPrefix+"segmentPercentage-"+b).text(function(b,c){var d=j.getPercentage(a,c,a.options.labels.percentage.decimalPlaces);return e.formatter?(h.index=c,h.part="percentage",h.value=b.value,h.label=d,d=e.formatter(h)):d+="%",d}).style("font-size",e.percentage.fontSize+"px").style("font-family",e.percentage.font).style("fill",e.percentage.color),d.value&&g.append("text").attr("id",function(c,d){return a.cssPrefix+"segmentValue"+d+"-"+b}).attr("class",a.cssPrefix+"segmentValue-"+b).text(function(a,b){return h.index=b,h.part="value",h.value=a.value,h.label=a.value,e.formatter?e.formatter(h,a.value):a.value}).style("font-size",e.value.fontSize+"px").style("font-family",e.value.font).style("fill",e.value.color)},positionLabelElements:function(a,b,c){i["dimensions-"+b]=[];var d=d3.selectAll("."+a.cssPrefix+"labelGroup-"+b);d.each(function(c,d){var e=d3.select(this).selectAll("."+a.cssPrefix+"segmentMainLabel-"+b),f=d3.select(this).selectAll("."+a.cssPrefix+"segmentPercentage-"+b),g=d3.select(this).selectAll("."+a.cssPrefix+"segmentValue-"+b);i["dimensions-"+b].push({mainLabel:null!==e.node()?e.node().getBBox():null,percentage:null!==f.node()?f.node().getBBox():null,value:null!==g.node()?g.node().getBBox():null})});var e=5,f=i["dimensions-"+b];switch(c){case"label-value1":d3.selectAll("."+a.cssPrefix+"segmentValue-"+b).attr("dx",function(a,b){return f[b].mainLabel.width+e});break;case"label-value2":d3.selectAll("."+a.cssPrefix+"segmentValue-"+b).attr("dy",function(a,b){return f[b].mainLabel.height});break;case"label-percentage1":d3.selectAll("."+a.cssPrefix+"segmentPercentage-"+b).attr("dx",function(a,b){return f[b].mainLabel.width+e});break;case"label-percentage2":d3.selectAll("."+a.cssPrefix+"segmentPercentage-"+b).attr("dx",function(a,b){return f[b].mainLabel.width/2-f[b].percentage.width/2}).attr("dy",function(a,b){return f[b].mainLabel.height})}},computeLabelLinePositions:function(a){a.lineCoordGroups=[],d3.selectAll("."+a.cssPrefix+"labelGroup-outer").each(function(b,c){return i.computeLinePosition(a,c)})},computeLinePosition:function(a,b){var c,d,e,f,g=j.getSegmentAngle(b,a.options.data.content,a.totalSize,{midpoint:!0}),i=h.rotate(a.pieCenter.x,a.pieCenter.y-a.outerRadius,a.pieCenter.x,a.pieCenter.y,g),k=a.outerLabelGroupData[b].h/5,l=6,m=Math.floor(g/90),n=4;switch(2===m&&180===g&&(m=1),m){case 0:c=a.outerLabelGroupData[b].x-l-(a.outerLabelGroupData[b].x-l-i.x)/2,d=a.outerLabelGroupData[b].y+(i.y-a.outerLabelGroupData[b].y)/n,e=a.outerLabelGroupData[b].x-l,f=a.outerLabelGroupData[b].y-k;break;case 1:c=i.x+(a.outerLabelGroupData[b].x-i.x)/n,d=i.y+(a.outerLabelGroupData[b].y-i.y)/n,e=a.outerLabelGroupData[b].x-l,f=a.outerLabelGroupData[b].y-k;break;case 2:var o=a.outerLabelGroupData[b].x+a.outerLabelGroupData[b].w+l;c=i.x-(i.x-o)/n,d=i.y+(a.outerLabelGroupData[b].y-i.y)/n,e=a.outerLabelGroupData[b].x+a.outerLabelGroupData[b].w+l,f=a.outerLabelGroupData[b].y-k;break;case 3:var p=a.outerLabelGroupData[b].x+a.outerLabelGroupData[b].w+l;c=p+(i.x-p)/n,d=a.outerLabelGroupData[b].y+(i.y-a.outerLabelGroupData[b].y)/n,e=a.outerLabelGroupData[b].x+a.outerLabelGroupData[b].w+l,f=a.outerLabelGroupData[b].y-k}"straight"===a.options.labels.lines.style?a.lineCoordGroups[b]=[{x:i.x,y:i.y},{x:e,y:f}]:a.lineCoordGroups[b]=[{x:i.x,y:i.y},{x:c,y:d},{x:e,y:f}]},addLabelLines:function(a){var b=a.svg.insert("g","."+a.cssPrefix+"pieChart").attr("class",a.cssPrefix+"lineGroups").style("opacity",0),c=b.selectAll("."+a.cssPrefix+"lineGroup").data(a.lineCoordGroups).enter().append("g").attr("class",a.cssPrefix+"lineGroup"),d=d3.svg.line().interpolate("basis").x(function(a){return a.x}).y(function(a){return a.y});c.append("path").attr("d",d).attr("stroke",function(b,c){return"segment"===a.options.labels.lines.color?a.options.colors[c]:a.options.labels.lines.color}).attr("stroke-width",1).attr("fill","none").style("opacity",function(b,c){var d=a.options.labels.outer.hideWhenLessThanPercentage,e=j.getPercentage(a,c,a.options.labels.percentage.decimalPlaces),f=null!==d&&d>e||""===a.options.data.content[c].label;return f?0:1})},positionLabelGroups:function(a,b){"none"!==a.options.labels[b].format&&d3.selectAll("."+a.cssPrefix+"labelGroup-"+b).style("opacity",0).attr("transform",function(c,d){var e,i;if("outer"===b)e=a.outerLabelGroupData[d].x,i=a.outerLabelGroupData[d].y;else{var k=g(!0,{},a.pieCenter);if(a.innerRadius>0){var l=j.getSegmentAngle(d,a.options.data.content,a.totalSize,{midpoint:!0}),m=h.translate(a.pieCenter.x,a.pieCenter.y,a.innerRadius,l);k.x=m.x,k.y=m.y}var n=f.getDimensions(a.cssPrefix+"labelGroup"+d+"-inner"),o=n.w/2,p=n.h/4;e=k.x+(a.lineCoordGroups[d][0].x-k.x)/1.8,i=k.y+(a.lineCoordGroups[d][0].y-k.y)/1.8,e-=o,i+=p}return"translate("+e+","+i+")"})},fadeInLabelsAndLines:function(a){var b="default"===a.options.effects.load.effect?a.options.effects.load.speed:1;setTimeout(function(){var b="default"===a.options.effects.load.effect?400:1;d3.selectAll("."+a.cssPrefix+"labelGroup-outer").transition().duration(b).style("opacity",function(b,c){var d=a.options.labels.outer.hideWhenLessThanPercentage,e=j.getPercentage(a,c,a.options.labels.percentage.decimalPlaces);return null!==d&&d>e?0:1}),d3.selectAll("."+a.cssPrefix+"labelGroup-inner").transition().duration(b).style("opacity",function(b,c){var d=a.options.labels.inner.hideWhenLessThanPercentage,e=j.getPercentage(a,c,a.options.labels.percentage.decimalPlaces);return null!==d&&d>e?0:1}),d3.selectAll("g."+a.cssPrefix+"lineGroups").transition().duration(b).style("opacity",1),f.isFunction(a.options.callbacks.onload)&&setTimeout(function(){try{a.options.callbacks.onload()}catch(b){}},b)},b)},getIncludes:function(a){var b=!1,c=!1,d=!1;switch(a){case"label":b=!0;break;case"value":c=!0;break;case"percentage":d=!0;break;case"label-value1":case"label-value2":b=!0,c=!0;break;case"label-percentage1":case"label-percentage2":b=!0,d=!0}return{mainLabel:b,value:c,percentage:d}},computeOuterLabelCoords:function(a){a.svg.selectAll("."+a.cssPrefix+"labelGroup-outer").each(function(b,c){return i.getIdealOuterLabelPositions(a,c)}),i.resolveOuterLabelCollisions(a)},resolveOuterLabelCollisions:function(a){if("none"!==a.options.labels.outer.format){var b=a.options.data.content.length;i.checkConflict(a,0,"clockwise",b),i.checkConflict(a,b-1,"anticlockwise",b)}},checkConflict:function(a,b,c,d){var e,g;if(!(1>=d)){var h=a.outerLabelGroupData[b].hs;if(!("clockwise"===c&&"right"!==h||"anticlockwise"===c&&"left"!==h)){var j="clockwise"===c?b+1:b-1,k=a.outerLabelGroupData[b],l=a.outerLabelGroupData[j],m={labelHeights:a.outerLabelGroupData[0].h,center:a.pieCenter,lineLength:a.outerRadius+a.options.labels.outer.pieDistance,heightChange:a.outerLabelGroupData[0].h+1};if("clockwise"===c){for(e=0;b>=e;e++)if(g=a.outerLabelGroupData[e],f.rectIntersect(g,l)){i.adjustLabelPos(a,j,k,m);break}}else for(e=d-1;e>=b;e--)if(g=a.outerLabelGroupData[e],f.rectIntersect(g,l)){i.adjustLabelPos(a,j,k,m);break}i.checkConflict(a,j,c,d)}}},adjustLabelPos:function(a,b,c,d){var e,f,g,h;h=c.y+d.heightChange,f=d.center.y-h,e=Math.sqrt(Math.abs(d.lineLength)>Math.abs(f)?d.lineLength*d.lineLength-f*f:f*f-d.lineLength*d.lineLength),g="right"===c.hs?d.center.x+e:d.center.x-e-a.outerLabelGroupData[b].w,a.outerLabelGroupData[b].x=g,a.outerLabelGroupData[b].y=h},getIdealOuterLabelPositions:function(a,b){var c=d3.select("#"+a.cssPrefix+"labelGroup"+b+"-outer").node();if(c){var d=c.getBBox(),e=j.getSegmentAngle(b,a.options.data.content,a.totalSize,{midpoint:!0}),f=a.pieCenter.x,g=a.pieCenter.y-(a.outerRadius+a.options.labels.outer.pieDistance),i=h.rotate(f,g,a.pieCenter.x,a.pieCenter.y,e),k="right";e>180?(i.x-=d.width+8,k="left"):i.x+=8,a.outerLabelGroupData[b]={x:i.x,y:i.y,w:d.width,h:d.height,hs:k}}}},j={create:function(a){var b=a.pieCenter,c=a.options.colors,d=a.options.effects.load,e=a.options.misc.colors.segmentStroke,f=a.svg.insert("g","#"+a.cssPrefix+"title").attr("transform",function(){return h.getPieTranslateCenter(b)}).attr("class",a.cssPrefix+"pieChart"),g=d3.svg.arc().innerRadius(a.innerRadius).outerRadius(a.outerRadius).startAngle(0).endAngle(function(b){return b.value/a.totalSize*2*Math.PI}),i=f.selectAll("."+a.cssPrefix+"arc").data(a.options.data.content).enter().append("g").attr("class",a.cssPrefix+"arc"),k=d.speed;"none"===d.effect&&(k=0),i.append("path").attr("id",function(b,c){return a.cssPrefix+"segment"+c}).attr("fill",function(b,d){var e=c[d];return a.options.misc.gradient.enabled&&(e="url(#"+a.cssPrefix+"grad"+d+")"),e}).style("stroke",e).style("stroke-width",1).transition().ease("cubic-in-out").duration(k).attr("data-index",function(a,b){return b}).attrTween("d",function(b){var c=d3.interpolate({value:0},b);return function(b){return a.arc(c(b))}}),a.svg.selectAll("g."+a.cssPrefix+"arc").attr("transform",function(b,c){var d=0;return c>0&&(d=j.getSegmentAngle(c-1,a.options.data.content,a.totalSize)),"rotate("+d+")"}),a.arc=g},addGradients:function(a){var b=a.svg.append("defs").selectAll("radialGradient").data(a.options.data.content).enter().append("radialGradient").attr("gradientUnits","userSpaceOnUse").attr("cx",0).attr("cy",0).attr("r","120%").attr("id",function(b,c){return a.cssPrefix+"grad"+c});b.append("stop").attr("offset","0%").style("stop-color",function(b,c){return a.options.colors[c]}),b.append("stop").attr("offset",a.options.misc.gradient.percentage+"%").style("stop-color",a.options.misc.gradient.color)},addSegmentEventHandlers:function(a){var b=d3.selectAll("."+a.cssPrefix+"arc,."+a.cssPrefix+"labelGroup-inner,."+a.cssPrefix+"labelGroup-outer");b.on("click",function(){var b,c=d3.select(this);if(c.attr("class")===a.cssPrefix+"arc")b=c.select("path");else{var d=c.attr("data-index");b=d3.select("#"+a.cssPrefix+"segment"+d)}var e=b.attr("class")===a.cssPrefix+"expanded";j.onSegmentEvent(a,a.options.callbacks.onClickSegment,b,e),"none"!==a.options.effects.pullOutSegmentOnClick.effect&&(e?j.closeSegment(a,b.node()):j.openSegment(a,b.node()))}),b.on("mouseover",function(){var b,c,d=d3.select(this);if(d.attr("class")===a.cssPrefix+"arc"?b=d.select("path"):(c=d.attr("data-index"),b=d3.select("#"+a.cssPrefix+"segment"+c)),a.options.effects.highlightSegmentOnMouseover){c=b.attr("data-index");var e=a.options.colors[c];b.style("fill",f.getColorShade(e,a.options.effects.highlightLuminosity))}a.options.tooltips.enabled&&(c=b.attr("data-index"),l.showTooltip(a,c));var g=b.attr("class")===a.cssPrefix+"expanded";j.onSegmentEvent(a,a.options.callbacks.onMouseoverSegment,b,g)}),b.on("mousemove",function(){l.moveTooltip(a)}),b.on("mouseout",function(){var b,c,d=d3.select(this);if(d.attr("class")===a.cssPrefix+"arc"?b=d.select("path"):(c=d.attr("data-index"),b=d3.select("#"+a.cssPrefix+"segment"+c)),a.options.effects.highlightSegmentOnMouseover){c=b.attr("data-index");var e=a.options.colors[c];a.options.misc.gradient.enabled&&(e="url(#"+a.cssPrefix+"grad"+c+")"),b.style("fill",e)}a.options.tooltips.enabled&&(c=b.attr("data-index"),l.hideTooltip(a,c));var f=b.attr("class")===a.cssPrefix+"expanded";j.onSegmentEvent(a,a.options.callbacks.onMouseoutSegment,b,f)})},onSegmentEvent:function(a,b,c,d){if(f.isFunction(b)){var e=parseInt(c.attr("data-index"),10);b({segment:c.node(),index:e,expanded:d,data:a.options.data.content[e]})}},openSegment:function(a,b){a.isOpeningSegment||(a.isOpeningSegment=!0,d3.selectAll("."+a.cssPrefix+"expanded").length>0&&j.closeSegment(a,d3.select("."+a.cssPrefix+"expanded").node()),d3.select(b).transition().ease(a.options.effects.pullOutSegmentOnClick.effect).duration(a.options.effects.pullOutSegmentOnClick.speed).attr("transform",function(b,c){var d=a.arc.centroid(b),e=d[0],f=d[1],g=Math.sqrt(e*e+f*f),h=parseInt(a.options.effects.pullOutSegmentOnClick.size,10);return"translate("+e/g*h+","+f/g*h+")"}).each("end",function(c,d){a.currentlyOpenSegment=b,a.isOpeningSegment=!1,d3.select(this).attr("class",a.cssPrefix+"expanded")}))},closeSegment:function(a,b){d3.select(b).transition().duration(400).attr("transform","translate(0,0)").each("end",function(b,c){d3.select(this).attr("class",""),a.currentlyOpenSegment=null})},getCentroid:function(a){var b=a.getBBox();return{x:b.x+b.width/2,y:b.y+b.height/2}},getSegmentAngle:function(a,b,c,d){var e,f=g({compounded:!0,midpoint:!1},d),h=b[a].value;if(f.compounded){e=0;for(var i=0;a>=i;i++)e+=b[i].value}"undefined"==typeof e&&(e=h);var j=e/c*360;if(f.midpoint){var k=h/c*360;j-=k/2}return j},getPercentage:function(a,b,c){var d=a.options.data.content[b].value/a.totalSize;return 0>=c?Math.round(100*d):(100*d).toFixed(c)}},k={offscreenCoord:-1e4,addTitle:function(a){a.svg.selectAll("."+a.cssPrefix+"title").data([a.options.header.title]).enter().append("text").text(function(a){return a.text}).attr({id:a.cssPrefix+"title","class":a.cssPrefix+"title",x:k.offscreenCoord,y:k.offscreenCoord}).attr("text-anchor",function(){var b;return b="top-center"===a.options.header.location||"pie-center"===a.options.header.location?"middle":"left"}).attr("fill",function(a){return a.color}).style("font-size",function(a){return a.fontSize+"px"}).style("font-family",function(a){return a.font})},positionTitle:function(a){var b,c=a.textComponents,d=a.options.header.location,e=a.options.misc.canvasPadding,f=a.options.size.canvasWidth,g=a.options.header.titleSubtitlePadding;b="top-left"===d?e.left:(f-e.right)/2+e.left,b+=a.options.misc.pieCenterOffset.x;var h=e.top+c.title.h;if("pie-center"===d)if(h=a.pieCenter.y,c.subtitle.exists){var i=c.title.h+g+c.subtitle.h;h=h-i/2+c.title.h}else h+=c.title.h/4;a.svg.select("#"+a.cssPrefix+"title").attr("x",b).attr("y",h)},addSubtitle:function(a){var b=a.options.header.location;a.svg.selectAll("."+a.cssPrefix+"subtitle").data([a.options.header.subtitle]).enter().append("text").text(function(a){return a.text}).attr("x",k.offscreenCoord).attr("y",k.offscreenCoord).attr("id",a.cssPrefix+"subtitle").attr("class",a.cssPrefix+"subtitle").attr("text-anchor",function(){var a;return a="top-center"===b||"pie-center"===b?"middle":"left"}).attr("fill",function(a){return a.color}).style("font-size",function(a){return a.fontSize+"px"}).style("font-family",function(a){return a.font})},positionSubtitle:function(a){var b,c=a.options.misc.canvasPadding,d=a.options.size.canvasWidth;b="top-left"===a.options.header.location?c.left:(d-c.right)/2+c.left,b+=a.options.misc.pieCenterOffset.x;var e=k.getHeaderHeight(a);a.svg.select("#"+a.cssPrefix+"subtitle").attr("x",b).attr("y",e)},addFooter:function(a){a.svg.selectAll("."+a.cssPrefix+"footer").data([a.options.footer]).enter().append("text").text(function(a){return a.text}).attr("x",k.offscreenCoord).attr("y",k.offscreenCoord).attr("id",a.cssPrefix+"footer").attr("class",a.cssPrefix+"footer").attr("text-anchor",function(){var b="left";return"bottom-center"===a.options.footer.location?b="middle":"bottom-right"===a.options.footer.location&&(b="left"),b}).attr("fill",function(a){return a.color}).style("font-size",function(a){return a.fontSize+"px"}).style("font-family",function(a){return a.font})},positionFooter:function(a){var b,c=a.options.footer.location,d=a.textComponents.footer.w,e=a.options.size.canvasWidth,f=a.options.size.canvasHeight,g=a.options.misc.canvasPadding;b="bottom-left"===c?g.left:"bottom-right"===c?e-d-g.right:e/2,a.svg.select("#"+a.cssPrefix+"footer").attr("x",b).attr("y",f-g.bottom)},getHeaderHeight:function(a){var b;if(a.textComponents.title.exists){var c=a.textComponents.title.h+a.options.header.titleSubtitlePadding+a.textComponents.subtitle.h;b="pie-center"===a.options.header.location?a.pieCenter.y-c/2+c:c+a.options.misc.canvasPadding.top}else if("pie-center"===a.options.header.location){var d=a.options.misc.canvasPadding.bottom+a.textComponents.footer.h;b=(a.options.size.canvasHeight-d)/2+a.options.misc.canvasPadding.top+a.textComponents.subtitle.h/2}else b=a.options.misc.canvasPadding.top+a.textComponents.subtitle.h;return b}},l={addTooltips:function(a){var b=a.svg.insert("g").attr("class",a.cssPrefix+"tooltips");b.selectAll("."+a.cssPrefix+"tooltip").data(a.options.data.content).enter().append("g").attr("class",a.cssPrefix+"tooltip").attr("id",function(b,c){return a.cssPrefix+"tooltip"+c}).style("opacity",0).append("rect").attr({rx:a.options.tooltips.styles.borderRadius,ry:a.options.tooltips.styles.borderRadius,x:-a.options.tooltips.styles.padding,opacity:a.options.tooltips.styles.backgroundOpacity}).style("fill",a.options.tooltips.styles.backgroundColor),b.selectAll("."+a.cssPrefix+"tooltip").data(a.options.data.content).append("text").attr("fill",function(b){return a.options.tooltips.styles.color}).style("font-size",function(b){return a.options.tooltips.styles.fontSize}).style("font-family",function(b){return a.options.tooltips.styles.font}).text(function(b,c){var d=a.options.tooltips.string;return"caption"===a.options.tooltips.type&&(d=b.caption),l.replacePlaceholders(a,d,c,{label:b.label,value:b.value,percentage:j.getPercentage(a,c,a.options.labels.percentage.decimalPlaces)})}),b.selectAll("."+a.cssPrefix+"tooltip rect").attr({width:function(b,c){var d=f.getDimensions(a.cssPrefix+"tooltip"+c);return d.w+2*a.options.tooltips.styles.padding},height:function(b,c){var d=f.getDimensions(a.cssPrefix+"tooltip"+c);return d.h+2*a.options.tooltips.styles.padding},y:function(b,c){var d=f.getDimensions(a.cssPrefix+"tooltip"+c);return-(d.h/2)+1}})},showTooltip:function(a,b){var c=a.options.tooltips.styles.fadeInSpeed;l.currentTooltip===b&&(c=1),l.currentTooltip=b,d3.select("#"+a.cssPrefix+"tooltip"+b).transition().duration(c).style("opacity",function(){return 1}),l.moveTooltip(a)},moveTooltip:function(a){d3.selectAll("#"+a.cssPrefix+"tooltip"+l.currentTooltip).attr("transform",function(b){var c=d3.mouse(this.parentNode),d=c[0]+a.options.tooltips.styles.padding+2,e=c[1]-2*a.options.tooltips.styles.padding-2;return"translate("+d+","+e+")"})},hideTooltip:function(a,b){d3.select("#"+a.cssPrefix+"tooltip"+b).style("opacity",function(){return 0}),d3.select("#"+a.cssPrefix+"tooltip"+l.currentTooltip).attr("transform",function(b,c){var d=a.options.size.canvasWidth+1e3,e=a.options.size.canvasHeight+1e3;return"translate("+d+","+e+")"})},replacePlaceholders:function(a,b,c,d){f.isFunction(a.options.tooltips.placeholderParser)&&a.options.tooltips.placeholderParser(c,d);var e=function(){return function(a){var b=arguments[1];return d.hasOwnProperty(b)?d[arguments[1]]:arguments[0]}};return b.replace(/\{(\w+)\}/g,e(d))}},m=function(i,j){if(this.element=i,"string"==typeof i){var k=i.replace(/^#/,"");this.element=document.getElementById(k)}var l={};g(!0,l,d,j),this.options=l,null!==this.options.misc.cssPrefix?this.cssPrefix=this.options.misc.cssPrefix:(this.cssPrefix="p"+c+"_",c++),e.initialCheck(this)&&(d3.select(this.element).attr(a,b),this.options.data.content=h.sortPieData(this),this.options.data.smallSegmentGrouping.enabled&&(this.options.data.content=f.applySmallSegmentGrouping(this.options.data.content,this.options.data.smallSegmentGrouping)),this.options.colors=f.initSegmentColors(this),this.totalSize=h.getTotalPieSize(this.options.data.content),n.call(this))};m.prototype.recreate=function(){e.initialCheck(this)&&(this.options.data.content=h.sortPieData(this),this.options.data.smallSegmentGrouping.enabled&&(this.options.data.content=f.applySmallSegmentGrouping(this.options.data.content,this.options.data.smallSegmentGrouping)),this.options.colors=f.initSegmentColors(this),this.totalSize=h.getTotalPieSize(this.options.data.content),n.call(this))},m.prototype.redraw=function(){this.element.innerHTML="",n.call(this)},m.prototype.destroy=function(){this.element.innerHTML="",d3.select(this.element).attr(a,null)},m.prototype.getOpenSegment=function(){var a=this.currentlyOpenSegment;if(null!==a&&"undefined"!=typeof a){var b=parseInt(d3.select(a).attr("data-index"),10);return{element:a,index:b,data:this.options.data.content[b]}}return null},m.prototype.openSegment=function(a){a=parseInt(a,10),0>a||a>this.options.data.content.length-1||j.openSegment(this,d3.select("#"+this.cssPrefix+"segment"+a).node())},m.prototype.closeSegment=function(){var a=this.currentlyOpenSegment;a&&j.closeSegment(this,a)},m.prototype.updateProp=function(a,b){switch(a){case"header.title.text":var c=f.processObj(this.options,a);f.processObj(this.options,a,b),d3.select("#"+this.cssPrefix+"title").html(b),(""===c&&""!==b||""!==c&&""===b)&&this.redraw();break;case"header.subtitle.text":var d=f.processObj(this.options,a);f.processObj(this.options,a,b),d3.select("#"+this.cssPrefix+"subtitle").html(b),(""===d&&""!==b||""!==d&&""===b)&&this.redraw();break;case"callbacks.onload":case"callbacks.onMouseoverSegment":case"callbacks.onMouseoutSegment":case"callbacks.onClickSegment":case"effects.pullOutSegmentOnClick.effect":case"effects.pullOutSegmentOnClick.speed":case"effects.pullOutSegmentOnClick.size":case"effects.highlightSegmentOnMouseover":case"effects.highlightLuminosity":f.processObj(this.options,a,b);break;default:f.processObj(this.options,a,b),this.destroy(),this.recreate()}};var n=function(){this.svg=f.addSVGSpace(this),this.textComponents={headerHeight:0,title:{exists:""!==this.options.header.title.text,h:0,w:0},subtitle:{exists:""!==this.options.header.subtitle.text,h:0,w:0},footer:{exists:""!==this.options.footer.text,h:0,w:0}},this.outerLabelGroupData=[],
+this.textComponents.title.exists&&k.addTitle(this),this.textComponents.subtitle.exists&&k.addSubtitle(this),k.addFooter(this);var a=this;f.whenIdExists(this.cssPrefix+"footer",function(){k.positionFooter(a);var b=f.getDimensions(a.cssPrefix+"footer");a.textComponents.footer.h=b.h,a.textComponents.footer.w=b.w});var b=[];this.textComponents.title.exists&&b.push(this.cssPrefix+"title"),this.textComponents.subtitle.exists&&b.push(this.cssPrefix+"subtitle"),this.textComponents.footer.exists&&b.push(this.cssPrefix+"footer"),f.whenElementsExist(b,function(){if(a.textComponents.title.exists){var b=f.getDimensions(a.cssPrefix+"title");a.textComponents.title.h=b.h,a.textComponents.title.w=b.w}if(a.textComponents.subtitle.exists){var c=f.getDimensions(a.cssPrefix+"subtitle");a.textComponents.subtitle.h=c.h,a.textComponents.subtitle.w=c.w}if(a.textComponents.title.exists||a.textComponents.subtitle.exists){var d=0;a.textComponents.title.exists&&(d+=a.textComponents.title.h,a.textComponents.subtitle.exists&&(d+=a.options.header.titleSubtitlePadding)),a.textComponents.subtitle.exists&&(d+=a.textComponents.subtitle.h),a.textComponents.headerHeight=d}h.computePieRadius(a),h.calculatePieCenter(a),k.positionTitle(a),k.positionSubtitle(a),a.options.misc.gradient.enabled&&j.addGradients(a),j.create(a),i.add(a,"inner",a.options.labels.inner.format),i.add(a,"outer",a.options.labels.outer.format),i.positionLabelElements(a,"inner",a.options.labels.inner.format),i.positionLabelElements(a,"outer",a.options.labels.outer.format),i.computeOuterLabelCoords(a),i.positionLabelGroups(a,"outer"),i.computeLabelLinePositions(a),a.options.labels.lines.enabled&&"none"!==a.options.labels.outer.format&&i.addLabelLines(a),i.positionLabelGroups(a,"inner"),i.fadeInLabelsAndLines(a),a.options.tooltips.enabled&&l.addTooltips(a),j.addSegmentEventHandlers(a)})};return m}); \ No newline at end of file
diff --git a/src/usr/local/www/diag_arp.php b/src/usr/local/www/diag_arp.php
index e5615f4..01d1ef0 100644
--- a/src/usr/local/www/diag_arp.php
+++ b/src/usr/local/www/diag_arp.php
@@ -1,35 +1,58 @@
<?php
/*
diag_arp.php
- part of the pfSense project (https://www.pfsense.org)
- Copyright (C) 2004-2009 Scott Ullrich <sullrich@gmail.com>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2005 Paul Taylor (paultaylor@winndixie.com) and Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /bin/cat /usr/sbin/arp
@@ -268,13 +291,9 @@ include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-
-<?php include("fbegin.inc"); ?>
-
+<!-- On modern hardware the table will load so fast you may never see this! -->
<div id="loading">
- <img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /><?= gettext("Loading, please wait..."); ?>
- <p>&nbsp;</p>
+ <?= gettext(" Loading, please wait...")?>
</div>
<?php
@@ -316,50 +335,48 @@ $data = msort($data, "dnsresolve");
// Load MAC-Manufacturer table
$mac_man = load_mac_manufacturer_table();
?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag arp">
- <tr>
- <td>
- <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="tabcont">
- <tr>
- <td class="listhdrr"><?= gettext("IP address"); ?></td>
- <td class="listhdrr"><?= gettext("MAC address"); ?></td>
- <td class="listhdrr"><?= gettext("Hostname"); ?></td>
- <td class="listhdr"><?= gettext("Interface"); ?></td>
- <td class="list"></td>
- </tr>
- <?php foreach ($data as $entry): ?>
- <tr>
- <td class="listlr"><?=$entry['ip'];?></td>
- <td class="listr">
- <?php
- $mac=trim($entry['mac']);
- $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
- print $mac;
- if (isset($mac_man[$mac_hi])) { print "<br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>"; }
- ?>
- </td>
- <td class="listr">
- <?php
- echo trim(str_replace("Z_ ", "", $entry['dnsresolve']));
- ?>
- </td>
- <td class="listr"><?=$hwif[$entry['interface']];?></td>
- </tr>
- <?php endforeach; ?>
- </table>
- </td>
- </tr>
- <tr>
- <td><br /><?= gettext("NOTE: Local IPv6 peers use") ?> <a href="diag_ndp.php"><?= gettext("NDP") ?></a> <?= gettext("instead of ARP") ?>.</td>
- </tr>
-</table>
-
-<?php include("fend.inc"); ?>
-
-<script type="text/javascript">
+<div class="table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><?= gettext("Interface")?></th>
+ <th><?= gettext("IP address")?></th>
+ <th><?= gettext("MAC address")?></th>
+ <th><?= gettext("Hostname")?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($data as $entry): ?>
+ <tr>
+ <td><?=$hwif[$entry['interface']]?></td>
+ <td><?=$entry['ip']?></td>
+ <td>
+ <?=trim($entry['mac'])?>
+ <?php
+ $mac = trim($entry['mac']);
+ $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
+
+ if (isset($mac_man[$mac_hi]))
+ print '<small>('. $mac_man[$mac_hi] .')</small>';
+ ?>
+ </td>
+ <td><?=trim(str_replace("Z_ ", "", $entry['dnsresolve']))?></td>
+ </tr>
+ <?php endforeach?>
+ </tbody>
+ </table>
+</div>
+
+<script>
//<![CDATA[
- jQuery('#loading').html('');
-//]]>
+// Clear the "loading" div once the page has loaded"
+events.push(function(){
+ $('#loading').empty();
+});
+//]]>
</script>
-</body>
-</html>
+
+<?php
+print_info_box(gettext("Local IPv6 peers use ") . '<a href="diag_ndp.php">' . gettext("NDP") . '</a>' . gettext(" instead of ARP"), 'info');
+
+include("foot.inc")?>
diff --git a/src/usr/local/www/diag_authentication.php b/src/usr/local/www/diag_authentication.php
index d0b81d5..503f5a3 100644
--- a/src/usr/local/www/diag_authentication.php
+++ b/src/usr/local/www/diag_authentication.php
@@ -1,35 +1,61 @@
<?php
/*
diag_authentication.php
- part of the pfSense project (https://www.pfsense.org)
- Copyright (C) 2010 Ermal Luçi
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2010 Ermal Luçi
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: auth
+ pfSense_MODULE: auth
*/
##|+PRIV
@@ -52,19 +78,21 @@ if ($_POST) {
$input_errors[] = $_POST['authmode'] . " " . gettext("is not a valid authentication server");
}
- if (empty($_POST['username']) || empty($_POST['passwordfld'])) {
+ if (empty($_POST['username']) || empty($_POST['password'])) {
$input_errors[] = gettext("A username and password must be specified.");
}
if (!$input_errors) {
$attributes = array();
- if (authenticate_user($_POST['username'], $_POST['passwordfld'], $authcfg, $attributes)) {
+ if (authenticate_user($_POST['username'], $_POST['password'], $authcfg, $attributes)) {
$savemsg = gettext("User") . ": " . $_POST['username'] . " " . gettext("authenticated successfully.");
$groups = getUserGroups($_POST['username'], $authcfg, $attributes);
- $savemsg .= "<br />" . gettext("This user is a member of these groups") . ": <br />";
- foreach ($groups as $group) {
- $savemsg .= "{$group} ";
- }
+ $savemsg .= "&nbsp;" . gettext("This user is a member of groups") . ": <br />";
+ $savemsg .= "<ul>";
+ foreach ($groups as $group)
+ $savemsg .= "<li>" . "{$group} " . "</li>";
+ $savemsg .= "</ul>";
+
} else {
$input_errors[] = gettext("Authentication failed.");
}
@@ -75,64 +103,46 @@ $shortcut_section = "authentication";
include("head.inc");
?>
+<?php
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print('<div class="alert alert-success" role="alert">'. $savemsg.'</div>');
+
+require('classes/Form.class.php');
+
+$form = new Form('Test');
+
+$section = new Form_Section('Authentication Test');
+
+foreach (auth_get_authserver_list() as $auth_server)
+ $serverlist[$auth_server['name']] = $auth_server['name'];
+
+$section->addInput(new Form_Select(
+ 'authmode',
+ 'Authentication Server',
+ $pconfig['authmode'],
+ $serverlist
+))->setHelp('Select the authentication server to test against');
+
+$section->addInput(new Form_Input(
+ 'username',
+ 'Username',
+ 'text',
+ $pconfig['username'],
+ ['placeholder' => 'Username']
+));
+
+$section->addInput(new Form_Input(
+ 'password',
+ 'Password',
+ 'password',
+ $pconfig['password'],
+ ['placeholder' => 'Password']
+));
+
+$form->add($section);
+print $form;
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors);?>
-<?php if ($savemsg) print_info_box($savemsg);?>
-
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag authentication">
- <tr>
- <td class="tabnavtbl"></td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <form id="iform" name="iform" action="diag_authentication.php" method="post">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="6" summary="test">
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Authentication Server"); ?></td>
- <td width="78%" class="vtable">
- <select name="authmode" id="authmode" class="formselect" >
- <?php
- $auth_servers = auth_get_authserver_list();
- foreach ($auth_servers as $auth_server):
- $selected = "";
- if ($auth_server['name'] == $pconfig['authmode']) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$auth_server['name'];?>" <?=$selected;?>><?=$auth_server['name'];?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Username"); ?></td>
- <td width="78%" class="vtable">
- <input class="formfld unknown" size="20" id="username" name="username" value="<?=htmlspecialchars($pconfig['username']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Password"); ?></td>
- <td width="78%" class="vtable">
- <input class="formfld pwd" type="password" size="20" id="passwordfld" name="passwordfld" value="<?=htmlspecialchars($pconfig['passwordfld']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="save" name="save" type="submit" class="formbtn" value="<?=gettext("Test");?>" />
- </td>
- </tr>
- </table>
- </form>
- </div>
- </td>
- </tr>
-</table>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc");
diff --git a/src/usr/local/www/diag_backup.php b/src/usr/local/www/diag_backup.php
index 6e454a4..39bcc70 100644
--- a/src/usr/local/www/diag_backup.php
+++ b/src/usr/local/www/diag_backup.php
@@ -2,39 +2,62 @@
/* $Id$ */
/*
diag_backup.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/shutdown
- pfSense_MODULE: backup
+ pfSense_MODULE: backup
*/
##|+PRIV
@@ -178,70 +201,6 @@ function check_and_returnif_section_exists($section) {
return false;
}
-function spit_out_select_items($name, $showall) {
- global $config;
-
- $areas = array("aliases" => gettext("Aliases"),
- "captiveportal" => gettext("Captive Portal"),
- "voucher" => gettext("Captive Portal Vouchers"),
- "dnsmasq" => gettext("DNS Forwarder"),
- "unbound" => gettext("DNS Resolver"),
- "dhcpd" => gettext("DHCP Server"),
- "dhcpdv6" => gettext("DHCPv6 Server"),
- "filter" => gettext("Firewall Rules"),
- "interfaces" => gettext("Interfaces"),
- "ipsec" => gettext("IPSEC"),
- "nat" => gettext("NAT"),
- "openvpn" => gettext("OpenVPN"),
- "installedpackages" => gettext("Package Manager"),
- "pptpd" => gettext("PPTP Server"),
- "rrddata" => gettext("RRD Data"),
- "cron" => gettext("Scheduled Tasks"),
- "syslog" => gettext("Syslog"),
- "system" => gettext("System"),
- "staticroutes" => gettext("Static routes"),
- "sysctl" => gettext("System tunables"),
- "snmpd" => gettext("SNMP Server"),
- "shaper" => gettext("Traffic Shaper"),
- "vlans" => gettext("VLANS"),
- "wol" => gettext("Wake on LAN")
- );
-
- $select = "<select name=\"{$name}\" id=\"{$name}\">";
- $select .= "<option value=\"\">" . gettext("ALL") . "</option>";
-
- if ($showall == true) {
- foreach ($areas as $area => $areaname) {
- $select .= "<option value=\"{$area}\">{$areaname}</option>\n";
- }
- } else {
- foreach ($areas as $area => $areaname) {
- if ($area === "rrddata" || check_and_returnif_section_exists($area) == true) {
- $select .= "<option value=\"{$area}\">{$areaname}</option>\n";
- }
- }
- }
-
- $select .= "</select>\n";
-
- if ($name === "backuparea") {
- $select .= <<<END_SCRIPT_BLOCK
- <script type="text/javascript">
- //<![CDATA[
- jQuery(function (\$) {
- $("#{$name}").change(function () {
- backuparea_change(this);
- }).trigger("change");
- });
- //]]>
- </script>
-END_SCRIPT_BLOCK;
- }
-
- echo $select;
-
-}
-
if ($_POST['apply']) {
ob_flush();
flush();
@@ -319,7 +278,7 @@ if ($_POST) {
//unlock($lockbckp);
/*
- * Backup RRD Data
+ * Backup RRD Data
*/
if ($_POST['backuparea'] !== "rrddata" && !$_POST['donotbackuprrd']) {
$rrd_data_xml = rrd_data_xml();
@@ -603,216 +562,219 @@ $id = rand() . '.' . time();
$mth = ini_get('upload_progress_meter.store_method');
$dir = ini_get('upload_progress_meter.file.filename_template');
-$pgtitle = array(gettext("Diagnostics"), gettext("Backup/restore"));
-include("head.inc");
+function build_area_list($showall) {
+ global $config;
-?>
+ $areas = array(
+ "aliases" => gettext("Aliases"),
+ "captiveportal" => gettext("Captive Portal"),
+ "voucher" => gettext("Captive Portal Vouchers"),
+ "dnsmasq" => gettext("DNS Forwarder"),
+ "unbound" => gettext("DNS Resolver"),
+ "dhcpd" => gettext("DHCP Server"),
+ "dhcpdv6" => gettext("DHCPv6 Server"),
+ "filter" => gettext("Firewall Rules"),
+ "interfaces" => gettext("Interfaces"),
+ "ipsec" => gettext("IPSEC"),
+ "nat" => gettext("NAT"),
+ "openvpn" => gettext("OpenVPN"),
+ "installedpackages" => gettext("Package Manager"),
+ "pptpd" => gettext("PPTP Server"),
+ "rrddata" => gettext("RRD Data"),
+ "cron" => gettext("Scheduled Tasks"),
+ "syslog" => gettext("Syslog"),
+ "system" => gettext("System"),
+ "staticroutes" => gettext("Static routes"),
+ "sysctl" => gettext("System tunables"),
+ "snmpd" => gettext("SNMP Server"),
+ "shaper" => gettext("Traffic Shaper"),
+ "vlans" => gettext("VLANS"),
+ "wol" => gettext("Wake on LAN")
+ );
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
+ $list = array("" => gettext("All"));
-function encrypt_change() {
+ if($showall)
+ return($list + $areas);
+ else {
+ foreach ($areas as $area => $areaname) {
+ if ($area === "rrddata" || check_and_returnif_section_exists($area) == true) {
+ $list[$area] = $areaname;
+ }
+ }
- if (!document.iform.encrypt.checked) {
- document.getElementById("encrypt_opts").style.display="none";
- } else {
- document.getElementById("encrypt_opts").style.display="";
+ return($list);
}
}
-function decrypt_change() {
+$pgtitle = array(gettext("Diagnostics"), gettext("Backup/restore"));
+include("head.inc");
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
- if (!document.iform.decrypt.checked) {
- document.getElementById("decrypt_opts").style.display="none";
- } else {
- document.getElementById("decrypt_opts").style.display="";
+if (is_subsystem_dirty('restore')):
+?>
+ <br/>
+ <form action="reboot.php" method="post">
+ <input name="Submit" type="hidden" value="Yes" />
+ <?=print_info_box(gettext("The firewall configuration has been changed.") . "<br />" . gettext("The firewall is now rebooting."))?>
+ <br />
+ </form>
+<?php
+endif;
+
+$tab_array = array();
+$tab_array[] = array(gettext("Config History"), false, "diag_confbak.php");
+$tab_array[] = array(gettext("Backup/Restore"), true, "diag_backup.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form(false);
+
+$section = new Form_Section('Backup configuration');
+
+$section->addInput(new Form_Select(
+ 'backuparea',
+ 'Backup area',
+ '',
+ build_area_list(false)
+));
+
+$section->addInput(new Form_Checkbox(
+ 'nopackages',
+ 'Skip packages',
+ 'Do not backup package information.',
+ false
+));
+
+$section->addInput(new Form_Checkbox(
+ 'donotbackuprrd',
+ 'Skip RRD data',
+ 'Do not backup RRD data (NOTE: RRD Data can consume 4+ megabytes of config.xml space!)',
+ true
+));
+
+$section->addInput(new Form_Checkbox(
+ 'encrypt',
+ 'Encryption',
+ 'Encrypt this configuration file.',
+ false
+))->toggles('.toggle-passwords');;
+
+$section->addInput(new Form_Input(
+ 'encrypt_password',
+ null,
+ 'password',
+ null,
+ ['placeholder' => 'Password']
+))->addClass('toggle-passwords');
+
+$section->addInput(new Form_Input(
+ 'encrypt_passconf',
+ null,
+ 'password',
+ null,
+ ['placeholder' => 'Confirm password']
+))->addClass('toggle-passwords');
+
+$group = new Form_Group('');
+$group->add(new Form_Button(
+ 'Submit',
+ 'Download configuration as XML'
+));
+
+$section->add($group);
+$form->add($section);
+
+$section = new Form_Section('Restore backup');
+
+$section->addInput(new Form_StaticText(
+ null,
+ gettext("Open a ") . $g['[product_name'] . gettext(" configuration XML file and click the button below to restore the configuration.")
+));
+
+$section->addInput(new Form_Select(
+ 'restorearea',
+ 'Restore area',
+ '',
+ build_area_list(false)
+));
+
+$section->addInput(new Form_Input(
+ 'conffile',
+ 'Configuration file',
+ 'file',
+ null
+));
+
+$section->addInput(new Form_Checkbox(
+ 'encrypt',
+ 'Encryption',
+ 'Encrypt this configuration file.',
+ false
+))->toggles('.toggle-dpasswords');;
+
+$section->addInput(new Form_Input(
+ 'decrypt_password',
+ null,
+ 'password',
+ null,
+ ['placeholder' => 'Password']
+))->addClass('toggle-dpasswords');
+
+$section->addInput(new Form_Input(
+ 'decrypt_passconf',
+ null,
+ 'password',
+ null,
+ ['placeholder' => 'Confirm password']
+))->addClass('toggle-dpasswords');
+
+$group = new Form_Group('');
+$group->add(new Form_Button(
+ 'Submit',
+ 'Restore configuration'
+))->setHelp('The firewall will reboot after restoring the configuration.')->removeClass('btn-primary')->addClass('btn-danger');
+
+$section->add($group);
+
+$form->add($section);
+
+if (($config['installedpackages']['package'] != "") || (is_subsystem_dirty("packagelock"))) {
+ $section = new Form_Section('Package functions');
+
+ if ($config['installedpackages']['package'] != "") {
+ $group = new Form_Group('');
+ $group->add(new Form_Button(
+ 'Submit',
+ 'Reinstall packages'
+ ))->setHelp('Click this button to reinstall all system packages. This may take a while.')->removeClass('btn-primary')->addClass('btn-warning');
+
+ $section->add($group);
}
-}
-function backuparea_change(obj) {
- if (obj.value == "rrddata") {
- document.getElementById("nopackages").disabled = true;
- document.getElementById("dotnotbackuprrd").disabled = true;
- } else {
- document.getElementById("nopackages").disabled = false;
- document.getElementById("dotnotbackuprrd").disabled = false;
+ if (is_subsystem_dirty("packagelock")) {
+ $group = new Form_Group('');
+ $group->add(new Form_Button(
+ 'Submit',
+ 'Clear Package Lock'
+ ))->setHelp('Click this button to clear the package lock if a package fails to reinstall properly after an upgrade.')->removeClass('btn-primary')->addClass('btn-warning');
+
+ $section->add($group);
}
+
+ $form->add($section);
}
-//]]>
-</script>
-
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('restore')): ?><br/>
-<form action="reboot.php" method="post">
-<input name="Submit" type="hidden" value="Yes" />
-<?php print_info_box(gettext("The firewall configuration has been changed.") . "<br />" . gettext("The firewall is now rebooting."));?><br />
-</form>
-<?php endif; ?>
-<form action="diag_backup.php" method="post" name="iform" enctype="multipart/form-data">
-<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="diag backup">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Config History"), false, "diag_confbak.php");
- $tab_array[1] = array(gettext("Backup/Restore"), true, "diag_backup.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic"><?=gettext("Backup configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="baseline" class="vncell">&nbsp;</td>
- <td width="78%" class="vtable">
- <p><?=gettext("Click this button to download the system configuration in XML format."); ?><br /><br /> <?=gettext("Backup area:"); ?> <?php spit_out_select_items("backuparea", false); ?></p>
- <table>
- <tr>
- <td>
- <input name="nopackages" type="checkbox" class="formcheckbox" id="nopackages" />
- </td>
- <td>
- <span class="vexpl"><?=gettext("Do not backup package information."); ?></span>
- </td>
- </tr>
- </table>
- <table>
- <tr>
- <td>
- <input name="encrypt" type="checkbox" class="formcheckbox" id="nopackages" onclick="encrypt_change()" />
- </td>
- <td>
- <span class="vexpl"><?=gettext("Encrypt this configuration file."); ?></span>
- </td>
- </tr>
- <tr>
- <td>
- <input name="donotbackuprrd" type="checkbox" class="formcheckbox" id="dotnotbackuprrd" checked="checked" />
- </td>
- <td>
- <span class="vexpl"><?=gettext("Do not backup RRD data (NOTE: RRD Data can consume 4+ megabytes of config.xml space!)"); ?></span>
- </td>
- </tr>
- </table>
- <table id="encrypt_opts">
- <tr>
- <td>
- <span class="vexpl"><?=gettext("Password:"); ?> </span>
- </td>
- <td>
- <input name="encrypt_password" type="password" class="formfld pwd" size="20" value="" />
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl"><?=gettext("confirm:"); ?> </span>
- </td>
- <td>
- <input name="encrypt_passconf" type="password" class="formfld pwd" size="20" value="" />
- </td>
- </tr>
- </table>
- <p><input name="Submit" type="submit" class="formbtn" id="download" value="<?=gettext("Download configuration"); ?>" /></p>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" class="listtopic"><?=gettext("Restore configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="baseline" class="vncell">&nbsp;</td>
- <td width="78%" class="vtable">
- <?=gettext("Open a"); ?> <?=$g['[product_name']?> <?=gettext("configuration XML file and click the button below to restore the configuration."); ?>
- <br /><br />
- <?=gettext("Restore area:"); ?> <?php spit_out_select_items("restorearea", true); ?>
- <p><input name="conffile" type="file" class="formbtn" id="conffile" size="40" /></p>
- <table>
- <tr>
- <td>
- <input name="decrypt" type="checkbox" class="formcheckbox" id="nopackages" onclick="decrypt_change()" />
- </td>
- <td>
- <span class="vexpl"><?=gettext("Configuration file is encrypted."); ?></span>
- </td>
- </tr>
- </table>
- <table id="decrypt_opts">
- <tr>
- <td>
- <span class="vexpl"><?=gettext("Password :"); ?></span>
- </td>
- <td>
- <input name="decrypt_password" type="password" class="formfld pwd" size="20" value="" />
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl"><?=gettext("confirm :"); ?></span>
- </td>
- <td>
- <input name="decrypt_passconf" type="password" class="formfld pwd" size="20" value="" />
- </td>
- </tr>
- </table>
- <p><input name="Submit" type="submit" class="formbtn" id="restore" value="<?=gettext("Restore configuration"); ?>" /></p>
- <p><strong><span class="red"><?=gettext("Note:"); ?></span></strong><br /><?=gettext("The firewall will reboot after restoring the configuration."); ?><br /></p>
- </td>
- </tr>
- <?php if (($config['installedpackages']['package'] != "") || (is_subsystem_dirty("packagelock"))) { ?>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" class="listtopic"><?=gettext("Package Functions"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="baseline" class="vncell">&nbsp;</td>
- <td width="78%" class="vtable">
- <?php if ($config['installedpackages']['package'] != "") { ?>
- <p><?=gettext("Click this button to reinstall all system packages. This may take a while."); ?> <br /><br />
- <input name="Submit" type="submit" class="formbtn" id="reinstallpackages" value="<?=gettext("Reinstall packages"); ?>" />
- <br />
- <br />
- <?php } ?>
- <?php if (is_subsystem_dirty("packagelock")) { ?>
- <p><?=gettext("Click this button to clear the package lock if a package fails to reinstall properly after an upgrade."); ?> <br /><br />
- <input name="Submit" type="submit" class="formbtn" id="clearpackagelock" value="<?=gettext("Clear Package Lock"); ?>" />
- <?php } ?>
- </p>
- </td>
- </tr>
- <?php } ?>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-
-<script type="text/javascript">
-//<![CDATA[
-encrypt_change();
-decrypt_change();
-//]]>
-</script>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
-<?php
+
+print($form);
+
+include("foot.inc");
if (is_subsystem_dirty('restore')) {
system_reboot();
-}
-
-?>
+} \ No newline at end of file
diff --git a/src/usr/local/www/diag_confbak.php b/src/usr/local/www/diag_confbak.php
index cc1da99..bc9cc51 100644
--- a/src/usr/local/www/diag_confbak.php
+++ b/src/usr/local/www/diag_confbak.php
@@ -112,21 +112,12 @@ unset($confvers['versions']);
$pgtitle = array(gettext("Diagnostics"), gettext("Configuration History"));
include("head.inc");
+if($savemsg)
+ print_info_box($savemsg);
?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
- <?php
- include("fbegin.inc");
- if ($savemsg) {
- print_info_box($savemsg);
- }
- ?>
- <?php if ($diff) { ?>
- <table align="center" width="100%" border="0" cellspacing="0" style="padding-top: 4px; padding-bottom: 4px; vertical-align:middle;" summary="diag confbak">
- <tr>
- <td><?=gettext("Configuration diff from");?> <?php echo date(gettext("n/j/y H:i:s"), $oldtime); ?> <?=gettext("to");?> <?php echo date(gettext("n/j/y H:i:s"), $newtime); ?></td>
- </tr>
- <?php foreach ($diff as $line) {
+ <?php if ($diff):?>
+ <h3><?=gettext("Configuration diff from")?><?=date(gettext("n/j/y H:i:s"), $oldtime)?><?=gettext("to")?><?=date(gettext("n/j/y H:i:s"), $newtime)?></h3>
+ <pre><?php foreach ($diff as $line) {
switch (substr($line, 0, 1)) {
case "+":
$color = "#caffd3";
@@ -140,25 +131,93 @@ include("head.inc");
default:
$color = "#ffffff";
}
- ?>
+
+ print '<span style="background-color: '.$color .'">'. htmlentities($line) .'</span><br/>';
+ }
+ ?></pre>
+<?php endif?>
+<?PHP if ($_GET["newver"] || $_GET["rmver"]):?>
+ <h2><?=gettext("Confirm Action")?></h2>
+ <form action="diag_confbak.php" method="post">
+ <div class="alert alert-danger">
+ <p><?=gettext("Please confirm you wish to ")?>
+ <?PHP
+ if (!empty($_GET["newver"])) {
+ echo gettext("restore from Configuration Backup");
+ $target_config = $_GET["newver"]?>
+ <input type="hidden" name="newver" value="<?PHP echo htmlspecialchars($_GET["newver"])?>" />
+ <?PHP
+ } elseif (!empty($_GET["rmver"])) {
+ echo gettext("remove Configuration Backup");
+ $target_config = $_GET["rmver"]?>
+ <input type="hidden" name="rmver" value="<?PHP echo htmlspecialchars($_GET["rmver"])?>" />
+ <?PHP
+ } ?>
+ <?PHP echo gettext("revert to configuration from ")?> <?=date(gettext("n/j/y H:i:s"), $target_config)?>
+ <br />
+ <input type="submit" name="confirm" value="<?PHP echo gettext("Confirm")?>" />
+ </p>
+ </div>
+ </form>
+<?PHP else:?>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Config History"), true, "diag_confbak.php");
+ $tab_array[1] = array(gettext("Backup/Restore"), false, "diag_backup.php");
+ display_top_tabs($tab_array);
+?>
+ <form action="diag_confbak.php" method="post">
+ <div class="form-group">
+ <label for="backupcount" class="col-sm-2 control-label"><?=gettext("Backup Count")?></label>
+ <div class="col-sm-10">
+ <input name="backupcount" type="number" class="form-control" size="5" value="<?=htmlspecialchars($config['system']['backupcount'])?>" />
+ <?=gettext("Maximum number of old configurations to keep. By default this is 30 for a full install or 5 on NanoBSD.")?>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <div class="col-sm-offset-2 col-sm-10">
+ <input name="Submit" type="submit" class="btn btn-primary" value="<?=gettext("Save")?>" />
+ <p><?=gettext("Current space used by backups: ")?><?=exec("/usr/bin/du -sh /conf/backup | /usr/bin/awk '{print $1;}'")?></p>
+ </div>
+ </div>
+ </form>
+<?php if (!is_array($confvers)): ?>
+ <?php print_info_box(gettext("No backups found."))?>
+<?php else: ?>
+ <form action="diag_confbak.php" method="get">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
<tr>
- <td valign="middle" bgcolor="<?php echo $color; ?>" style="white-space: pre-wrap;"><?php echo htmlentities($line);?></td>
+ <th><input type="submit" name="diff" class="btn btn-default" value="<?=gettext("Diff")?>" /></th>
+ <th><?=gettext("Date")?></th>
+ <th><?=gettext("Version")?></th>
+ <th><?=gettext("Size")?></th>
+ <th><?=gettext("Configuration Change")?></th>
+ <th></th>
</tr>
- <?php } ?>
- </table>
- <br />
- <?php } ?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="stats">
+ </thead>
+
+ <tbody>
<tr>
<td>
- <?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Config History"), true, "diag_confbak.php");
- $tab_array[1] = array(gettext("Backup/Restore"), false, "diag_backup.php");
- display_top_tabs($tab_array);
- ?>
+ <input type="radio" name="oldtime" disabled="disabled" />
+ <input type="radio" name="newtime" value="current" <?=($_GET['newtime']==$version['time'] ? ' checked="checked"' : '')?>/>
</td>
+ <td><?=date(gettext("n/j/y H:i:s"), $config['revision']['time'])?></td>
+ <td><?=$config['version']?></td>
+ <td><?=format_bytes(filesize("/conf/config.xml"))?></td>
+ <td><?=$config['revision']['description']?></td>
+ <td><i><?=gettext("Current")?></i></td>
</tr>
+ <?php
+ foreach($confvers as $version):
+ if($version['time'] != 0)
+ $date = date(gettext("n/j/y H:i:s"), $version['time']);
+ else
+ $date = gettext("Unknown");
+ ?>
<tr>
<td>
<div id="mainarea">
@@ -294,8 +353,15 @@ include("head.inc");
</div>
</td>
</tr>
+ <?php endforeach?>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td colspan="6"><input type="submit" name="diff" class="btn btn-default" value="<?=gettext("Compare selected")?>" /></td>
+ </tr>
+ <?php endif; ?>
+<?php endif?>
</table>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </div>
+ </form>
+<?php include("foot.inc")?> \ No newline at end of file
diff --git a/src/usr/local/www/diag_defaults.php b/src/usr/local/www/diag_defaults.php
index 7c17511..79786ad 100755
--- a/src/usr/local/www/diag_defaults.php
+++ b/src/usr/local/www/diag_defaults.php
@@ -2,35 +2,58 @@
/* $Id$ */
/*
diag_defaults.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: config
@@ -52,39 +75,33 @@ if ($_POST['Submit'] == " " . gettext("No") . " ") {
$pgtitle = array(gettext("Diagnostics"), gettext("Factory defaults"));
include("head.inc");
-
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-
<?php if ($_POST['Submit'] == " " . gettext("Yes") . " "):
- print_info_box(gettext("The system has been reset to factory defaults and is now rebooting. This may take a few minutes, depending on your hardware.")); ?>
+ print_info_box(gettext("The system has been reset to factory defaults and is now rebooting. This may take a few minutes, depending on your hardware."))?>
<pre>
<?php
reset_factory_defaults();
system_reboot();
?>
</pre>
-<?php else: ?>
+<?php else:?>
<form action="diag_defaults.php" method="post">
- <p><strong> <?=gettext("If you click") . " &quot;" . gettext("Yes") . "&quot;, " . gettext("the firewall will:")?></strong></p>
+ <p><strong><?=gettext("If you click") . " &quot;" . gettext("Yes") . "&quot;, " . gettext("the firewall will:")?></strong></p>
<ul>
- <li><?=gettext("Reset to factory defaults");?></li>
- <li><?=gettext("LAN IP address will be reset to 192.168.1.1");?></li>
- <li><?=gettext("System will be configured as a DHCP server on the default LAN interface");?></li>
- <li><?=gettext("Reboot after changes are installed");?></li>
- <li><?=gettext("WAN interface will be set to obtain an address automatically from a DHCP server");?></li>
- <li><?=gettext("webConfigurator admin username will be reset to 'admin'");?></li>
- <li><?=gettext("webConfigurator admin password will be reset to");?> '<?=$g['factory_shipped_password']?>'</li>
+ <li><?=gettext("Reset to factory defaults")?></li>
+ <li><?=gettext("LAN IP address will be reset to 192.168.1.1")?></li>
+ <li><?=gettext("System will be configured as a DHCP server on the default LAN interface")?></li>
+ <li><?=gettext("Reboot after changes are installed")?></li>
+ <li><?=gettext("WAN interface will be set to obtain an address automatically from a DHCP server")?></li>
+ <li><?=gettext("webConfigurator admin username will be reset to 'admin'")?></li>
+ <li><?=gettext("webConfigurator admin password will be reset to")?> '<?=$g['factory_shipped_password']?>'</li>
</ul>
- <p><strong><?=gettext("Are you sure you want to proceed?");?></strong></p>
+ <p><strong><?=gettext("Are you sure you want to proceed?")?></strong></p>
<p>
- <input name="Submit" type="submit" class="formbtn" value=" <?=gettext("Yes");?> " />
- <input name="Submit" type="submit" class="formbtn" value=" <?=gettext("No");?> " />
+ <input name="Submit" type="submit" class="btn btn-sm btn-success" value=" <?=gettext("Yes")?> " />
+ <input name="Submit" type="submit" class="btn btn-sm btn-default" value=" <?=gettext("No")?> " />
</p>
</form>
-<?php endif; ?>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php endif?>
+<?php include("foot.inc")?> \ No newline at end of file
diff --git a/src/usr/local/www/diag_dns.php b/src/usr/local/www/diag_dns.php
index 4c57223..a1267e2 100644..100755
--- a/src/usr/local/www/diag_dns.php
+++ b/src/usr/local/www/diag_dns.php
@@ -1,35 +1,60 @@
<?php
/*
diag_dns.php
-
- Copyright (C) 2009 Jim Pingle (jpingle@gmail.com)
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
-
+ /* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2009 Jim Pingle (jpingle@gmail.com)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: dns
+ pfSense_MODULE: dns
*/
$pgtitle = array(gettext("Diagnostics"), gettext("DNS Lookup"));
@@ -66,11 +91,10 @@ if (isset($_POST['create_alias']) && (is_hostname($host) || is_ipaddr($host))) {
$resolved = array();
exec("/usr/bin/drill {$host_esc} A | /usr/bin/grep {$host_esc} | /usr/bin/grep -v ';' | /usr/bin/awk '{ print $5 }'", $resolved);
$isfirst = true;
- foreach ($resolved as $re) {
- if ($re <> "") {
- if (!$isfirst) {
+ foreach($resolved as $re) {
+ if($re != "") {
+ if(!$isfirst)
$addresses .= " ";
- }
$addresses .= rtrim($re) . "/32";
$isfirst = false;
}
@@ -178,143 +202,100 @@ function display_host_results ($address, $hostname, $dns_speeds) {
}
}
-include("head.inc"); ?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag dns">
- <tr>
- <td>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
- <form action="diag_dns.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
- <tr>
- <td colspan="2" valign="top" class="listtopic"> <?=gettext("Resolve DNS hostname or IP");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname or IP");?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?>
- <table summary="results">
- <tr>
- <td valign="top">
- <input name="host" type="text" class="formfld unknown" id="host" size="20" value="<?=htmlspecialchars($host);?>" />
- </td>
-<?php
- if ($resolved && $type) {
-?>
- <td valign="middle">&nbsp;=&nbsp;</td>
- <td>
- <font size="+1">
-<?php
- $found = 0;
- if (is_array($resolved)) {
- foreach ($resolved as $hostitem) {
- if ($hostitem <> "") {
- echo $hostitem . "<br />";
- $found++;
- }
- }
- } else {
- echo $resolved;
- }
- if ($found > 0) {
-?>
- <br/>
- </font>
- <font size='-2'>
-<?php
- if ($alias_exists) {
-?>
- An alias already exists for the hostname <?= htmlspecialchars($host) ?>. <br />
- <input type="hidden" name="override" value="true"/>
- <input type="submit" name="create_alias" value="Overwrite Alias"/>
-<?php
- } else {
- if (!$createdalias) {
+include("head.inc");
+
+/* Display any error messages resulting from user input */
+if ($input_errors)
+ print_input_errors($input_errors);
+else if (!$resolved && $type)
+ print('<div class="alert alert-warning" role="alert">' . gettext("Host") .' "'. $host .'" '. gettext("could not be resolved") . '</div>');
+
+if ($createdalias)
+ print('<div class="alert alert-success" role="alert">'.gettext("Alias was created/updated successfully").'</div>');
+
+require('classes/Form.class.php');
+
+$form = new Form('Lookup');
+$section = new Form_Section('DNS Lookup');
+
+$section->addInput(new Form_Input(
+ 'host',
+ 'Hostname',
+ 'text',
+ $host,
+ ['placeholder' => 'Hostname to look up.']
+));
+
+if (!empty($resolved)) {
+ $form->addGlobal(new Form_Button(
+ 'create_alias',
+ 'Add alias'
+ ))->removeClass('btn-primary')->addClass('btn-success');
+}
+
+$form->add($section);
+print $form;
+
+if (!$input_errors && $type) {
+ if ($resolved):
?>
- <input type="submit" name="create_alias" value="Create Alias from These Entries"/>
-<?php
- } else {
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Results</h2></div>
+ <div class="panel-body">
+ <ul class="list-group">
+<?
+ foreach ((array)$resolved as $hostitem) {
?>
- Alias created with name <?= htmlspecialchars($newalias['name']) ?>
-<?php
- }
+ <li class="list-group-item"><?=$hostitem?></li>
+<?
+ if ($hostitem != "") {
+ $found++;
}
}
- }
-?>
- </font>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-<?php
- if ($_POST):
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Resolution time per server");?></td>
- <td width="78%" class="vtable">
- <table width="170" border="0" cellpadding="6" cellspacing="0" summary="resolution time">
- <tr>
- <td class="listhdrr">
- <?=gettext("Server");?>
- </td>
- <td class="listhdrr">
- <?=gettext("Query time");?>
- </td>
- </tr>
-<?php
- if (is_array($dns_speeds)) {
- foreach ($dns_speeds as $qt):
?>
- <tr>
- <td class="listlr">
- <?=$qt['dns_server']?>
- </td>
- <td class="listr">
- <?=$qt['query_time']?>
- </td>
- </tr>
-<?php
- endforeach;
- }
-?>
- </table>
- </td>
- </tr>
-<?php
- endif;
+ </ul>
+ </div>
+</div>
+<? endif?>
- if (!$input_errors && $ipaddr) {
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("More Information:");?></td>
- <td width="78%" class="vtable">
- <a href ="/diag_ping.php?host=<?=htmlspecialchars($host)?>&amp;interface=wan&amp;count=3"><?=gettext("Ping");?></a> <br />
- <a href ="/diag_traceroute.php?host=<?=htmlspecialchars($host)?>&amp;ttl=18"><?=gettext("Traceroute");?></a>
- <p>
- <?=gettext("NOTE: The following links are to external services, so their reliability cannot be guaranteed.");?><br /><br />
- <a target="_blank" href="http://private.dnsstuff.com/tools/whois.ch?ip=<?php echo $ipaddr; ?>"><?=gettext("IP WHOIS @ DNS Stuff");?></a><br />
- <a target="_blank" href="http://private.dnsstuff.com/tools/ipall.ch?ip=<?php echo $ipaddr; ?>"><?=gettext("IP Info @ DNS Stuff");?></a>
- </p>
- </td>
- </tr>
+<!-- Second table displays the server resolution times -->
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Timings</h2></div>
+ <div class="panel-body">
+ <table class="table">
+ <thead>
+ <tr>
+ <th>Name server</th>
+ <th>Query time</th>
+ </tr>
+ </thead>
+
+ <tbody>
+<? foreach ((array)$dns_speeds as $qt):?>
+ <tr>
+ <td><?=$qt['dns_server']?></td><td><?=$qt['query_time']?></td>
+ </tr>
+<? endforeach?>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<!-- Third table displays "More information" -->
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">More information</h2></div>
+ <div class="panel-body">
+ <ul class="list-group">
+ <li class="list-group-item"><a href="/diag_ping.php?host=<?=htmlspecialchars($host)?>&amp;interface=wan&amp;count=3"><?=gettext("Ping")?></a></li>
+ <li class="list-group-item"><a href="/diag_traceroute.php?host=<?=htmlspecialchars($host)?>&amp;ttl=18"><?=gettext("Traceroute")?></a></li>
+ </ul>
+ <p><?=gettext("NOTE: The following links are to external services, so their reliability cannot be guaranteed.");?></p>
+ <ul class="list-group">
+ <li class="list-group-item"><a target="_blank" href="http://private.dnsstuff.com/tools/whois.ch?ip=<?php echo $ipaddr; ?>"><?=gettext("IP WHOIS @ DNS Stuff");?></a></li>
+ <li class="list-group-item"><a target="_blank" href="http://private.dnsstuff.com/tools/ipall.ch?ip=<?php echo $ipaddr; ?>"><?=gettext("IP Info @ DNS Stuff");?></a></li>
+ </ul>
+ </div>
+</div>
<?php
- }
-?>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <br />&nbsp;
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("DNS Lookup");?>" />
- </td>
- </tr>
- </table>
- </form>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+}
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_dump_states.php b/src/usr/local/www/diag_dump_states.php
index ebb3b06..9bd63f1 100755
--- a/src/usr/local/www/diag_dump_states.php
+++ b/src/usr/local/www/diag_dump_states.php
@@ -1,36 +1,61 @@
<?php
/*
diag_dump_states.php
- Copyright (C) 2005 Colin Smith
- Copyright (C) 2005-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
-
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2005 Colin Smith
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/pfctl
- pfSense_MODULE: filter
+ pfSense_MODULE: filter
*/
##|+PRIV
@@ -71,210 +96,135 @@ if (isset($_POST['filter']) && isset($_POST['killfilter'])) {
$pgtitle = array(gettext("Diagnostics"), gettext("Show States"));
include("head.inc");
-
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?=$jsevents["body"]["onload"];?>">
-<?php include("fbegin.inc"); ?>
-
-<script type="text/javascript">
-//<![CDATA[
- function removeState(srcip, dstip) {
- var busy = function(index, icon) {
- jQuery(icon).bind("onclick", "");
- jQuery(icon).attr('src', jQuery(icon).attr('src').replace("\.gif", "_d.gif"));
- jQuery(icon).css("cursor", "wait");
- }
+<script>
+events.push(function(){
+ $('a[data-entry]').on('click', function(){
+ var el = $(this);
+ var data = $(this).data('entry').split('|');
- jQuery('img[name="i:' + srcip + ":" + dstip + '"]').each(busy);
-
- jQuery.ajax(
- "<?=$_SERVER['SCRIPT_NAME'];?>",
+ $.ajax(
+ '/diag_dump_states.php',
{
- type: "post",
+ type: 'post',
data: {
- action: "remove",
- srcip: srcip,
- dstip: dstip
+ action: 'remove',
+ srcip: data[0],
+ dstip: data[1]
},
- complete: removeComplete
- }
- );
- }
-
- function removeComplete(req) {
- var values = req.responseText.split("|");
- if (values[3] != "0") {
- alert('<?=gettext("An error occurred.");?>');
- return;
- }
-
- jQuery('tr[id="r:' + values[1] + ":" + values[2] + '"]').each(
- function(index, row) { jQuery(row).fadeOut(1000); }
- );
- }
-//]]>
+ success: function(){
+ el.parents('tr').remove();
+ },
+ });
+ });
+});
</script>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tabcon">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("States"), true, "diag_dump_states.php");
- if (isset($config['system']['lb_use_sticky'])) {
- $tab_array[] = array(gettext("Source Tracking"), false, "diag_dump_states_sources.php");
- }
- $tab_array[] = array(gettext("Reset States"), false, "diag_resetstate.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
-
-<!-- Start of tab content -->
-
-<?php
- $current_statecount=`pfctl -si | grep "current entries" | awk '{ print $3 }'`;
-?>
-
-<table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="states">
- <tr>
- <td>
- <form action="<?=$_SERVER['SCRIPT_NAME'];?>" method="post" name="iform">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="filter">
- <tr>
- <td>
- <?=gettext("Current total state count");?>: <?= $current_statecount ?>
- </td>
- <td style="font-weight:bold;" align="right">
- <?=gettext("Filter expression:");?>
- <input type="text" name="filter" class="formfld search" value="<?=htmlspecialchars($_POST['filter']);?>" size="30" />
- <input type="submit" class="formbtn" value="<?=gettext("Filter");?>" />
- <?php if (isset($_POST['filter']) && (is_ipaddr($_POST['filter']) || is_subnet($_POST['filter']))): ?>
- <input type="submit" class="formbtn" name="killfilter" value="<?=gettext("Kill");?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </form>
- </td>
- </tr>
- <tr>
- <td>
- <table class="tabcont sortable" width="100%" border="0" cellspacing="0" cellpadding="0" summary="results">
- <thead>
- <tr>
- <th class="listhdrr" width="5%"><?=gettext("Int");?></th>
- <th class="listhdrr" width="5%"><?=gettext("Proto");?></th>
- <th class="listhdrr" width="65"><?=gettext("Source -> Router -> Destination");?></th>
- <th class="listhdr" width="24%"><?=gettext("State");?></th>
- <th class="list sort_ignore" width="1%"></th>
- </tr>
- </thead>
- <tbody>
<?php
-$row = 0;
-/* get our states */
-$grepline = (isset($_POST['filter'])) ? "| /usr/bin/egrep " . escapeshellarg(htmlspecialchars($_POST['filter'])) : "";
-$fd = popen("/sbin/pfctl -s state {$grepline}", "r");
-while ($line = chop(fgets($fd))) {
- if ($row >= 10000) {
- break;
- }
-
- $line_split = preg_split("/\s+/", $line);
-
- $iface = array_shift($line_split);
- $proto = array_shift($line_split);
- $state = array_pop($line_split);
- $info = implode(" ", $line_split);
-
- // We may want to make this optional, with a large state table, this could get to be expensive.
- $iface = convert_real_interface_to_friendly_descr($iface);
-
- /* break up info and extract $srcip and $dstip */
- $ends = preg_split("/\<?-\>?/", $info);
- if (strstr($info, "[")) {
- // IPv6
- $parts = explode("[", $ends[0]);
- if (strstr($info, "->")) {
- $srcip = trim($parts[0]);
- } else {
- $dstip = trim($parts[0]);
- }
- $parts = explode("[", $ends[count($ends) - 1]);
- if (strstr($info, "->")) {
- $dstip = trim($parts[0]);
- } else {
- $srcip = trim($parts[0]);
- }
- } else {
- // IPv4
- $parts = explode(":", $ends[0]);
- if (strstr($info, "->")) {
- $srcip = trim($parts[0]);
- } else {
- $dstip = trim($parts[0]);
- }
- $parts = explode(":", $ends[count($ends) - 1]);
- if (strstr($info, "->")) {
- $dstip = trim($parts[0]);
- } else {
- $srcip = trim($parts[0]);
- }
- }
-?>
- <tr valign="top" id="r:<?= $srcip ?>:<?= $dstip ?>">
- <td class="listlr"><?= $iface ?></td>
- <td class="listr"><?= $proto ?></td>
- <td class="listr"><?= $info ?></td>
- <td class="listr"><?= $state ?></td>
- <td class="list">
- <img src="/themes/<?= $g['theme'] ?>/images/icons/icon_x.gif" height="17" width="17" border="0"
- onclick="removeState('<?= $srcip ?>', '<?= $dstip ?>');" style="cursor:pointer;"
- name="i:<?= $srcip ?>:<?= $dstip ?>"
- title="<?= gettext('Remove all state entries from') ?> <?= $srcip ?> <?= gettext('to') ?> <?= $dstip ?>" alt="" />
- </td>
- </tr>
-<?php
- $row++;
- ob_flush();
+$tab_array = array();
+$tab_array[] = array(gettext("States"), true, "diag_dump_states.php");
+if (isset($config['system']['lb_use_sticky']))
+ $tab_array[] = array(gettext("Source Tracking"), false, "diag_dump_states_sources.php");
+$tab_array[] = array(gettext("Reset States"), false, "diag_resetstate.php");
+display_top_tabs($tab_array);
+
+// Start of tab content
+$current_statecount=`pfctl -si | grep "current entries" | awk '{ print $3 }'`;
+
+require('classes/Form.class.php');
+
+$form = new Form(false);
+
+$section = new Form_Section('State filter');
+
+$section->addInput(new Form_Input(
+ 'filter',
+ 'Filter expression',
+ 'text',
+ $_POST['filter'],
+ ['placeholder' => 'Simple filter such as 192.168, v6, icmp or ESTABLISHED']
+));
+
+$filterbtn = new Form_Button('filterbtn', 'Filter', null);
+$filterbtn->removeClass('btn-primary')->addClass('btn-default btn-sm');
+$section->addInput(new Form_StaticText(
+ '',
+ $filterbtn
+));
+
+if (isset($_POST['filter']) && (is_ipaddr($_POST['filter']) || is_subnet($_POST['filter']))) {
+ $killbtn = new Form_Button('killfilter', 'Kill States');
+ $killbtn->removeClass('btn-primary')->addClass('btn-danger btn-sm');
+ $section->addInput(new Form_StaticText(
+ 'Kill filtered states',
+ $killbtn
+ ))->setHelp('Remove all states to and from the filtered address');
}
-if ($row == 0):
+$form->add($section);
+print $form;
?>
- <tr>
- <td class="list" colspan="4" align="center" valign="top">
- <?= gettext("No states were found.") ?>
- </td>
- </tr>
+<table class="table table-striped">
+ <thead>
+ <tr>
+ <th><?=gettext("Int")?></th>
+ <th><?=gettext("Proto")?></th>
+ <th><?=gettext("Source -> Router -> Destination")?></th>
+ <th><?=gettext("State")?></th>
+ <th></th> <!-- For the optional "Remove" button -->
+ </tr>
+ </thead>
+ <tbody>
<?php
-endif;
-pclose($fd);
+ $row = 0;
+ /* get our states */
+ $grepline = (isset($_POST['filter'])) ? "| /usr/bin/egrep " . escapeshellarg(htmlspecialchars($_POST['filter'])) : "";
+ $fd = popen("/sbin/pfctl -s state {$grepline}", "r" );
+ while ($line = chop(fgets($fd))) {
+ if($row >= 10000)
+ break;
+
+ $line_split = preg_split("/\s+/", $line);
+
+ $iface = array_shift($line_split);
+ $proto = array_shift($line_split);
+ $state = array_pop($line_split);
+ $info = implode(" ", $line_split);
+
+ // We may want to make this optional, with a large state table, this could get to be expensive.
+ $iface = convert_real_interface_to_friendly_descr($iface);
+
+ /* break up info and extract $srcip and $dstip */
+ $ends = preg_split("/\<?-\>?/", $info);
+ $parts = explode(":", $ends[0]);
+ $srcip = trim($parts[0]);
+ $parts = explode(":", $ends[count($ends) - 1]);
+ $dstip = trim($parts[0]);
?>
- </tbody>
- </table>
- </td>
- </tr>
- <tr>
- <td class="list" colspan="4" align="center" valign="top">
- <?php if (isset($_POST['filter']) && !empty($_POST['filter'])): ?>
- <?=gettext("States matching current filter")?>: <?= $row ?>
- <?php endif; ?>
- </td>
- </tr>
+ <tr>
+ <td><?= $iface ?></td>
+ <td><?= $proto ?></td>
+ <td><?= $info ?></td>
+ <td><?= $state ?></td>
+
+ <td>
+ <a class="btn btn-xs btn-danger" data-entry="<?=$srcip?>|<?=$dstip?>"
+ title="<?=sprintf(gettext('Remove all state entries from %s to %s'), $srcip, $dstip);?>">Remove</a>
+ </td>
+ </tr>
+<?php $row++; } ?>
+ </tbody>
</table>
+<?php
-<!-- End of tab content -->
+if ($row == 0) {
+ if (isset($_POST['filter']) && !empty($_POST['filter']))
+ $errmsg = gettext('No states were found that match the current filter');
+ else
+ $errmsg = gettext('No states were found');
- </div>
- </td>
- </tr>
-</table>
+ print('<p class="alert alert-warning">' . $errmsg . '</p>');
+}
-<?php require("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_dump_states_sources.php b/src/usr/local/www/diag_dump_states_sources.php
index 4cb14c2..04c8c03 100644
--- a/src/usr/local/www/diag_dump_states_sources.php
+++ b/src/usr/local/www/diag_dump_states_sources.php
@@ -1,32 +1,58 @@
<?php
/*
diag_dump_states_sources.php
- Copyright (C) 2005 Colin Smith
- Copyright (C) 2005-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2005 Colin Smith
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/pfctl
@@ -43,11 +69,11 @@
require_once("guiconfig.inc");
/* handle AJAX operations */
-if ($_GET['action']) {
- if ($_GET['action'] == "remove") {
- if (is_ipaddr($_GET['srcip']) and is_ipaddr($_GET['dstip'])) {
- $retval = mwexec("/sbin/pfctl -K " . escapeshellarg($_GET['srcip']) . " -K " . escapeshellarg($_GET['dstip']));
- echo htmlentities("|{$_GET['srcip']}|{$_GET['dstip']}|{$retval}|");
+if($_POST['action']) {
+ if($_POST['action'] == "remove") {
+ if (is_ipaddr($_POST['srcip']) && is_ipaddr($_POST['dstip'])) {
+ $retval = mwexec("/sbin/pfctl -K " . escapeshellarg($_POST['srcip']) . " -K " . escapeshellarg($_POST['dstip']));
+ echo htmlentities("|{$_GET['srcip']}|{$_POST['dstip']}|{$retval}|");
} else {
echo gettext("invalid input");
}
@@ -56,101 +82,80 @@ if ($_GET['action']) {
}
/* get our states */
-if ($_GET['filter']) {
+if($_POST['filter']) {
exec("/sbin/pfctl -s Sources | grep " . escapeshellarg(htmlspecialchars($_GET['filter'])), $sources);
-} else {
+}
+else {
exec("/sbin/pfctl -s Sources", $sources);
}
-$pgtitle = array(gettext("Diagnostics"), gettext("Show Source Tracking"));
+
+$pgtitle = array(gettext("Diagnostics"),gettext("Show Source Tracking"));
include("head.inc");
+$tab_array = array();
+$tab_array[] = array(gettext("States"), false, "diag_dump_states.php");
+$tab_array[] = array(gettext("Source Tracking"), true, "diag_dump_states_sources.php");
+$tab_array[] = array(gettext("Reset States"), false, "diag_resetstate.php");
+display_top_tabs($tab_array);
+
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?=$jsevents["body"]["onload"];?>">
-<?php include("fbegin.inc"); ?>
-<form action="diag_dump_states_sources.php" method="get" name="iform">
-
-<script type="text/javascript">
-//<![CDATA[
- function removeSource(srcip, dstip) {
- var busy = function(index, icon) {
- jQuery(icon).bind("onclick", "");
- jQuery(icon).attr('src', jQuery(icon).attr('src').replace("\.gif", "_d.gif"));
- jQuery(icon).css("cursor", "wait");
- }
+<script>
+events.push(function(){
+ $('a[data-entry]').on('click', function(){
+ var el = $(this);
+ var data = $(this).data('entry').split('|');
+
+ $.ajax(
+ '/diag_dump_states_sources.php',
+ {
+ type: 'post',
+ data: {
+ action: 'remove',
+ srcip: data[0],
+ dstip: data[1]
+ },
+ success: function(){
+ el.parents('tr').remove();
+ },
+ });
+ });
+});
+</script>
- jQuery('img[name="i:' + srcip + ":" + dstip + '"]').each(busy);
+<?php
- jQuery.ajax(
- "<?=$_SERVER['SCRIPT_NAME'];?>" +
- "?action=remove&srcip=" + srcip + "&dstip=" + dstip,
- { type: "get", complete: removeComplete }
- );
- }
+require('classes/Form.class.php');
- function removeComplete(req) {
- var values = req.responseText.split("|");
- if (values[3] != "0") {
- alert('<?=gettext("An error occurred.");?>');
- return;
- }
+$form = new Form;
+$section = new Form_Section('Filters');
- jQuery('tr[name="r:' + values[1] + ":" + values[2] + '"]').each(
- function(index, row) { jQuery(row).fadeOut(1000); }
- );
- }
-//]]>
-</script>
+$section->addInput(new Form_Input(
+ 'filter',
+ 'Filter expression',
+ 'text',
+ $_POST['filter']
+));
-<table width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("States"), false, "diag_dump_states.php");
- $tab_array[] = array(gettext("Source Tracking"), true, "diag_dump_states_sources.php");
- $tab_array[] = array(gettext("Reset States"), false, "diag_resetstate.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
-
-<!-- Start of tab content -->
-
-<table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0">
- <tr>
- <td>
- <form action="<?=$_SERVER['SCRIPT_NAME'];?>" method="get">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0">
- <tr>
- <td>&nbsp;</td>
- <td style="font-weight:bold;" align="right">
- <?=gettext("Filter expression:");?>
- <input type="text" name="filter" class="formfld search" value="<?=htmlspecialchars($_GET['filter']);?>" size="30" />
- <input type="submit" class="formbtn" value="<?=gettext("Filter");?>" />
- </td>
- </tr>
- </table>
- </form>
- </td>
- </tr>
- <tr>
- <td>
- <table class="tabcont sortable" width="100%" border="0" cellspacing="0" cellpadding="0">
- <thead>
+$form->add($section);
+print $form;
+
+?>
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Current source tracking entries</h2></div>
+ <div class="panel-body">
+ <table class="table table-striped">
+ <thead>
<tr>
- <th class="listhdrr" width="40%"><?=gettext("Source -> Destination");?></th>
- <th class="listhdrr" width="15%"><?=gettext("# States");?></th>
- <th class="listhdrr" width="15%"><?=gettext("# Connections");?></th>
- <th class="listhdr" width="15%"><?=gettext("Rate");?></th>
- <th class="list sort_ignore" width="1%"></th>
+ <th><?=gettext("Source -> Destination")?></th>
+ <th><?=gettext("# States")?></th>
+ <th><?=gettext("# Connections")?></th>
+ <th><?=gettext("Rate")?></th>
+ <th></th>
</tr>
- </thead>
- <tbody>
+ </thead>
+ <tbody>
<?php
$row = 0;
if (count($sources) > 0) {
@@ -168,44 +173,30 @@ if (count($sources) > 0) {
$source_split = "";
preg_match("/(.*)\s\<?-\>?\s(.*)/", $info, $source_split);
list($all, $srcip, $dstip) = $source_split;
-
- ?>
- <tr valign='top' name='r:<?php echo "{$srcip}:{$dstip}" ?>'>
- <td class='listlr'><?php echo $info;?></td>
- <td class='listr'><?php echo $numstates;?></td>
- <td class='listr'><?php echo $numconnections;?></td>
- <td class='listr'><?php echo $rate;?></td>
- <td class='list'>
- <img src='/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif' height='17' width='17' border='0'
- onclick="removeSource(<?php echo "'{$srcip}', '{$dstip}'"; ?>);" style='cursor:pointer;'
- name='i:<?php echo "{$srcip}:{$dstip}"; ?>'
- title='<?php echo gettext("Remove all source tracking entries from") . " {$srcip} " . gettext("to") . " {$dstip}";?>' alt='' />
+?>
+ <tr>
+ <td><?= $info ?></td>
+ <td><?= $numstates ?></td>
+ <td><?= $numconnections ?></td>
+ <td><?= $rate ?></td>
+
+ <td>
+ <a class="btn btn-xs btn-danger" data-entry="<?=$srcip?>|<?=$dstip?>"
+ title="<?=sprintf(gettext('Remove all source tracking entries from %s to %s'), $srcip, $dstip);?>">Remove</a>
</td>
</tr>
<?php
$row++;
}
-} else {
- echo "<tr>
- <td class='list' colspan='5' align='center' valign='top'>
- " . gettext("No source tracking entries were found.") . "
- </td>
- </tr>";
}
?>
- </tbody>
- </table>
- </td>
- </tr>
-</table>
-
-<!-- End of tab content -->
-
- </div>
- </td>
- </tr>
-</table>
-
-<?php require("fend.inc"); ?>
-</body>
-</html>
+ </tbody>
+ </table>
+ </div>
+</div>
+<?php
+if ($row == 0) {
+ print('<p class="alert alert-warning">' . gettext('No source tracking entries were found.') . '</p>');
+}
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_gmirror.php b/src/usr/local/www/diag_gmirror.php
index f0f5bff..17fbed8 100644
--- a/src/usr/local/www/diag_gmirror.php
+++ b/src/usr/local/www/diag_gmirror.php
@@ -1,35 +1,63 @@
<?php
/*
diag_gmirror.php
- Copyright (C) 2014 Jim Pingle
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INClUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2014 Jim Pingle
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/gmirror /sbin/geom /usr/bin/grep /usr/bin/egrep /usr/bin/cut /usr/bin/head
- pfSense_BUILDER_BINARIES: /sbin/mount /usr/bin/awk /usr/bin/sed
- pfSense_MODULE: gmirror
+ pfSense_BUILDER_BINARIES: /sbin/mount /usr/bin/awk /usr/bin/sed
+ pfSense_MODULE: gmirror
*/
##|+PRIV
@@ -47,13 +75,6 @@ $pgtitle = array(gettext("Diagnostics"), gettext("GEOM Mirrors"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?=$jsevents["body"]["onload"];?>">
-
-<?php include("fbegin.inc"); ?>
-
-<?php
$action_list = array(
"forget" => gettext("Forget all formerly connected consumers"),
"clear" => gettext("Remove metadata from disk"),
@@ -75,6 +96,7 @@ if ($_POST) {
header("Location: diag_gmirror.php");
return;
}
+
$input_errors = "";
if (($_POST['action'] != "clear") && !is_valid_mirror($_POST['mirror'])) {
@@ -99,6 +121,7 @@ if ($_POST) {
$input_errors[] = gettext("Mirror is not in a COMPLETE state, cannot insert consumer. Forget disconnected disks or wait for rebuild to finish.");
}
break;
+
case "clear":
if (!is_consumer_unused($_POST['consumer'])) {
$input_errors[] = gettext("Consumer is in use and cannot be cleared. Deactivate disk first.");
@@ -107,6 +130,7 @@ if ($_POST) {
$input_errors[] = gettext("Consumer has no metadata to clear.");
}
break;
+
case "activate":
if (is_consumer_in_mirror($_POST['consumer'], $_POST['mirror'])) {
$input_errors[] = gettext("Consumer is already present on specified mirror.");
@@ -116,6 +140,7 @@ if ($_POST) {
}
break;
+
case "remove":
case "deactivate":
case "rebuild":
@@ -150,10 +175,13 @@ if ($_POST) {
$result = gmirror_force_rebuild($_POST['mirror'], $_POST['consumer']);
break;
}
+
$redir = "Location: diag_gmirror.php";
+
if ($result != 0) {
$redir .= "?error=" . urlencode($result);
}
+
/* If we reload the page too fast, the gmirror information may be missing or not up-to-date. */
sleep(3);
header($redir);
@@ -165,6 +193,7 @@ $mirror_status = gmirror_get_status();
$mirror_list = gmirror_get_mirrors();
$unused_disks = gmirror_get_disks();
$unused_consumers = array();
+
foreach ($unused_disks as $disk) {
if (is_consumer_unused($disk)) {
$unused_consumers = array_merge($unused_consumers, gmirror_get_all_unused_consumer_sizes_on_disk($disk));
@@ -180,227 +209,197 @@ if ($_GET["error"] && ($_GET["error"] != 0)) {
?>
<form action="diag_gmirror.php" method="POST" id="gmirror_form" name="gmirror_form">
-<table width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <span class="vexpl">
- <span class="red">
- <strong><?=gettext("NOTE:")?>&nbsp;</strong>
- </span>
- <?=gettext("The options on this page are intended for use by advanced users only. This page is for managing existing mirrors, not creating new mirrors.")?>
- <br />&nbsp;
- </span>
- <p/>
- <table width="100%" border="0" cellpadding="6" cellspacing="0">
-
-<?php
- if ($_GET["action"]):
+
+<!-- Confirmation screen -->
+<?php
+if ($_GET["action"]): ?>
+ <div class="panel panel-default">
+ <div class="panel-heading">Confirm Action</div>
+ <div class="panel-body">
+ <strong><?=gettext('Please confirm the selected action: '); ?></strong>
+ <span style="color:green"><?=$action_list[$_GET["action"]]; ?></span>
+ <input type="hidden" name="action" value="<?=htmlspecialchars($_GET['action']); ?>" />
+<?php
+ if (!empty($_GET["mirror"])): ?>
+ <br /><strong><?=gettext("Mirror: "); ?></strong>
+ <?=htmlspecialchars($_GET['mirror']); ?>
+ <input type="hidden" name="mirror" value="<?=htmlspecialchars($_GET['mirror']); ?>" />
+<?php
+ endif; ?>
+
+<?php
+ if (!empty($_GET["consumer"])): ?>
+ <br /><strong><?=gettext("Consumer"); ?>:</strong>
+ <?=htmlspecialchars($_GET["consumer"]); ?>
+ <input type="hidden" name="consumer" value="<?=htmlspecialchars($_GET["consumer"]); ?>" />
+<?php
+ endif; ?>
+ <br />
+ <br /><input type="submit" name="confirm" class="btn btn-sm btn-primary" value="<?=gettext("Confirm"); ?>" />
+ </div>
+ </div>
+<?php
+else:
+ // Status/display page
+ print_info_box(gettext("The options on this page are intended for use by advanced users only. This page is for managing existing mirrors, not creating new mirrors."));
?>
+
+ <!-- GEOM mirror table -->
+ <div class="panel panel-default">
+ <div class="panel-heading">GEOM Mirror information - Mirror Status</div>
+ <div class="panel-body table-responsive">
+
+<?php
+ if (count($mirror_status) > 0): ?>
+
+ <table class="table table-striped stable-hover table-condensed">
+ <thead>
<tr>
- <td colspan="2" valign="top" class="listtopic"><?php echo gettext("Confirm Action"); ?></td>
+ <th="><?=gettext("Name"); ?></th>
+ <th=><?=gettext("Status"); ?></th>
+ <th=><?=gettext("Component"); ?></th>
</tr>
+ </thead>
+ <tbody>
+<?php
+ foreach ($mirror_status as $mirror => $name):
+ $components = count($name["components"]); ?>
<tr>
- <td width="22%" valign="top" class="vncell">&nbsp;</td>
- <td width="78%" class="vtable">
- <strong><?php echo gettext("Please confirm the selected action"); ?></strong>:
- <br />
- <br /><strong><?php echo gettext("Action"); ?>:</strong> <?php echo $action_list[$_GET["action"]]; ?>
- <input type="hidden" name="action" value="<?php echo htmlspecialchars($_GET["action"]); ?>" />
- <?php if (!empty($_GET["mirror"])): ?>
- <br /><strong><?php echo gettext("Mirror"); ?>:</strong> <?php echo htmlspecialchars($_GET["mirror"]); ?>
- <input type="hidden" name="mirror" value="<?php echo htmlspecialchars($_GET["mirror"]); ?>" />
- <?php endif; ?>
- <?php if (!empty($_GET["consumer"])): ?>
- <br /><strong><?php echo gettext("Consumer"); ?>:</strong> <?php echo htmlspecialchars($_GET["consumer"]); ?>
- <input type="hidden" name="consumer" value="<?php echo htmlspecialchars($_GET["consumer"]); ?>" />
- <?php endif; ?>
- <br />
- <br /><input type="submit" name="confirm" value="<?php echo gettext("Confirm"); ?>" />
+ <td rowspan="<?=$components; ?>">
+ <?=htmlspecialchars($name['name']); ?><br />Size: <?=gmirror_get_mirror_size($name['name']); ?>
</td>
- </tr>
+ <td rowspan="<?=$components; ?>">
+ <?=htmlspecialchars($name['status']); ?>
<?php
- else:
-?>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?php echo gettext("GEOM Mirror information"); ?></td>
+ if (strtoupper($name['status']) == "DEGRADED"): ?>
+ <br /><a href="diag_gmirror.php?action=forget&amp;mirror=<?=htmlspecialchars($name['name']); ?>">[<?=gettext("Forget Disconnected Disks"); ?>]</a>
+<?php
+ endif; ?>
+ </td>
+ <td>
+ <?=$name['components'][0]; ?>
+ <?php list($cname, $cstatus) = explode(" ", $name['components'][0], 2); ?><br />
+<?php
+ if ((strtoupper($name['status']) == "COMPLETE") && (count($name["components"]) > 1)): ?>
+ <a class="btn btn-xs btn-info" href="diag_gmirror.php?action=rebuild&amp;consumer=<?=htmlspecialchars($cname); ?>&amp;mirror=<?=htmlspecialchars($name['name']); ?>">[<?=gettext("Rebuild"); ?>]</a>
+ <a class="btn btn-xs btn-info" href="diag_gmirror.php?action=deactivate&amp;consumer=<?=htmlspecialchars($cname); ?>&amp;mirror=<?=htmlspecialchars($name['name']); ?>">[<?=gettext("Deactivate"); ?>]</a>
+ <a class="btn btn-xs btn-danger" href="diag_gmirror.php?action=remove&amp;consumer=<?=htmlspecialchars($cname); ?>&amp;mirror=<?=htmlspecialchars($name['name']); ?>">[<?=gettext("Remove"); ?>]</a>
+<?php
+ endif; ?>
+ </td>
</tr>
-
- <tr>
- <td width="22%" valign="top" class="vncell"><?php echo gettext("Mirror Status"); ?></td>
- <td width="78%" class="vtable">
- <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="gmirror status">
- <tbody id="gmirror_status_table">
<?php
- if (count($mirror_status) > 0):
-?>
- <tr>
- <td width="30%" class="vncellt"><?php echo gettext("Name"); ?></td>
- <td width="30%" class="vncellt"><?php echo gettext("Status"); ?></td>
- <td width="40%" class="vncellt"><?php echo gettext("Component"); ?></td>
- </tr>
-<?php
- foreach ($mirror_status as $mirror => $name):
- $components = count($name["components"]);
-?>
- <tr>
- <td width="30%" rowspan="<?php echo $components; ?>" class="listr">
- <?php echo htmlspecialchars($name['name']); ?>
- <br />Size: <?php echo gmirror_get_mirror_size($name['name']); ?>
- </td>
- <td width="30%" rowspan="<?php echo $components; ?>" class="listr">
- <?php echo htmlspecialchars($name['status']); ?>
-<?php
- if (strtoupper($name['status']) == "DEGRADED"):
-?>
- <br /><a href="diag_gmirror.php?action=forget&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Forget Disconnected Disks"); ?>]</a>
+ if (count($name["components"]) > 1):
+ $morecomponents = array_slice($name["components"], 1); ?>
<?php
- endif;
-?>
- </td>
- <td width="40%" class="listr">
- <?php echo $name['components'][0]; ?>
- <?php list($cname, $cstatus) = explode(" ", $name['components'][0], 2); ?>
- <br />
+ foreach ($morecomponents as $component): ?>
+ <tr>
+ <td>
+ <?=$component; ?>
+ <?php list($cname, $cstatus) = explode(" ", $component, 2); ?><br />
<?php
- if ((strtoupper($name['status']) == "COMPLETE") && (count($name["components"]) > 1)):
-?>
- <a href="diag_gmirror.php?action=rebuild&amp;consumer=<?php echo htmlspecialchars($cname); ?>&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Rebuild"); ?>]</a>
- <a href="diag_gmirror.php?action=deactivate&amp;consumer=<?php echo htmlspecialchars($cname); ?>&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Deactivate"); ?>]</a>
- <a href="diag_gmirror.php?action=remove&amp;consumer=<?php echo htmlspecialchars($cname); ?>&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Remove"); ?>]</a>
+ if ((strtoupper($name['status']) == "COMPLETE") && (count($name["components"]) > 1)): ?>
+ <a class="btn btn-xs btn-info" href="diag_gmirror.php?action=rebuild&amp;consumer=<?=htmlspecialchars($cname); ?>&amp;mirror=<?=htmlspecialchars($name['name']); ?>">[<?=gettext("Rebuild"); ?>]</a>
+ <a class="btn btn-xs btn-info" href="diag_gmirror.php?action=deactivate&amp;consumer=<?=htmlspecialchars($cname); ?>&amp;mirror=<?=htmlspecialchars($name['name']); ?>">[<?=gettext("Deactivate"); ?>]</a>
+ <a class="btn btn-xs btn-danger" href="diag_gmirror.php?action=remove&amp;consumer=<?=htmlspecialchars($cname); ?>&amp;mirror=<?=htmlspecialchars($name['name']); ?>">[<?=gettext("Remove"); ?>]</a>
<?php
- endif;
-?>
- </td>
- </tr>
+ endif; ?>
+ </td>
+ </tr>
<?php
- if (count($name["components"]) > 1):
- $morecomponents = array_slice($name["components"], 1);
- foreach ($morecomponents as $component):
-?>
- <tr>
- <td width="40%" class="listr">
- <?php echo $component; ?>
- <?php list($cname, $cstatus) = explode(" ", $component, 2); ?>
- <br />
+ endforeach; ?>
<?php
- if ((strtoupper($name['status']) == "COMPLETE") && (count($name["components"]) > 1)):
-?>
- <a href="diag_gmirror.php?action=rebuild&amp;consumer=<?php echo htmlspecialchars($cname); ?>&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Rebuild"); ?>]</a>
- <a href="diag_gmirror.php?action=deactivate&amp;consumer=<?php echo htmlspecialchars($cname); ?>&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Deactivate"); ?>]</a>
- <a href="diag_gmirror.php?action=remove&amp;consumer=<?php echo htmlspecialchars($cname); ?>&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Remove"); ?>]</a>
+ endif; ?>
<?php
- endif;
-?>
- </td>
- </tr>
+ endforeach; ?>
+ </tbody>
+ </table>
<?php
- endforeach;
- endif;
- endforeach;
- else:
-?>
- <tr>
- <td colspan="3" class="listr"><?php echo gettext("No Mirrors Found"); ?></td>
- </tr>
+ else: ?>
+ <?=gettext("No Mirrors Found"); ?>
+
<?php
- endif;
-?>
- </tbody>
- </table>
- <br /><?php echo gettext("Some disk operations may only be performed when there are multiple consumers present in a mirror."); ?>
- </td>
- </tr>
+ endif; ?>
+
+ </div>
+ </div>
+<?php print_info_box(gettext("Some disk operations may only be performed when there are multiple consumers present in a mirror."), 'default'); ?>
+
+ <!-- Consumer information table -->
+ <div class="panel panel-default">
+ <div class="panel-heading">Consumer information - Available consumers</div>
+ <div class="panel-body table-responsive">
+<?php
+ if (count($unused_consumers) > 0): ?>
+ <table class="table table-striped stable-hover table-condensed">
+ <thead>
<tr>
- <td colspan="2" valign="top" class="listtopic"><?php echo gettext("Consumer information"); ?></td>
+ <th><?=gettext("Name"); ?></th>
+ <th><?=gettext("Size"); ?></th>
+ <th><?=gettext("Add to Mirror"); ?></th>
</tr>
+ </thead>
+ <tbody>
+<?php
+ foreach ($unused_consumers as $consumer): ?>
<tr>
- <td width="22%" valign="top" class="vncell"><?php echo gettext("Available Consumers"); ?></td>
- <td width="78%" class="vtable">
+ <td>
+ <?=htmlspecialchars($consumer['name']); ?>
+ </td>
+ <td>
+ <?=htmlspecialchars($consumer['size']); ?>
+ <?=htmlspecialchars($consumer['humansize']); ?>
+ </td>
+ <td>
+<?php
+ $oldmirror = gmirror_get_consumer_metadata_mirror($consumer['name']);
- <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="consumer list">
- <tbody id="consumer_list">
+ if ($oldmirror): ?>
+ <a class="btn btn-xs btn-success" href="diag_gmirror.php?action=activate&amp;consumer=<?=htmlspecialchars($consumer['name']); ?>&amp;mirror=<?=htmlspecialchars($oldmirror); ?>">
+ <?=gettext("Reactivate on:") . ' ' . htmlspecialchars($oldmirror); ?>
+ </a>
+ <br />
+ <a class="btn btn-xs btn-danger" href="diag_gmirror.php?action=clear&amp;consumer=<?=htmlspecialchars($consumer['name']); ?>">
+ <?=gettext("Remove metadata from disk"); ?>
+ </a>
<?php
- if (count($unused_consumers) > 0):
-?>
- <tr>
- <td width="30%" class="vncellt"><?php echo gettext("Name"); ?></td>
- <td width="30%" class="vncellt"><?php echo gettext("Size"); ?></td>
- <td width="40%" class="vncellt"><?php echo gettext("Add to Mirror"); ?></td>
- </tr>
+ else: ?>
<?php
- foreach ($unused_consumers as $consumer):
-?>
- <tr>
- <td width="30%" class="listr">
- <?php echo htmlspecialchars($consumer['name']); ?>
- </td>
- <td width="30%" class="listr"><?php echo htmlspecialchars($consumer['size']); ?> <?php echo htmlspecialchars($consumer['humansize']); ?></td>
- <td width="40%" class="listr">
-<?php
- $oldmirror = gmirror_get_consumer_metadata_mirror($consumer['name']);
- if ($oldmirror):
-?>
- <a href="diag_gmirror.php?action=activate&amp;consumer=<?php echo htmlspecialchars($consumer['name']); ?>&amp;mirror=<?php echo htmlspecialchars($oldmirror); ?>">[<?php echo gettext("Reactivate on:") . ' ' . htmlspecialchars($oldmirror); ?>]</a>
- <br /><a href="diag_gmirror.php?action=clear&amp;consumer=<?php echo htmlspecialchars($consumer['name']); ?>">[<?php echo gettext("Remove metadata from disk"); ?>]</a>
-<?php
- else:
- foreach ($mirror_list as $mirror):
- $mirror_size = gmirror_get_mirror_size($mirror);
- $consumer_size = gmirror_get_unused_consumer_size($consumer['name']);
- if ($consumer_size > $mirror_size):
-?>
- <a href="diag_gmirror.php?action=insert&amp;consumer=<?php echo htmlspecialchars($consumer['name']); ?>&amp;mirror=<?php echo htmlspecialchars($mirror); ?>"><?php echo htmlspecialchars($mirror); ?></a>
+ foreach ($mirror_list as $mirror):
+ $mirror_size = gmirror_get_mirror_size($mirror);
+ $consumer_size = gmirror_get_unused_consumer_size($consumer['name']);
+
+ if ($consumer_size > $mirror_size): ?>
+ <a class="btn btn-xs btn-info" href="diag_gmirror.php?action=insert&amp;consumer=<?=htmlspecialchars($consumer['name']); ?>&amp;mirror=<?=htmlspecialchars($mirror); ?>">
+ <?=htmlspecialchars($mirror); ?>
+ </a>
<?php
- endif;
- endforeach;
- endif;
-?>
- </td>
- </tr>
+ endif; ?>
<?php
- endforeach;
- else:
-?>
- <tr>
- <td colspan="3" class="listr">
- <?php echo gettext("No unused consumers found"); ?>
- </td>
- </tr>
+ endforeach; ?>
+
<?php
- endif;
-?>
- </tbody>
- </table>
- <br /><?php echo gettext("Consumers may only be added to a mirror if they are larger than the size of the mirror."); ?>
+ endif; ?>
</td>
</tr>
- <tr>
- <td colspan="2" valign="top" class="">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class=""><?php echo gettext("To repair a failed mirror, first perform a 'Forget' command on the mirror, followed by an 'insert' action on the new consumer."); ?></td>
- </tr>
<?php
- endif;
-?>
- </table>
- </div>
- </td>
- </tr>
-</table>
+ endforeach; ?>
+ </tbody>
+ </table>
+<?php
+ else: ?>
+ <?=gettext("No unused consumers found"); ?>
+<?php
+ endif; ?>
+ </div>
+ </div>
+<?php
+ print_info_box(gettext("Consumers may only be added to a mirror if they are larger than the size of the mirror.") . '<br />' .
+ gettext("To repair a failed mirror, first perform a 'Forget' command on the mirror, followed by an 'insert' action on the new consumer."), 'default');
+endif; ?>
</form>
-<?php require("fend.inc"); ?>
-</body>
-</html>
<?php
-
-// Clear the loading indicator
-echo "<script type=\"text/javascript\">";
-echo "jQuery('#loading').html('');";
-echo "</script>";
-
-?>
+require("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_ipsec.php b/src/usr/local/www/diag_ipsec.php
index 96c6835..f5a83c8 100644
--- a/src/usr/local/www/diag_ipsec.php
+++ b/src/usr/local/www/diag_ipsec.php
@@ -2,38 +2,61 @@
/* $Id$ */
/*
diag_ipsec.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2008 Shrew Soft Inc <mgrooms@shrew.net>.
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Parts of this code was originally based on vpn_ipsec_sad.php
- Copyright (C) 2003-2004 Manuel Kasper
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: ipsec
+ pfSense_MODULE: ipsec
*/
##|+PRIV
@@ -94,54 +117,71 @@ $a_phase1 = &$config['ipsec']['phase1'];
$status = ipsec_smp_dump_status();
+$tab_array = array();
+$tab_array[] = array(gettext("Overview"), true, "diag_ipsec.php");
+$tab_array[] = array(gettext("Leases"), false, "diag_ipsec_leases.php");
+$tab_array[] = array(gettext("SAD"), false, "diag_ipsec_sad.php");
+$tab_array[] = array(gettext("SPD"), false, "diag_ipsec_spd.php");
+$tab_array[] = array(gettext("Logs"), false, "diag_logs_ipsec.php");
+display_top_tabs($tab_array);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?php echo $jsevents["body"]["onload"]; ?>">
-<?php include("fbegin.inc"); ?>
-<div id="inputerrors"></div>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status ipsec">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Overview"), true, "diag_ipsec.php");
- $tab_array[1] = array(gettext("Leases"), false, "diag_ipsec_leases.php");
- $tab_array[2] = array(gettext("SAD"), false, "diag_ipsec_sad.php");
- $tab_array[3] = array(gettext("SPD"), false, "diag_ipsec_spd.php");
- $tab_array[4] = array(gettext("Logs"), false, "diag_logs_ipsec.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" class="tabcont sortable" summary="status">
- <thead>
- <tr>
- <th class="listhdrr nowrap"><?php echo gettext("Description");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Local ID");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Local IP");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Remote ID");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Remote IP");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Role");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Reauth");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Algo");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Status");?></th>
- <th class="list nowrap"></th>
- </tr>
- </thead>
- <tbody>
-<?php
- $ipsecconnected = array();
- if (is_array($status['query']) && is_array($status['query']['ikesalist']) && is_array($status['query']['ikesalist']['ikesa'])):
- foreach ($status['query']['ikesalist']['ikesa'] as $ikeid => $ikesa):
- $con_id = substr($ikesa['peerconfig'], 3);
- if ($ikesa['version'] == 1) {
- $ph1idx = substr($con_id, 0, strrpos(substr($con_id, 0, -1), '00'));
- $ipsecconnected[$ph1idx] = $ph1idx;
- } else {
- $ipsecconnected[$con_id] = $ph1idx = $con_id;
+<div class="panel panel-default">
+ <div class="panel-heading">IPSec status</div>
+ <div class="panel-body table responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Description")?></th>
+ <th><?=gettext("Local ID")?></th>
+ <th><?=gettext("Local IP")?></th>
+ <th><?=gettext("Remote ID")?></th>
+ <th><?=gettext("Remote IP")?></th>
+ <th><?=gettext("Role")?></th>
+ <th><?=gettext("Reauth")?></th>
+ <th><?=gettext("Algo")?></th>
+ <th><?=gettext("Status")?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+$ipsecconnected = array();
+
+if (is_array($status['query']) && is_array($status['query']['ikesalist']) && is_array($status['query']['ikesalist']['ikesa'])):
+ foreach ($status['query']['ikesalist']['ikesa'] as $ikeid => $ikesa):
+ $con_id = substr($ikesa['peerconfig'], 3);
+
+ if ($ikesa['version'] == 1) {
+ $ph1idx = substr($con_id, 0, strrpos(substr($con_id, 0, -1), '00'));
+ $ipsecconnected[$ph1idx] = $ph1idx;
+ } else {
+ $ipsecconnected[$con_id] = $ph1idx = $con_id;
+ }
+
+ if (ipsec_phase1_status($status['query']['ikesalist']['ikesa'], $ikesa['id']))
+ $icon = "pass";
+ elseif (!isset($config['ipsec']['enable']))
+ $icon = "block";
+ else
+ $icon = "reject";
+?>
+ <tr>
+ <td>
+ <?=htmlspecialchars(ipsec_get_descr($ph1idx))?>
+ </td>
+ <td>
+<?php
+ if (!is_array($ikesa['local']))
+ echo gettext("Unknown");
+ else {
+ if (!empty($ikesa['local']['identification'])) {
+ if ($ikesa['local']['identification'] == '%any')
+ print(gettext('Any identifier'));
+ else
+ print(htmlspecialchars($ikesa['local']['identification']));
+ } else
+ print(gettext("Unknown"));
}
if (ipsec_phase1_status($status['query']['ikesalist']['ikesa'], $ikesa['id'])) {
@@ -152,396 +192,316 @@ $status = ipsec_smp_dump_status();
$icon = "reject";
}
?>
- <tr>
- <td class="listlr">
-<?php
- echo htmlspecialchars(ipsec_get_descr($ph1idx));
-?>
- </td>
- <td class="listr">
-<?php
- if (!is_array($ikesa['local'])) {
- echo gettext("Unknown");
- } else {
- if (!empty($ikesa['local']['identification'])) {
- if ($ikesa['local']['identification'] == '%any') {
- echo gettext('Any identifier');
- } else {
- echo htmlspecialchars($ikesa['local']['identification']);
- }
- } else {
- echo gettext("Unknown");
- }
- }
+ </td>
+ <td>
+<?php
+ if (!is_array($ikesa['local']))
+ print(gettext("Unknown"));
+ else {
+ if (!empty($ikesa['local']['address']))
+ print(htmlspecialchars($ikesa['local']['address']) . '<br/>' . gettext('Port: ') . htmlspecialchars($ikesa['local']['port']));
+ else
+ print(gettext("Unknown"));
+ if ($ikesa['local']['port'] == '4500')
+ print(" NAT-T");
+ }
?>
- </td>
- <td class="listr">
-<?php
- if (!is_array($ikesa['local'])) {
- echo gettext("Unknown");
- } else {
- if (!empty($ikesa['local']['address'])) {
- echo htmlspecialchars($ikesa['local']['address']) . '<br/>' .
- gettext('Port: ') . htmlspecialchars($ikesa['local']['port']);
- } else {
- echo gettext("Unknown");
- }
- if ($ikesa['local']['port'] == '4500') {
- echo " NAT-T";
- }
+ </td>
+ <td>
+<?php
+ if (!is_array($ikesa['remote']))
+ print(gettext("Unknown"));
+ else {
+ $identity = "";
+ if (!empty($ikesa['remote']['identification'])) {
+ if ($ikesa['remote']['identification'] == '%any')
+ $identity = 'Any identifier';
+ else
+ $identity = htmlspecialchars($ikesa['remote']['identification']);
}
-?>
- </td>
- <td class="listr">
-<?php
- if (!is_array($ikesa['remote'])) {
- echo gettext("Unknown");
- } else {
- $identity = "";
- if (!empty($ikesa['remote']['identification'])) {
- if ($ikesa['remote']['identification'] == '%any') {
- $identity = 'Any identifier';
- } else {
- $identity = htmlspecialchars($ikesa['remote']['identification']);
- }
- }
- if (is_array($ikesa['remote']['auth']) && !empty($ikesa['remote']['auth'][0]['identity'])) {
- echo htmlspecialchars($ikesa['remote']['auth'][0]['identity']);
- echo "<br/>{$identity}";
- } else {
- if (empty($identity)) {
- echo gettext("Unknown");
- } else {
- echo $identity;
- }
- }
- }
-?>
- </td>
- <td class="listr">
-<?php
- if (!is_array($ikesa['remote'])) {
- echo gettext("Unknown");
+ if (is_array($ikesa['remote']['auth']) && !empty($ikesa['remote']['auth'][0]['identity'])) {
+ print(htmlspecialchars($ikesa['remote']['auth'][0]['identity']));
+ print('<br/>' . $identity);
} else {
- if (!empty($ikesa['remote']['address'])) {
- echo htmlspecialchars($ikesa['remote']['address']) . '<br/>' .
- gettext('Port: ') . htmlspecialchars($ikesa['remote']['port']);
- } else {
- echo gettext("Unknown");
- }
- if ($ikesa['remote']['port'] == '4500') {
- echo " NAT-T";
- }
+ if (empty($identity))
+ print(ettext("Unknown"));
+ else
+ print($identity);
}
+ }
?>
- </td>
- <td class="listr">
- IKEv<?php echo htmlspecialchars($ikesa['version']);?>
- <br/>
-<?php
- echo htmlspecialchars($ikesa['role']);
-?>
- </td>
- <td class="listr">
-<?php
- echo htmlspecialchars($ikesa['reauth']);
-?>
- </td>
- <td class="listr">
-<?php
- echo htmlspecialchars($ikesa['encalg']);
- echo "<br/>";
- echo htmlspecialchars($ikesa['intalg']);
- echo "<br/>";
- echo htmlspecialchars($ikesa['prfalg']);
- echo "<br/>";
- echo htmlspecialchars($ikesa['dhgroup']);
+ </td>
+ <td>
+<?php
+ if (!is_array($ikesa['remote']))
+ print(gettext("Unknown"));
+ else {
+ if (!empty($ikesa['remote']['address']))
+ print(htmlspecialchars($ikesa['remote']['address']) . '<br/>' . gettext('Port: ') . htmlspecialchars($ikesa['remote']['port']));
+ else
+ print(gettext("Unknown"));
+ if ($ikesa['remote']['port'] == '4500')
+ print(" NAT-T");
+ }
?>
- </td>
- <td class="listr">
- <center>
- <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_<?php echo $icon; ?>.gif" title="<?php echo $ikesa['status']; ?>" alt=""/>
- <br/><?php echo htmlspecialchars($ikesa['status']);?>
- <br/><?php echo htmlspecialchars($ikesa['established']);?>
- </center>
- </td>
- <td >
+ </td>
+ <td>
+ IKEv<?=htmlspecialchars($ikesa['version'])?>
+ <br/>
+ <?=htmlspecialchars($ikesa['role'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($ikesa['reauth']);?>
+ </td>
+ <td>
+ <?=htmlspecialchars($ikesa['encalg'])?>
+ <br/>
+ <?=htmlspecialchars($ikesa['intalg'])?>
+ <br/>
+ <?=htmlspecialchars($ikesa['prfalg'])?>
+ <br/>
+ <?=htmlspecialchars($ikesa['dhgroup'])?>
+ </td>
+ <td>
+<?php
+ if($ikesa['status'] == 'established')
+ print('<span style="color:green">');
+ else
+ print('<span>');
+?>
+ <?=ucfirst(htmlspecialchars($ikesa['status']))?>
+ <br/><?=htmlspecialchars($ikesa['established'])?>
+ </span>
+ </td>
+ <td >
<?php
if ($icon != "pass"):
?>
- <center>
- <a href="diag_ipsec.php?act=connect&amp;ikeid=<?php echo $con_id; ?>">
- <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_service_start.gif" alt=<?php echo gettext("Connect VPN");?> title=<?php echo gettext("Connect VPN");?> border="0"/>
+ <a href="diag_ipsec.php?act=connect&amp;ikeid=<?=$con_id; ?>" class="btn btn-xs btn-success" data-toggle="tooltip" title="Connect VPN" >
+ <?=gettext("Connect VPN")?>
</a>
- </center>
<?php
else:
?>
- <center>
- <a href="diag_ipsec.php?act=ikedisconnect&amp;ikeid=<?php echo $con_id; ?>">
- <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_service_stop.gif" alt=<?php echo gettext("Disconnect VPN");?> title=<?php echo gettext("Disconnect VPN");?> border="0"/>
- </a>
- <a href="diag_ipsec.php?act=ikedisconnect&amp;ikeid=<?php echo $con_id; ?>&amp;ikesaid=<?php echo $ikesa['id']; ?>">
- <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" alt=<?php echo gettext("Disconnect VPN Connection");?> title=<?php echo gettext("Disconnect VPN Connection");?> border="0"/>
+ <a href="diag_ipsec.php?act=ikedisconnect&amp;ikeid=<?=$con_id; ?>" class="btn btn-xs btn-danger" data-toggle="tooltip" title="Disconnect VPN">
+ <?=gettext("Disconnect")?>
+ </a><br />
+ <a href="diag_ipsec.php?act=ikedisconnect&amp;ikeid=<?=$con_id; ?>&amp;ikesaid=<?=$ikesa['id']; ?>" class="btn btn-xs btn-warning" data-toggle="tooltip" title="Disconnect VPN connection">
+ <?=gettext("Disconnect")?>
</a>
- </center>
<?php
endif;
?>
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="">
- </table>
- </td>
- </tr>
-<?php
- if (is_array($ikesa['childsalist'])):
-?>
- <tr>
- <td class="listrborder" colspan="9">
- <div id="btnchildsa-<?=$ikeid;?>">
- <input type="button" onclick="show_childsa('childsa-<?=$ikeid;?>', 'btnchildsa-<?=$ikeid;?>');" value="+" /> - Show child SA entries
- </div>
- <table class="tabcont" width="100%" height="100%" border="0" cellspacing="0" cellpadding="0" id="childsa-<?=$ikeid;?>" style="display:none" summary="">
- <thead>
- <tr>
- <th class="listhdrr nowrap"><?php echo gettext("Local subnets");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Local SPI(s)");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Remote subnets");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Times");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Algo");?></th>
- <th class="listhdrr nowrap"><?php echo gettext("Stats");?></th>
- </tr>
- </thead>
- <tbody>
-<?php
- if (is_array($ikesa['childsalist']['childsa'])):
- foreach ($ikesa['childsalist']['childsa'] as $childsa):
-?>
- <tr valign="top">
- <td class="listlr nowrap">
-<?php
- if (is_array($childsa['local']) &&
- is_array($childsa['local']['networks']) &&
- is_array($childsa['local']['networks']['network'])) {
- foreach ($childsa['local']['networks']['network'] as $lnets) {
- echo htmlspecialchars(ipsec_fixup_network($lnets)) . "<br />";
- }
- } else {
- echo gettext("Unknown");
- }
-?>
- </td>
- <td class="listr nowrap">
-<?php
- if (is_array($childsa['local'])) {
- echo gettext("Local: ") . htmlspecialchars($childsa['local']['spi']);
- }
- if (is_array($childsa['remote'])) {
- echo "<br/>" . gettext("Remote: ") . htmlspecialchars($childsa['remote']['spi']);
- }
-?>
- </td>
- <td class="listr nowrap">
+ </td>
+ </tr>
+ <tr>
+ <td colspan = 10>
<?php
- if (is_array($childsa['remote']) &&
- is_array($childsa['remote']['networks']) &&
- is_array($childsa['remote']['networks']['network'])) {
- foreach ($childsa['remote']['networks']['network'] as $rnets) {
- echo htmlspecialchars(ipsec_fixup_network($rnets)) . "<br />";
- }
- } else {
- echo gettext("Unknown");
- }
+ if (is_array($ikesa['childsalist'])):
?>
- </td>
- <td class="listr nowrap">
-<?php
- echo gettext("Rekey: ") . htmlspecialchars($childsa['rekey']);
- echo "<br/>" . gettext("Life: ") . htmlspecialchars($childsa['lifetime']);
- echo "<br/>" . gettext("Install: ") .htmlspecialchars($childsa['installtime']);
+ <div id="btnchildsa-<?=$ikeid?>">
+ <a type="button" onclick="show_childsa('childsa-<?=$ikeid?>','btnchildsa-<?=$ikeid?>');" class="btn btn-sm btn-default" />
+ <?=gettext('Show child SA entries')?>
+ </a>
+ </div>
+
+ <table class="table table-hover table-condensed" id="childsa-<?=$ikeid?>" style="display:none">
+ <thead>
+ <tr class="info">
+ <th><?=gettext("Local subnets")?></th>
+ <th><?=gettext("Local SPI(s)")?></th>
+ <th><?=gettext("Remote subnets")?></th>
+ <th><?=gettext("Times")?></th>
+ <th><?=gettext("Algo")?></th>
+ <th><?=gettext("Stats")?></th>
+ <th><!-- Buttons --></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+ if (is_array($ikesa['childsalist']['childsa'])):
+ foreach ($ikesa['childsalist']['childsa'] as $childsa):
+?>
+ <tr>
+ <td>
+<?php
+ if (is_array($childsa['local']) &&
+ is_array($childsa['local']['networks']) &&
+ is_array($childsa['local']['networks']['network']))
+ foreach ($childsa['local']['networks']['network'] as $lnets)
+ print(htmlspecialchars(ipsec_fixup_network($lnets)) . "<br />");
+ else
+ print(gettext("Unknown"));
+?>
+ </td>
+ <td>
+<?php
+ if (is_array($childsa['local']))
+ print(gettext("Local: ") . htmlspecialchars($childsa['local']['spi']));
+
+ if (is_array($childsa['remote']))
+ print('<br/>' . gettext('Remote: ') . htmlspecialchars($childsa['remote']['spi']));
+?>
+ </td>
+ <td>
+<?php
+ if (is_array($childsa['remote']) &&
+ is_array($childsa['remote']['networks']) &&
+ is_array($childsa['remote']['networks']['network']))
+ foreach ($childsa['remote']['networks']['network'] as $rnets)
+ print(htmlspecialchars(ipsec_fixup_network($rnets)) . '<br />');
+ else
+ print(gettext("Unknown"));
+?>
+ </td>
+ <td>
+<?php
+ print(gettext("Rekey: ") . htmlspecialchars($childsa['rekey']));
+ print('<br/>' . gettext('Life: ') . htmlspecialchars($childsa['lifetime']));
+ print('<br/>' . gettext('Install: ') .htmlspecialchars($childsa['installtime']));
?>
- </td>
- <td class="listr nowrap">
-<?php
- echo htmlspecialchars($childsa['encalg']);
- echo "<br/>";
- echo htmlspecialchars($childsa['intalg']);
- echo "<br/>";
- if (!empty($childsa['prfalg'])) {
- echo htmlspecialchars($childsa['prfalg']);
- echo "<br/>";
- }
- if (!empty($childsa['dhgroup'])) {
- echo htmlspecialchars($childsa['dhgroup']);
- echo "<br/>";
- }
- if (!empty($childsa['esn'])) {
- echo htmlspecialchars($childsa['esn']);
- echo "<br/>";
- }
- echo gettext("IPComp: ") . htmlspecialchars($childsa['ipcomp']);
-?>
- </td>
- <td class="listr nowrap">
-<?php
- echo gettext("Bytes-In: ") . htmlspecialchars($childsa['bytesin']);
- echo "<br/>";
- echo gettext("Packets-In: ") . htmlspecialchars($childsa['packetsin']);
- echo "<br/>";
- echo gettext("Bytes-Out: ") . htmlspecialchars($childsa['bytesout']);
- echo "<br/>";
- echo gettext("Packets-Out: ") . htmlspecialchars($childsa['packetsout']);
-?>
- </td>
- <td>
- <center>
- <a href="diag_ipsec.php?act=childdisconnect&amp;ikeid=<?php echo $con_id; ?>&amp;ikesaid=<?php echo $childsa['reqid']; ?>">
- <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" alt=<?php echo gettext("Disconnect Child SA");?> title=<?php echo gettext("Disconnect Child SA");?> border="0"/>
- </a>
- </center>
- </td>
- <td class="list nowrap">
- &nbsp;
- </td>
- </tr>
-<?php
- endforeach;
- endif;
+ </td>
+ <td>
+<?php
+ print(htmlspecialchars($childsa['encalg']) . '<br/>');
+ print(htmlspecialchars($childsa['intalg']) . '<br/>');
+
+ if (!empty($childsa['prfalg']))
+ print(htmlspecialchars($childsa['prfalg']) . '<br/>');
+
+ if (!empty($childsa['dhgroup']))
+ print(htmlspecialchars($childsa['dhgroup']) . '<br/>');
+
+ if (!empty($childsa['esn']))
+
+ print(gettext("IPComp: ") . htmlspecialchars($childsa['ipcomp']));
+?>
+ </td>
+ <td>
+<?php
+ print(gettext("Bytes-In: ") . htmlspecialchars($childsa['bytesin']) . '<br/>');
+ print(gettext("Packets-In: ") . htmlspecialchars($childsa['packetsin']) . '<br/>');
+ print(gettext("Bytes-Out: ") . htmlspecialchars($childsa['bytesout']) . '<br/>');
+ print(gettext("Packets-Out: ") . htmlspecialchars($childsa['packetsout']) . '<br/>');
+?>
+ </td>
+ <td>
+ <a href="diag_ipsec.php?act=childdisconnect&amp;ikeid=<?=$con_id; ?>&amp;ikesaid=<?=$childsa['reqid']; ?>" class="btn btn-xs btn-warning" data-toggle="tooltip" title="<?=gettext('Disconnect Child SA')?>">
+ <?=gettext("Disconnect")?>
+ </a>
+ </td>
+ </tr>
+<?php
+ endforeach;
+ endif;
?>
- <tr style="display:none;"><td></td></tr>
- </tbody>
- </table>
- </td>
- </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
<?php
- endif;
+ endif;
- unset($con_id);
- endforeach;
- endif;
+ unset($con_id);
+ endforeach;
+endif;
- $rgmap = array();
- foreach ($a_phase1 as $ph1ent):
- if (isset($ph1ent['disabled'])) {
- continue;
- }
- $rgmap[$ph1ent['remote-gateway']] = $ph1ent['remote-gateway'];
- if ($ipsecconnected[$ph1ent['ikeid']]) {
- continue;
- }
-?>
- <tr>
- <td class="listlr">
-<?php
- echo htmlspecialchars($ph1ent['descr']);
-?>
- </td>
- <td class="listr">
-<?php
- list ($myid_type, $myid_data) = ipsec_find_id($ph1ent, "local");
- if (empty($myid_data)) {
- echo gettext("Unknown");
- } else {
- echo htmlspecialchars($myid_data);
- }
-?>
- </td>
- <td class="listr">
-<?php
- $ph1src = ipsec_get_phase1_src($ph1ent);
- if (empty($ph1src)) {
- echo gettext("Unknown");
- } else {
- echo htmlspecialchars($ph1src);
- }
-?>
- </td>
- <td class="listr">
-<?php
- list ($peerid_type, $peerid_data) = ipsec_find_id($ph1ent, "peer", $rgmap);
- if (empty($peerid_data)) {
- echo gettext("Unknown");
- } else {
- echo htmlspecialchars($peerid_data);
- }
-?>
- </td>
- <td class="listr">
-<?php
- $ph1src = ipsec_get_phase1_dst($ph1ent);
- if (empty($ph1src)) {
- echo gettext("Unknown");
- } else {
- echo htmlspecialchars($ph1src);
- }
-?>
- </td>
- <td class="listr" >
- </td>
- <td class="listr" >
- </td>
- <td class="listr" >
- </td>
-<?php
- if (isset($ph1ent['mobile'])):
-?>
- <td class="listr">
- <center>
- <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_pass.gif" title=<?php echo gettext("Awaiting connections");?> alt=""/>
- <br/><?php echo gettext("Awaiting connections");?>
- </center>
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="">
- </table>
- </td>
-<?php
- else:
-?>
- <td class="listr">
- <center>
- <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_reject.gif" title=<?php echo gettext("Disconnected");?> alt=""/>
- <br/><?php echo gettext("Disconnected");?>
- </center>
- </td>
- <td >
- <center>
- <a href="diag_ipsec.php?act=connect&amp;ikeid=<?php echo $ph1ent['ikeid']; ?>">
- <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_service_start.gif" alt=<?php echo gettext("Connect VPN");?> title=<?php echo gettext("Connect VPN");?> border="0"/>
+$rgmap = array();
+foreach ($a_phase1 as $ph1ent):
+ if (isset($ph1ent['disabled']))
+ continue;
+
+ $rgmap[$ph1ent['remote-gateway']] = $ph1ent['remote-gateway'];
+
+ if ($ipsecconnected[$ph1ent['ikeid']])
+ continue;
+?>
+ <tr>
+ <td>
+<?php
+ print(htmlspecialchars($ph1ent['descr']));
+?>
+ </td>
+ <td>
+<?php
+ list ($myid_type, $myid_data) = ipsec_find_id($ph1ent, "local");
+ if (empty($myid_data))
+ print(gettext("Unknown"));
+ else
+ print(htmlspecialchars($myid_data));
+?>
+ </td>
+ <td>
+<?php
+ $ph1src = ipsec_get_phase1_src($ph1ent);
+
+ if (empty($ph1src))
+ print(gettext("Unknown"));
+ else
+ print(htmlspecialchars($ph1src));
+?>
+ </td>
+ <td>
+<?php
+ list ($peerid_type, $peerid_data) = ipsec_find_id($ph1ent, "peer", $rgmap);
+ if (empty($peerid_data))
+ print(gettext("Unknown"));
+ else
+ print(htmlspecialchars($peerid_data));
+?>
+ </td>
+ <td>
+<?php
+ $ph1src = ipsec_get_phase1_dst($ph1ent);
+ if (empty($ph1src))
+ print(gettext("Unknown"));
+ else
+ print(htmlspecialchars($ph1src));
+?>
+ </td>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td>
+ </td>
+<?php
+ if (isset($ph1ent['mobile'])):
+?>
+ <td>
+ <?=gettext("Awaiting connections")?>
+ </td>
+ <td>
+ </td>
+<?php
+ else:
+?>
+ <td>
+ <?=gettext("Disconnected")?>
+ </td>
+ <td >
+ <a href="diag_ipsec.php?act=connect&amp;ikeid=<?=$ph1ent['ikeid']; ?>" class="btn btn-xs btn-success">
+ <?=gettext("Connect VPN")?>
</a>
- </center>
- </td>
+ </td>
<?php
- endif;
+ endif;
?>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="">
- </table>
- </td>
- </tr>
+ <td>>
+ </td>
+ </tr>
<?php
- endforeach;
- unset($ipsecconnected, $phase1, $rgmap);
+endforeach;
+unset($ipsecconnected, $phase1, $rgmap);
?>
- <tr style="display:none;"><td></td></tr>
- </tbody>
+ </tbody>
</table>
- </div>
- </td>
- </tr>
-</table>
+ </div>
+</div>
-<p class="vexpl">
- <span class="red">
- <strong><?php echo gettext("Note:");?><br /></strong>
- </span>
- <?php echo gettext("You can configure IPsec");?>
- <a href="vpn_ipsec.php">here</a>.
-</p>
-<?php unset($status); include("fend.inc"); ?>
<script type="text/javascript">
//<![CDATA[
function show_childsa(id, buttonid) {
@@ -551,5 +511,8 @@ function show_childsa(id, buttonid) {
}
//]]>
</script>
-</body>
-</html>
+
+<?php
+unset($status);
+print_info_box(gettext("You can configure IPsec ") . '<a href="vpn_ipsec.php">Here</a>');
+include("foot.inc"); ?>
diff --git a/src/usr/local/www/diag_ipsec_leases.php b/src/usr/local/www/diag_ipsec_leases.php
index 501c83a..0bf5012 100644
--- a/src/usr/local/www/diag_ipsec_leases.php
+++ b/src/usr/local/www/diag_ipsec_leases.php
@@ -2,35 +2,62 @@
/* $Id$ */
/*
diag_ipsec_leases.php
- Copyright (C) 2014 Ermal Luçi
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2014 Ermal Luçi
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/local/sbin/ipsec
- pfSense_MODULE: ipsec
+ pfSense_MODULE: ipsec
*/
##|+PRIV
@@ -40,92 +67,100 @@
##|*MATCH=diag_ipsec_leases.php*
##|-PRIV
+define(DEBUG, true); // Force dummy data for testing. Setting up a pFSense box to get real data is far too hard!
+
require("guiconfig.inc");
require("ipsec.inc");
-$pgtitle = array(gettext("Status"), gettext("IPsec"), gettext("Leases"));
+$pgtitle = array(gettext("Status"),gettext("IPsec"),gettext("Leases"));
$shortcut_section = "ipsec";
include("head.inc");
$mobile = ipsec_dump_mobile();
+$tab_array = array();
+$tab_array[] = array(gettext("Overview"), false, "diag_ipsec.php");
+$tab_array[] = array(gettext("Leases"), true, "diag_ipsec_leases.php");
+$tab_array[] = array(gettext("SAD"), false, "diag_ipsec_sad.php");
+$tab_array[] = array(gettext("SPD"), false, "diag_ipsec_spd.php");
+$tab_array[] = array(gettext("Logs"), false, "diag_logs.php?logfile=ipsec");
+display_top_tabs($tab_array);
+
+if (isset($mobile['pool']) && is_array($mobile['pool'])) {
+?>
+ <div class="table-responsive">
+ <table class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Pool")?></th>
+ <th><?=gettext("Usage")?></th>
+ <th><?=gettext("Online")?></th>
+ <th><?=gettext("ID")?></th>
+ <th><?=gettext("Host")?></th>
+ <th><?=gettext("Status")?></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+ foreach($mobile['pool'] as $pool) {
+ // The first row of each pool includes the pool information
+?>
+ <tr>
+ <td>
+ <?=$pool['name']?>
+ </td>
+ <td>
+ <?=$pool['usage']?>
+ </td>
+ <td>
+ <?=$pool['online']?>
+ </td>
+
+<?php
+ $leaserow = true;
+ if (is_array($pool['lease']) && count($pool['lease']) > 0) {
+ foreach ($pool['lease'] as $lease) {
+ if(!$leaserow) {
+ // On subsequent rows the first three columns are blank
?>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+<?php
+ }
+ $leaserow = false;
+?>
+ <td>
+ <?=htmlspecialchars($lease['id'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($lease['host'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($lease['status'])?>
+ </td>
+ </tr>
+<?php
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
- <?php include("fbegin.inc"); ?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status ipsec sad">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Overview"), false, "diag_ipsec.php");
- $tab_array[1] = array(gettext("Leases"), true, "diag_ipsec_leases.php");
- $tab_array[2] = array(gettext("SAD"), false, "diag_ipsec_sad.php");
- $tab_array[3] = array(gettext("SPD"), false, "diag_ipsec_spd.php");
- $tab_array[4] = array(gettext("Logs"), false, "diag_logs_ipsec.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <?php if (isset($mobile['pool']) && is_array($mobile['pool'])): ?>
- <?php foreach ($mobile['pool'] as $pool): ?>
- <table class="tabcont sortable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="4" valign="top" class="listtopic">
- <?php
- echo gettext("Pool: ") . $pool['name'];
- echo ' ' . gettext("usage: ") . $pool['usage'];
- echo ' ' . gettext("online: ") . $pool['online'];
- ?>
- </td>
- </tr>
- <?php if (is_array($pool['lease']) && count($pool['lease']) > 0): ?>
- <tr>
- <td class="listhdrr nowrap"><?=gettext("ID");?></td>
- <td class="listhdrr nowrap"><?=gettext("Host");?></td>
- <td class="listhdrr nowrap"><?=gettext("Status");?></td>
- <td class="list nowrap"></td>
- </tr>
- <?php foreach ($pool['lease'] as $lease): ?>
- <tr>
- <td class="listlr"><?=htmlspecialchars($lease['id']);?></td>
- <td class="listr"><?=htmlspecialchars($lease['host']);?></td>
- <td class="listr"><?=htmlspecialchars($lease['status']);?></td>
- <td class="list nowrap">
- </td>
- </tr>
- <?php endforeach;
- else: ?>
- <tr>
- <td>
- <p><strong><?=gettext("No leases from this pool yet.");?></strong></p>
- </td>
- </tr>
- <?php endif; ?>
- </table>
- <?php endforeach; ?>
- <?php else: ?>
- <table class="tabcont sortable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td>
- <p><strong><?=gettext("No IPsec pools.");?></strong></p>
- </td>
- </tr>
- </table>
- <?php endif; ?>
- </div>
- </td>
- </tr>
- </table>
+ }
+ }
+ else {
+?>
+ <td colspan="3" class="warning"><?=gettext('No leases from this pool yet.')?></td>
+ </tr>
+<?php
+ }
+ }
+?>
+ </tbody>
+ </table>
+ </div>
+<?php
+}
+else
+ print_info_box(gettext('No IPsec pools.'));
-<p class="vexpl">
-<span class="red"><strong><?=gettext("Note:");?><br /></strong></span>
-<?=gettext("You can configure your IPsec");?> <a href="vpn_ipsec.php"><?=gettext("here.");?></a>
-</p>
+print_info_box(gettext('You can configure your IPsec subsystem by clicking ') . '<a href="vpn_ipsec.php">' . gettext("here.") . '</a>');
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc");
diff --git a/src/usr/local/www/diag_ipsec_sad.php b/src/usr/local/www/diag_ipsec_sad.php
index f958d29..2a9579f 100644
--- a/src/usr/local/www/diag_ipsec_sad.php
+++ b/src/usr/local/www/diag_ipsec_sad.php
@@ -2,39 +2,62 @@
/* $Id$ */
/*
diag_ipsec_sad.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004-2009 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/setkey
- pfSense_MODULE: ipsec
+ pfSense_MODULE: ipsec
*/
##|+PRIV
@@ -47,7 +70,7 @@
require("guiconfig.inc");
require("ipsec.inc");
-$pgtitle = array(gettext("Status"), gettext("IPsec"), gettext("SAD"));
+$pgtitle = array(gettext("Status"),gettext("IPsec"),gettext("SAD"));
$shortcut_section = "ipsec";
include("head.inc");
@@ -63,79 +86,74 @@ if ($_GET['act'] == "del") {
}
}
+$tab_array = array();
+$tab_array[] = array(gettext("Overview"), false, "diag_ipsec.php");
+$tab_array[] = array(gettext("Leases"), false, "diag_ipsec_leases.php");
+$tab_array[] = array(gettext("SAD"), true, "diag_ipsec_sad.php");
+$tab_array[] = array(gettext("SPD"), false, "diag_ipsec_spd.php");
+$tab_array[] = array(gettext("Logs"), false, "diag_logs.php?logfile=ipsec");
+display_top_tabs($tab_array);
+
+if (count($sad)) {
?>
+ <div table-responsive>
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Source")?></th>
+ <th><?=gettext("Destination")?></th>
+ <th><?=gettext("Protocol")?></th>
+ <th><?=gettext("SPI")?></th>
+ <th><?=gettext("Enc. alg.")?></th>
+ <th><?=gettext("Auth. alg.")?></th>
+ <th><?=gettext("Data")?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($sad as $sa) { ?>
+ <tr>
+ <td>
+ <?=htmlspecialchars($sa['src'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($sa['dst'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars(strtoupper($sa['proto']))?>
+ </td>
+ <td>
+ <?=htmlspecialchars($sa['spi'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($sa['ealgo'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($sa['aalgo'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($sa['data'])?></td>
+ <td>
+ <?php
+ $args = "src=" . rawurlencode($sa['src']);
+ $args .= "&amp;dst=" . rawurlencode($sa['dst']);
+ $args .= "&amp;proto=" . rawurlencode($sa['proto']);
+ $args .= "&amp;spi=" . rawurlencode("0x" . $sa['spi']);
+ ?>
+ <a class="btn btn-xs btn-danger" href="diag_ipsec_sad.php?act=del&amp;<?=$args?>">Delete</a>
+ </td>
+ </tr>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
- <?php include("fbegin.inc"); ?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status ipsec sad">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Overview"), false, "diag_ipsec.php");
- $tab_array[1] = array(gettext("Leases"), false, "diag_ipsec_leases.php");
- $tab_array[2] = array(gettext("SAD"), true, "diag_ipsec_sad.php");
- $tab_array[3] = array(gettext("SPD"), false, "diag_ipsec_spd.php");
- $tab_array[4] = array(gettext("Logs"), false, "diag_logs_ipsec.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont sortable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <?php if (count($sad)): ?>
- <tr>
- <td class="listhdrr nowrap"><?=gettext("Source");?></td>
- <td class="listhdrr nowrap"><?=gettext("Destination");?></td>
- <td class="listhdrr nowrap"><?=gettext("Protocol");?></td>
- <td class="listhdrr nowrap"><?=gettext("SPI");?></td>
- <td class="listhdrr nowrap"><?=gettext("Enc. alg.");?></td>
- <td class="listhdr nowrap"><?=gettext("Auth. alg.");?></td>
- <td class="listhdr nowrap"><?=gettext("Data");?></td>
- <td class="list nowrap"></td>
- </tr>
- <?php foreach ($sad as $sa): ?>
- <tr>
- <td class="listlr"><?=htmlspecialchars($sa['src']);?></td>
- <td class="listr"><?=htmlspecialchars($sa['dst']);?></td>
- <td class="listr"><?=htmlspecialchars(strtoupper($sa['proto']));?></td>
- <td class="listr"><?=htmlspecialchars($sa['spi']);?></td>
- <td class="listr"><?=htmlspecialchars($sa['ealgo']);?></td>
- <td class="listr"><?=htmlspecialchars($sa['aalgo']);?></td>
- <td class="listr"><?=htmlspecialchars($sa['data']);?></td>
- <td class="list nowrap">
- <?php
- $args = "src=" . rawurlencode($sa['src']);
- $args .= "&amp;dst=" . rawurlencode($sa['dst']);
- $args .= "&amp;proto=" . rawurlencode($sa['proto']);
- $args .= "&amp;spi=" . rawurlencode("0x" . $sa['spi']);
- ?>
- <a href="diag_ipsec_sad.php?act=del&amp;<?=$args;?>" onclick="return confirm('<?=gettext("Do you really want to delete this security association?"); ?>')">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" />
- </a>
- </td>
- </tr>
- <?php endforeach; ?>
- <?php else: ?>
- <tr>
- <td>
- <p><strong><?=gettext("No IPsec security associations.");?></strong></p>
- </td>
- </tr>
- <?php endif; ?>
- </table>
- </div>
- </td>
- </tr>
- </table>
+ <?php
+ } ?>
+ </tbody>
+ </table>
+ </div>
+<?php
+ }
+else
+ print_info_box(gettext('No IPsec security associations.'));
-<p class="vexpl">
-<span class="red"><strong><?=gettext("Note:");?><br /></strong></span>
-<?=gettext("You can configure your IPsec");?> <a href="vpn_ipsec.php"><?=gettext("here.");?></a>
-</p>
+print_info_box(gettext('You can configure your IPsec subsystem by clicking ') . '<a href="vpn_ipsec.php">' . gettext("here.") . '</a>');
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_ipsec_spd.php b/src/usr/local/www/diag_ipsec_spd.php
index 5efeda3..c952188 100644
--- a/src/usr/local/www/diag_ipsec_spd.php
+++ b/src/usr/local/www/diag_ipsec_spd.php
@@ -2,39 +2,62 @@
/* $Id$ */
/*
diag_ipsec_spd.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004-2009 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/setkey
- pfSense_MODULE: ipsec
+ pfSense_MODULE: ipsec
*/
##|+PRIV
@@ -44,95 +67,83 @@
##|*MATCH=diag_ipsec_spd.php*
##|-PRIV
+define(DEBUG, true);
+define(RIGHTARROW, '&#x25ba;');
+define(LEFTARROW, '&#x25c0;');
+
require("guiconfig.inc");
require("ipsec.inc");
-$pgtitle = array(gettext("Status"), gettext("IPsec"), gettext("SPD"));
+$pgtitle = array(gettext("Status"),gettext("IPsec"),gettext("SPD"));
$shortcut_section = "ipsec";
include("head.inc");
-$spd = ipsec_dump_spd();
+if(DEBUG) { // Dummy data for testing. REMOVE for production
+ $spd = array ( 0 => array ( 'srcid' => '172.27.0.0/16', 'dstid' => '172.21.2.0/24', 'dir' => 'in' , 'proto' => 'esp', 'dst' => '184.57.8.247', 'src' => '208.123.73.7', 'reqid' => 'nique:1' ),
+ 1 => array ( 'srcid' => '172.21.2.0/24', 'dstid' => '172.27.0.0/16', 'dir' => 'out', 'proto' => 'esp', 'dst' => '208.123.73.7', 'src' => '184.57.8.247', 'reqid' => 'nique:1' ) );
+}
+else
+ $spd = ipsec_dump_spd();
+
+$tab_array = array();
+$tab_array[0] = array(gettext("Overview"), false, "diag_ipsec.php");
+$tab_array[1] = array(gettext("Leases"), false, "diag_ipsec_leases.php");
+$tab_array[2] = array(gettext("SAD"), false, "diag_ipsec_sad.php");
+$tab_array[3] = array(gettext("SPD"), true, "diag_ipsec_spd.php");
+$tab_array[4] = array(gettext("Logs"), false, "diag_logs.php?logfile=ipsec");
+display_top_tabs($tab_array);
+
+if (count($spd)){
?>
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?= gettext("Source"); ?></th>
+ <th><?= gettext("Destination"); ?></th>
+ <th><?= gettext("Direction"); ?></th>
+ <th><?= gettext("Protocol"); ?></th>
+ <th><?= gettext("Tunnel endpoints"); ?></th>
+ </tr>
+ </thead>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
- <?php include("fbegin.inc"); ?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status ipsec spd">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Overview"), false, "diag_ipsec.php");
- $tab_array[1] = array(gettext("Leases"), false, "diag_ipsec_leases.php");
- $tab_array[2] = array(gettext("SAD"), false, "diag_ipsec_sad.php");
- $tab_array[3] = array(gettext("SPD"), true, "diag_ipsec_spd.php");
- $tab_array[4] = array(gettext("Logs"), false, "diag_logs_ipsec.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea" style="background:#eeeeee">
- <table class="tabcont sortable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <?php if (count($spd)): ?>
- <tr>
- <td class="listhdrr nowrap"><?= gettext("Source"); ?></td>
- <td class="listhdrr nowrap"><?= gettext("Destination"); ?></td>
- <td class="listhdrr nowrap"><?= gettext("Direction"); ?></td>
- <td class="listhdrr nowrap"><?= gettext("Protocol"); ?></td>
- <td class="listhdrr nowrap"><?= gettext("Tunnel endpoints"); ?></td>
- <td class="list nowrap"></td>
- </tr>
- <?php foreach ($spd as $sp): ?>
- <tr>
- <td class="listlr" valign="top"><?=htmlspecialchars($sp['srcid']);?></td>
- <td class="listr" valign="top"><?=htmlspecialchars($sp['dstid']);?></td>
- <td class="listr" valign="top">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_<?=$sp['dir'];?>.gif" width="11" height="11" style="margin-top: 2px" alt="direction" />
- </td>
- <td class="listr" valign="top"><?=htmlspecialchars(strtoupper($sp['proto']));?></td>
- <td class="listr" valign="top"><?=htmlspecialchars($sp['src']);?> -> <?=htmlspecialchars($sp['dst']);?></td>
- <td class="list nowrap">
- <?php
- $args = "srcid=".rawurlencode($sp['srcid']);
- $args .= "&amp;dstid=".rawurlencode($sp['dstid']);
- $args .= "&amp;dir=".rawurlencode($sp['dir']);
- ?>
- </td>
- </tr>
- <?php endforeach; ?>
- </table>
- <br />
- <table class="tabcont" border="0" cellspacing="0" cellpadding="6" summary="policies">
- <tr>
- <td width="16"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_in.gif" width="11" height="11" alt="in" /></td>
- <td><?= gettext("incoming (as seen by firewall)"); ?></td>
- </tr>
- <tr>
- <td colspan="5" height="4"></td>
- </tr>
- <tr>
- <td><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_out.gif" width="11" height="11" alt="out" /></td>
- <td><?= gettext("outgoing (as seen by firewall)"); ?></td>
- </tr>
- <?php else: ?>
- <tr>
- <td>
- <p><strong><?= gettext("No IPsec security policies."); ?></strong></p>
- </td>
- </tr>
- <?php endif; ?>
- </table>
- </div>
- </td>
- </tr>
- </table>
+ <tbody>
+<?php
+ foreach ($spd as $sp) {
+ if($sp['dir'] == 'in')
+ $dirstr = LEFTARROW . ' Inbound';
+ else
+ $dirstr = RIGHTARROW . ' Outbound';
+?>
+ <tr>
+ <td>
+ <?=htmlspecialchars($sp['srcid'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($sp['dstid'])?>
+ </td>
+ <td>
+ <?=$dirstr ?>
+ </td>
+ <td>
+ <?=htmlspecialchars(strtoupper($sp['proto']))?>
+ </td>
+ <td>
+ <?=htmlspecialchars($sp['src'])?> -&gt; <?=htmlspecialchars($sp['dst'])?>
+ </td>
+ </tr>
+<?php
+ }
+?>
+ </tbody>
+ </table>
+ </div>
+<?php
+ } // e-o-if (count($spd))
+else {
+ print_info_box(gettext('No IPsec security policies configured.'));
+}
-<p class="vexpl">
-<span class="red"><strong><?= gettext("Note:"); ?><br /></strong></span>
-<?= gettext("You can configure your IPsec"); ?> <a href="vpn_ipsec.php"><?= gettext("here."); ?></a>
-</p>
+print_info_box(gettext('You can configure your IPsec subsystem by clicking ') . '<a href="vpn_ipsec.php">' . gettext("here.") . '</a>');
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_ipsec_xml.php b/src/usr/local/www/diag_ipsec_xml.php
index 82dcbea..e495685 100644
--- a/src/usr/local/www/diag_ipsec_xml.php
+++ b/src/usr/local/www/diag_ipsec_xml.php
@@ -2,35 +2,58 @@
/* $Id$ */
/*
diag_ipsec_xml.php
- Copyright (C) 2007 pfSense Project
- Copyright (C) 2010 Seth Mos
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Parts of this code was originally based on vpn_ipsec_sad.php
- Copyright (C) 2003-2004 Manuel Kasper
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2010 Seth Mos
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
##|+PRIV
##|*IDENT=page-ipsecxml
diff --git a/src/usr/local/www/diag_limiter_info.php b/src/usr/local/www/diag_limiter_info.php
index d4e5b06..8c7cd1f 100644
--- a/src/usr/local/www/diag_limiter_info.php
+++ b/src/usr/local/www/diag_limiter_info.php
@@ -2,35 +2,62 @@
/* $Id$ */
/*
diag_limiter_info.php
- Copyright (C) 2010 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2010 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/bin/top
- pfSense_MODULE: system
+ pfSense_MODULE: system
*/
##|+PRIV
@@ -62,60 +89,36 @@ if ($_REQUEST['getactivity']) {
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
+<script>
function getlimiteractivity() {
- var url = "/diag_limiter_info.php";
- var pars = 'getactivity=yes';
- jQuery.ajax(
- url,
+ $.ajax(
+ '/diag_limiter_info.php',
{
type: 'post',
- data: pars,
- complete: activitycallback
- });
- }
- function activitycallback(transport) {
- jQuery('#limiteractivitydiv').html('<font face="Courier" size="2"><pre style="text-align:left;">' + transport.responseText + '<\/pre><\/font>');
- setTimeout('getlimiteractivity()', 2000);
+ data: {
+ getactivity: 'yes'
+ },
+ success: function (data) {
+ $('#xhrOutput').html(data);
+ },
+ });
}
- setTimeout('getlimiteractivity()', 5000);
-//]]>
+
+ events.push(function(){
+ setInterval('getlimiteractivity()', 2500);
+ getlimiteractivity();
+ });
</script>
-<div id="maincontent">
-<?php
- if ($savemsg) {
- echo "<div id=\"savemsg\">";
- print_info_box($savemsg);
- echo "</div>";
- }
- if ($input_errors) {
- print_input_errors($input_errors);
- }
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag limiter info">
- <tr>
- <td>
- <table id="backuptable" class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
- <tr>
- <td align="center">
- <table summary="results">
- <tr><td>
- <div id="limiteractivitydiv">
- <?=gettext("Gathering Limiter information, please wait...");?>
- </div>
- </td></tr>
- </table>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Limiter Information</h2></div>
+ <div class="panel-body">
+ <pre id="xhrOutput"><?=gettext("Gathering Limiter information, please wait...")?></pre>
+ </div>
</div>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_logs.php b/src/usr/local/www/diag_logs.php
index 2cbfcbb..69422cc 100755
--- a/src/usr/local/www/diag_logs.php
+++ b/src/usr/local/www/diag_logs.php
@@ -2,35 +2,58 @@
/* $Id$ */
/*
diag_logs.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004-2009 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: system
@@ -45,7 +68,13 @@
require("guiconfig.inc");
-$system_logfile = "{$g['varlog_path']}/system.log";
+// The logs to display are specified in a GET argument. Default to 'system' logs
+if(!$_GET['logfile'])
+ $logfile = 'system';
+else
+ $logfile = $_GET['logfile'];
+
+$system_logfile = "{$g['varlog_path']}/{$logfile}.log";
$nentries = $config['syslog']['nentries'];
if (!$nentries) {
@@ -71,75 +100,76 @@ if ($filtertext) {
$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("General"));
include("head.inc");
-?>
+$tab_array = array();
+$tab_array[] = array(gettext("System"), ($logfile == 'system'), "diag_logs.php");
+$tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+$tab_array[] = array(gettext("DHCP"), ($logfile == 'dhcpd'), "diag_logs.php?logfile=dhcpd");
+$tab_array[] = array(gettext("Portal Auth"), ($logfile == 'portalauth'), "diag_logs.php?logfile=portalauth");
+$tab_array[] = array(gettext("IPsec"), ($logfile == 'ipsec'), "diag_logs.php?logfile=ipsec");
+$tab_array[] = array(gettext("PPP"), ($logfile == 'ppp'), "diag_logs.php?logfile=ppp");
+$tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+$tab_array[] = array(gettext("Load Balancer"), ($logfile == 'relayd'), "diag_logs.php?logfile=relayd");
+$tab_array[] = array(gettext("OpenVPN"), ($logfile == 'openvpn'), "diag_logs.php?logfile=openvpn");
+$tab_array[] = array(gettext("NTP"), ($logfile == 'ntpd'), "diag_logs.php?logfile=ntpd");
+$tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+display_top_tabs($tab_array);
+
+$tab_array = array();
+if (in_array($logfile, array('system', 'gateways', 'routing', 'resolver', 'wireless'))) {
+ $tab_array[] = array(gettext("General"), ($logfile == 'system'), "/diag_logs.php");
+ $tab_array[] = array(gettext("Gateways"), ($logfile == 'gateways'), "/diag_logs.php?logfile=gateways");
+ $tab_array[] = array(gettext("Routing"), ($logfile == 'routing'), "/diag_logs.php?logfile=routing");
+ $tab_array[] = array(gettext("Resolver"), ($logfile == 'resolver'), "/diag_logs.php?logfile=resolver");
+ $tab_array[] = array(gettext("Wireless"), ($logfile == 'wireless'), "/diag_logs.php?logfile=wireless");
+ display_top_tabs($tab_array, false, 'nav nav-tabs');
+}
+
+require('classes/Form.class.php');
+
+$form = new Form(false);
+
+$section = new Form_Section('Log file filter');
+
+$section->addInput(new Form_Input(
+ 'filtertext',
+ 'Filter',
+ 'text',
+ $filtertext,
+ ['placeholder' => 'Filter text']
+));
+
+$form->addGlobal(new Form_Button(
+ 'filtersubmit',
+ 'Filter'
+))->removeClass('btn-primary')->addClass('btn-default')->addClass('btn-sm');
+
+$form->addGlobal(new Form_Button(
+ 'clear',
+ 'Clear log'
+))->removeClass('btn-primary')->addClass('btn-danger')->addClass('btn-sm');
+
+$form->add($section);
+print $form;
+
+if($logfile == 'dhcpd')
+ print_info_box('Warning: Clearing the log file will restart the DHCP daemon.');
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs system">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), true, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
?>
- </td>
- </tr>
- <tr>
- <td class="tabnavtbl">
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Last ")?><?=$nentries?> <?=$logfile?><?=gettext(" log entries")?></h2></div>
+ <pre>
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("General"), true, "/diag_logs.php");
- $tab_array[] = array(gettext("Gateways"), false, "/diag_logs_gateways.php");
- $tab_array[] = array(gettext("Routing"), false, "/diag_logs_routing.php");
- $tab_array[] = array(gettext("Resolver"), false, "/diag_logs_resolver.php");
- $tab_array[] = array(gettext("Wireless"), false, "/diag_logs_wireless.php");
- display_top_tabs($tab_array);
+ if(($logfile == 'resolver') || ($logfile == 'system'))
+ $inverse = array("ppp");
+ else
+ $inverse = null;
+
+ if($filtertext)
+ dump_clog_no_table($system_logfile, $nentries, true, array("$filtertext"), $inverse);
+ else
+ dump_clog_no_table($system_logfile, $nentries, true, array(), $inverse);
?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic"><?php printf(gettext("Last %s system log entries"), $nentries); ?></td>
- </tr>
- <?php
- if ($filtertext) {
- dump_clog($system_logfile, $nentries, true, array("$filtertext"), array("ppp"));
- } else {
- dump_clog($system_logfile, $nentries, true, array(), array("ppp"));
- }
- ?>
- <tr>
- <td align="left" valign="top">
- <form id="filterform" name="filterform" action="diag_logs.php" method="post" style="margin-top: 14px;">
- <input id="submit" name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log");?>" />
- </form>
- </td>
- <td align="right" valign="top" >
- <form id="clearform" name="clearform" action="diag_logs.php" method="post" style="margin-top: 14px;">
- <input id="filtertext" name="filtertext" value="<?=$filtertext;?>" />
- <input id="filtersubmit" name="filtersubmit" type="submit" class="formbtn" value="<?=gettext("Filter");?>" />
- </form>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </pre>
+</div>
+
+<?php include("foot.inc"); ?> \ No newline at end of file
diff --git a/src/usr/local/www/diag_logs_auth.php b/src/usr/local/www/diag_logs_auth.php
deleted file mode 100644
index 42bc0ba..0000000
--- a/src/usr/local/www/diag_logs_auth.php
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-/* $Id$ */
-/*
- diag_logs_auth.php
- part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- part of pfSense
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- pfSense_MODULE: captiveportal
-*/
-
-##|+PRIV
-##|*IDENT=page-status-systemlogs-portalauth
-##|*NAME=Status: System logs: Portal Auth page
-##|*DESCR=Allow access to the 'Status: System logs: Portal Auth' page.
-##|*MATCH=diag_logs_auth.php*
-##|-PRIV
-
-require("guiconfig.inc");
-
-$portal_logfile = "{$g['varlog_path']}/portalauth.log";
-
-$nentries = $config['syslog']['nentries'];
-if (!$nentries) {
- $nentries = 50;
-}
-
-if ($_POST['clear']) {
- clear_log_file($portal_logfile);
-}
-
-$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Portal Auth"));
-$shortcut_section = "captiveportal";
-include("head.inc");
-
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs captive portal">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), false, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), true, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic">
- <?php printf(gettext("Last %s Portal Auth log entries"), $nentries);?>
- </td>
- </tr>
- <?php dump_clog($portal_logfile, $nentries, true); ?>
- <tr>
- <td>
- <br />
- <form action="diag_logs_auth.php" method="post">
- <input name="clear" type="submit" class="formbtn" value="<?= gettext("Clear log"); ?>"/>
- </form>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
diff --git a/src/usr/local/www/diag_logs_dhcp.php b/src/usr/local/www/diag_logs_dhcp.php
deleted file mode 100644
index f87845d..0000000
--- a/src/usr/local/www/diag_logs_dhcp.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-/* $Id$ */
-/*
- diag_logs_dhcp.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- pfSense_MODULE: dhcpserver
-*/
-
-##|+PRIV
-##|*IDENT=page-diagnostics-logs-dhcp
-##|*NAME=Diagnostics: Logs: DHCP page
-##|*DESCR=Allow access to the 'Diagnostics: Logs: DHCP' page.
-##|*MATCH=diag_logs_dhcp.php*
-##|-PRIV
-
-require("guiconfig.inc");
-
-$dhcpd_logfile = "{$g['varlog_path']}/dhcpd.log";
-
-$nentries = $config['syslog']['nentries'];
-if (!$nentries) {
- $nentries = 50;
-}
-
-if ($_POST['clear']) {
- clear_log_file($dhcpd_logfile);
- killbyname("dhcpd");
- services_dhcpd_configure();
-}
-
-$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("DHCP"));
-$shortcut_section = "dhcp";
-include("head.inc");
-
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs dhcp">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), false, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), true, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic">
- <?php printf(gettext("Last %s DHCP service log entries"), $nentries);?>
- </td>
- </tr>
- <?php dump_clog($dhcpd_logfile, $nentries); ?>
- <tr>
- <td>
- <br />
- <form action="diag_logs_dhcp.php" method="post">
- <input name="clear" type="submit" class="formbtn" value="<?= gettext("Clear log");?>" />
- </form>
- </td>
- <td>NOTE: Clearing the log file will restart the DHCP daemon.</td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
diff --git a/src/usr/local/www/diag_logs_filter.php b/src/usr/local/www/diag_logs_filter.php
index b583035..fd4df31 100644
--- a/src/usr/local/www/diag_logs_filter.php
+++ b/src/usr/local/www/diag_logs_filter.php
@@ -2,37 +2,63 @@
/* $Id$ */
/*
diag_logs_filter.php
- part of pfSense
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- originally based on m0n0wall (http://m0n0.ch/wall)
-
- Copyright (C) 2003-2009 Manuel Kasper <mk@neon1.net>,
- Jim Pingle jim@pingle.org
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004-2009 Scott Ullrich
+ * Copyright (c) 2003-2009 Manuel Kasper <mk@neon1.net>
+ * Jim Pingle jim@pingle.org
+ * originally based on m0n0wall (http://m0n0.ch/wall)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
+
/*
pfSense_MODULE: filter
*/
@@ -82,6 +108,7 @@ if ($rulenum) {
}
$filtersubmit = getGETPOSTsettingvalue('filtersubmit', null);
+
if ($filtersubmit) {
$interfacefilter = getGETPOSTsettingvalue('interface', null);
$filtertext = getGETPOSTsettingvalue('filtertext', "");
@@ -89,6 +116,7 @@ if ($filtersubmit) {
}
$filterlogentries_submit = getGETPOSTsettingvalue('filterlogentries_submit', null);
+
if ($filterlogentries_submit) {
$filterfieldsarray = array();
@@ -129,336 +157,357 @@ $pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Firewall"))
$shortcut_section = "firewall";
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<script src="/javascript/filter_log.js" type="text/javascript"></script>
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs filter">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), false, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), true, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Normal View"), true, "/diag_logs_filter.php");
- $tab_array[] = array(gettext("Dynamic View"), false, "/diag_logs_filter_dynamic.php");
- $tab_array[] = array(gettext("Summary View"), false, "/diag_logs_filter_summary.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" style="sortableMultirow:<?=$config['syslog']['filterdescriptions'] === "2"?2:1?>" summary="main area">
- <tr>
- <td colspan="<?=(!isset($config['syslog']['rawfilter']))?7:2?>" align="left" valign="middle">
- <div id="filterlogentries_show" class="widgetconfigdiv" style="<?=(!isset($config['syslog']['rawfilter']))?"":"display:none"?>">
- <form id="filterlogentries" name="filterlogentries" action="diag_logs_filter.php" method="post">
- <?php
- $Include_Act = explode(",", str_replace(" ", ",", $filterfieldsarray['act']));
- if ($filterfieldsarray['interface'] == "All") $interface = "";
- ?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="action">
- <tr>
- <td rowspan="2">
- <div align="center"><?=gettext("Action");?></div>
- <div align="left">
- <input id="actpass" name="actpass" type="checkbox" value="Pass" <?php if (in_arrayi('Pass', $Include_Act)) echo "checked=\"checked\""; ?> /> Pass<br />
- <input id="actblock" name="actblock" type="checkbox" value="Block" <?php if (in_arrayi('Block', $Include_Act)) echo "checked=\"checked\""; ?> /> Block<br />
- </div>
- </td>
- <td>
- <div align="center"><?=gettext("Time");?></div>
- <div align="center"><input id="filterlogentries_time" name="filterlogentries_time" class="formfld search" type="text" size="12" value="<?= htmlspecialchars($filterfieldsarray['time']) ?>" /></div>
- </td>
- <td>
- <div align="center"><?=gettext("Source IP Address");?></div>
- <div align="center"><input id="filterlogentries_sourceipaddress" name="filterlogentries_sourceipaddress" class="formfld search" type="text" size="35" value="<?= htmlspecialchars($filterfieldsarray['srcip']) ?>" /></div>
- </td>
- <td>
- <div align="center"><?=gettext("Source Port");?></div>
- <div align="center"><input id="filterlogentries_sourceport" name="filterlogentries_sourceport" class="formfld search" type="text" size="10" value="<?= htmlspecialchars($filterfieldsarray['srcport']) ?>" /></div>
- </td>
- <td>
- <div align="center"><?=gettext("Protocol");?></div>
- <div align="center"><input id="filterlogentries_protocol" name="filterlogentries_protocol" class="formfld search" type="text" size="5" value="<?= htmlspecialchars($filterfieldsarray['proto']) ?>" /></div>
- </td>
- <td>
- <div align="center" style="vertical-align:top;"><?=gettext("Quantity");?></div>
- <div align="center" style="vertical-align:top;"><input id="filterlogentries_qty" name="filterlogentries_qty" class="" type="text" size="6" value="<?= htmlspecialchars($filterlogentries_qty) ?>" /></div>
- </td>
- </tr>
- <tr>
- <td valign="top">
- <div align="center"><?=gettext("Interface");?></div>
- <div align="center"><input id="filterlogentries_interfaces" name="filterlogentries_interfaces" class="formfld search" type="text" size="12" value="<?= htmlspecialchars($filterfieldsarray['interface']) ?>" /></div>
- </td>
- <td valign="top">
- <div align="center"><?=gettext("Destination IP Address");?></div>
- <div align="center"><input id="filterlogentries_destinationipaddress" name="filterlogentries_destinationipaddress" class="formfld search" type="text" size="35" value="<?= htmlspecialchars($filterfieldsarray['dstip']) ?>" /></div>
- </td>
- <td valign="top">
- <div align="center"><?=gettext("Destination Port");?></div>
- <div align="center"><input id="filterlogentries_destinationport" name="filterlogentries_destinationport" class="formfld search" type="text" size="10" value="<?= htmlspecialchars($filterfieldsarray['dstport']) ?>" /></div>
- </td>
- <td valign="top">
- <div align="center"><?=gettext("Protocol Flags");?></div>
- <div align="center"><input id="filterlogentries_protocolflags" name="filterlogentries_protocolflags" class="formfld search" type="text" size="5" value="<?= htmlspecialchars($filterfieldsarray['tcpflags']) ?>" /></div>
- </td>
- <td valign="bottom">
- <div align="center"><input id="filterlogentries_submit" name="filterlogentries_submit" type="submit" class="formbtn" value="<?=gettext("Filter");?>" /></div>
- </td>
- </tr>
- <tr>
- <td></td>
- <td colspan="5">
- <?printf(gettext('Matches %1$s regular expression%2$s.'), '<a target="_blank" href="http://www.php.net/manual/en/book.pcre.php">', '</a>');?>&nbsp;&nbsp;
- <?=gettext("Precede with exclamation (!) as first character to exclude match.");?>&nbsp;&nbsp;
- </td>
- </tr>
- </table>
- </form>
- </div>
- <div id="filterform_show" class="widgetconfigdiv" style="<?=(!isset($config['syslog']['rawfilter']))?"display:none":""?>">
- <form id="filterform" name="filterform" action="diag_logs_filter.php" method="post">
- <table width="0%" border="0" cellpadding="0" cellspacing="0" summary="firewall log">
- <tr>
- <td>
- <div align="center" style="vertical-align:top;"><?=gettext("Interface");?></div>
- <div align="center" style="vertical-align:top;">
- <select name="interface" onchange="dst_change(this.value,iface_old,document.iform.dsttype.value);iface_old = document.iform.interface.value;typesel_change();">
- <option value="" <?=$interfacefilter?"":"selected=\"selected\""?>>*Any interface</option>
-<?php
+/*
+&#x1f539; = "Resolve" (Small blue diamond)
+&#x23ec; = "Easyrule add to block list" (Double down arrow)
+&#x23eb; = "Easyrule add to pass list" (Double up arrow)
+&#x25ba; = "out" (simple right arrow)
+*/
+
+function build_if_list() {
$iflist = get_configured_interface_with_descr(false, true);
//$iflist = get_interface_list();
// Allow extending of the firewall edit interfaces
pfSense_handle_custom_code("/usr/local/pkg/firewall_nat/pre_interfaces_edit");
- foreach ($iflist as $if => $ifdesc) {
+ foreach ($iflist as $if => $ifdesc)
$interfaces[$if] = $ifdesc;
- }
- if ($config['l2tp']['mode'] == "server") {
+ if ($config['l2tp']['mode'] == "server")
$interfaces['l2tp'] = "L2TP VPN";
- }
- if ($config['pptpd']['mode'] == "server") {
+ if ($config['pptpd']['mode'] == "server")
$interfaces['pptp'] = "PPTP VPN";
- }
- if (is_pppoe_server_enabled() && have_ruleint_access("pppoe")) {
+ if (is_pppoe_server_enabled() && have_ruleint_access("pppoe"))
$interfaces['pppoe'] = "PPPoE Server";
- }
/* add ipsec interfaces */
- if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
+ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable']))
$interfaces["enc0"] = "IPsec";
- }
/* add openvpn/tun interfaces */
- if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
+ if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"])
$interfaces["openvpn"] = "OpenVPN";
- }
- foreach ($interfaces as $iface => $ifacename):
+ return($interfaces);
+}
+
+$tab_array = array();
+$tab_array[] = array(gettext("System"), false, "diag_logs.php");
+$tab_array[] = array(gettext("Firewall"), true, "diag_logs_filter.php");
+$tab_array[] = array(gettext("DHCP"), false, "diag_logs.php?logfile=dhcpd");
+$tab_array[] = array(gettext("Portal Auth"), false, "diag_logs.php?logfile=portalauth");
+$tab_array[] = array(gettext("IPsec"), false, "diag_logs.php?logfile=ipsec");
+$tab_array[] = array(gettext("PPP"), false, "diag_logs.php?logfile=ppp");
+$tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+$tab_array[] = array(gettext("Load Balancer"), false, "diag_logs.php?logfile=relayd");
+$tab_array[] = array(gettext("OpenVPN"), false, "diag_logs.php?logfile=openvpn");
+$tab_array[] = array(gettext("NTP"), false, "diag_logs.php?logfile=ntpd");
+$tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+display_top_tabs($tab_array);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Normal View"), true, "/diag_logs_filter.php");
+$tab_array[] = array(gettext("Dynamic View"), false, "/diag_logs_filter_dynamic.php");
+$tab_array[] = array(gettext("Summary View"), false, "/diag_logs_filter_summary.php");
+display_top_tabs($tab_array, false, 'nav nav-tabs');
+
+$Include_Act = explode(",", str_replace(" ", ",", $filterfieldsarray['act']));
+if ($filterfieldsarray['interface'] == "All")
+ $interface = "";
+
+require('classes/Form.class.php');
+
+if(!isset($config['syslog']['rawfilter'])) { // Advanced log filter form
+ $form = new Form(new Form_Button(
+ 'filterlogentries_submit',
+ 'Filter'
+ ));
+
+ $section = new Form_Section('Advanced Log Filter');
+
+ $group = new Form_Group('');
+
+ $group->add(new Form_Input(
+ 'filterlogentries_sourceipaddress',
+ null,
+ 'text',
+ $filterfieldsarray['srcip']
+ ))->setHelp('Source IP Address');
+
+ $group->add(new Form_Input(
+ 'filterlogentries_destinationipaddress',
+ null,
+ 'text',
+ $filterfieldsarray['dstip']
+ ))->setHelp('Destination IP Address');
+
+ $section->add($group);
+ $group = new Form_Group('');
+
+ $group->add(new Form_Checkbox(
+ 'actpass',
+ 'Pass',
+ 'Pass',
+ in_arrayi('Pass', $Include_Act)
+ ));
+
+ $group->add(new Form_Input(
+ 'filterlogentries_time',
+ null,
+ 'text',
+ $filterfieldsarray['time']
+ ))->setHelp('Time');
+
+ $group->add(new Form_Input(
+ 'filterlogentries_sourceport',
+ null,
+ 'text',
+ $filterfieldsarray['srcport']
+ ))->setHelp('Source Port');
+
+ $group->add(new Form_Input(
+ 'filterlogentries_protocol',
+ null,
+ 'text',
+ $filterfieldsarray['proto']
+ ))->setHelp('Protocol');
+
+ $group->add(new Form_Input(
+ 'filterlogentries_qty',
+ null,
+ 'text',
+ $filterlogentries_qty
+ ))->setHelp('Quantity');
+
+ $section->add($group);
+
+ $group = new Form_Group('');
+
+ $group->add(new Form_Checkbox(
+ 'actblock',
+ 'Block',
+ 'Block',
+ in_arrayi('Block', $Include_Act)
+ ));
+
+ $group->add(new Form_Input(
+ 'filterlogentries_interfaces',
+ null,
+ 'text',
+ $filterfieldsarray['interface']
+ ))->setHelp('Interface');
+
+ $group->add(new Form_Input(
+ 'filterlogentries_destinationport',
+ null,
+ 'text',
+ $filterfieldsarray['dstport']
+ ))->setHelp('Destination Port');
+
+ $group->add(new Form_Input(
+ 'filterlogentries_protocolflags',
+ null,
+ 'text',
+ $filterfieldsarray['tcpflags']
+ ))->setHelp('Protocol Flags');
+}
+else { // Simple log filter form
+ $form = new Form(new Form_Button(
+ 'filtersubmit',
+ 'Filter'
+ ));
+ $section = new Form_Section('Log Filter');
+
+ $section->addInput(new Form_Select(
+ 'filterdescriptions',
+ 'Where to show rule descriptions',
+ $interfacefilter,
+ build_if_list()
+ ));
+
+ $group = new Form_Group('');
+
+ $group->add(new Form_Input(
+ 'filtertext',
+ null,
+ 'text',
+ $filtertext
+ ))->setHelp('Filter Expression');
+
+ $group->add(new Form_Input(
+ 'filterlogentries_qty',
+ null,
+ 'text',
+ $filterlogentries_qty
+ ))->setHelp('Quantity');
+}
+
+$group->setHelp('<a target="_blank" href="http://www.php.net/manual/en/book.pcre.php">' . 'Regular expression reference</a> Precede with exclamation (!) to exclude match.');
+$section->add($group);
+$form->add($section);
+print($form);
+
+// Now the forms are complete we can draw the log table and its controls
+if (!isset($config['syslog']['rawfilter'])) {
+ $iflist = get_configured_interface_with_descr(false, true);
+
+ if ($iflist[$interfacefilter])
+ $interfacefilter = $iflist[$interfacefilter];
+
+ if ($filterlogentries_submit)
+ $filterlog = conv_log_filter($filter_logfile, $nentries, $nentries + 100, $filterfieldsarray);
+ else
+ $filterlog = conv_log_filter($filter_logfile, $nentries, $nentries + 100, $filtertext, $interfacefilter);
?>
- <option value="<?=$iface;?>" <?=($iface == $interfacefilter)?"selected=\"selected\"":"";?>><?=htmlspecialchars($ifacename);?></option>
+
+<div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title">
<?php
- endforeach;
+ if ( (!$filtertext) && (!$filterfieldsarray) )
+ printf(gettext("Last %s firewall log entries."),count($filterlog));
+ else
+ print(count($filterlog). ' ' . gettext('matched log entries.') . ' ');
+
+ printf(gettext(" (Maximum %s)"),$nentries)
?>
- </select>
- </div>
- </td>
- <td>
- <div align="center" style="vertical-align:top;"><?=gettext("Filter expression");?></div>
- <div align="center" style="vertical-align:top;"><input id="filtertext" name="filtertext" class="formfld search" style="vertical-align:top;" type="text" size="35" value="<?= htmlspecialchars($filtertext) ?>" /></div>
- </td>
- <td>
- <div align="center" style="vertical-align:top;"><?=gettext("Quantity");?></div>
- <div align="center" style="vertical-align:top;"><input id="filterlogentries_qty" name="filterlogentries_qty" class="" style="vertical-align:top;" type="text" size="6" value="<?= htmlspecialchars($filterlogentries_qty) ?>" /></div>
- </td>
- <td>
- <div align="center" style="vertical-align:top;">&nbsp;</div>
- <div align="center" style="vertical-align:top;"><input id="filtersubmit" name="filtersubmit" type="submit" class="formbtn" style="vertical-align:top;" value="<?=gettext("Filter");?>" /></div>
- </td>
- </tr>
- <tr>
- <td></td>
- <td colspan="2">
- <?printf(gettext('Matches %1$s regular expression%2$s.'), '<a target="_blank" href="http://www.php.net/manual/en/book.pcre.php">', '</a>');?>&nbsp;&nbsp;
- </td>
- </tr>
- </table>
- </form>
- </div>
- <div style="float: right; vertical-align:middle">
- <br />
- <?php if (!isset($config['syslog']['rawfilter']) && (isset($config['syslog']['filterdescriptions']) && $config['syslog']['filterdescriptions'] === "2")):?>
- <a href="#" onclick="toggleListDescriptions()">Show/hide rule descriptions</a>
- <?php endif;?>
- </div>
- </td>
- </tr>
+ </h2>
+ </div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table striped table-hover table-compact">
+ <tr>
+ <th><?=gettext("Act")?></th>
+ <th><?=gettext("Time")?></th>
+ <th><?=gettext("IF")?></th>
<?php
- if (!isset($config['syslog']['rawfilter'])):
- $iflist = get_configured_interface_with_descr(false, true);
- if ($iflist[$interfacefilter]) {
- $interfacefilter = $iflist[$interfacefilter];
- }
- if ($filterlogentries_submit) {
- $filterlog = conv_log_filter($filter_logfile, $nentries, $nentries + 100, $filterfieldsarray);
- } else {
- $filterlog = conv_log_filter($filter_logfile, $nentries, $nentries + 100, $filtertext, $interfacefilter);
- }
+ if ($config['syslog']['filterdescriptions'] === "1") {
?>
- <tr>
- <td colspan="<?=$config['syslog']['filterdescriptions'] === "1"?7:6?>" class="listtopic">
+ <th>
+ <?=gettext("Rule")?>
+ </th>
<?php
- if ((!$filtertext) && (!$filterfieldsarray)) {
- printf(gettext("Last %s firewall log entries."), count($filterlog));
- } else {
- echo count($filterlog). ' ' . gettext("matched log entries.") . ' ';
- }
- printf(gettext("Max(%s)"), $nentries);
+ }
?>
- </td>
- </tr>
- <tr class="sortableHeaderRowIdentifier">
- <td width="10%" class="listhdrr"><?=gettext("Act");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Time");?></td>
- <td width="15%" class="listhdrr"><?=gettext("If");?></td>
- <?php if ($config['syslog']['filterdescriptions'] === "1"):?>
- <td width="10%" class="listhdrr"><?=gettext("Rule");?></td>
- <?php endif;?>
- <td width="25%" class="listhdrr"><?=gettext("Source");?></td>
- <td width="25%" class="listhdrr"><?=gettext("Destination");?></td>
- <td width="15%" class="listhdrr"><?=gettext("Proto");?></td>
- </tr>
+ <th><?=gettext("Source")?></th>
+ <th><?=gettext("Destination")?></th>
+ <th><?=gettext("Proto")?></th>
+ </tr>
<?php
- if ($config['syslog']['filterdescriptions']) {
- buffer_rules_load();
- }
- $rowIndex = 0;
- foreach ($filterlog as $filterent):
- $evenRowClass = $rowIndex % 2 ? " listMReven" : " listMRodd";
- $rowIndex++;
+ if ($config['syslog']['filterdescriptions'])
+ buffer_rules_load();
+
+ foreach ($filterlog as $filterent) {
?>
- <tr class="<?=$evenRowClass?>">
- <td class="listMRlr nowrap" align="center" sorttable_customkey="<?=$filterent['act']?>">
- <center>
- <a onclick="javascript:getURL('diag_logs_filter.php?getrulenum=<?php echo "{$filterent['rulenum']},{$filterent['tracker']},{$filterent['act']}"; ?>', outputrule);">
- <img border="0" src="<?php echo find_action_image($filterent['act']);?>" width="11" height="11" align="middle" alt="<?php echo $filterent['act'] .'/'. $filterent['tracker'];?>" title="<?php echo $filterent['act'] .'/'. $filterent['tracker'];?>" />
- <?php if ($filterent['count']) echo $filterent['count'];?>
- </a>
- </center>
- </td>
- <td class="listMRr nowrap"><?php echo htmlspecialchars($filterent['time']);?></td>
- <td class="listMRr nowrap">
- <?php if ($filterent['direction'] == "out"): ?>
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/out.gif" alt="Direction=OUT" title="Direction=OUT"/>
- <?php endif; ?>
- <?php echo htmlspecialchars($filterent['interface']);?>
- </td>
+ <tr>
+ <td>
+ <a class="btn btn-xs btn-info" onclick="javascript:getURL('diag_logs_filter.php?getrulenum=<?="{$filterent['rulenum']},{$filterent['tracker']},{$filterent['act']}"; ?>', outputrule);">
+ <?=gettext('Block')?></a>
<?php
- if ($config['syslog']['filterdescriptions'] === "1") {
- echo("<td class=\"listMRr nowrap\">" . find_rule_by_number_buffer($filterent['rulenum'], $filterent['tracker'], $filterent['act']) . "</td>");
- }
-
- $int = strtolower($filterent['interface']);
- $proto = strtolower($filterent['proto']);
- if ($filterent['version'] == '6') {
- $ipproto = "inet6";
- $filterent['srcip'] = "[{$filterent['srcip']}]";
- $filterent['dstip'] = "[{$filterent['dstip']}]";
- } else {
- $ipproto = "inet";
- }
-
- $srcstr = $filterent['srcip'] . get_port_with_service($filterent['srcport'], $proto);
- $src_htmlclass = str_replace(array('.', ':'), '-', $filterent['srcip']);
- $dststr = $filterent['dstip'] . get_port_with_service($filterent['dstport'], $proto);
- $dst_htmlclass = str_replace(array('.', ':'), '-', $filterent['dstip']);
+ if ($filterent['count'])
+ echo $filterent['count'];
?>
- <td class="listMRr nowrap">
- <img onclick="javascript:resolve_with_ajax('<?php echo "{$filterent['srcip']}"; ?>');" title="<?=gettext("Click to resolve");?>" class="ICON-<?= $src_htmlclass; ?>" border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_log.gif" alt="Icon Reverse Resolve with DNS"/>
- <a href="easyrule.php?<?php echo "action=block&amp;int={$int}&amp;src={$filterent['srcip']}&amp;ipproto={$ipproto}"; ?>" title="<?=gettext("Easy Rule: Add to Block List");?>" onclick="return confirm('<?=gettext("Do you really want to add this BLOCK rule?")?>')">
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_block_add.gif" alt="Icon Easy Rule: Add to Block List" />
- </a>
- <?php echo $srcstr . '<span class="RESOLVE-' . $src_htmlclass . '"></span>';?>
- </td>
- <td class="listMRr nowrap">
- <img onclick="javascript:resolve_with_ajax('<?php echo "{$filterent['dstip']}"; ?>');" title="<?=gettext("Click to resolve");?>" class="ICON-<?= $dst_htmlclass; ?>" border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_log.gif" alt="Icon Reverse Resolve with DNS"/>
- <a href="easyrule.php?<?php echo "action=pass&amp;int={$int}&amp;proto={$proto}&amp;src={$filterent['srcip']}&amp;dst={$filterent['dstip']}&amp;dstport={$filterent['dstport']}&amp;ipproto={$ipproto}"; ?>" title="<?=gettext("Easy Rule: Pass this traffic");?>" onclick="return confirm('<?=gettext("Do you really want to add this PASS rule?")?>')">
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_pass_add.gif" alt="Icon Easy Rule: Pass this traffic" />
- </a>
- <?php echo $dststr . '<span class="RESOLVE-' . $dst_htmlclass . '"></span>';?>
- </td>
+ </td>
+ <td>
+ <?=htmlspecialchars($filterent['time'])?>
+ </td>
+ <td>
<?php
- if ($filterent['proto'] == "TCP") {
- $filterent['proto'] .= ":{$filterent['tcpflags']}";
- }
+ if ($filterent['direction'] == "out")
+ print('&#x25ba;' . ' ');
?>
- <td class="listMRr nowrap"><?php echo htmlspecialchars($filterent['proto']);?></td>
- </tr>
+ <?=htmlspecialchars($filterent['interface'])?>
+ </td>
<?php
- if (isset($config['syslog']['filterdescriptions']) && $config['syslog']['filterdescriptions'] === "2"):
+ if ($config['syslog']['filterdescriptions'] === "1") {
?>
- <tr class="<?=$evenRowClass?>">
- <td colspan="2" class="listMRDescriptionL listMRlr" />
- <td colspan="4" class="listMRDescriptionR listMRr nowrap"><?=find_rule_by_number_buffer($filterent['rulenum'], $filterent['tracker'], $filterent['act']);?></td>
- </tr>
+ <td>
+ <?=find_rule_by_number_buffer($filterent['rulenum'], $filterent['tracker'], $filterent['act'])?>
+ </td>
+<?php
+ }
+
+ $int = strtolower($filterent['interface']);
+ $proto = strtolower($filterent['proto']);
+
+ if($filterent['version'] == '6') {
+ $ipproto = "inet6";
+ $filterent['srcip'] = "[{$filterent['srcip']}]";
+ $filterent['dstip'] = "[{$filterent['dstip']}]";
+ } else {
+ $ipproto = "inet";
+ }
+
+ $srcstr = $filterent['srcip'] . get_port_with_service($filterent['srcport'], $proto);
+ $src_htmlclass = str_replace(array('.', ':'), '-', $filterent['srcip']);
+ $dststr = $filterent['dstip'] . get_port_with_service($filterent['dstport'], $proto);
+ $dst_htmlclass = str_replace(array('.', ':'), '-', $filterent['dstip']);
+?>
+ <td>
+ <a onclick="javascript:resolve_with_ajax('<?="{$filterent['srcip']}"; ?>');" title="<?=gettext("Click to resolve")?>" alt="Reverse Resolve with DNS"/>
+ &#x1f539;</a>
+ <a href="easyrule.php?<?="action=block&amp;int={$int}&amp;src={$filterent['srcip']}&amp;ipproto={$ipproto}"; ?>" alt="Easy Rule: Add to Block List" title="<?=gettext("Easy Rule: Add to Block List")?>" onclick="return confirm('<?=gettext("Do you really want to add this BLOCK rule?")?>')">
+ &#x23ec;</a>
+ <?=$srcstr . '<span class="RESOLVE-' . $src_htmlclass . '"></span>'?>
+ </td>
+ <td>
+ <a onclick="javascript:resolve_with_ajax('<?="{$filterent['dstip']}"; ?>');" title="<?=gettext("Click to resolve")?>" class="ICON-<?= $dst_htmlclass; ?>" alt="Reverse Resolve with DNS"/>
+ &#x1f539;</a>
+ <a href="easyrule.php?<?="action=pass&amp;int={$int}&amp;proto={$proto}&amp;src={$filterent['srcip']}&amp;dst={$filterent['dstip']}&amp;dstport={$filterent['dstport']}&amp;ipproto={$ipproto}"; ?>" title="<?=gettext("Easy Rule: Pass this traffic")?>" onclick="return confirm('<?=gettext("Do you really want to add this PASS rule?")?>')">
+ &#x23eb</a>
+ <?=$dststr . '<span class="RESOLVE-' . $dst_htmlclass . '"></span>'?>
+ </td>
<?php
- endif;
- endforeach;
- buffer_rules_clear();
- else:
+ if ($filterent['proto'] == "TCP")
+ $filterent['proto'] .= ":{$filterent['tcpflags']}";
+ ?>
+ <td><?=htmlspecialchars($filterent['proto'])?></td>
+ </tr>
+<?php
+ if (isset($config['syslog']['filterdescriptions']) && $config['syslog']['filterdescriptions'] === "2") {
?>
<tr>
- <td colspan="2" class="listtopic">
- <?php printf(gettext("Last %s firewall log entries"), $nentries);?>
- </td>
+ <td colspan="2" />
+ <td colspan="4"><?=find_rule_by_number_buffer($filterent['rulenum'],$filterent['tracker'],$filterent['act'])?></td>
</tr>
<?php
- if ($filtertext) {
- dump_clog($filter_logfile, $nentries, true, array("$filtertext"));
- } else {
- dump_clog($filter_logfile, $nentries);
}
- endif;
+ } // e-o-foreach
+ buffer_rules_clear();
+}
+else
+ {
?>
- <tr>
- <td align="left" valign="top" colspan="3">
- <form id="clearform" name="clearform" action="diag_logs_filter.php" method="post" style="margin-top: 14px;">
- <input id="submit" name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log");?>" />
- </form>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
+ <tr>
+ <td colspan="2">
+ <?php printf(gettext("Last %s firewall log entries"),$nentries)?>
+ </td>
+ </tr>
+<?php
+ if($filtertext)
+ dump_clog($filter_logfile, $nentries, true, array("$filtertext"));
+ else
+ dump_clog($filter_logfile, $nentries);
+}
+?>
+ </table>
+ </div>
+ </div>
+</div>
-<p><span class="vexpl"><a href="https://doc.pfsense.org/index.php/What_are_TCP_Flags%3F">TCP Flags</a>: F - FIN, S - SYN, A or . - ACK, R - RST, P - PSH, U - URG, E - ECE, W - CWR</span></p>
+<p>
+ <form id="clearform" name="clearform" action="diag_logs_filter.php" method="post" style="margin-top: 14px;">
+ <input id="submit" name="clear" type="submit" class="btn btn-danger" value="<?=gettext("Clear log")?>" />
+ </form>
+</p>
-<?php include("fend.inc"); ?>
+<?php
+
+print_info_box('<a href="https://doc.pfsense.org/index.php/What_are_TCP_Flags%3F">' .
+ gettext("TCP Flags") . '</a>: F - FIN, S - SYN, A or . - ACK, R - RST, P - PSH, U - URG, E - ECE, C - CWR');
+
+?>
<!-- AJAXY STUFF -->
<script type="text/javascript">
@@ -499,5 +548,4 @@ function htmlspecialchars(str) {
//]]>
</script>
-</body>
-</html>
+<?php include("foot.inc");
diff --git a/src/usr/local/www/diag_logs_filter_dynamic.php b/src/usr/local/www/diag_logs_filter_dynamic.php
index 16ced9f..ca32b46 100755
--- a/src/usr/local/www/diag_logs_filter_dynamic.php
+++ b/src/usr/local/www/diag_logs_filter_dynamic.php
@@ -2,35 +2,58 @@
/* $Id$ */
/*
diag_logs_filter_dynamic.php
- part of pfSesne
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- originally based on m0n0wall (http://m0n0.ch/wall)
-
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: filter
@@ -65,17 +88,16 @@ $shortcut_section = "firewall";
include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
+
<script type="text/javascript">
//<![CDATA[
- lastsawtime = '<?php echo time(); ?>;';
+ lastsawtime = '<?=time(); ?>;';
var lines = Array();
var timer;
var updateDelay = 25500;
var isBusy = false;
var isPaused = false;
- var nentries = <?php echo $nentries; ?>;
+ var nentries = <?=$nentries; ?>;
<?php
if (isset($config['syslog']['reverse'])) {
echo "var isReverse = true;\n";
@@ -104,120 +126,118 @@ include("head.inc");
dstPort = ':' + row[6];
}
- var line = '<td class="listMRlr" align="center">' + row[0] + '</td>' +
- '<td class="listMRr nowrap">' + row[1] + '</td>' +
- '<td class="listMRr nowrap">' + row[2] + '</td>' +
- '<td class="listMRr nowrap">' + srcIP + srcPort + '</td>' +
- '<td class="listMRr nowrap">' + dstIP + dstPort + '</td>' +
- '<td class="listMRr nowrap">' + row[7] + '</td>';
+ var line =
+ '<td>' + row[1] + '</td>' +
+ '<td>' + row[2] + '</td>' +
+ '<td>' + srcIP + srcPort + '</td>' +
+ '<td>' + dstIP + dstPort + '</td>' +
+ '<td>' + row[7] + '</td>' +
+ '<td>' + row[0] + '</td>';
+
return line;
}
//]]>
</script>
<script src="/javascript/filter_log.js" type="text/javascript"></script>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs filter dynamic">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), false, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), true, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabnavtbl">
+
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Normal View"), false, "/diag_logs_filter.php");
- $tab_array[] = array(gettext("Dynamic View"), true, "/diag_logs_filter_dynamic.php");
- $tab_array[] = array(gettext("Summary View"), false, "/diag_logs_filter_summary.php");
- display_top_tabs($tab_array);
+$tab_array = array();
+$tab_array[] = array(gettext("System"), false, "diag_logs.php");
+$tab_array[] = array(gettext("Firewall"), true, "diag_logs_filter.php");
+$tab_array[] = array(gettext("DHCP"), false, "diag_logs.php?logfile=dhcpd");
+$tab_array[] = array(gettext("Portal Auth"), false, "diag_logs.php?logfile=portalauth");
+$tab_array[] = array(gettext("IPsec"), false, "diag_logs.php?logfile=ipsec");
+$tab_array[] = array(gettext("PPP"), false, "diag_logs.php?logfile=ppp");
+$tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+$tab_array[] = array(gettext("Load Balancer"), false, "diag_logs.php?logfile=relayd");
+$tab_array[] = array(gettext("OpenVPN"), false, "diag_logs.php?logfile=openvpn");
+$tab_array[] = array(gettext("NTP"), false, "diag_logs.php?logfile=ntpd");
+$tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+display_top_tabs($tab_array);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Normal View"), false, "/diag_logs_filter.php");
+$tab_array[] = array(gettext("Dynamic View"), true, "/diag_logs_filter_dynamic.php");
+$tab_array[] = array(gettext("Summary View"), false, "/diag_logs_filter_summary.php");
+display_top_tabs($tab_array, false, 'nav nav-tabs');
?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+
+<div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title">
+ <?=gettext('Last ') . $nentries . gettext(' records. ') . gettext('Pause ')?><input type="checkbox" onclick="javascript:toggle_pause();" />
+ </h2>
+ </div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
<thead>
- <tr>
- <td colspan="6" class="listtopic">
- <?php printf(gettext("Last %s records"), $nentries);?>; <?=gettext("Pause:");?><input style="vertical-align:middle;" type="checkbox" onclick="javascript:toggle_pause();" />
- </td>
- </tr>
- <tr>
- <td width="10%" class="listhdrr"><?=gettext("Act");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Time");?></td>
- <td width="15%" class="listhdrr"><?=gettext("If");?></td>
- <td width="25%" class="listhdrr"><?=gettext("Source");?></td>
- <td width="25%" class="listhdrr"><?=gettext("Destination");?></td>
- <td width="15%" class="listhdrr"><?=gettext("Proto");?></td>
- </tr>
+ <tr>
+ <th><?=gettext("Time")?></th>
+ <th><?=gettext("IF")?></th>
+ <th><?=gettext("Source")?></th>
+ <th><?=gettext("Destination")?></th>
+ <th><?=gettext("Proto")?></th>
+ <th></th> <!-- For the "Block" buttons-->
+ </tr>
</thead>
<tbody id="filter-log-entries">
<?php
- $rowIndex = 0;
- foreach ($filterlog as $filterent):
- $evenRowClass = $rowIndex % 2 ? " listMReven" : " listMRodd";
- $rowIndex++;
- if ($filterent['version'] == '6') {
- $srcIP = "[" . htmlspecialchars($filterent['srcip']) . "]";
- $dstIP = "[" . htmlspecialchars($filterent['dstip']) . "]";
- } else {
- $srcIP = htmlspecialchars($filterent['srcip']);
- $dstIP = htmlspecialchars($filterent['dstip']);
- }
-
- if ($filterent['srcport']) {
- $srcPort = ":" . htmlspecialchars($filterent['srcport']);
- } else {
- $srcPort = "";
- }
-
- if ($filterent['dstport']) {
- $dstPort = ":" . htmlspecialchars($filterent['dstport']);
- } else {
- $dstPort = "";
- }
+ $rowIndex = 0;
+ $tcpcnt = 0;
+
+ foreach ($filterlog as $filterent) {
+ $evenRowClass = $rowIndex % 2 ? " listMReven" : " listMRodd";
+ $rowIndex++;
+ if ($filterent['version'] == '6') {
+ $srcIP = "[" . htmlspecialchars($filterent['srcip']) . "]";
+ $dstIP = "[" . htmlspecialchars($filterent['dstip']) . "]";
+ } else {
+ $srcIP = htmlspecialchars($filterent['srcip']);
+ $dstIP = htmlspecialchars($filterent['dstip']);
+ }
+
+ if ($filterent['srcport'])
+ $srcPort = ":" . htmlspecialchars($filterent['srcport']);
+ else
+ $srcPort = "";
+
+ if ($filterent['dstport'])
+ $dstPort = ":" . htmlspecialchars($filterent['dstport']);
+ else
+ $dstPort = "";
?>
- <tr class="<?=$evenRowClass?>">
- <td class="listMRlr nowrap" align="center">
- <a href="#" onclick="javascript:getURL('diag_logs_filter.php?getrulenum=<?php echo "{$filterent['rulenum']},{$filterent['tracker']},{$filterent['act']}"; ?>', outputrule);">
- <img border="0" src="<?php echo find_action_image($filterent['act']);?>" width="11" height="11" alt="<?php echo $filterent['act'] .'/'. $filterent['tracker'];?>" title="<?php echo $filterent['act'] .'/'. $filterent['tracker'];?>" />
- </a>
- </td>
- <td class="listMRr nowrap"><?php echo htmlspecialchars($filterent['time']);?></td>
- <td class="listMRr nowrap"><?php echo htmlspecialchars($filterent['interface']);?></td>
- <td class="listMRr nowrap"><?php echo $srcIP . $srcPort;?></td>
- <td class="listMRr nowrap"><?php echo $dstIP . $dstPort;?></td>
- <?php
+ <tr>
+ <td><?=htmlspecialchars($filterent['time'])?></td>
+ <td><?=htmlspecialchars($filterent['interface'])?></td>
+ <td><?=$srcIP . $srcPort?></td>
+ <td><?=$dstIP . $dstPort?></td>
+<?php
if ($filterent['proto'] == "TCP") {
$filterent['proto'] .= ":{$filterent['tcpflags']}";
+ $tcpcnt++;
}
- ?>
- <td class="listMRr nowrap"><?php echo htmlspecialchars($filterent['proto']);?></td>
- </tr>
+?>
+ <td><?=htmlspecialchars($filterent['proto'])?></td>
+ <td>
+ <a href="#" class="btn btn-danger btn-xs" alt="<?=$filterent['act'];?>" title="<?=$filterent['act'];?> onclick="javascript:getURL('diag_logs_filter.php?getrulenum=<?="{$filterent['rulenum']},{$filterent['act']}"; ?>', outputrule);">
+ <?=gettext('Block')?>
+ </a>
+ </td>
+ </tr>
<?php
- endforeach;
+ } // e-o-foreach()
?>
</tbody>
</table>
- </div>
- </td>
- </tr>
-</table>
-<p><span class="vexpl"><a href="https://doc.pfsense.org/index.php/What_are_TCP_Flags%3F"><?=gettext("TCP Flags"); ?></a>: F - FIN, S - SYN, A or . - ACK, R - RST, P - PSH, U - URG, E - ECE, C - CWR</span></p>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </div>
+ </div>
+</div>
+<?php
+
+if($tcpcnt > 0)
+ print_info_box('<a href="https://doc.pfsense.org/index.php/What_are_TCP_Flags%3F">' .
+ gettext("TCP Flags") . '</a>: F - FIN, S - SYN, A or . - ACK, R - RST, P - PSH, U - URG, E - ECE, C - CWR');
+?>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_logs_filter_summary.php b/src/usr/local/www/diag_logs_filter_summary.php
index 331df0d..8d88310 100644
--- a/src/usr/local/www/diag_logs_filter_summary.php
+++ b/src/usr/local/www/diag_logs_filter_summary.php
@@ -1,31 +1,58 @@
<?php
/*
diag_logs_filter_summary.php
- Copyright (C) 2009 Jim Pingle (jpingle@gmail.com)
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2009 Jim Pingle (jpingle@gmail.com)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES:
@@ -44,13 +71,16 @@ $entriesperblock = 5;
$filterlog = conv_log_filter($filter_logfile, $lines, $lines);
$gotlines = count($filterlog);
$fields = array(
- 'act' => gettext("Actions"),
+ 'act' => gettext("Actions"),
'interface' => gettext("Interfaces"),
- 'proto' => gettext("Protocols"),
- 'srcip' => gettext("Source IPs"),
- 'dstip' => gettext("Destination IPs"),
- 'srcport' => gettext("Source Ports"),
- 'dstport' => gettext("Destination Ports"));
+ 'proto' => gettext("Protocols"),
+ 'srcip' => gettext("Source IPs"),
+ 'dstip' => gettext("Destination IPs"),
+ 'srcport' => gettext("Source Ports"),
+ 'dstport' => gettext("Destination Ports"));
+
+$segcolors = array("#2484c1", "#65a620", "#7b6888", "#a05d56", "#961a1a", "#d8d23a", "#e98125", "#d0743c", "#635222", "#6ada6a");
+$numcolors = 10;
$summary = array();
foreach (array_keys($fields) as $f) {
@@ -69,8 +99,9 @@ function cmp($a, $b) {
function stat_block($summary, $stat, $num) {
global $g, $gotlines, $fields;
uasort($summary[$stat] , 'cmp');
- print "<table width=\"200\" cellpadding=\"3\" cellspacing=\"0\" border=\"1\" summary=\"source destination ip\">";
- print "<tr><th colspan=\"2\">{$fields[$stat]} ".gettext("data")."</th></tr>";
+ print('<div class="table-responsive">');
+ print('<table class="table table-striped table-hover table-condensed">');
+ print('<tr><th>' . $fields[$stat] . '</th>' . '<th>' . gettext("Data points") . '</th><th></th></tr>');
$k = array_keys($summary[$stat]);
$total = 0;
$numentries = 0;
@@ -80,7 +111,8 @@ function stat_block($summary, $stat, $num) {
$numentries++;
$outstr = $k[$i];
if (is_ipaddr($outstr)) {
- $outstr = "<a href=\"diag_dns.php?host={$outstr}\" title=\"".gettext("Reverse Resolve with DNS")."\"><img border=\"0\" src=\"/themes/{$g['theme']}/images/icons/icon_log.gif\" alt=\"log\" /></a> {$outstr}";
+ print('<tr><td>' . $outstr . '</td>' . '<td>' . $summary[$stat][$k[$i]] . '</td><td><a href="diag_dns.php?host=' . $outstr . '" class="btn btn-xs btn-success" title="' . gettext("Reverse Resolve with DNS") . '">Lookup</a></td></tr>');
+
} elseif (substr_count($outstr, '/') == 1) {
list($proto, $port) = explode('/', $outstr);
$service = getservbyport($port, strtolower($proto));
@@ -88,66 +120,130 @@ function stat_block($summary, $stat, $num) {
$outstr .= ": {$service}";
}
}
- print "<tr><td>{$outstr}</td><td width=\"50\" align=\"right\">{$summary[$stat][$k[$i]]}</td></tr>";
+
+ if(!is_ipaddr($outstr))
+ print('<tr><td>' . $outstr . '</td><td>' . $summary[$stat][$k[$i]] . '</td><td></td></tr>');
}
}
$leftover = $gotlines - $total;
if ($leftover > 0) {
- print "<tr><td>Other</td><td width=\"50\" align=\"right\">{$leftover}</td></tr>";
+ print "<tr><td>Other</td><td>{$leftover}</td><td></td>";
}
print "</table>";
+ print('</div>');
}
-function pie_block($summary, $stat, $num) {
- global $gotlines, $fields;
+// Create the JSON document for the chart to be displayed
+// Todo: Be good to investigate building this with json_encode and friends some time
+function pie_block($summary, $stat, $num, $chartnum) {
+ global $fields, $segcolors, $gotlines, $numcolors;
+?>
+<script>
+var pie = new d3pie("pieChart<?=$chartnum?>", {
+ "header": {
+ "title": {
+ "text": "",
+ "fontSize": 22,
+ "font": "verdana"
+ },
+ "subtitle": {
+ "color": "#999999",
+ "fontSize": 12,
+ "font": "open sans"
+ },
+ "titleSubtitlePadding": 12
+ },
+ "footer": {
+ "color": "#999999",
+ "fontSize": 10,
+ "font": "open sans",
+ "location": "bottom-left"
+ },
+ "size": {
+ "canvasHeight": 400,
+ "canvasWidth": 590,
+ "pieOuterRadius": "88%"
+ },
+ "data": {
+ "sortOrder": "value-desc",
+ "content": [
+<?php
uasort($summary[$stat] , 'cmp');
$k = array_keys($summary[$stat]);
$total = 0;
$numentries = 0;
- print "\n<script type=\"text/javascript\">\n";
- print "//<![CDATA[\n";
- for ($i = 0; $i < $num; $i++) {
+
+ for ($i=0; $i < $num; $i++) {
if ($k[$i]) {
$total += $summary[$stat][$k[$i]];
$numentries++;
- print "var d{$stat}{$i} = [];\n";
- print "d{$stat}{$i}.push([1, {$summary[$stat][$k[$i]]}]);\n";
+ if($i > 0)
+ print(",\r\n");
+
+ print("{");
+ print('"label": "' . $k[$i] . '", "value": ');
+ print($summary[$stat][$k[$i]]);
+ print(', "color": "' . $segcolors[$i % $numcolors] . '"');
+ print("}");
+
}
}
+
$leftover = $gotlines - $total;
- if ($leftover > 0) {
- print "var d{$stat}{$num} = [];\n";
- print "d{$stat}{$num}.push([1, {$leftover}]);\n";
- }
- print "Event.observe(window, 'load', function() {\n";
- print " new Proto.Chart($('piechart{$stat}'),\n";
- print " [\n";
- for ($i = 0; $i < $num; $i++) {
- if ($k[$i]) {
- print " { data: d{$stat}{$i}, label: \"{$k[$i]}\"}";
- if (!(($i == ($numentries - 1)) && ($leftover <= 0))) {
- print ",\n";
- } else {
- print "\n";
- }
- }
- }
if ($leftover > 0) {
- print " { data: d{$stat}{$i}, label: \"Other\"}\n";
+ print(",\r\n");
+ print("{");
+ print('"label": "Other", "value": ');
+ print($leftover);
+ print(', "color": "' . $segcolors[$i % $numcolors] . '"');
+ print("}");
}
- print " ],\n";
- print " {\n";
- print " pies: {show: true, autoScale: true},\n";
- print " legend: {show: true, labelFormatter: lblfmt}\n";
- print " });\n";
- print "});\n";
- print "//]]>\n";
- print "</script>\n";
- print "<table cellpadding=\"3\" cellspacing=\"0\" border=\"0\" summary=\"pie chart\">";
- print "<tr><th><font size=\"+1\">{$fields[$stat]}</font></th></tr>";
- print "<tr><td><div id=\"piechart{$stat}\" style=\"width:450px;height:300px\"></div></td></tr>";
- print "</table>\n";
+?>
+ ]
+ },
+ "labels": {
+ "outer": {
+ "pieDistance": 32
+ },
+ "inner": {
+ "hideWhenLessThanPercentage": 3
+ },
+ "mainLabel": {
+ "fontSize": 11
+ },
+ "percentage": {
+ "color": "#ffffff",
+ "decimalPlaces": 0
+ },
+ "value": {
+ "color": "#adadad",
+ "fontSize": 11
+ },
+ "lines": {
+ "enabled": true
+ },
+ "truncation": {
+ "enabled": true
+ }
+ },
+ "effects": {
+ "pullOutSegmentOnClick": {
+ "effect": "linear",
+ "speed": 400,
+ "size": 8
+ }
+ },
+ "misc": {
+ "gradient": {
+ "enabled": true,
+ "percentage": 100
+ }
+ },
+ "callbacks": {}
+});
+</script>
+<?php
}
foreach ($filterlog as $fe) {
@@ -170,80 +266,53 @@ foreach ($filterlog as $fe) {
}
}
-include("head.inc"); ?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<script src="/javascript/filter_log.js" type="text/javascript"></script>
-<script type="text/javascript" src="/protochart/prototype.js"></script>
-<script type="text/javascript" src="/protochart/ProtoChart.js"></script>
-<!--[if IE]>
-<script type="text/javascript" src="/protochart/excanvas.js">
-</script>
-<![endif]-->
-<script type="text/javascript">
-//<![CDATA[
- function lblfmt(lbl) {
- return '<font size=\"-2\">' + lbl + '<\/font>'
- }
-//]]>
-</script>
+include("head.inc");
+
+$tab_array = array();
+$tab_array[] = array(gettext("System"), false, "diag_logs.php");
+$tab_array[] = array(gettext("Firewall"), true, "diag_logs_filter.php");
+$tab_array[] = array(gettext("DHCP"), false, "diag_logs.php?logfile=dhcpd");
+$tab_array[] = array(gettext("Portal Auth"), false, "diag_logs.php?logfile=portalauth");
+$tab_array[] = array(gettext("IPsec"), false, "diag_logs.php?logfile=ipsec");
+$tab_array[] = array(gettext("PPP"), false, "diag_logs.php?logfile=ppp");
+$tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+$tab_array[] = array(gettext("Load Balancer"), false, "diag_logs.php?logfile=relayd");
+$tab_array[] = array(gettext("OpenVPN"), false, "diag_logs.php?logfile=openvpn");
+$tab_array[] = array(gettext("NTP"), false, "diag_logs.php?logfile=ntpd");
+$tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+display_top_tabs($tab_array);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Normal View"), false, "/diag_logs_filter.php");
+$tab_array[] = array(gettext("Dynamic View"), false, "/diag_logs_filter_dynamic.php");
+$tab_array[] = array(gettext("Summary View"), true, "/diag_logs_filter_summary.php");
+display_top_tabs($tab_array, false, 'nav nav-tabs');
+
+$infomsg = sprintf('This is a firewall log summary, of the last %1$s lines of the firewall log (Max %2$s).', $gotlines, $lines);
+print_info_box($infomsg);
+?>
+
+<script src="d3pie/d3pie.min.js"></script>
+<script src="d3pie/d3.min.js"></script>
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs filter summary">
- <tr>
- <td>
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), false, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), true, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
+
+$chartnum=0;
+foreach(array_keys($fields) as $field) {
?>
- </td>
- </tr>
- <tr>
- <td class="tabnavtbl">
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=$fields[$field]?></h2></div>
+ <div class="panel-body">
+ <div id="pieChart<?=$chartnum?>" align="center">
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Normal View"), false, "/diag_logs_filter.php");
- $tab_array[] = array(gettext("Dynamic View"), false, "/diag_logs_filter_dynamic.php");
- $tab_array[] = array(gettext("Summary View"), true, "/diag_logs_filter_summary.php");
- display_top_tabs($tab_array);
+ pie_block($summary, $field , $entriesperblock, $chartnum);
+ stat_block($summary, $field , $entriesperblock);
+ $chartnum++;
?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" align="center" summary="main area">
- <tr>
- <td align="center">
-
-<?php printf (gettext('This is a firewall log summary, of the last %1$s lines of the firewall log (Max %2$s).'), $gotlines, $lines)?><br />
-<?=gettext("NOTE: IE8 users must enable compatibility view.")?>
-
+ </div>
+ </div>
+</div>
<?php
-foreach (array_keys($fields) as $field) {
- pie_block($summary, $field , $entriesperblock);
- echo "<br /><br />";
- stat_block($summary, $field , $entriesperblock);
- echo "<br /><br />";
}
-?>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_logs_gateways.php b/src/usr/local/www/diag_logs_gateways.php
deleted file mode 100755
index bb88615..0000000
--- a/src/usr/local/www/diag_logs_gateways.php
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-/* $Id$ */
-/*
- diag_logs_gateways.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2012 Seth Mos
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- pfSense_MODULE: system
-*/
-
-##|+PRIV
-##|*IDENT=page-diagnostics-logs-gateways
-##|*NAME=Diagnostics: Logs: System: Gateways page
-##|*DESCR=Allow access to the 'Diagnostics: Logs: System: Gateways' page.
-##|*MATCH=diag_logs_gateways.php*
-##|-PRIV
-
-require("guiconfig.inc");
-
-$system_logfile = "{$g['varlog_path']}/gateways.log";
-
-$nentries = $config['syslog']['nentries'];
-if (!$nentries) {
- $nentries = 50;
-}
-
-if ($_POST['clear']) {
- clear_log_file($system_logfile);
-}
-
-if ($_GET['filtertext']) {
- $filtertext = htmlspecialchars($_GET['filtertext']);
-}
-
-if ($_POST['filtertext']) {
- $filtertext = htmlspecialchars($_POST['filtertext']);
-}
-
-if ($filtertext) {
- $filtertextmeta="?filtertext=$filtertext";
-}
-
-$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Gateways"));
-$shortcut_section = "gateways";
-include("head.inc");
-
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs system gateways">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), true, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("General"), false, "/diag_logs.php");
- $tab_array[] = array(gettext("Gateways"), true, "/diag_logs_gateways.php");
- $tab_array[] = array(gettext("Routing"), false, "/diag_logs_routing.php");
- $tab_array[] = array(gettext("Resolver"), false, "/diag_logs_resolver.php");
- $tab_array[] = array(gettext("Wireless"), false, "/diag_logs_wireless.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic"><?php printf(gettext("Last %s system log entries"), $nentries); ?></td>
- </tr>
- <?php
- if ($filtertext) {
- dump_clog($system_logfile, $nentries, true, array("$filtertext"));
- } else {
- dump_clog($system_logfile, $nentries, true, array());
- }
- ?>
- <tr>
- <td align="left" valign="top">
- <form id="filterform" name="filterform" action="diag_logs_gateways.php" method="post" style="margin-top: 14px;">
- <input id="submit" name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log");?>" />
- </form>
- </td>
- <td align="right" valign="top" >
- <form id="clearform" name="clearform" action="diag_logs_gateways.php" method="post" style="margin-top: 14px;">
- <input id="filtertext" name="filtertext" value="<?=$filtertext;?>" />
- <input id="filtersubmit" name="filtersubmit" type="submit" class="formbtn" value="<?=gettext("Filter");?>" />
- </form>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
diff --git a/src/usr/local/www/diag_logs_ipsec.php b/src/usr/local/www/diag_logs_ipsec.php
deleted file mode 100644
index 8fa79ce..0000000
--- a/src/usr/local/www/diag_logs_ipsec.php
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-/* $Id$ */
-/*
- diag_logs_ipsec.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- pfSense_BUILDER_BINARIES: /sbin/ifconfig /usr/bin/awk
- pfSense_MODULE: ipsec
-*/
-
-##|+PRIV
-##|*IDENT=page-status-systemlogs-ipsecvpn
-##|*NAME=Status: System logs: IPsec VPN page
-##|*DESCR=Allow access to the 'Status: System logs: IPsec VPN' page.
-##|*MATCH=diag_logs_ipsec.php*
-##|-PRIV
-
-require("guiconfig.inc");
-require("ipsec.inc");
-
-$ipsec_logfile = "{$g['varlog_path']}/ipsec.log";
-
-$nentries = $config['syslog']['nentries'];
-if (!$nentries) {
- $nentries = 50;
-}
-
-if ($_POST['clear']) {
- clear_log_file($ipsec_logfile);
-}
-
-$ipsec_logarr = return_clog($ipsec_logfile, $nentries);
-
-$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("IPsec VPN"));
-$shortcut_section = "ipsec";
-include("head.inc");
-
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs ipsec">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), false, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), true, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic"><?php printf(gettext("Last %s IPsec log entries"), $nentries);?></td>
- </tr>
- <?php
- foreach ($ipsec_logarr as $logent) {
- $logent = htmlspecialchars($logent);
- $logent = preg_split("/\s+/", $logent, 6);
- echo "<tr valign=\"top\">\n";
- $entry_date_time = htmlspecialchars(join(" ", array_slice($logent, 0, 3)));
- echo "<td class=\"listlr nowrap\">" . $entry_date_time . "</td>\n";
- echo "<td class=\"listr\">" . $logent[4] . " " . $logent[5] . "</td>\n";
- echo "</tr>\n";
- }
- ?>
- <tr>
- <td>
- <br />
- <form action="diag_logs_ipsec.php" method="post">
- <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
- </form>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
diff --git a/src/usr/local/www/diag_logs_ntpd.php b/src/usr/local/www/diag_logs_ntpd.php
deleted file mode 100644
index d9f6bf5..0000000
--- a/src/usr/local/www/diag_logs_ntpd.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-/* $Id$ */
-/*
- diag_logs_ntpd.php
- part of pfSense
- Copyright (C) 2005 Bill Marquette <bill.marquette@gmail.com>.
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- pfSense_MODULE: ntpd
-*/
-
-##|+PRIV
-##|*IDENT=page-status-systemlogs-ntpd
-##|*NAME=Status: System logs: NTP page
-##|*DESCR=Allow access to the 'Status: System logs: NTP' page.
-##|*MATCH=diag_logs_ntpd.php*
-##|-PRIV
-
-require("guiconfig.inc");
-
-$ntpd_logfile = "{$g['varlog_path']}/ntpd.log";
-
-$nentries = $config['syslog']['nentries'];
-if (!$nentries) {
- $nentries = 50;
-}
-
-if ($_POST['clear']) {
- clear_log_file($ntpd_logfile);
-}
-
-$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("NTP"));
-$shortcut_section = "ntp";
-include("head.inc");
-
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs ntpd">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), false, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), true, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic">
- <?php printf(gettext("Last %s NTP log entries"), $nentries);?>
- </td>
- </tr>
- <?php dump_clog($ntpd_logfile, $nentries); ?>
- <tr>
- <td>
- <br />
- <form action="diag_logs_ntpd.php" method="post">
- <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
- </form>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
diff --git a/src/usr/local/www/diag_logs_openvpn.php b/src/usr/local/www/diag_logs_openvpn.php
deleted file mode 100644
index 374014d..0000000
--- a/src/usr/local/www/diag_logs_openvpn.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/* $Id$ */
-/*
- diag_logs_openvpn.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- pfSense_MODULE: openvpn
-*/
-
-##|+PRIV
-##|*IDENT=page-status-systemlogs-openvpn
-##|*NAME=Status: System logs: OpenVPN page
-##|*DESCR=Allow access to the 'Status: System logs: OpenVPN' page.
-##|*MATCH=diag_logs_openvpn.php*
-##|-PRIV
-
-$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("OpenVPN"));
-$shortcut_section = "openvpn";
-
-require("guiconfig.inc");
-require_once("vpn.inc");
-
-$openvpn_logfile = "{$g['varlog_path']}/openvpn.log";
-
-$nentries = $config['syslog']['nentries'];
-if (!$nentries) {
- $nentries = 50;
-}
-
-if ($_POST['clear']) {
- clear_log_file($openvpn_logfile);
-}
-
-include("head.inc");
-
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs openvpn">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), false, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), true, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic"><?php printf(gettext("Last %s OpenVPN log entries"), $nentries)?></td>
- </tr>
- <?php dump_clog($openvpn_logfile, $nentries); ?>
- <tr>
- <td>
- <br />
- <form action="diag_logs_openvpn.php" method="post">
- <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
- </form>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
diff --git a/src/usr/local/www/diag_logs_ppp.php b/src/usr/local/www/diag_logs_ppp.php
deleted file mode 100644
index 4ef3f9c..0000000
--- a/src/usr/local/www/diag_logs_ppp.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-/* $Id$ */
-/*
- diag_logs_ppp.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- pfSense_BUILDER_BINARIES: /sbin/ifconfig /usr/bin/awk
- pfSense_MODULE:
-*/
-
-##|+PRIV
-##|*IDENT=page-status-systemlogs-ppp
-##|*NAME=Status: System logs: IPsec VPN page
-##|*DESCR=Allow access to the 'Status: System logs: IPsec VPN' page.
-##|*MATCH=diag_logs_ppp.php*
-##|-PRIV
-
-require("guiconfig.inc");
-
-$ppp_logfile = "{$g['varlog_path']}/ppp.log";
-
-$nentries = $config['syslog']['nentries'];
-if (!$nentries) {
- $nentries = 50;
-}
-
-if ($_POST['clear']) {
- clear_log_file($ppp_logfile);
-}
-
-$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("PPP"));
-include("head.inc");
-
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs ppp">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), false, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), true, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic"><?php printf(gettext("Last %s PPP log entries"), $nentries);?></td>
- </tr>
- <?php dump_clog($ppp_logfile, $nentries); ?>
- <tr>
- <td>
- <br />
- <form action="diag_logs_ppp.php" method="post">
- <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
- </form>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
diff --git a/src/usr/local/www/diag_logs_relayd.php b/src/usr/local/www/diag_logs_relayd.php
deleted file mode 100644
index 5468761..0000000
--- a/src/usr/local/www/diag_logs_relayd.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/* $Id$ */
-/*
- diag_logs_relayd.php
- part of pfSense
-
- Copyright (C) 2008 Bill Marquette <bill.marquette@gmail.com>.
- Copyright (C) 2008 Seth Mos <seth.mos@dds.nl>.
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- pfSense_MODULE: routing
-*/
-
-##|+PRIV
-##|*IDENT=page-status-systemlogs-loadbalancer
-##|*NAME=Status: System logs: Load Balancer page
-##|*DESCR=Allow access to the 'Status: System logs: Load Balancer' page.
-##|*MATCH=diag_logs_relayd.php*
-##|-PRIV
-
-require("guiconfig.inc");
-
-$relayd_logfile = "{$g['varlog_path']}/relayd.log";
-
-$nentries = $config['syslog']['nentries'];
-if (!$nentries) {
- $nentries = 50;
-}
-
-if ($_POST['clear']) {
- clear_log_file($relayd_logfile);
-}
-
-$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Load Balancer"));
-$shortcut_section = "relayd";
-include("head.inc");
-
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="load balancer">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), false, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), true, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic">
- <?php printf(gettext("Last %s Load Balancer log entries"), $nentries);?>
- </td>
- </tr>
- <?php dump_clog($relayd_logfile, $nentries); ?>
- <tr>
- <td>
- <br />
- <form action="diag_logs_relayd.php" method="post">
- <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
- </form>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
diff --git a/src/usr/local/www/diag_logs_resolver.php b/src/usr/local/www/diag_logs_resolver.php
deleted file mode 100755
index 73e39a9..0000000
--- a/src/usr/local/www/diag_logs_resolver.php
+++ /dev/null
@@ -1,152 +0,0 @@
-<?php
-/* $Id$ */
-/*
- diag_logs_resolver.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2012 Seth Mos
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- pfSense_MODULE: system
-*/
-
-##|+PRIV
-##|*IDENT=page-diagnostics-logs-resolver
-##|*NAME=Diagnostics: Logs: System: Resolver page
-##|*DESCR=Allow access to the 'Diagnostics: Logs: System: Resolver' page.
-##|*MATCH=diag_logs_resolver.php*
-##|-PRIV
-
-require("guiconfig.inc");
-
-$system_logfile = "{$g['varlog_path']}/resolver.log";
-
-$nentries = $config['syslog']['nentries'];
-if (!$nentries) {
- $nentries = 50;
-}
-
-if ($_POST['clear']) {
- clear_log_file($system_logfile);
-}
-
-if ($_GET['filtertext']) {
- $filtertext = htmlspecialchars($_GET['filtertext']);
-}
-
-if ($_POST['filtertext']) {
- $filtertext = htmlspecialchars($_POST['filtertext']);
-}
-
-if ($filtertext) {
- $filtertextmeta="?filtertext=$filtertext";
-}
-
-$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Resolver"));
-if (isset($config['dnsmasq']['enable'])) {
- $shortcut_section = "forwarder";
-} else {
- $shortcut_section = "resolver";
-}
-
-include("head.inc");
-
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs system resolver">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), true, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("General"), false, "/diag_logs.php");
- $tab_array[] = array(gettext("Gateways"), false, "/diag_logs_gateways.php");
- $tab_array[] = array(gettext("Routing"), false, "/diag_logs_routing.php");
- $tab_array[] = array(gettext("Resolver"), true, "/diag_logs_resolver.php");
- $tab_array[] = array(gettext("Wireless"), false, "/diag_logs_wireless.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic"><?php printf(gettext("Last %s system log entries"), $nentries); ?></td>
- </tr>
- <?php
- if ($filtertext) {
- dump_clog($system_logfile, $nentries, true, array("$filtertext"), array("ppp"));
- } else {
- dump_clog($system_logfile, $nentries, true, array(), array("ppp"));
- }
- ?>
- <tr>
- <td align="left" valign="top">
- <form id="filterform" name="filterform" action="diag_logs_resolver.php" method="post" style="margin-top: 14px;">
- <input id="submit" name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log");?>" />
- </form>
- </td>
- <td align="right" valign="top" >
- <form id="clearform" name="clearform" action="diag_logs_resolver.php" method="post" style="margin-top: 14px;">
- <input id="filtertext" name="filtertext" value="<?=$filtertext;?>" />
- <input id="filtersubmit" name="filtersubmit" type="submit" class="formbtn" value="<?=gettext("Filter");?>" />
- </form>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
diff --git a/src/usr/local/www/diag_logs_routing.php b/src/usr/local/www/diag_logs_routing.php
deleted file mode 100644
index debbf18..0000000
--- a/src/usr/local/www/diag_logs_routing.php
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-/* $Id$ */
-/*
- diag_logs_routing.php
- part of pfSense
-
- Copyright (C) 2012 Jim Pingle <jimp@pfsense.org>.
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- pfSense_MODULE: routing
-*/
-
-##|+PRIV
-##|*IDENT=page-status-systemlogs-routing
-##|*NAME=Status: System logs: Routing page
-##|*DESCR=Allow access to the 'Status: System logs: System: Routing' page.
-##|*MATCH=diag_logs_routing.php*
-##|-PRIV
-
-require("guiconfig.inc");
-
-$routing_logfile = "{$g['varlog_path']}/routing.log";
-
-$nentries = $config['syslog']['nentries'];
-if (!$nentries) {
- $nentries = 50;
-}
-
-if ($_POST['clear']) {
- clear_log_file($routing_logfile);
-}
-
-$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Routing"));
-$shortcut_section = "routing";
-include("head.inc");
-
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs system routing">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), true, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("General"), false, "/diag_logs.php");
- $tab_array[] = array(gettext("Gateways"), false, "/diag_logs_gateways.php");
- $tab_array[] = array(gettext("Routing"), true, "/diag_logs_routing.php");
- $tab_array[] = array(gettext("Resolver"), false, "/diag_logs_resolver.php");
- $tab_array[] = array(gettext("Wireless"), false, "/diag_logs_wireless.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic">
- <?php printf(gettext("Routing daemon log entries"), $nentries);?>
- </td>
- </tr>
- <?php dump_clog($routing_logfile, $nentries); ?>
- <tr>
- <td>
- <br />
- <form action="diag_logs_routing.php" method="post">
- <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
- </form>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
diff --git a/src/usr/local/www/diag_logs_settings.php b/src/usr/local/www/diag_logs_settings.php
index c9f2791..b195714 100644
--- a/src/usr/local/www/diag_logs_settings.php
+++ b/src/usr/local/www/diag_logs_settings.php
@@ -2,38 +2,61 @@
/* $Id$ */
/*
diag_logs_settings.php
- Copyright (C) 2004-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004-9 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: system
+ pfSense_MODULE: system
*/
##|+PRIV
@@ -90,7 +113,6 @@ if ($_POST['resetlogs'] == gettext("Reset Log Files")) {
clear_all_log_files();
$savemsg .= gettext("The log files have been reset.");
} elseif ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -188,330 +210,254 @@ if ($_POST['resetlogs'] == gettext("Reset Log Files")) {
}
$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Settings"));
-$closehead = false;
include("head.inc");
-?>
-
-
-<script type="text/javascript">
-//<![CDATA[
-function enable_change(enable_over) {
- if (document.iform.enable.checked || enable_over) {
- document.iform.remoteserver.disabled = 0;
- document.iform.remoteserver2.disabled = 0;
- document.iform.remoteserver3.disabled = 0;
- document.iform.filter.disabled = 0;
- document.iform.dhcp.disabled = 0;
- document.iform.portalauth.disabled = 0;
- document.iform.vpn.disabled = 0;
- document.iform.apinger.disabled = 0;
- document.iform.relayd.disabled = 0;
- document.iform.hostapd.disabled = 0;
- document.iform.system.disabled = 0;
- document.iform.logall.disabled = 0;
- check_everything();
- } else {
- document.iform.remoteserver.disabled = 1;
- document.iform.remoteserver2.disabled = 1;
- document.iform.remoteserver3.disabled = 1;
- document.iform.filter.disabled = 1;
- document.iform.dhcp.disabled = 1;
- document.iform.portalauth.disabled = 1;
- document.iform.vpn.disabled = 1;
- document.iform.apinger.disabled = 1;
- document.iform.relayd.disabled = 1;
- document.iform.hostapd.disabled = 1;
- document.iform.system.disabled = 1;
- document.iform.logall.disabled = 1;
- }
-}
-function check_everything() {
- if (document.iform.logall.checked) {
- document.iform.filter.disabled = 1;
- document.iform.filter.checked = false;
- document.iform.dhcp.disabled = 1;
- document.iform.dhcp.checked = false;
- document.iform.portalauth.disabled = 1;
- document.iform.portalauth.checked = false;
- document.iform.vpn.disabled = 1;
- document.iform.vpn.checked = false;
- document.iform.apinger.disabled = 1;
- document.iform.apinger.checked = false;
- document.iform.relayd.disabled = 1;
- document.iform.relayd.checked = false;
- document.iform.hostapd.disabled = 1;
- document.iform.hostapd.checked = false;
- document.iform.system.disabled = 1;
- document.iform.system.checked = false;
- } else {
- document.iform.filter.disabled = 0;
- document.iform.dhcp.disabled = 0;
- document.iform.portalauth.disabled = 0;
- document.iform.vpn.disabled = 0;
- document.iform.apinger.disabled = 0;
- document.iform.relayd.disabled = 0;
- document.iform.hostapd.disabled = 0;
- document.iform.system.disabled = 0;
- }
-}
-//]]>
-</script>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="diag_logs_settings.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs settings">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), false, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), true, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("General Logging Options");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vtable">Forward/Reverse Display</td>
- <td width="78%" class="vtable">
- <input name="reverse" type="checkbox" id="reverse" value="yes" <?php if ($pconfig['reverse']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Show log entries in reverse order (newest entries on top)");?></strong>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vtable">GUI Log Entries to Display</td>
- <td width="78%" class="vtable">
- <input name="nentries" id="nentries" type="text" class="formfld unknown" size="4" value="<?=htmlspecialchars($pconfig['nentries']);?>" /><br />
- <?=gettext("Hint: This is only the number of log entries displayed in the GUI. It does not affect how many entries are contained in the actual log files.") ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vtable">Log File Size (Bytes)</td>
- <td width="78%" class="vtable">
- <input name="logfilesize" id="logfilesize" type="text" class="formfld unknown" size="8" value="<?=htmlspecialchars($pconfig['logfilesize']);?>" /><br />
- <?=gettext("Logs are held in constant-size circular log files. This field controls how large each log file is, and thus how many entries may exist inside the log. By default this is approximately 500KB per log file, and there are nearly 20 such log files.") ?>
- <br /><br />
- <?=gettext("NOTE: Log sizes are changed the next time a log file is cleared or deleted. To immediately increase the size of the log files, you must first save the options to set the size, then clear all logs using the \"Reset Log Files\" option farther down this page. "); ?>
- <?=gettext("Be aware that increasing this value increases every log file size, so disk usage will increase significantly."); ?>
- <?=gettext("Disk space currently used by log files: ") ?><?= exec("/usr/bin/du -sh /var/log | /usr/bin/awk '{print $1;}'"); ?>.
- <?=gettext("Remaining disk space for log files: ") ?><?= exec("/bin/df -h /var/log | /usr/bin/awk '{print $4;}'"); ?>.
- </td>
- </tr>
- <tr>
- <td valign="top" class="vtable">Log Firewall Default Blocks</td>
- <td class="vtable">
- <input name="logdefaultblock" type="checkbox" id="logdefaultblock" value="yes" <?php if ($pconfig['logdefaultblock']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Log packets matched from the default block rules put in the ruleset");?></strong><br />
- <?=gettext("Hint: packets that are blocked by the implicit default block rule will not be logged if you uncheck this option. Per-rule logging options are still respected.");?>
- <br />
- <input name="logdefaultpass" type="checkbox" id="logdefaultpass" value="yes" <?php if ($pconfig['logdefaultpass']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Log packets matched from the default pass rules put in the ruleset");?></strong><br />
- <?=gettext("Hint: packets that are allowed by the implicit default pass rule will be logged if you check this option. Per-rule logging options are still respected.");?>
- <br />
- <input name="logbogons" type="checkbox" id="logbogons" value="yes" <?php if ($pconfig['logbogons']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Log packets blocked by 'Block Bogon Networks' rules");?></strong><br />
- <br />
- <input name="logprivatenets" type="checkbox" id="logprivatenets" value="yes" <?php if ($pconfig['logprivatenets']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Log packets blocked by 'Block Private Networks' rules");?></strong><br />
- </td>
- </tr>
- <tr>
- <td valign="top" class="vtable">Web Server Log</td>
- <td class="vtable">
- <input name="loglighttpd" type="checkbox" id="loglighttpd" value="yes" <?php if ($pconfig['loglighttpd']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Log errors from the web server process.");?></strong><br />
- <?=gettext("Hint: If this is checked, errors from the lighttpd web server process for the GUI or Captive Portal will appear in the main system log.");?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vtable">Raw Logs</td>
- <td class="vtable">
- <input name="rawfilter" type="checkbox" id="rawfilter" value="yes" <?php if ($pconfig['rawfilter']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Show raw filter logs");?></strong><br />
- <?=gettext("Hint: If this is checked, filter logs are shown as generated by the packet filter, without any formatting. This will reveal more detailed information, but it is more difficult to read.");?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vtable">Filter descriptions</td>
- <td class="vtable">
- <select name="filterdescriptions" id="filterdescriptions" >
- <option value="0"<?=!isset($pconfig['filterdescriptions'])?" selected=\"selected\"":""?>>Dont load descriptions</option>
- <option value="1"<?=($pconfig['filterdescriptions']) === "1"?" selected=\"selected\"":""?>>Display as column</option>
- <option value="2"<?=($pconfig['filterdescriptions']) === "2"?" selected=\"selected\"":""?>>Display as second row</option>
- </select>
- <strong><?=gettext("Show the applied rule description below or in the firewall log rows.");?></strong>
- <br />
- <?=gettext("Displaying rule descriptions for all lines in the log might affect performance with large rule sets.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vtable">Local Logging</td>
- <td width="78%" class="vtable">
- <input name="disablelocallogging" type="checkbox" id="disablelocallogging" value="yes" <?php if ($pconfig['disablelocallogging']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
- <strong>
- <?php if ($g['platform'] == "pfSense"): ?>
- <?=gettext("Disable writing log files to the local disk");?>
- <?php else: ?>
- <?=gettext("Disable writing log files to the local RAM disk");?>
- <?php endif; ?>
- </strong>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">Reset Logs</td>
- <td width="78%">
- <input name="resetlogs" type="submit" class="formbtn" value="<?=gettext("Reset Log Files"); ?>" onclick="return confirm('<?=gettext('Do you really want to reset the log files? This will erase all local log data.');?>')" />
- <br /><br />
- <?= gettext("Note: Clears all local log files and reinitializes them as empty logs. This also restarts the DHCP daemon. Use the Save button first if you have made any setting changes."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Remote Logging Options");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Source Address"); ?></td>
- <td width="78%" class="vtable">
- <select name="sourceip" class="formselect">
- <option value="">Default (any)</option>
- <?php
- $sourceips = get_possible_traffic_source_addresses(false);
- foreach ($sourceips as $sipvalue => $sipname):
- $selected = "";
- if (!link_interface_to_bridge($sipvalue) && ($sipvalue == $pconfig['sourceip'])) {
- $selected = 'selected="selected"';
- }
- ?>
- <option value="<?=$sipvalue;?>" <?=$selected;?>>
- <?=htmlspecialchars($sipname);?>
- </option>
- <?php
- endforeach;
- ?>
- </select>
- <br />
- <?= gettext("This option will allow the logging daemon to bind to a single IP address, rather than all IP addresses."); ?>
- <?= gettext("If you pick a single IP, remote syslog severs must all be of that IP type. If you wish to mix IPv4 and IPv6 remote syslog servers, you must bind to all interfaces."); ?>
- <br /><br />
- <?= gettext("NOTE: If an IP address cannot be located on the chosen interface, the daemon will bind to all addresses."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IP Protocol"); ?></td>
- <td width="78%" class="vtable">
- <select name="ipproto" class="formselect">
- <option value="ipv4" <?php if ($ipproto == "ipv4") echo 'selected="selected"' ?>>IPv4</option>
- <option value="ipv6" <?php if ($ipproto == "ipv6") echo 'selected="selected"' ?>>IPv6</option>
- </select>
- <br />
- <?= gettext("This option is only used when a non-default address is chosen as the source above. This option only expresses a preference; If an IP address of the selected type is not found on the chosen interface, the other type will be tried."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Enable Remote Logging");?></td>
- <td width="78%" class="vtable">
- <input name="enable" type="checkbox" id="enable" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
- <strong><?=gettext("Send log messages to remote syslog server");?></strong>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Remote Syslog Servers");?></td>
- <td width="78%" class="vtable">
- <table summary="remtote syslog servers">
- <tr>
- <td><?=gettext("Server") . " 1";?></td>
- <td><input name="remoteserver" id="remoteserver" type="text" class="formfld host" size="20" value="<?=htmlspecialchars($pconfig['remoteserver']);?>" /></td>
- </tr>
- <tr>
- <td><?=gettext("Server") . " 2";?></td>
- <td><input name="remoteserver2" id="remoteserver2" type="text" class="formfld host" size="20" value="<?=htmlspecialchars($pconfig['remoteserver2']);?>" /></td>
- </tr>
- <tr>
- <td><?=gettext("Server") . " 3";?></td>
- <td><input name="remoteserver3" id="remoteserver3" type="text" class="formfld host" size="20" value="<?=htmlspecialchars($pconfig['remoteserver3']);?>" /></td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td><?=gettext("IP addresses of remote syslog servers, or an IP:port.");?></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Remote Syslog Contents");?></td>
- <td width="78%" class="vtable">
- <input name="logall" id="logall" type="checkbox" value="yes" <?php if ($pconfig['logall']) echo "checked=\"checked\""; ?> onclick="check_everything();" />
- <?=gettext("Everything");?><br /><br />
- <input name="system" id="system" type="checkbox" value="yes" onclick="enable_change(false)" <?php if ($pconfig['system']) echo "checked=\"checked\""; ?> />
- <?=gettext("System events");?><br />
- <input name="filter" id="filter" type="checkbox" value="yes" <?php if ($pconfig['filter']) echo "checked=\"checked\""; ?> />
- <?=gettext("Firewall events");?><br />
- <input name="dhcp" id="dhcp" type="checkbox" value="yes" <?php if ($pconfig['dhcp']) echo "checked=\"checked\""; ?> />
- <?=gettext("DHCP service events");?><br />
- <input name="portalauth" id="portalauth" type="checkbox" value="yes" <?php if ($pconfig['portalauth']) echo "checked=\"checked\""; ?> />
- <?=gettext("Portal Auth events");?><br />
- <input name="vpn" id="vpn" type="checkbox" value="yes" <?php if ($pconfig['vpn']) echo "checked=\"checked\""; ?> />
- <?=gettext("VPN (PPTP, IPsec, OpenVPN) events");?><br />
- <input name="apinger" id="apinger" type="checkbox" value="yes" <?php if ($pconfig['apinger']) echo "checked=\"checked\""; ?> />
- <?=gettext("Gateway Monitor events");?><br />
- <input name="relayd" id="relayd" type="checkbox" value="yes" <?php if ($pconfig['relayd']) echo "checked=\"checked\""; ?> />
- <?=gettext("Server Load Balancer events");?><br />
- <input name="hostapd" id="hostapd" type="checkbox" value="yes" <?php if ($pconfig['hostapd']) echo "checked=\"checked\""; ?> />
- <?=gettext("Wireless events");?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
- </td>
- </tr>
- <tr>
- <td width="22%" height="53" valign="top">&nbsp;</td>
- <td width="78%">
- <strong>
- <span class="red">
- <?=gettext("Note:")?>
- </span>
- </strong>
- <br />
- <?=gettext("syslog sends UDP datagrams to port 514 on the specified " .
- "remote syslog server, unless another port is specified. Be sure to set syslogd on the " .
- "remote server to accept syslog messages from");?> <?=$g['product_name']?>.
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<script type="text/javascript">
-//<![CDATA[
-enable_change(false);
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+$logfilesizeHelp = gettext("Logs are held in constant-size circular log files. This field controls how large each log file is, and thus how many entries may exist inside the log. By default this is approximately 500KB per log file, and there are nearly 20 such log files.") .
+ '<br /><br />' .
+ gettext("NOTE: Log sizes are changed the next time a log file is cleared or deleted. To immediately increase the size of the log files, you must first save the options to set the size, then clear all logs using the \"Reset Log Files\" option farther down this page. ") .
+ gettext("Be aware that increasing this value increases every log file size, so disk usage will increase significantly.") . '<br /><br />' .
+ gettext("Disk space currently used by log files is: ") . exec("/usr/bin/du -sh /var/log | /usr/bin/awk '{print $1;}'") .
+ gettext(" Remaining disk space for log files: ") . exec("/bin/df -h /var/log | /usr/bin/awk '{print $4;}'");
+
+$remoteloghelp = gettext("This option will allow the logging daemon to bind to a single IP address, rather than all IP addresses.") .
+ gettext("If you pick a single IP, remote syslog severs must all be of that IP type. If you wish to mix IPv4 and IPv6 remote syslog servers, you must bind to all interfaces.") .
+ "<br /><br />" .
+ gettext("NOTE: If an IP address cannot be located on the chosen interface, the daemon will bind to all addresses.");
+if ($input_errors)
+ print_input_errors($input_errors);
+else if ($savemsg)
+ print_info_box($savemsg);
+
+$tab_array = array();
+$tab_array[] = array(gettext("System"), false, "diag_logs.php");
+$tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+$tab_array[] = array(gettext("DHCP"), false, "diag_logs.php?logfile=dhcpd");
+$tab_array[] = array(gettext("Portal Auth"), false, "diag_logs.php?logfile=portalauth");
+$tab_array[] = array(gettext("IPsec"), false, "diag_logs.php?logfile=ipsec");
+$tab_array[] = array(gettext("PPP"), false, "diag_logs.php?logfile=ppp");
+$tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+$tab_array[] = array(gettext("Load Balancer"), false, "diag_logs.php?logfile=relayd");
+$tab_array[] = array(gettext("OpenVPN"), false, "diag_logs.php?logfile=openvpn");
+$tab_array[] = array(gettext("NTP"), false, "diag_logs.php?logfile=ntpd");
+$tab_array[] = array(gettext("Settings"), true, "diag_logs_settings.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'Submit',
+ gettext("Save")
+));
+
+$section = new Form_Section('General Logging Options');
+
+$section->addInput(new Form_Checkbox(
+ 'reverse',
+ 'Forward/Reverse Display',
+ 'Show log entries in reverse order (newest entries on top)',
+ $pconfig['reverse']
+));
+
+$section->addInput(new Form_Input(
+ 'nentries',
+ 'GUI Log Entries',
+ 'text',
+ $pconfig['nentries'],
+ ['placeholder' => '']
+))->setHelp('This is only the number of log entries displayed in the GUI. It does not affect how many entries are contained in the actual log files.');
+
+$section->addInput(new Form_Input(
+ 'logfilesize',
+ 'Log file size (Bytes)',
+ 'text',
+ $pconfig['logfilesize'],
+ ['placeholder' => 'Bytes']
+))->setHelp($logfilesizeHelp);
+
+$section->addInput(new Form_Checkbox(
+ 'logdefaultblock',
+ 'Log firewall default blocks',
+ 'Log packets matched from the default block rules in the ruleset',
+ $pconfig['logdefaultblock']
+))->setHelp('Packets that are blocked by the implicit default block rule will not be logged if you uncheck this option. Per-rule logging options are still respected.');
+
+$section->addInput(new Form_Checkbox(
+ 'logdefaultpass',
+ null,
+ 'Log packets matched from the default pass rules put in the ruleset',
+ $pconfig['logdefaultpass']
+))->setHelp('Packets that are allowed by the implicit default pass rule will be logged if you check this option. Per-rule logging options are still respected. ');
+
+$section->addInput(new Form_Checkbox(
+ 'logbogons',
+ null,
+ 'Log packets blocked by \'Block Bogon Networks\' rules',
+ $pconfig['logbogons']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'logprivatenets',
+ null,
+ 'Log packets blocked by \'Block Private Networks\' rules',
+ $pconfig['logprivatenets']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'loglighttpd',
+ 'Web Server Log',
+ 'Log errors from the web server process',
+ $pconfig['loglighttpd']
+))->setHelp('If this is checked, errors from the lighttpd web server process for the GUI or Captive Portal will appear in the main system log');
+
+$section->addInput(new Form_Checkbox(
+ 'rawfilter',
+ 'Raw Logs',
+ 'Show raw filter logs)',
+ $pconfig['rawfilter']
+))->setHelp(gettext('If this is checked, filter logs are shown as generated by the packet filter, without any formatting. This will reveal more detailed information, but it is more difficult to read'));
+
+$section->addInput(new Form_Select(
+ 'filterdescriptions',
+ 'Where to show rule descriptions',
+ !isset($pconfig['filterdescriptions']) ? '0':$pconfig['filterdescriptions'],
+ array(
+ '0' => 'Dont load descriptions',
+ '1' => 'Display as column',
+ '2' => 'Display as second row'
+ )
+))->setHelp('Show the applied rule description below or in the firewall log rows' . '<br />' .
+ 'Displaying rule descriptions for all lines in the log might affect performance with large rule sets');
+
+$section->addInput(new Form_Checkbox(
+ 'disablelocallogging',
+ 'Local Logging',
+ $g['platform'] == 'pfSense' ? "Disable writing log files to the local disk" : "Disable writing log files to the local RAM disk",
+ $pconfig['disablelocallogging']
+));
+
+$section->addInput(new Form_Button(
+ 'resetlogs',
+ 'Reset Log Files'
+))->addClass('btn-danger btn-xs')->setHelp('Clears all local log files and reinitializes them as empty logs. This also restarts the DHCP daemon. Use the Save button first if you have made any setting changes.');
+
+$form->add($section);
+$section = new Form_Section('Remote Logging Options');
+$section->addClass('toggle-remote');
+
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'Enable Remote Logging',
+ 'Send log messages to remote syslog server',
+ $pconfig['enable']
+))->toggles('.toggle-remote .panel-body .form-group:not(:first-child)');
+
+$section->addInput(new Form_Select(
+ 'sourceip',
+ 'Source Address',
+ link_interface_to_bridge($pconfig['sourceip']) ? null : $pconfig['sourceip'],
+ get_possible_traffic_source_addresses(false)
+))->setHelp($remoteloghelp);
+
+$section->addInput(new Form_Select(
+ 'ipproto',
+ 'IP Protocol',
+ $ipproto,
+ array('ipv4' => 'IPv4', 'ipv6' => 'IPv6')
+))->setHelp('This option is only used when a non-default address is chosen as the source above. This option only expresses a preference; If an IP address of the selected type is not found on the chosen interface, the other type will be tried.');
+
+// Group colapses/appears based on 'enable' checkbox above
+$group = new Form_Group('Remote log servers');
+
+$group->add(new Form_Input(
+ 'remoteserver',
+ 'Server 1',
+ 'text',
+ $pconfig['remoteserver'],
+ ['placeholder' => 'IP[:port]']
+));
+
+$group->add(new Form_Input(
+ 'remoteserver2',
+ 'Server 2',
+ 'text',
+ $pconfig['remoteserver2'],
+ ['placeholder' => 'IP[:port]']
+));
+
+$group->add(new Form_Input(
+ 'remoteserver3',
+ 'Server 3',
+ 'text',
+ $pconfig['remoteserver3'],
+ ['placeholder' => 'IP[:port]']
+));
+
+$section->add($group);
+
+$group = new Form_MultiCheckboxGroup('Remote Syslog Contents');
+$group->add(new Form_MultiCheckbox(
+ 'system',
+ null,
+ 'System Events',
+ $pconfig['system']
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'filter',
+ null,
+ 'Firewall Events',
+ $pconfig['filter']
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'dhcp',
+ null,
+ 'DHCP service events',
+ $pconfig['dhcp']
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'portalauth',
+ null,
+ 'Portal Auth events',
+ $pconfig['portalauth']
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'vpn',
+ null,
+ 'VPN (PPTP, IPsec, OpenVPN) events',
+ $pconfig['vpn']
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'apinger',
+ null,
+ 'Gateway Monitor events',
+ $pconfig['apinger']
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'relayd',
+ null,
+ 'Server Load Balancer events',
+ $pconfig['relayd']
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'hostapd',
+ null,
+ 'Wireless events',
+ $pconfig['hostapd']
+));
+
+$group->setHelp('syslog sends UDP datagrams to port 514 on the specified remote '.
+ 'syslog server, unless another port is specified. Be sure to set syslogd on '.
+ 'the remote server to accept syslog messages from pfSense.');
+
+$section->add($group);
+
+$form->add($section);
+print $form;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_logs_vpn.php b/src/usr/local/www/diag_logs_vpn.php
index d1dc748..e5ce76b 100755
--- a/src/usr/local/www/diag_logs_vpn.php
+++ b/src/usr/local/www/diag_logs_vpn.php
@@ -2,37 +2,63 @@
<?php
/*
diag_logs_vpn.php
- part of m0n0wall (http://m0n0.ch/wall)
-
- Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2003-2006 Manuel Kasper <mk@neon1.net>
+ * part of m0n0wall (http://m0n0.ch/wall)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/sbin/fifolog_reader /usr/local/sbin/clog
- pfSense_MODULE: vpn
+ pfSense_MODULE: vpn
*/
##|+PRIV
@@ -42,6 +68,9 @@
##|*MATCH=diag_logs_vpn.php*
##|-PRIV
+
+$vpns = array('pptp' => 'PPTP', 'poes' => 'PPPoE', 'l2tp' => 'L2TP');
+
$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("VPN"));
require("guiconfig.inc");
require_once("vpn.inc");
@@ -98,6 +127,7 @@ function dump_clog_vpn($logfile, $tail) {
exec("/usr/local/sbin/clog " . escapeshellarg($logfile) . " | tail {$sor} -n " . $tail, $logarr);
}
+ $rows = 0;
foreach ($logarr as $logent) {
$logent = preg_split("/\s+/", $logent, 6);
$llent = explode(",", $logent[5]);
@@ -106,7 +136,7 @@ function dump_clog_vpn($logfile, $tail) {
continue;
}
echo "<tr>\n";
- echo "<td class=\"listlr nowrap\">" . htmlspecialchars(join(" ", array_slice($logent, 0, 3))) . "</td>\n";
+ echo "<td>" . htmlspecialchars(join(" ", array_slice($logent, 0, 3))) . "</td>\n";
if ($llent[0] == "login") {
echo "<td class=\"listr\"><img src=\"/themes/{$g['theme']}/images/icons/icon_in.gif\" width=\"11\" height=\"11\" title=\"login\" alt=\"in\" /></td>\n";
@@ -114,98 +144,99 @@ function dump_clog_vpn($logfile, $tail) {
echo "<td class=\"listr\"><img src=\"/themes/{$g['theme']}/images/icons/icon_out.gif\" width=\"11\" height=\"11\" title=\"logout\" alt=\"out\" /></td>\n";
}
- echo "<td class=\"listr\">" . htmlspecialchars($llent[3]) . "</td>\n";
- echo "<td class=\"listr\">" . htmlspecialchars($llent[2]) . "&nbsp;</td>\n";
+ echo "<td>" . htmlspecialchars($llent[3]) . "</td>\n";
+ echo "<td>" . htmlspecialchars($llent[2]) . "&nbsp;</td>\n";
echo "</tr>\n";
}
+ return($rows);
}
include("head.inc");
+$tab_array = array();
+$tab_array[] = array(gettext("System"), false, "diag_logs.php");
+$tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+$tab_array[] = array(gettext("DHCP"), false, "diag_logs.php?logfile=dhcpd");
+$tab_array[] = array(gettext("Portal Auth"), false, "diag_logs.php?logfile=portalauth");
+$tab_array[] = array(gettext("IPsec"), false, "diag_logs.php?logfile=ipsec");
+$tab_array[] = array(gettext("PPP"), false, "diag_logs.php?logfile=ppp");
+$tab_array[] = array(gettext("VPN"), true, "diag_logs_vpn.php");
+$tab_array[] = array(gettext("Load Balancer"), false, "diag_logs.php?logfile=relayd");
+$tab_array[] = array(gettext("OpenVPN"), false, "diag_logs.php?logfile=openvpn");
+$tab_array[] = array(gettext("NTP"), false, "diag_logs.php?logfile=ntpd");
+$tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+display_top_tabs($tab_array);
+
+$tab_array = array();
+$tab_array[] = array(gettext("PPTP Logins"),
+ (($vpntype == "pptp") && ($mode != "raw")),
+ "/diag_logs_vpn.php?vpntype=pptp");
+$tab_array[] = array(gettext("PPTP Raw"),
+ (($vpntype == "pptp") && ($mode == "raw")),
+ "/diag_logs_vpn.php?vpntype=pptp&amp;mode=raw");
+$tab_array[] = array(gettext("PPPoE Logins"),
+ (($vpntype == "poes") && ($mode != "raw")),
+ "/diag_logs_vpn.php?vpntype=poes");
+$tab_array[] = array(gettext("PPPoE Raw"),
+ (($vpntype == "poes") && ($mode == "raw")),
+ "/diag_logs_vpn.php?vpntype=poes&amp;mode=raw");
+$tab_array[] = array(gettext("L2TP Logins"),
+ (($vpntype == "l2tp") && ($mode != "raw")),
+ "/diag_logs_vpn.php?vpntype=l2tp");
+$tab_array[] = array(gettext("L2TP Raw"),
+ (($vpntype == "l2tp") && ($mode == "raw")),
+ "/diag_logs_vpn.php?vpntype=l2tp&amp;mode=raw");
+display_top_tabs($tab_array, false, 'nav nav-tabs');
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs vpn">
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), false, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), true, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabnavtbl">
+
+<!-- Raw logs are displayed as preformatted text. vpn logs are displayed as a table-->
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Last ")?><?=$nentries?> <?=$vpns[$vpntype]?><?=gettext(" log entries")?></h2></div>
+ <div class="panel-body">
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("PPTP Logins"),
- (($vpntype == "pptp") && ($mode != "raw")),
- "/diag_logs_vpn.php?vpntype=pptp");
- $tab_array[] = array(gettext("PPTP Raw"),
- (($vpntype == "pptp") && ($mode == "raw")),
- "/diag_logs_vpn.php?vpntype=pptp&amp;mode=raw");
- $tab_array[] = array(gettext("PPPoE Logins"),
- (($vpntype == "poes") && ($mode != "raw")),
- "/diag_logs_vpn.php?vpntype=poes");
- $tab_array[] = array(gettext("PPPoE Raw"),
- (($vpntype == "poes") && ($mode == "raw")),
- "/diag_logs_vpn.php?vpntype=poes&amp;mode=raw");
- $tab_array[] = array(gettext("L2TP Logins"),
- (($vpntype == "l2tp") && ($mode != "raw")),
- "/diag_logs_vpn.php?vpntype=l2tp");
- $tab_array[] = array(gettext("L2TP Raw"),
- (($vpntype == "l2tp") && ($mode == "raw")),
- "/diag_logs_vpn.php?vpntype=l2tp&amp;mode=raw");
- display_top_tabs($tab_array);
+ if ($mode != "raw") {
?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
- <form action="diag_logs_vpn.php" method="post">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td colspan="4" class="listtopic">
- <?php printf(gettext('Last %1$s %2$s VPN log entries'), $nentries, $vpns[$vpntype]);?>
- </td>
+ <th><?=gettext("Time")?></th>
+ <th><?=gettext("Action")?></th>
+ <th><?=gettext("User")?></th>
+ <th><?=gettext("IP address")?></th>
</tr>
- <?php
- if ($mode != "raw"):
- ?>
- <tr>
- <td class="listhdrr"><?=gettext("Time");?></td>
- <td class="listhdrr"><?=gettext("Action");?></td>
- <td class="listhdrr"><?=gettext("User");?></td>
- <td class="listhdrr"><?=gettext("IP address");?></td>
- </tr>
- <?php
- dump_clog_vpn("/var/log/vpn.log", $nentries);
- ?>
- <?php
- else:
- dump_clog("/var/log/{$logname}.log", $nentries);
- endif;
- ?>
+ </thead>
+ <tbody>
+<?php
+ $rows = dump_clog_vpn("/var/log/vpn.log", $nentries); // dump_clog_vpn provides all the need <td></td>/<tr></tr> tags
+?>
+ </tbody>
</table>
- <br />
- <input type="hidden" name="vpntype" id="vpntype" value="<?=$vpntype;?>" />
- <input type="hidden" name="mode" id="mode" value="<?=$mode;?>" />
- <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
+<?php
+ if($rows == 0)
+ print_info_box('No logs to display');
+?>
+ </div>
+<?php
+ }
+ else {
+?>
+ <pre>
+<?php
+ if(dump_clog_no_table("/var/log/{$logname}.log", $nentries) == 0)
+ print('No logs to display');
+?>
+ </pre>
+<?php
+ }
+?>
+ <p>
+ <form action="diag_logs_vpn.php" method="post">
+ <input type="hidden" name="vpntype" id="vpntype" value="<?=$vpntype?>" />
+ <input type="hidden" name="mode" id="mode" value="<?=$mode?>" />
+ <input name="clear" type="submit" class="btn btn-danger" value="<?=gettext("Clear log")?>" />
</form>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </p>
+ </div>
+</div>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_logs_wireless.php b/src/usr/local/www/diag_logs_wireless.php
deleted file mode 100644
index 4979d1e..0000000
--- a/src/usr/local/www/diag_logs_wireless.php
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-/* $Id$ */
-/*
- diag_logs_wireless.php
- part of pfSense
-
- Copyright (C) 2008 Bill Marquette <bill.marquette@gmail.com>.
- Copyright (C) 2008 Seth Mos <seth.mos@dds.nl>.
- Copyright (C) 2011 Jim Pingle <jimp@pfsense.org>.
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- pfSense_MODULE: routing
-*/
-
-##|+PRIV
-##|*IDENT=page-status-systemlogs-wireless
-##|*NAME=Status: System logs: Wireless page
-##|*DESCR=Allow access to the 'Status: System logs: System: Wireless' page.
-##|*MATCH=diag_logs_wireless.php*
-##|-PRIV
-
-require("guiconfig.inc");
-
-$wireless_logfile = "{$g['varlog_path']}/wireless.log";
-
-$nentries = $config['syslog']['nentries'];
-if (!$nentries) {
- $nentries = 50;
-}
-
-if ($_POST['clear']) {
- clear_log_file($wireless_logfile);
-}
-
-$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Wireless"));
-$shortcut_section = "wireless";
-include("head.inc");
-
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs system wireless">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("System"), true, "diag_logs.php");
- $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
- $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
- $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
- $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
- $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
- $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
- $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
- $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
- $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
- $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("General"), false, "/diag_logs.php");
- $tab_array[] = array(gettext("Gateways"), false, "/diag_logs_gateways.php");
- $tab_array[] = array(gettext("Routing"), false, "/diag_logs_routing.php");
- $tab_array[] = array(gettext("Resolver"), false, "/diag_logs_resolver.php");
- $tab_array[] = array(gettext("Wireless"), true, "/diag_logs_wireless.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic">
- <?php printf(gettext("Wireless (hostapd) log entries"), $nentries);?>
- </td>
- </tr>
- <?php dump_clog($wireless_logfile, $nentries); ?>
- <tr>
- <td>
- <br />
- <form action="diag_logs_wireless.php" method="post">
- <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
- </form>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
diff --git a/src/usr/local/www/diag_nanobsd.php b/src/usr/local/www/diag_nanobsd.php
index 63a4f35..7479693 100644
--- a/src/usr/local/www/diag_nanobsd.php
+++ b/src/usr/local/www/diag_nanobsd.php
@@ -1,31 +1,58 @@
<?php
/*
diag_nanobsd.php
- Copyright (C) 2009 Scott Ullrich <sullrich@gmail.com>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2009 Scott Ullrich <sullrich@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/mount /sbin/glabel /usr/bin/grep /usr/bin/cut /usr/bin/head /bin/cp
@@ -47,6 +74,10 @@ ini_set('max_input_time', '9999');
require_once("guiconfig.inc");
require_once("config.inc");
+// Setting DEBUG to true causes the dangerous stuff on this page to be simulated rather than exectued.
+// MUST be set to false for production of course
+define(DEBUG, true);
+
$pgtitle = array(gettext("Diagnostics"), gettext("NanoBSD"));
include("head.inc");
@@ -56,52 +87,37 @@ global $GLABEL_SLICE, $UFS_ID, $OLD_UFS_ID, $BOOTFLASH;
global $BOOT_DEVICE, $REAL_BOOT_DEVICE, $BOOT_DRIVE, $ACTIVE_SLICE;
nanobsd_detect_slice_info();
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?=$jsevents["body"]["onload"];?>">
-
-<?php include("fbegin.inc"); ?>
-
-<?php
-
$NANOBSD_SIZE = nanobsd_get_size();
+$class='alert-warning';
+
+if($_POST['bootslice']) {
+ if(!DEBUG)
+ nanobsd_switch_boot_slice();
+ else
+ sleep(4);
-if ($_POST['bootslice']) {
- $statusmsg = gettext("Setting slice information, please wait...");
- echo <<<EOF
- <div id="loading">
- <img src="/themes/{$g['theme']}/images/misc/loader.gif">
- $statusmsg
- <p/>&nbsp;
- </div>
-EOF;
- nanobsd_switch_boot_slice();
$savemsg = gettext("The boot slice has been set to") . " " . nanobsd_get_active_slice();
+ $class='alert-success';
// Survey slice info
nanobsd_detect_slice_info();
-
}
-if ($_POST['destslice']) {
+if($_POST['destslice'] && $_POST['duplicateslice']) {
$statusmsg = gettext("Duplicating slice. Please wait, this will take a moment...");
- echo <<<EOF
- <div id="loading">
- <img src="/themes/{$g['theme']}/images/misc/loader.gif">
- $statusmsg
- <p/>&nbsp;
- </div>
-EOF;
- if (nanobsd_clone_slice($_POST['destslice'])) {
+
+ if(!DEBUG && nanobsd_clone_slice($_POST['destslice'])) {
$savemsg = gettext("The slice has been duplicated.") . "<p/>" . gettext("If you would like to boot from this newly duplicated slice please set it using the bootup information area.");
+ $class='alert-success';
} else {
- $savemsg = gettext("There was an error while duplicating the slice. Operation aborted.");
+ $savemsg = gettext("There was an error while duplicating the slice. Operation aborted.");
+ $class='alert-danger';
}
// Re-Survey slice info
nanobsd_detect_slice_info();
}
if ($_POST['changero']) {
- if (is_writable("/")) {
+ if (!DEBUG && is_writable("/")) {
conf_mount_ro();
} else {
conf_mount_rw();
@@ -109,181 +125,132 @@ if ($_POST['changero']) {
}
if ($_POST['setrw']) {
- conf_mount_rw();
- if (isset($_POST['nanobsd_force_rw'])) {
- $config['system']['nanobsd_force_rw'] = true;
- } else {
- unset($config['system']['nanobsd_force_rw']);
- }
+ if(!DEBUG) {
+ conf_mount_rw();
+ if (isset($_POST['nanobsd_force_rw']))
+ $config['system']['nanobsd_force_rw'] = true;
+ else
+ unset($config['system']['nanobsd_force_rw']);
- write_config("Changed Permanent Read/Write Setting");
- conf_mount_ro();
+ write_config("Changed Permanent Read/Write Setting");
+ conf_mount_ro();
+ }
+ else {
+ $savemsg = 'Saved r/w permanantly';
+ $class = 'alert-success';
+ }
}
-if ($savemsg) {
- print_info_box($savemsg);
+print_info_box("The options on this page are intended for use by advanced users only.");
+
+if ($savemsg)
+ print_info_box($savemsg, $class);
+
+require('classes/Form.class.php');
+
+$form = new Form(false);
+
+$section = new Form_Section('NanoBSD Option');
+
+$section->addInput(new Form_StaticText(
+ 'Image Size',
+ $NANOBSD_SIZE
+));
+
+$slicebtn = new Form_Button('bootslice', 'Switch Slice');
+$slicebtn->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'Bootup slice',
+ $ACTIVE_SLICE . ' ' . $slicebtn
+));
+
+if (is_writable("/")) {
+ $refcount = refcount_read(1000);
+ /* refcount_read returns -1 when shared memory section does not exist */
+ if ($refcount == 1 || $refcount == -1) {
+ $refdisplay = "";
+ } else {
+ $refdisplay = " (Reference count " . $refcount . ")";
+ }
+ $lbl = gettext("Read/Write") . $refdisplay;
+ if (!isset($config['system']['nanobsd_force_rw']))
+ $btnlbl = gettext("Switch to Read-Only");
+} else {
+ $lbl = gettext("Read-Only");
+ if (!isset($config['system']['nanobsd_force_rw']))
+ $btnlbl = gettext("Switch to Read/Write");
}
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td>
- <!-- tabs here if you want them -->
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <span class="vexpl">
- <span class="red">
- <strong><?=gettext("NOTE:")?>&nbsp;</strong>
- </span>
- <?=gettext("The options on this page are intended for use by advanced users only.")?>
- <br />&nbsp;
- </span>
- <p/>
- <table width="100%" border="0" cellpadding="6" cellspacing="0">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Bootup information");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("NanoBSD Image size");?></td>
- <td width="78%" class="vtable">
- <?php echo $NANOBSD_SIZE; ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Bootup");?></td>
- <td width="78%" class="vtable">
- <form action="diag_nanobsd.php" method="post" name="iform">
- <?=gettext("Bootup slice is currently:");?> <?php echo $ACTIVE_SLICE; ?>
- <br /><br /><?=gettext("This will switch the bootup slice to the alternate slice.");?>
- <br />
- <input type='hidden' name='bootslice' value='switch'>
- <input type='submit' value='Switch Slice'></form>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Media Read/Write Status");?></td>
- </tr>
- <tr>
- <td valign="top" class="vncell">Current Read/Write Status:</td>
- <td valign="top" class="vncell">
- <form action="diag_nanobsd.php" method="post" name="iform">
- <?php if (is_writable("/")) {
- $refcount = refcount_read(1000);
- /* refcount_read returns -1 when shared memory section does not exist */
- if ($refcount == 1 || $refcount == -1) {
- $refdisplay = "";
- } else {
- $refdisplay = " (reference count " . $refcount . ")";
- }
- echo gettext("Read/Write") . $refdisplay;
- if (!isset($config['system']['nanobsd_force_rw'])) {
- echo "<br /><input type='submit' name='changero' value='" . gettext("Switch to Read-Only") . "'>";
- }
- } else {
- echo gettext("Read-Only");
- if (!isset($config['system']['nanobsd_force_rw'])) {
- echo "<br /><input type='submit' name='changero' value='" . gettext("Switch to Read/Write") . "'>";
- }
- } ?>
- </form>
- <br /><?php echo gettext("NOTE: This setting is only temporary, and can be switched dynamically in the background."); ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell">Permanent Read/Write:</td>
- <td valign="top" class="vncell">
- <form action="diag_nanobsd.php" method="post" name="iform">
- <input type="checkbox" name="nanobsd_force_rw" <?php if (isset($config['system']['nanobsd_force_rw'])) echo "checked"; ?>> <?php echo gettext("Keep media mounted read/write at all times.") ?>
- <br /><input type='submit' name='setrw' value='<?php echo gettext("Save") ?>'>
- </form>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Duplicate bootup slice to alternate");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Duplicate bootup slice");?></td>
- <td width="78%" class="vtable">
- <form action="diag_nanobsd.php" method="post" name="iform">
- <?=gettext("Destination slice:");?>
- <select name='destslice'>
- <option value='<?php echo $COMPLETE_PATH; ?>'>
- <?php echo "{$COMPLETE_BOOT_PATH} -> {$TOFLASH}"; ?>
- </option>
- </select>
- <br />
- <?=gettext("This will duplicate the bootup slice to the alternate slice. Use this if you would like to duplicate the known good working boot partition to the alternate.");?>
- <br /><input type='submit' name='duplicateslice' value='<?php echo gettext("Duplicate slice") ?>'>
- </form>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Periodic Data Backup");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RRD/DHCP Backup");?></td>
- <td width="78%" class="vtable">
- <?=gettext("These options have been relocated to");?> <a href="system_advanced_misc.php"><?=gettext("System > Advanced, Miscellaneous tab")?></a>.
- </td>
- </tr>
-<?php if (file_exists("/conf/upgrade_log.txt")): ?>
- <tr>
- <td colspan="2" valign="top" class="">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("View upgrade log");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("View previous upgrade log");?></td>
- <td width="78%" class="vtable">
- <?php
- if ($_POST['viewupgradelog']) {
- echo "<textarea name='log' cols='80' rows='40'>";
- echo str_ireplace("pfsense", $g['product_name'], file_get_contents("/conf/upgrade_log.txt"));
- echo "\nFile list:\n";
- echo str_ireplace("pfsense", $g['product_name'], file_get_contents("/conf/file_upgrade_log.txt"));
- echo "\nMisc log:\n";
- echo str_ireplace("pfsense", $g['product_name'], file_get_contents("/conf/firmware_update_misc_log.txt"));
- echo "\nfdisk/bsdlabel log:\n";
- echo str_ireplace("pfsense", $g['product_name'], file_get_contents("/conf/fdisk_upgrade_log.txt"));
- echo "</textarea>";
- } else {
- echo "<form action='diag_nanobsd.php' method='post' name='iform'>";
- echo "<input type='submit' name='viewupgradelog' value='View upgrade log'>";
- }
- ?>
- </td>
- </tr>
-<?php endif; ?>
- <tr>
- <td colspan="2" valign="top" class="">&nbsp;</td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php require("fend.inc"); ?>
-</body>
-</html>
+$robtn = new Form_Button('changero', $btnlbl);
+$robtn->removeClass('btn-primary')->addClass('btn-default btn-sm');
-<?php
+$section->addInput(new Form_StaticText(
+ 'Read/Write status',
+ $lbl . ' ' . $robtn
+));
+
+$section->addInput(new Form_Checkbox(
+ 'nanobsd_force_rw',
+ 'Permanent Read/Write',
+ 'Keep media mounted read/write at all times. ',
+ isset($config['system']['nanobsd_force_rw'])
+))->setHelp('This setting is only temporary, and can be switched dynamically in the background.');
+
+$permbtn = new Form_Button('setrw', 'Save');
+$permbtn->removeClass('btn-primary')->addClass('btn-default btn-sm');
-// Clear the loading indicator
-echo "<script type=\"text/javascript\">";
-echo "jQuery('#loading').html('');";
-echo "</script>";
+$section->addInput(new Form_StaticText(
+ null,
+ $permbtn
+));
+$section->addInput(new Form_Input(
+ 'destslice',
+ null,
+ 'hidden',
+ $COMPLETE_PATH
+));
+
+$dupbtn = new Form_Button('duplicateslice', 'Duplicate ' . $COMPLETE_BOOT_PATH . ' -> ' . $TOFLASH);
+$dupbtn->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'Duplicate boot slice',
+ $dupbtn
+))->setHelp('This will duplicate the bootup slice to the alternate slice. Use this if you would like to duplicate the known good working boot partition to the alternate.');
+
+$section->addInput(new Form_StaticText(
+ 'RRD/DHCP Backup',
+ 'These options have been relocated to the ' . '<a href="system_advanced_misc.php">' . 'System > Advanced, Miscellaneous</a> tab.'
+));
+
+if(file_exists("/conf/upgrade_log.txt")) {
+ $viewbtn = new Form_Button('viewupgradelog', 'View log');
+ $viewbtn->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+ $section->addInput(new Form_StaticText(
+ 'View previous upgrade log',
+ $viewbtn
+ ));
+}
+$form->add($section);
+print($form);
+
+if(file_exists("/conf/upgrade_log.txt") && $_POST['viewupgradelog']) {
?>
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Previous upgrade log")?></h2></div>
+ <!-- No white space between the <pre> and the first output or it will appear on the page! -->
+ <pre><?=str_ireplace("pfsense", $g['product_name'], file_get_contents("/conf/upgrade_log.txt"))?>
+ <br /><?=gettext("File list:")?>
+ <?=str_ireplace("pfsense", $g['product_name'], file_get_contents("/conf/file_upgrade_log.txt"))?>
+ <br /><?=gettext("Misc log:")?>
+ <?=str_ireplace("pfsense", $g['product_name'], file_get_contents("/conf/firmware_update_misc_log.txt"))?>
+ <br /><?=gettext("fdisk/bsdlabel log:")?>
+ <?=str_ireplace("pfsense", $g['product_name'], file_get_contents("/conf/fdisk_upgrade_log.txt"))?>
+ </pre>
+ </div>
+<?php
+}
+require("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_ndp.php b/src/usr/local/www/diag_ndp.php
index 233d8ee..1fe0b24 100644
--- a/src/usr/local/www/diag_ndp.php
+++ b/src/usr/local/www/diag_ndp.php
@@ -1,40 +1,64 @@
<?php
/*
diag_ndp.php
- part of the pfSense project (https://www.pfsense.org)
- Copyright (C) 2004-2010 Scott Ullrich <sullrich@gmail.com>
- Copyright (C) 2011 Seth Mos <seth.mos@dds.nl>
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2005 Paul Taylor (paultaylor@winndixie.com) and Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (C) 2004-2010 Scott Ullrich <sullrich@gmail.com>
+ * Copyright (C) 2011 Seth Mos <seth.mos@dds.nl>
+ * Part of the pfSense project (https://www.pfsense.org)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /bin/cat /usr/sbin/arp
- pfSense_MODULE: arp
+ pfSense_MODULE: arp
*/
##|+PRIV
@@ -107,78 +131,49 @@ $mac_man = load_mac_manufacturer_table();
$pgtitle = array(gettext("Diagnostics"), gettext("NDP Table"));
include("head.inc");
-
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-
-<?php include("fbegin.inc"); ?>
-
-<div id="loading">
- <img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /><?= gettext("Loading, please wait..."); ?>
- <p>&nbsp;</p>
-</div>
-
-<?php
-
-// Flush buffers out to client so that they see Loading, please wait....
-for ($i = 0; $i < ob_get_level(); $i++) {
- ob_end_flush();
-}
-ob_implicit_flush(1);
-
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag ndp">
- <tr>
- <td>
- <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="tabcont">
+<div class="table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><?= gettext("IPv6 address"); ?></th>
+ <th><?= gettext("MAC address"); ?></th>
+ <th><?= gettext("Hostname"); ?></th>
+ <th><?= gettext("Interface"); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($data as $entry): ?>
<tr>
- <td class="listhdrr"><?= gettext("IPv6 address"); ?></td>
- <td class="listhdrr"><?= gettext("MAC address"); ?></td>
- <td class="listhdrr"><?= gettext("Hostname"); ?></td>
- <td class="listhdr"><?= gettext("Interface"); ?></td>
- <td class="list"></td>
+ <td><?=$entry['ipv6']?></td>
+ <td>
+ <?php
+ $mac=trim($entry['mac']);
+ $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
+ ?>
+ <?=$mac?>
+
+ <? if(isset($mac_man[$mac_hi])):?>
+ (<?=$mac_man[$mac_hi]?>)
+ <?endif?>
+
+ </td>
+ <td>
+ <?=htmlspecialchars(str_replace("Z_ ", "", $entry['dnsresolve']))?>
+ </td>
+ <td>
+ <?php
+ if(isset($hwif[$entry['interface']]))
+ echo $hwif[$entry['interface']];
+ else
+ echo $entry['interface'];
+ ?>
+ </td>
</tr>
- <?php foreach ($data as $entry): ?>
- <tr>
- <td class="listlr"><?=$entry['ipv6'];?></td>
- <td class="listr">
- <?php
- $mac=trim($entry['mac']);
- $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
- print $mac;
- if (isset($mac_man[$mac_hi])) {
- print "<br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>";
- }
- ?>
- </td>
- <td class="listr">
- <?php
- echo "&nbsp;". str_replace("Z_ ", "", $entry['dnsresolve']);
- ?>
- </td>
- <td class="listr">
- <?php
- if (isset($hwif[$entry['interface']])) {
- echo $hwif[$entry['interface']];
- } else {
- echo $entry['interface'];
- }
- ?>
- </td>
- </tr>
- <?php endforeach; ?>
- </table>
- </td>
- </tr>
-</table>
-
-<?php include("fend.inc"); ?>
-
-<script type="text/javascript">
-//<![CDATA[
- jQuery('#loading').html('');
-//]]>
-</script>
-</body>
-</html>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+</div>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_packet_capture.php b/src/usr/local/www/diag_packet_capture.php
index 14be5d1..d4adee8 100644
--- a/src/usr/local/www/diag_packet_capture.php
+++ b/src/usr/local/www/diag_packet_capture.php
@@ -1,34 +1,61 @@
<?php
/*
diag_packet_capture.php
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_BUILDER_BINARIES: /bin/ps /usr/bin/grep /usr/sbin/tcpdump
- pfSense_MODULE: routing
+ pfSense_BUILDER_BINARIES: /bin/ps /usr/bin/grep /usr/sbin/tcpdump
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -43,9 +70,11 @@ $allowautocomplete = true;
function fixup_host_logic($value) {
return str_replace(array(" ", ",", "+", "|", "!"), array("", "and ", "and ", "or ", "not "), $value);
}
+
function strip_host_logic($value) {
return str_replace(array(" ", ",", "+", "|", "!"), array("", "", "", "", ""), $value);
}
+
function get_host_boolean($value, $host) {
$value = str_replace(array("!", $host), array("", ""), $value);
$andor = "";
@@ -58,14 +87,18 @@ function get_host_boolean($value, $host) {
$andor = "and ";
break;
}
+
return $andor;
}
+
function has_not($value) {
return strpos($value, '!') !== false;
}
+
function fixup_not($value) {
return str_replace("!", "not ", $value);
}
+
function strip_not($value) {
return ltrim(trim($value), '!');
}
@@ -98,7 +131,7 @@ $count = 100;//default number of packets to capture
$fams = array('ip', 'ip6');
$protos = array('icmp', 'icmp6', 'tcp', 'udp', 'arp', 'carp', 'esp',
- '!icmp', '!icmp6', '!tcp', '!udp', '!arp', '!carp', '!esp');
+ '!icmp', '!icmp6', '!tcp', '!udp', '!arp', '!carp', '!esp');
$input_errors = array();
@@ -129,31 +162,37 @@ if ($_POST) {
if (!array_key_exists($selectedif, $interfaces)) {
$input_errors[] = gettext("Invalid interface.");
}
+
if ($fam !== "" && $fam !== "ip" && $fam !== "ip6") {
$input_errors[] = gettext("Invalid address family.");
}
+
if ($proto !== "" && !in_array(strip_not($proto), $protos)) {
$input_errors[] = gettext("Invalid protocol.");
}
if ($host != "") {
$host_string = str_replace(array(" ", "|", ","), array("", "#|", "#+"), $host);
+
if (strpos($host_string, '#') === false) {
$hosts = array($host);
} else {
$hosts = explode('#', $host_string);
}
+
foreach ($hosts as $h) {
if (!is_subnet(strip_host_logic($h)) && !is_ipaddr(strip_host_logic($h))) {
$input_errors[] = sprintf(gettext("A valid IP address or CIDR block must be specified. [%s]"), $h);
}
}
}
+
if ($port != "") {
if (!is_port(strip_not($port))) {
$input_errors[] = gettext("Invalid value specified for port.");
}
}
+
if ($snaplen == "") {
$snaplen = 0;
} else {
@@ -161,6 +200,7 @@ if ($_POST) {
$input_errors[] = gettext("Invalid value specified for packet length.");
}
}
+
if ($count == "") {
$count = 0;
} else {
@@ -226,260 +266,240 @@ if ($_POST) {
$do_tcpdump = false;
}
-include("head.inc"); ?>
+$protocollist = array(
+ '' => 'Any',
+ 'icmp' => 'ICMP',
+ '!icmp' => 'Exclude ICMP',
+ 'icmp6' => 'ICMPv6',
+ '!icmp6' => 'Exclude ICMPv6',
+ 'tcp' => 'TCP',
+ '!tcp' => 'Exclude TCP',
+ 'udp' => 'UDP',
+ '!udp' => 'Exclude UDP',
+ 'arp' => 'ARP',
+ '!arp' => 'Exclude ARP',
+ 'carp' => 'CARP (VRRP)',
+ '!carp' => 'Exclude CARP (VRRP)',
+ 'esp' => 'ESP'
+);
+
+include("head.inc");
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form(false); // No button yet. We add those later depending on the required action
+
+$section = new Form_Section('General Logging Options');
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ $selectedif,
+ $interfaces
+))->setHelp('Select the interface on which to capture traffic. ');
+
+$section->addInput(new Form_Checkbox(
+ 'promiscuous',
+ 'Promiscuous',
+ 'Packet capture will be performed using promiscuous mode',
+ $pconfig['promiscuous']
+))->setHelp('Note: Some network adapters do not support or work well in promiscuous mode.'. '<br />' .
+ 'More: ' . '<a target="_blank" href="http://www.freebsd.org/cgi/man.cgi?query=tcpdump&amp;apropos=0&amp;sektion=0&amp;manpath=FreeBSD+8.3-stable&amp;arch=default&amp;format=html">' .
+ 'Packet capture' . '</a>');
+
+$section->addInput(new Form_Select(
+ 'fam',
+ 'Address Family',
+ $fam,
+ array('' => 'Any',
+ 'ip' => 'IPv4 Only',
+ 'ip6' => 'IPv6 Only'
+ )
+))->setHelp('Select the type of traffic to be captured');
+
+$section->addInput(new Form_Select(
+ 'proto',
+ 'Protocol',
+ $proto,
+ $protocollist
+))->setHelp('Select the protocol to capture, or "Any". ');
+
+$section->addInput(new Form_Input(
+ 'host',
+ 'Host Address',
+ 'text',
+ $host
+))->setHelp('This value is either the Source or Destination IP address or subnet in CIDR notation. The packet capture will look for this address in either field.' . '<br />' .
+ 'Matching can be negated by preceding the value with "!". Multiple IP addresses or CIDR subnets may be specified. Comma (",") separated values perform a boolean "AND". ' .
+ 'Separating with a pipe ("|") performs a boolean "OR".' . '<br />' .
+ 'If you leave this field blank, all packets on the specified interface will be captured.');
+
+$section->addInput(new Form_Input(
+ 'port',
+ 'Port',
+ 'text',
+ $port
+))->setHelp('The port can be either the source or destination port. The packet capture will look for this port in either field. ' .
+ 'Leave blank if you do not want to filter by port.');
+
+$section->addInput(new Form_Input(
+ 'snaplen',
+ 'Packet Length',
+ 'text',
+ $snaplen
+))->setHelp('The Packet length is the number of bytes of each packet that will be captured. Default value is 0, ' .
+ 'which will capture the entire frame regardless of its size.');
+
+$section->addInput(new Form_Input(
+ 'count',
+ 'Count',
+ 'text',
+ $count
+))->setHelp('This is the number of packets the packet capture will grab. Default value is 100.' . '<br />' .
+ 'Enter 0 (zero) for no count limit.');
+
+$section->addInput(new Form_Select(
+ 'detail',
+ 'Level of detail',
+ $detail,
+ array('' => 'Any',
+ 'normal' => 'Normal',
+ 'medium' => 'Medium',
+ 'high' => 'High',
+ 'full' => 'Full',
+ )
+))->setHelp('This is the level of detail that will be displayed after hitting "Stop" when the packets have been captured.' . '<br />' .
+ 'This option does not affect the level of detail when downloading the packet capture. ');
+
+$section->addInput(new Form_Checkbox(
+ 'dnsquery',
+ 'Reverse DNS Lookup',
+ null,
+ $_POST['dnsquery']
+))->setHelp('This check box will cause the packet capture to perform a reverse DNS lookup associated with all IP addresses.' . '<br />' .
+ 'This option can cause delays for large packet captures.');
+
+$form->add($section);
+
+/* check to see if packet capture tcpdump is already running */
+$processcheck = (trim(shell_exec("/bin/ps axw -O pid= | /usr/bin/grep tcpdump | /usr/bin/grep {$fn} | /usr/bin/egrep -v '(pflog|grep)'")));
+
+$processisrunning = ($processcheck != "");
+
+if (($action == gettext("Stop") or $action == "") and $processisrunning != true) {
+ $form->addGlobal(new Form_Button(
+ 'startbtn',
+ 'Start'
+ ))->removeClass('btn-primary')->addClass('btn-success');
+}
+else {
+ $form->addGlobal(new Form_Button(
+ 'stopbtn',
+ 'Stop'
+ ))->removeClass('btn-primary')->addClass('btn-warning');
+}
-<body link="#000000" vlink="#0000CC" alink="#0000CC">
+if (file_exists($fp.$fn) and $processisrunning != true) {
+ $form->addGlobal(new Form_Button(
+ 'viewbtn',
+ 'View Capture'
+ ))->removeClass('btn-primary');
+
+ $form->addGlobal(new Form_Button(
+ 'downloadbtn',
+ 'Download Capture'
+ ))->removeClass('btn-primary');
+
+ $section->addInput(new Form_StaticText(
+ 'Last capture',
+ date("F jS, Y g:i:s a.", filemtime($fp.$fn))
+ ));
+}
-<?php
-include("fbegin.inc");
-?>
+print($form);
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag packet capture">
- <tr><td>
- <form action="diag_packet_capture.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="table">
- <tr>
- <td colspan="3" valign="top" class="listtopic"><?=gettext("Packet capture");?></td>
- </tr>
- <tr>
- <td width="17%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
- <td width="32%" class="vtable">
- <select name="interface">
- <?php foreach ($interfaces as $iface => $ifacename): ?>
- <option value="<?=$iface;?>" <?php if ($selectedif == $iface) echo "selected=\"selected\""; ?>>
- <?php echo $ifacename;?>
- </option>
- <?php endforeach; ?>
- </select>
- <br /><?=gettext("Select the interface on which to capture traffic.");?>
- </td>
- </tr>
- <tr>
- <td width="17%" valign="top" class="vncellreq"><?=gettext("Promiscuous");?></td>
- <td width="51%" class="vtable">
- <input name="promiscuous" type="checkbox"<?php if ($_POST['promiscuous']) echo " checked=\"checked\""; ?> />
- <br /><?=gettext("If checked, the");?> <a target="_blank" href="http://www.freebsd.org/cgi/man.cgi?query=tcpdump&amp;apropos=0&amp;sektion=0&amp;manpath=FreeBSD+8.3-stable&amp;arch=default&amp;format=html"><?= gettext("packet capture")?></a> <?= gettext("will be performed using promiscuous mode.");?>
- <br /><b><?=gettext("Note");?>: </b><?=gettext("Some network adapters do not support or work well in promiscuous mode.");?>
- </td>
- </tr>
- <tr>
- <td width="17%" valign="top" class="vncellreq"><?=gettext("Address Family");?></td>
- <td colspan="2" width="83%" class="vtable">
- <select name="fam">
- <option value="">Any</option>
- <option value="ip" <?php if ($fam == "ip") echo "selected=\"selected\""; ?>>IPv4 Only</option>
- <option value="ip6" <?php if ($fam == "ip6") echo "selected=\"selected\""; ?>>IPv6 Only</option>
- </select>
- <br /><?=gettext("Select the type of traffic to be captured, either Any, IPv4 only or IPv6 only.");?>
- </td>
- </tr>
- <tr>
- <td width="17%" valign="top" class="vncellreq"><?=gettext("Protocol");?></td>
- <td colspan="2" width="83%" class="vtable">
- <select name="proto">
- <option value="">Any</option>
- <option value="icmp" <?php if ($proto == "icmp") echo "selected=\"selected\""; ?>>ICMP</option>
- <option value="!icmp" <?php if ($proto == "!icmp") echo "selected=\"selected\""; ?>>Exclude ICMP</option>
- <option value="icmp6" <?php if ($proto == "icmp6") echo "selected=\"selected\""; ?>>ICMPv6</option>
- <option value="!icmp6" <?php if ($proto == "!icmp6") echo "selected=\"selected\""; ?>>Exclude ICMPv6</option>
- <option value="tcp" <?php if ($proto == "tcp") echo "selected=\"selected\""; ?>>TCP</option>
- <option value="!tcp" <?php if ($proto == "!tcp") echo "selected=\"selected\""; ?>>Exclude TCP</option>
- <option value="udp" <?php if ($proto == "udp") echo "selected=\"selected\""; ?>>UDP</option>
- <option value="!udp" <?php if ($proto == "!udp") echo "selected=\"selected\""; ?>>Exclude UDP</option>
- <option value="arp" <?php if ($proto == "arp") echo "selected=\"selected\""; ?>>ARP</option>
- <option value="!arp" <?php if ($proto == "!arp") echo "selected=\"selected\""; ?>>Exclude ARP</option>
- <option value="carp" <?php if ($proto == "carp") echo "selected=\"selected\""; ?>>CARP (VRRP)</option>
- <option value="!carp" <?php if ($proto == "!carp") echo "selected=\"selected\""; ?>>Exclude CARP (VRRP)</option>
- <option value="esp" <?php if ($proto == "esp") echo "selected=\"selected\""; ?>>ESP</option>
- </select>
- <br /><?=gettext("Select the protocol to capture, or Any.");?>
- </td>
- </tr>
- <tr>
- <td width="17%" valign="top" class="vncellreq"><?=gettext("Host Address");?></td>
- <td colspan="2" width="83%" class="vtable">
- <input name="host" class="formfld host" id="host" size="20" value="<?=htmlspecialchars($host);?>" />
- <br /><?=gettext("This value is either the Source or Destination IP address or subnet in CIDR notation. The packet capture will look for this address in either field.");?>
- <br /><?=gettext("Matching can be negated by preceding the value with \"!\". Multiple IP addresses or CIDR subnets may be specified. Comma (\",\") separated values perform a boolean \"and\". Separating with a pipe (\"|\") performs a boolean \"or\".");?>
- <br /><?=gettext("If you leave this field blank, all packets on the specified interface will be captured.");?>
- </td>
- </tr>
- <tr>
- <td width="17%" valign="top" class="vncellreq"><?=gettext("Port");?></td>
- <td colspan="2" width="83%" class="vtable">
- <input name="port" class="formfld unknown" id="port" size="5" value="<?=htmlspecialchars($port);?>" />
- <br /><?=gettext("The port can be either the source or destination port. The packet capture will look for this port in either field.");?>
- <br /><?=gettext("Leave blank if you do not want to filter by port.");?>
- </td>
- </tr>
- <tr>
- <td width="17%" valign="top" class="vncellreq"><?=gettext("Packet Length");?></td>
- <td colspan="2" width="83%" class="vtable">
- <input name="snaplen" class="formfld unknown" id="snaplen" size="5" value="<?=htmlspecialchars($snaplen);?>" />
- <br /><?=gettext("The Packet length is the number of bytes of each packet that will be captured. Default value is 0, which will capture the entire frame regardless of its size.");?>
- </td>
- </tr>
- <tr>
- <td width="17%" valign="top" class="vncellreq"><?=gettext("Count");?></td>
- <td colspan="2" width="83%" class="vtable">
- <input name="count" class="formfld unknown" id="count" size="5" value="<?=htmlspecialchars($count);?>" />
- <br /><?=gettext("This is the number of packets the packet capture will grab. Default value is 100.") . "<br />" . gettext("Enter 0 (zero) for no count limit.");?>
- </td>
- </tr>
- <tr>
- <td width="17%" valign="top" class="vncellreq"><?=gettext("Level of Detail");?></td>
- <td colspan="2" width="83%" class="vtable">
- <select name="detail" class="formselect" id="detail" size="1">
- <option value="normal" <?php if ($detail == "normal") echo "selected=\"selected\""; ?>><?=gettext("Normal");?></option>
- <option value="medium" <?php if ($detail == "medium") echo "selected=\"selected\""; ?>><?=gettext("Medium");?></option>
- <option value="high" <?php if ($detail == "high") echo "selected=\"selected\""; ?>><?=gettext("High");?></option>
- <option value="full" <?php if ($detail == "full") echo "selected=\"selected\""; ?>><?=gettext("Full");?></option>
- </select>
- <br />
- <?=gettext("This is the level of detail that will be displayed after hitting 'Stop' when the packets have been captured.") . "<br /><b>" .
- gettext("Note:") . "</b> " .
- gettext("This option does not affect the level of detail when downloading the packet capture.");?>
- </td>
- </tr>
- <tr>
- <td width="17%" valign="top" class="vncellreq"><?=gettext("Reverse DNS Lookup");?></td>
- <td colspan="2" width="83%" class="vtable">
- <input name="dnsquery" type="checkbox" <?php if ($_POST['dnsquery']) echo " checked=\"checked\""; ?> />
- <br /><?=gettext("This check box will cause the packet capture to perform a reverse DNS lookup associated with all IP addresses.");?>
- <br /><b><?=gettext("Note");?>: </b><?=gettext("This option can cause delays for large packet captures.");?>
- </td>
- </tr>
- <tr>
- <td width="17%" valign="top">&nbsp;</td>
- <td colspan="2" width="83%">
-<?php
+if ($do_tcpdump) :
+ $matches = array();
- /* check to see if packet capture tcpdump is already running */
- $processcheck = (trim(shell_exec("/bin/ps axw -O pid= | /usr/bin/grep tcpdump | /usr/bin/grep {$fn} | /usr/bin/egrep -v '(pflog|grep)'")));
+ if (in_array($fam, $fams))
+ $matches[] = $fam;
- if ($processcheck != "") {
- $processisrunning = true;
- } else {
- $processisrunning = false;
- }
+ if (in_array($proto, $protos))
+ $matches[] = fixup_not($proto);
- if (($action == gettext("Stop") or $action == "") and $processisrunning != true) {
- echo "<input type=\"submit\" name=\"startbtn\" value=\"" . gettext("Start") . "\" />&nbsp;";
- } else {
- echo "<input type=\"submit\" name=\"stopbtn\" value=\"" . gettext("Stop") . "\" />&nbsp;";
- }
- if (file_exists($fp.$fn) and $processisrunning != true) {
- echo "<input type=\"submit\" name=\"viewbtn\" value=\"" . gettext("View Capture") . "\" />&nbsp;";
- echo "<input type=\"submit\" name=\"downloadbtn\" value=\"" . gettext("Download Capture") . "\" />";
- echo "<br />" . gettext("The packet capture file was last updated:") . " " . date("F jS, Y g:i:s a.", filemtime($fp.$fn));
- }
-?>
- </td>
- </tr>
- </table>
- </form>
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="results">
- <tr>
- <td valign="top" colspan="2">
-<?php
- echo "<font face=\"terminal\" size=\"2\">";
- if ($processisrunning == true) {
- echo("<strong>" . gettext("Packet Capture is running.") . "</strong><br />");
- }
+ if ($port != "")
+ $matches[] = "port ".fixup_not($port);
- if ($do_tcpdump) {
- $matches = array();
+ if ($host != "") {
+ $hostmatch = "";
+ $hostcount = 0;
- if (in_array($fam, $fams)) {
- $matches[] = $fam;
- }
+ foreach ($hosts as $h) {
+ $h = fixup_host($h, $hostcount++);
- if (in_array($proto, $protos)) {
- $matches[] = fixup_not($proto);
- }
+ if (!empty($h))
+ $hostmatch .= " " . $h;
+ }
- if ($port != "") {
- $matches[] = "port ".fixup_not($port);
- }
+ if (!empty($hostmatch))
+ $matches[] = "({$hostmatch})";
+ }
- if ($host != "") {
- $hostmatch = "";
- $hostcount = 0;
- foreach ($hosts as $h) {
- $h = fixup_host($h, $hostcount++);
- if (!empty($h)) {
- $hostmatch .= " " . $h;
- }
- }
- if (!empty($hostmatch)) {
- $matches[] = "({$hostmatch})";
- }
- }
+ if ($count != "0" ) {
+ $searchcount = "-c " . $count;
+ } else {
+ $searchcount = "";
+ }
- if ($count != "0") {
- $searchcount = "-c " . $count;
- } else {
- $searchcount = "";
- }
+ $selectedif = convert_friendly_interface_to_real_interface_name($selectedif);
- $selectedif = convert_friendly_interface_to_real_interface_name($selectedif);
-
- if ($action == gettext("Start")) {
- $matchstr = implode($matches, " and ");
- echo("<strong>" . gettext("Packet Capture is running.") . "</strong><br />");
- $cmd = "/usr/sbin/tcpdump -i {$selectedif} {$disablepromiscuous} {$searchcount} -s {$snaplen} -w {$fp}{$fn} " . escapeshellarg($matchstr);
- // Debug
- //echo $cmd;
- mwexec_bg ($cmd);
- } else {
- //action = stop
- echo("<strong>" . gettext("Packet Capture stopped.") . "<br /><br />" . gettext("Packets Captured:") . "</strong><br />");
-?>
- <script type="text/javascript">
- //<![CDATA[
- window.onload=function() {
- document.getElementById("packetsCaptured").wrap='off';
- }
- //]]>
- </script>
- <textarea id="packetsCaptured" style="width:98%" name="code" rows="15" cols="66" readonly="readonly">
-<?php
- $detail_args = "";
- switch ($detail) {
- case "full":
- $detail_args = "-vv -e";
- break;
- case "high":
- $detail_args = "-vv";
- break;
- case "medium":
- $detail_args = "-v";
- break;
- case "normal":
- default:
- $detail_args = "-q";
- break;
- }
- system("/usr/sbin/tcpdump {$disabledns} {$detail_args} -r {$fp}{$fn}");
-
- conf_mount_ro();
+ if ($action == gettext("Start")) {
+ $matchstr = implode($matches, " and ");
+
+ print_info_box(gettext('Packet Capture is running'), 'info');
+
+ $cmd = "/usr/sbin/tcpdump -i {$selectedif} {$disablepromiscuous} {$searchcount} -s {$snaplen} -w {$fp}{$fn} " . escapeshellarg($matchstr);
+ // Debug
+ //echo $cmd;
+ mwexec_bg ($cmd);
+ } else {
?>
- </textarea>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Packets Captured')?></h2></div>
+ <div class="panel-body">
+
<?php
- }
+ $detail_args = "";
+ switch ($detail) {
+ case "full":
+ $detail_args = "-vv -e";
+ break;
+ case "high":
+ $detail_args = "-vv";
+ break;
+ case "medium":
+ $detail_args = "-v";
+ break;
+ case "normal":
+ default:
+ $detail_args = "-q";
+ break;
}
-?>
- &nbsp;</font>
- </td>
- </tr>
- </table>
- </td></tr>
-</table>
-<?php
-include("fend.inc");
+ print('<pre>');
+ system("/usr/sbin/tcpdump {$disabledns} {$detail_args} -r {$fp}{$fn}");
+ print('</pre>');
+
+ conf_mount_ro();
?>
-</body>
-</html>
+ </div>
+</div>
+<?php
+ }
+endif;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_patterns.php b/src/usr/local/www/diag_patterns.php
index 1c3528d..8386f25 100644
--- a/src/usr/local/www/diag_patterns.php
+++ b/src/usr/local/www/diag_patterns.php
@@ -1,33 +1,62 @@
<?php
/* $Id$ */
/*
- Exec+ v1.02-000 - Copyright 2001-2003, All rights reserved
- Created by André Ribeiro and Hélder Pereira
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
+ diag_patterns.php
*/
-
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Exec+ v1.02-000 - Copyright 2001-2003, All rights reserved
+ * Created by André Ribeiro and Hélder Pereira
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: shaper
+ pfSense_MODULE: shaper
*/
##|+PRIV
@@ -39,19 +68,24 @@
require("guiconfig.inc");
+// Defining this here ensures that both instances (button name and POST check) are identical
+$buttonlabel = gettext("Upload Pattern file");
+
//Move the upload file to /usr/local/share/protocols (is_uploaded_file must use tmp_name as argument)
-if (($_POST['submit'] == gettext("Upload Pattern file")) && is_uploaded_file($_FILES['ulfile']['tmp_name'])) {
- if (fileExtension($_FILES['ulfile']['name'])) {
- if (!is_array($config['l7shaper']['custom_pat'])) {
+if (($_POST['submit'] == $buttonlabel) && is_uploaded_file($_FILES['ulfile']['tmp_name'])) {
+ if(fileExtension($_FILES['ulfile']['name'])) {
+ if (!is_array($config['l7shaper']['custom_pat']))
$config['l7shaper']['custom_pat'] = array();
- }
$config['l7shaper']['custom_pat'][$_FILES['ulfile']['name']] = base64_encode(file_get_contents($_FILES['ulfile']['tmp_name']));
write_config(sprintf(gettext("Added custom l7 pattern %s"), $_FILES['ulfile']['name']));
move_uploaded_file($_FILES['ulfile']['tmp_name'], "/usr/local/share/protocols/" . $_FILES['ulfile']['name']);
$ulmsg = gettext("Uploaded file to") . " /usr/local/share/protocols/" . htmlentities($_FILES['ulfile']['name']);
- } else {
- $ulmsg = gettext("Warning: You must upload a file with .pat extension.");
+ $class = 'alert-success';
+ }
+ else {
+ $ulmsg = gettext("Error: You must upload a file with .pat extension.");
+ $class = 'alert-danger';
}
}
@@ -63,35 +97,27 @@ function fileExtension($nameFile) {
$pgtitle = array(gettext("Diagnostics"), gettext("Add layer7 pattern"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($ulmsg) echo "<p class=\"red\"><strong>" . $ulmsg . "</strong></p>\n"; ?>
-<div id="mainarea">
-<form action="diag_patterns.php" method="post" enctype="multipart/form-data" name="frmPattern">
-<table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="upload pattern">
- <tr>
- <td colspan="4" valign="top" class="listtopic"><?=gettext("Upload layer7 pattern file");?></td>
- </tr>
- <tr>
- <td align="right"><strong><?=gettext("File to upload:");?></strong></td>
- <td valign="top" class="label">
- <input name="ulfile" type="file" class="formfld file" id="ulfile" />
- </td>
- </tr>
- <tr>
- <td valign="top">&nbsp;&nbsp;&nbsp;</td>
- <td valign="top" class="label">
- <input name="submit" type="submit" class="button" id="upload" value="<?=gettext("Upload Pattern file");?>" />
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
-</table>
-</form>
-</div>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+if($ulmsg)
+ print_info_box($ulmsg, $class);
+
+require('classes/Form.class.php');
+
+$form = new Form($buttonlabel);
+
+$form->setMultipartEncoding();
+
+$section = new Form_Section('Upload Layer7 pattern file');
+
+$filepicker = new Form_Input(
+ 'ulfile',
+ 'File to upload',
+ 'file'
+);
+
+$section->addInput($filepicker)->setHelp('Choose the file you wish to upload (*.pat)');
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_pf_info.php b/src/usr/local/www/diag_pf_info.php
index 369c0f4..881da29 100644
--- a/src/usr/local/www/diag_pf_info.php
+++ b/src/usr/local/www/diag_pf_info.php
@@ -2,35 +2,62 @@
/* $Id$ */
/*
diag_pf_info.php
- Copyright (C) 2010 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2010 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/bin/top
- pfSense_MODULE: system
+ pfSense_MODULE: system
*/
##|+PRIV
@@ -44,7 +71,12 @@ require("guiconfig.inc");
$pgtitle = gettext("Diagnostics: pfInfo");
-if ($_REQUEST['getactivity']) {
+if (stristr($_POST['Submit'], gettext("No"))) {
+ header("Location: index.php");
+ exit;
+}
+
+if($_REQUEST['getactivity']) {
$text = `/sbin/pfctl -vvsi`;
$text .= "<p/>";
$text .= `/sbin/pfctl -vvsm`;
@@ -58,60 +90,57 @@ if ($_REQUEST['getactivity']) {
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+$form = new Form(false);
+$form->addGlobal(new Form_Input(
+ 'getactivity',
+ null,
+ 'hidden',
+ 'yes'
+));
+$section = new Form_Section('Auto update page');
+
+$section->addInput(new Form_Checkbox(
+ 'refresh',
+ 'Refresh',
+ 'Automatically refresh the output below',
+ true
+));
+
+$form->add($section);
+print $form;
+
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-jQuery(document).ready(function() {setTimeout('getpfinfo()', 5000);});
-//<![CDATA[
+<script>
function getpfinfo() {
- jQuery.ajax({
- type: "POST",
- url: "/diag_pf_info.php",
- data: 'getactivity=yes',
- async: false,
- complete: activitycallback
+ if (!$('#refresh').is(':checked'))
+ return;
+
+ $.ajax(
+ '/diag_pf_info.php',
+ {
+ type: 'post',
+ data: $(document.forms[0]).serialize(),
+ success: function (data) {
+ $('#xhrOutput').html(data);
+ },
});
}
- function activitycallback(transport) {
- jQuery('#pfactivitydiv').html('<font face="Courier" size="2"><pre style="text-align:left;">' + transport.responseText + '<\/pre><\/font>');
- setTimeout('getpfinfo()', 2000);
- }
-//]]>
+
+ events.push(function(){
+ setInterval('getpfinfo()', 2500);
+ getpfinfo();
+ });
</script>
-<div id="maincontent">
-<?php
- if ($savemsg) {
- echo "<div id=\"savemsg\">";
- print_info_box($savemsg);
- echo "</div>";
- }
- if ($input_errors) {
- print_input_errors($input_errors);
- }
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag pf info">
- <tr>
- <td>
- <table id="backuptable" class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
- <tr>
- <td align="center">
- <table summary="results">
- <tr>
- <td>
- <div id="pfactivitydiv">
- <?=gettext("Gathering PF information, please wait...");?>
- </div>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Output')?></h2></div>
+ <div class="panel panel-body">
+ <pre id="xhrOutput"><?=gettext("Gathering PF information, please wait...")?></pre>
+ </div>
</div>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_ping.php b/src/usr/local/www/diag_ping.php
index 102b097..cb4bf2e 100644
--- a/src/usr/local/www/diag_ping.php
+++ b/src/usr/local/www/diag_ping.php
@@ -1,39 +1,63 @@
<?php
/*
diag_ping.php
- part of m0n0wall (http://m0n0.ch/wall)
-
- Copyright (C) 2003-2005 Bob Zoller (bob@kludgebox.com) and Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2003-2005 Bob Zoller (bob@kludgebox.com) and Manuel Kasper <mk@neon1.net>
+ * part of m0n0wall (http://m0n0.ch/wall)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/ping /sbin/ping6
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -50,6 +74,15 @@ require_once("guiconfig.inc");
define('MAX_COUNT', 10);
define('DEFAULT_COUNT', 3);
+function create_sourceaddresslist() {
+ $list = array('any' => 'Any');
+
+ foreach (get_possible_traffic_source_addresses(true) as $sipname)
+ $list[$sipname['value']] = $sipname['name'];
+
+ return $list;
+}
+
if ($_POST || $_REQUEST['host']) {
unset($input_errors);
unset($do_ping);
@@ -81,122 +114,115 @@ if ($_POST || $_REQUEST['host']) {
}
}
}
+
if (!isset($do_ping)) {
$do_ping = false;
$host = '';
$count = DEFAULT_COUNT;
}
-include("head.inc"); ?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="ping">
-<tr><td>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="diag_ping.php" method="post" name="iform" id="iform">
-<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Ping"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Host"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="host" type="text" class="formfld unknown" id="host" size="20" value="<?=htmlspecialchars($host);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("IP Protocol"); ?></td>
- <td width="78%" class="vtable">
- <select name="ipproto" class="formselect">
- <option value="ipv4" <?php if ($ipproto == "ipv4") echo "selected=\"selected\"" ?>>IPv4</option>
- <option value="ipv6" <?php if ($ipproto == "ipv6") echo "selected=\"selected\"" ?>>IPv6</option>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Source Address"); ?></td>
- <td width="78%" class="vtable">
- <select name="sourceip" class="formselect">
- <option value="">Default</option>
- <?php $sourceips = get_possible_traffic_source_addresses(true);
- foreach ($sourceips as $sipvalue => $sipname):
- $selected = "";
- if (!link_interface_to_bridge($sipvalue) && ($sipvalue == $sourceip)) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$sipvalue;?>" <?=$selected;?>>
- <?=htmlspecialchars($sipname);?>
- </option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?= gettext("Count"); ?></td>
- <td width="78%" class="vtable">
- <select name="count" class="formfld" id="count">
- <?php for ($i = 1; $i <= MAX_COUNT; $i++): ?>
- <option value="<?=$i;?>" <?php if ($i == $count) echo "selected=\"selected\""; ?>><?=$i;?></option>
- <?php endfor; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Ping"); ?>" />
- </td>
- </tr>
- <tr>
- <td valign="top" colspan="2">
- <?php if ($do_ping) {
- echo "<font face=\"terminal\" size=\"2\">";
- echo "<strong>" . gettext("Ping output") . ":</strong><br />";
- ?>
- <script type="text/javascript">
- //<![CDATA[
- window.onload=function() {
- document.getElementById("pingCaptured").wrap='off';
- }
- //]]>
- </script>
- <?php
- echo "<textarea id=\"pingCaptured\" style=\"width:98%\" name=\"code\" rows=\"15\" cols=\"66\" readonly=\"readonly\">";
- $ifscope = '';
- $command = "/sbin/ping";
- if ($ipproto == "ipv6") {
- $command .= "6";
- $ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ipv6($sourceip);
- if (is_linklocal($ifaddr)) {
- $ifscope = get_ll_scope($ifaddr);
- }
- } else {
- $ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ip($sourceip);
- }
- if ($ifaddr && (is_ipaddr($host) || is_hostname($host))) {
- $srcip = "-S" . escapeshellarg($ifaddr);
- if (is_linklocal($host) && !strstr($host, "%") && !empty($ifscope)) {
- $host .= "%{$ifscope}";
- }
- }
-
- $cmd = "{$command} {$srcip} -c" . escapeshellarg($count) . " " . escapeshellarg($host);
- //echo "Ping command: {$cmd}\n";
- system($cmd);
- echo('</textarea>&nbsp;</font>');
- }
- ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">&nbsp;</td>
- </tr>
-</table>
-</form>
-</td></tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if($do_ping) {
+?>
+ <script type="text/javascript">
+ //<![CDATA[
+ window.onload=function(){
+ document.getElementById("pingCaptured").wrap='off';
+ }
+ //]]>
+ </script>
+<?php
+ $ifscope = '';
+ $command = "/sbin/ping";
+ if ($ipproto == "ipv6") {
+ $command .= "6";
+ $ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ipv6($sourceip);
+ if (is_linklocal($ifaddr))
+ $ifscope = get_ll_scope($ifaddr);
+ } else {
+ $ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ip($sourceip);
+ }
+
+ if ($ifaddr && (is_ipaddr($host) || is_hostname($host))) {
+ $srcip = "-S" . escapeshellarg($ifaddr);
+ if (is_linklocal($host) && !strstr($host, "%") && !empty($ifscope))
+ $host .= "%{$ifscope}";
+ }
+
+ $cmd = "{$command} {$srcip} -c" . escapeshellarg($count) . " " . escapeshellarg($host);
+ //echo "Ping command: {$cmd}\n";
+ $result = shell_exec($cmd);
+
+ if(empty($result))
+ $input_errors[] = "Host \"" . $host . "\" did not respond or could not be resolved.";
+
+}
+
+include('head.inc');
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form('Ping');
+
+$section = new Form_Section('Ping');
+
+$section->addInput(new Form_Input(
+ 'host',
+ 'Hostname',
+ 'text',
+ $host,
+ ['placeholder' => 'Hostname to ping']
+));
+
+$group = new Form_Group('IP Protocol');
+$group->add(new Form_Checkbox(
+ 'ipproto',
+ null,
+ 'IPv4',
+ ('ipv6' != $ipproto), # negative check, so this would be checked by default
+ 'ipv4'
+))->displayAsRadio();
+$group->add(new Form_Checkbox(
+ 'ipproto',
+ null,
+ 'IPv6',
+ ('ipv6' == $ipproto),
+ 'ipv6'
+))->displayAsRadio();
+$group->setHelp('Select the protocol to use');
+$section->add($group);
+
+$section->addInput(new Form_Select(
+ 'sourceip',
+ 'Source address',
+ $pconfig['source'],
+ create_sourceaddresslist()
+))->setHelp('Select source address for the ping');
+
+$section->addInput(new Form_Select(
+ 'count',
+ 'Maximum number of pings',
+ $count,
+ array_combine(range(1, MAX_COUNT), range(1, MAX_COUNT))
+))->setHelp('Select the maximum number pings');
+
+$form->add($section);
+print $form;
+
+if($do_ping && !empty($result) && !$input_errors) {
+?>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title">Results</h2>
+ </div>
+
+ <div class="panel-body">
+ <pre><?= $result ?></pre>
+ </div>
+ </div>
+<?php
+}
+
+include('foot.inc');
diff --git a/src/usr/local/www/diag_pkglogs.php b/src/usr/local/www/diag_pkglogs.php
index 6575c48..e02cfff 100755
--- a/src/usr/local/www/diag_pkglogs.php
+++ b/src/usr/local/www/diag_pkglogs.php
@@ -3,33 +3,59 @@
$Id$
diag_pkglogs.php
- Copyright (C) 2005 Colin Smith
- All rights reserved.
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
+*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2005 Colin Smith
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
+/*
<logging>
<logtab>arpwatch</logtab>
<grepfor>arpwatch</logtab>
@@ -59,9 +85,6 @@ if (!($nentries = $config['syslog']['nentries'])) {
$nentries = 50;
}
-//if ($_POST['clear'])
-// clear_log_file($logfile);
-
$i = 0;
$pkgwithlogging = false;
$apkg = $_GET['pkg'];
@@ -88,26 +111,16 @@ if (!$apkg) { // If we aren't looking for a specific package, locate the first p
$pgtitle = array(gettext("Status"), gettext("Package logs"));
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td>
- <?php
- if ($pkgwithlogging == false) {
- print_info_box(gettext("No packages with logging facilities are currently installed."));
- echo '</ul></td></tr></table>';
- include("fend.inc");
- exit;
- }
+if($pkgwithlogging == false) {
+ print_info_box(gettext("No packages with logging facilities are currently installed."));
+} else {
$tab_array = array();
- foreach ($config['installedpackages']['package'] as $package) {
- if (is_array($package['logging'])) {
- if (!($logtab = $package['logging']['logtab'])) {
+ foreach($config['installedpackages']['package'] as $package) {
+ if(is_array($package['logging'])) {
+ if(!($logtab = $package['logging']['logtab']))
$logtab = $package['name'];
- }
- if ($apkg == $package['name']) {
+
+ if($apkg == $package['name']) {
$curtab = $logtab;
$tab_array[] = array(sprintf(gettext("%s"), $logtab), true, "diag_pkglogs.php?pkg=".$package['name']);
} else {
@@ -116,32 +129,20 @@ include("head.inc");
}
}
display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0">
- <tr>
- <td colspan="2" class="listtopic">
- <?php printf(gettext('Last %1$s %2$s log entries'), $nentries, $curtab); ?>
- </td>
- </tr>
- <?php
- $package =& $config['installedpackages']['package'][$apkgid];
- dump_clog($g['varlog_path'] . '/' . $package['logging']['logfilename'], $nentries);
- ?>
- </table>
-<!--
-<form action="diag_pkglogs.php" method="post">
-<input name="clear" type="submit" class="formbtn" value="Clear log">
-</form>
--->
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+?>
+
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=printf(gettext('Last %1$s %2$s log entries'),$nentries,$curtab)?></h2></div>
+ <div>class="panel-body">
+ <pre>
+<?php
+ $package = $config['installedpackages']['package'][$apkgid];
+ dump_clog_no_table($g['varlog_path'] . '/' . $package['logging']['logfilename'], $nentries, true, array());
+?>
+ </pre>
+ </div>
+ </div>
+
+<?php }
+
+include("foot.inc"); ?> \ No newline at end of file
diff --git a/src/usr/local/www/diag_resetstate.php b/src/usr/local/www/diag_resetstate.php
index 07d3575..7dff11c 100644
--- a/src/usr/local/www/diag_resetstate.php
+++ b/src/usr/local/www/diag_resetstate.php
@@ -2,38 +2,61 @@
/* $Id$ */
/*
diag_resetstate.php
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2004-2009 Scott Ullrich
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004-2009 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: filter
+ pfSense_MODULE: filter
*/
##|+PRIV
@@ -48,6 +71,7 @@ require_once("filter.inc");
if ($_POST) {
$savemsg = "";
+
if ($_POST['statetable']) {
filter_flush_state_table();
if ($savemsg) {
@@ -55,6 +79,7 @@ if ($_POST) {
}
$savemsg .= gettext("The state table has been flushed successfully.");
}
+
if ($_POST['sourcetracking']) {
mwexec("/sbin/pfctl -F Sources");
if ($savemsg) {
@@ -67,77 +92,67 @@ if ($_POST) {
$pgtitle = array(gettext("Diagnostics"), gettext("Reset state"));
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'alert-success');
+
+$statetabelhelp = 'Resetting the state tables will remove all entries from the corresponding tables. This means that all open connections ' .
+ 'will be broken and will have to be re-established. This may be necessary after making substantial changes to the ' .
+ 'firewall and/or NAT rules, especially if there are IP protocol mappings (e.g. for PPTP or IPv6) with open connections.' .
+ '<br /><br />' .
+ 'The firewall will normally leave the state tables intact when changing rules.' .
+ '<br /><br />' .
+ '<strong>NOTE:</strong> If you reset the firewall state table, the browser session may appear to be hung after clicking &quot;Reset&quot;. ' .
+ 'Simply refresh the page to continue.';
+
+$sourcetablehelp = 'Resetting the source tracking table will remove all source/destination associations. ' .
+ 'This means that the \"sticky\" source/destination association ' .
+ 'will be cleared for all clients.' .
+ ' <br /><br />' .
+ 'This does not clear active connection states, only source tracking.';
+
+$tab_array = array();
+$tab_array[] = array(gettext("States"), false, "diag_dump_states.php");
+
+if (isset($config['system']['lb_use_sticky']))
+ $tab_array[] = array(gettext("Source Tracking"), false, "diag_dump_states_sources.php");
+
+$tab_array[] = array(gettext("Reset States"), true, "diag_resetstate.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$resetbtn = new Form_Button(
+ 'Submit',
+ 'Reset'
+);
+
+$resetbtn->removeClass('btn-primary')->addClass('btn-danger');
+
+$form = new Form($resetbtn);
+
+$section = new Form_Section('Select states to reset');
+
+$section->addInput(new Form_Checkbox(
+ 'statetable',
+ 'State Table',
+ 'Reset the firewall state table',
+ true
+))->setHelp($statetabelhelp);
+
+if(isset($config['system']['lb_use_sticky'])) {
+ $section->addInput(new Form_Checkbox(
+ 'sourcetracking',
+ 'Source Tracking',
+ 'Reset firewall source tracking',
+ true
+ ))->setHelp($sourcetablehelp);
+}
+
+$form->add($section);
+print $form;
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<form action="diag_resetstate.php" method="post" name="iform" id="iform">
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="reset states">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("States"), false, "diag_dump_states.php");
- if (isset($config['system']['lb_use_sticky'])) {
- $tab_array[] = array(gettext("Source Tracking"), false, "diag_dump_states_sources.php");
- }
- $tab_array[] = array(gettext("Reset States"), true, "diag_resetstate.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="22%" valign="top" class="vtable">&nbsp;</td>
- <td width="78%" class="vtable"> <p>
- <input name="statetable" type="checkbox" id="statetable" value="yes" checked="checked" />
- <strong><?= gettext("Firewall state table"); ?></strong><br />
- <span class="vexpl"><br />
- <?=gettext("Resetting the state tables will remove all entries from " .
- "the corresponding tables. This means that all open connections " .
- "will be broken and will have to be re-established. This " .
- "may be necessary after making substantial changes to the " .
- "firewall and/or NAT rules, especially if there are IP protocol " .
- "mappings (e.g. for PPTP or IPv6) with open connections."); ?><br />
- <br />
- </span><span class="vexpl"><?=gettext("The firewall will normally leave " .
- "the state tables intact when changing rules."); ?><br />
- <br />
- <?=gettext("NOTE: If you reset the firewall state table, the browser " .
- "session may appear to be hung after clicking &quot;Reset&quot;. " .
- "Simply refresh the page to continue."); ?></span></p>
- </td>
- </tr>
- <?php if (isset($config['system']['lb_use_sticky'])): ?>
- <tr>
- <td width="22%" valign="top" class="vtable">&nbsp;</td>
- <td width="78%" class="vtable"><p>
- <input name="sourcetracking" type="checkbox" id="sourcetracking" value="yes" checked="checked" />
- <strong><?= gettext("Firewall Source Tracking"); ?></strong><br />
- <span class="vexpl"><br />
- <?=gettext("Resetting the source tracking table will remove all source/destination associations. " .
- "This means that the \"sticky\" source/destination association " .
- "will be cleared for all clients."); ?><br />
- <br />
- </span><span class="vexpl"><?=gettext("This does not clear active connection states, only source tracking."); ?><br />
- </p>
- </td>
- </tr>
- <?php endif; ?>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Reset"); ?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include("foot.inc"); ?> \ No newline at end of file
diff --git a/src/usr/local/www/diag_routes.php b/src/usr/local/www/diag_routes.php
index ff2fe8d..3b8e3ab 100644
--- a/src/usr/local/www/diag_routes.php
+++ b/src/usr/local/www/diag_routes.php
@@ -3,33 +3,58 @@
/* $Id$ */
/*
diag_routes.php
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2006 Fernando Lamos
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
*/
-
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2006 Fernando Lamos
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/bin/netstat
pfSense_MODULE: routing
@@ -43,6 +68,9 @@
include('guiconfig.inc');
+$limit='100';
+$filter='';
+
if (isset($_REQUEST['isAjax'])) {
$netstat = "/usr/bin/netstat -rW";
if (isset($_REQUEST['IPv6'])) {
@@ -51,6 +79,7 @@ if (isset($_REQUEST['isAjax'])) {
} else {
$netstat .= " -f inet";
echo "IPv4\n";
+
}
if (!isset($_REQUEST['resolve'])) {
$netstat .= " -n";
@@ -76,172 +105,138 @@ $shortcut_section = "routing";
include('head.inc');
+require('classes/Form.class.php');
+
+$form = new Form('Update');
+$form->addGlobal(new Form_Input(
+ 'isAjax',
+ null,
+ 'hidden',
+ 1
+));
+$section = new Form_Section('Traceroute');
+
+$section->addInput(new Form_Checkbox(
+ 'resolve',
+ 'Resolve names',
+ 'Enable',
+ $resolve
+))->setHelp('Enabling name resolution may cause the query should take longer.'.
+ ' You can stop it at any time by clicking the Stop button in your browser.');
+
+$validLimits = array('10', '50', '100', '200', '500', '1000', 'all');
+$section->addInput(new Form_Select(
+ 'limit',
+ 'Rows to display',
+ $limit,
+ array_combine($validLimits, $validLimits)
+));
+
+$section->addInput(new Form_Input(
+ 'filter',
+ 'Filter',
+ 'text',
+ $host
+))->setHelp('Use a regular expression to filter IP address or hostnames');
+
+$form->add($section);
+print $form;
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-
-<?php include("fbegin.inc"); ?>
-
-<script type="text/javascript">
-//<![CDATA[
-
- function update_routes(section) {
- var url = "diag_routes.php";
- var limit = jQuery('#limit option:selected').text();
- var filter = jQuery('#filter').val();
- var params = "isAjax=true&limit=" + limit + "&filter=" + filter;
- if (jQuery('#resolve').is(':checked')) {
- params += "&resolve=true";
- }
- if (section == "IPv6") {
- params += "&IPv6=true";
- }
- var myAjax = new Ajax.Request(
- url,
- {
- method: 'post',
- parameters: params,
- onComplete: update_routes_callback
- });
- }
+<script>
+function update_routes(section) {
+ $.ajax(
+ '/diag_routes.php',
+ {
+ type: 'post',
+ data: $(document.forms[0]).serialize() +'&'+ section +'=true',
+ success: update_routes_callback,
+ });
+}
- function update_routes_callback(transport) {
- // First line contains section
- var responseTextArr = transport.responseText.split("\n");
- var section = responseTextArr.shift();
- var tbody = '';
- var field = '';
- var elements = 8;
- var tr_class = '';
-
- var thead = '<tr><td class="listtopic" colspan="' + elements + '"><strong>' + section + '<\/strong><\/td><\/tr>' + "\n";
- for (var i = 0; i < responseTextArr.length; i++) {
- if (responseTextArr[i] == "") {
+function update_routes_callback(html) {
+ // First line contains section
+ var responseTextArr = html.split("\n");
+ var section = responseTextArr.shift();
+ var tbody = '';
+ var field = '';
+ var tr_class = '';
+ var thead = '<tr>';
+
+ for (var i = 0; i < responseTextArr.length; i++) {
+ if (responseTextArr[i] == "")
+ continue;
+ var tmp = '<tr>';
+ var j = 0;
+ var entry = responseTextArr[i].split(" ");
+ for (var k = 0; k < entry.length; k++) {
+ if (entry[k] == "")
continue;
- }
- var tmp = '';
- if (i == 0) {
- tr_class = 'listhdrr';
- tmp += '<tr class="sortableHeaderRowIdentifier">' + "\n";
- } else {
- tr_class = 'listlr';
- tmp += '<tr>' + "\n";
- }
- var j = 0;
- var entry = responseTextArr[i].split(" ");
- for (var k = 0; k < entry.length; k++) {
- if (entry[k] == "") {
- continue;
- }
- if (i == 0 && j == (elements - 1)) {
- tr_class = 'listhdr';
- }
- tmp += '<td class="' + tr_class + '">' + entry[k] + '<\/td>' + "\n";
- if (i > 0) {
- tr_class = 'listr';
- }
- j++;
- }
- // The 'Expire' field might be blank
- if (j == (elements - 1)) {
- tmp += '<td class="listr">&nbsp;<\/td>' + "\n";
- }
- tmp += '<\/tr>' + "\n";
- if (i == 0) {
- thead += tmp;
- } else {
- tbody += tmp;
- }
+ if (i == 0)
+ tmp += '<th>' + entry[k] + '<\/th>';
+ else
+ tmp += '<td>' + entry[k] + '<\/td>';
+ j++;
}
- jQuery('#' + section + ' > thead').html(thead);
- jQuery('#' + section + ' > tbody').html(tbody);
+
+ tmp += '<td><\/td>';
+
+ if (i == 0)
+ thead += tmp;
+ else
+ tbody += tmp;
}
-//]]>
-</script>
+ $('#' + section + ' > thead').html(thead);
+ $('#' + section + ' > tbody').html(tbody);
+}
-<script type="text/javascript">
-//<![CDATA[
+function update_all_routes() {
+ update_routes("IPv4");
+ update_routes("IPv6");
+}
- function update_all_routes() {
- update_routes("IPv4");
- update_routes("IPv6");
- }
+events.push(function(){
+ setInterval('update_all_routes()', 5000);
+ update_all_routes();
- jQuery(document).ready(function() {setTimeout('update_all_routes()', 5000);});
+ $(document.forms[0]).on('submit', function(e){
+ update_all_routes();
-//]]>
+ e.preventDefault();
+ });
+});
</script>
-<div id="mainarea">
-<form action="diag_routes.php" method="post">
-<table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="6" summary="diag routes">
- <tr>
- <td class="vncellreq" width="22%"><?=gettext("Name resolution");?></td>
- <td class="vtable" width="78%">
- <input type="checkbox" class="formfld" id="resolve" name="resolve" value="yes" <?php if ($_POST['resolve'] == 'yes') echo "checked=\"checked\""; ?> /><?=gettext("Enable");?>
- <br />
- <span class="expl"><?=gettext("Enable this to attempt to resolve names when displaying the tables.");?></span>
- </td>
- </tr>
-
- <tr>
- <td class="vncellreq" width="22%"><?=gettext("Number of rows");?></td>
- <td class="vtable" width="78%">
- <select id="limit" name="limit">
-<?php
- foreach (array("10", "50", "100", "200", "500", "1000", gettext("all")) as $item) {
- echo "<option value=\"{$item}\" " . ($item == "100" ? "selected=\"selected\"" : "") . ">{$item}</option>\n";
- }
-?>
- </select>
- <br />
- <span class="expl"><?=gettext("Select how many rows to display.");?></span>
- </td>
- </tr>
-
- <tr>
- <td class="vncellreq" width="22%"><?=gettext("Filter expression");?></td>
- <td class="vtable" width="78%">
- <input type="text" class="formfld search" name="filter" id="filter" />
- <br />
- <span class="expl"><?=gettext("Use a regular expression to filter IP address or hostnames.");?></span>
- </td>
- </tr>
-
- <tr>
- <td class="vncellreq" width="22%">&nbsp;</td>
- <td class="vtable" width="78%">
- <input type="button" class="formbtn" name="update" onclick="update_all_routes();" value="<?=gettext("Update"); ?>" />
- <br />
- <br />
- <span class="vexpl"><span class="red"><strong><?=gettext("Note:")?></strong></span> <?=gettext("By enabling name resolution, the query should take a bit longer. You can stop it at any time by clicking the Stop button in your browser.");?></span>
- </td>
- </tr>
-</table>
-</form>
-
-<table class="tabcont sortable" width="100%" cellspacing="0" cellpadding="6" border="0" id="IPv4" summary="ipv4 routes">
- <thead>
- <tr><td class="listtopic"><strong>IPv4</strong></td></tr>
- </thead>
- <tbody>
- <tr><td class="listhdrr"><?=gettext("Gathering data, please wait...");?></td></tr>
- </tbody>
-</table>
-<table class="tabcont sortable" width="100%" cellspacing="0" cellpadding="6" border="0" id="IPv6" summary="ipv6 routes">
- <thead>
- <tr><td class="listtopic"><strong>IPv6</strong></td></tr>
- </thead>
- <tbody>
- <tr><td class="listhdrr"><?=gettext("Gathering data, please wait...");?></td></tr>
- </tbody>
-</table>
-
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">IPv4 Routes</h2></div>
+ <div class="panel panel-body">
+ <table class="table table-striped table-compact" id="IPv4">
+ <thead>
+ <!-- filled by xhr -->
+ </thead>
+ <tbody>
+ <tr>
+ <td><?=gettext("Gathering data, please wait...")?></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
</div>
-<?php
-include('fend.inc');
-?>
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">IPv6 Routes</h2></div>
+ <div class="panel panel-body">
+ <table class="table table-striped table-compact" id="IPv6">
+ <thead>
+ <!-- filled by xhr -->
+ </thead>
+ <tbody>
+ <tr>
+ <td><?=gettext("Gathering data, please wait...")?></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
-</body>
-</html>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_smart.php b/src/usr/local/www/diag_smart.php
index 1cc9161..d09a891 100644
--- a/src/usr/local/www/diag_smart.php
+++ b/src/usr/local/www/diag_smart.php
@@ -1,18 +1,59 @@
<?php
/*
diag_smart.php
- Part of pfSense
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved
-
- Some modifications:
- Copyright (C) 2010 - Jim Pingle
-
- Copyright (C) 2006, Eric Friesen
- All rights reserved
-
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2010 - Jim Pingle
+ * Copyright (c) 2006, Eric Friesen
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
require("guiconfig.inc");
@@ -27,56 +68,17 @@ $valid_log_types = array("error", "selftest");
$closehead = false;
include("head.inc");
-?>
-
-<style type="text/css">
-/*<![CDATA[*/
-
-input {
- font-family: courier new, courier;
- font-weight: normal;
- font-size: 9pt;
-}
-
-pre {
- border: 2px solid #435370;
- background: #F0F0F0;
- padding: 1em;
- font-family: courier new, courier;
- white-space: pre;
- line-height: 10pt;
- font-size: 10pt;
-}
-
-.label {
- font-family: tahoma, verdana, arial, helvetica;
- font-size: 11px;
- font-weight: bold;
-}
-
-.button {
- font-family: tahoma, verdana, arial, helvetica;
- font-weight: bold;
- font-size: 11px;
-}
-
-/*]]>*/
-</style>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-
-<?php
-include("fbegin.inc");
// Highlights the words "PASSED", "FAILED", and "WARNING".
-function add_colors($string) {
+function add_colors($string)
+{
// To add words keep arrays matched by numbers
$patterns[0] = '/PASSED/';
$patterns[1] = '/FAILED/';
$patterns[2] = '/Warning/';
- $replacements[0] = '<b><font color="#00ff00">' . gettext("PASSED") . '</font></b>';
- $replacements[1] = '<b><font color="#ff0000">' . gettext("FAILED") . '</font></b>';
- $replacements[2] = '<font color="#ff0000">' . gettext("Warning") . '</font>';
+ $replacements[0] = '<b><font color="#00ff00">' . gettext("PASSED") . '</font></b>';
+ $replacements[1] = '<b><font color="#ff0000">' . gettext("FAILED") . '</font></b>';
+ $replacements[2] = '<font color="#ff0000">' . gettext("Warning") . '</font>';
ksort($patterns);
ksort($replacements);
return preg_replace($patterns, $replacements, $string);
@@ -103,11 +105,20 @@ function smartmonctl($action) {
// If they "get" a page but don't pass all arguments, smartctl will throw an error
$action = (isset($_POST['action']) ? $_POST['action'] : $_GET['action']);
$targetdev = basename($_POST['device']);
+
if (!file_exists('/dev/' . $targetdev)) {
echo "Device does not exist, bailing.";
return;
}
-switch ($action) {
+
+require('classes/Form.class.php');
+
+$tab_array = array();
+$tab_array[0] = array(gettext("Information/Tests"), ($action != 'config'), $_SERVER['PHP_SELF'] . "?action=default");
+$tab_array[1] = array(gettext("Config"), ($action == 'config'), $_SERVER['PHP_SELF'] . "?action=config");
+display_top_tabs($tab_array);
+
+switch($action) {
// Testing devices
case 'test':
{
@@ -116,14 +127,26 @@ switch ($action) {
echo "Invalid test type, bailing.";
return;
}
+
$output = add_colors(shell_exec($smartctl . " -t " . escapeshellarg($test) . " /dev/" . escapeshellarg($targetdev)));
- echo '<pre>' . $output . '
+?>
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Test results')?></h2></div>
+ <div class="panel-body">
+ <pre><?=$output?></pre>
+ </div>
+ </div>
+
<form action="diag_smart.php" method="post" name="abort">
- <input type="hidden" name="device" value="' . $targetdev . '" />
- <input type="hidden" name="action" value="abort" />
- <input type="submit" name="submit" value="' . gettext("Abort") . '" />
+ <input type="hidden" name="device" value="<?=$targetdev?>" />
+ <input type="hidden" name="action" value="abort" />
+ <nav class="action-buttons">
+ <input type="submit" name="submit" class="btn btn-danger" value="<?=gettext("Abort")?>" />
+ <a href="<?=$_SERVER['PHP_SELF']?>" class="btn btn-default"><?=gettext("Back")?></a>
+ </nav>
</form>
- </pre>';
+
+<?php
break;
}
@@ -131,12 +154,25 @@ switch ($action) {
case 'info':
{
$type = $_POST['type'];
+
if (!in_array($type, $valid_info_types)) {
- echo "Invalid info type, bailing.";
+ print_info_box(gettext("Invalid info type, bailing."), 'danger');
return;
}
+
$output = add_colors(shell_exec($smartctl . " -" . escapeshellarg($type) . " /dev/" . escapeshellarg($targetdev)));
- echo "<pre>$output</pre>";
+?>
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Information')?></h2></div>
+ <div class="panel-body">
+ <pre><?=$output?></pre>
+ </div>
+ </div>
+
+ <nav class="action-buttons">
+ <a href="<?=$_SERVER['PHP_SELF']?>" class="btn btn-default"><?=gettext("Back")?></a>
+ </nav>
+<?php
break;
}
@@ -145,11 +181,23 @@ switch ($action) {
{
$type = $_POST['type'];
if (!in_array($type, $valid_log_types)) {
- echo "Invalid log type, bailing.";
+ print_info_box(gettext("Invalid log type, bailing."), 'danger');
return;
}
+
$output = add_colors(shell_exec($smartctl . " -l " . escapeshellarg($type) . " /dev/" . escapeshellarg($targetdev)));
- echo "<pre>$output</pre>";
+?>
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Logs')?></h2></div>
+ <div class="panel-body">
+ <pre><?=$output?></pre>
+ </div>
+ </div>
+
+ <nav class="action-buttons">
+ <a href="<?=$_SERVER['PHP_SELF']?>" class="btn btn-default"><?=gettext("Back")?></a>
+ </nav>
+<?php
break;
}
@@ -157,297 +205,297 @@ switch ($action) {
case 'abort':
{
$output = shell_exec($smartctl . " -X /dev/" . escapeshellarg($targetdev));
- echo "<pre>$output</pre>";
+?>
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Abort')?></h2></div>
+ <div class="panel-body">
+ <pre><?=$output?></pre>
+ </div>
+ </div>
+<?php
break;
}
// Config changes, users email in xml config and write changes to smartd.conf
case 'config':
{
- if (isset($_POST['submit'])) {
- // DOES NOT WORK YET...
- if ($_POST['testemail']) {
+ if(isset($_POST['test'])) {
+
// FIXME shell_exec($smartd . " -M test -m " . $config['system']['smartmonemail']);
- $savemsg = sprintf(gettext("Email sent to %s"), $config['system']['smartmonemail']);
- smartmonctl("stop");
- smartmonctl("start");
- } else {
- $config['system']['smartmonemail'] = $_POST['smartmonemail'];
- write_config();
-
- // Don't know what all this means, but it adds the config changed header when config is saved
- $retval = 0;
- config_lock();
- if (stristr($retval, "error") <> true) {
- $savemsg = get_std_save_message($retval);
- } else {
- $savemsg = $retval;
+ $savemsg = sprintf(gettext("Email sent to %s"), $config['system']['smartmonemail']);
+ smartmonctl("stop");
+ smartmonctl("start");
+ $style = 'warning';
+ }
+ else if(isset($_POST['save']))
+ {
+ $config['system']['smartmonemail'] = $_POST['smartmonemail'];
+ write_config();
+
+ // Don't know what all this means, but it adds the config changed header when config is saved
+ $retval = 0;
+ config_lock();
+ if(stristr($retval, "error") != true) {
+ $savemsg = get_std_save_message($retval);
+ $style = 'success';
}
- config_unlock();
+ else {
+ $savemsg = $retval;
+ $style='danger';
+ }
- if ($_POST['email']) {
- // Write the changes to the smartd.conf file
- update_email($_POST['smartmonemail']);
- }
+ config_unlock();
- // Send sig HUP to smartd, rereads the config file
- shell_exec("/usr/bin/killall -HUP smartd");
- }
- }
- // Was the config changed? if so , print the message
- if ($savemsg) {
- print_info_box($savemsg);
+ // Write the changes to the smartd.conf file
+ update_email($_POST['smartmonemail']);
+
+ // Send sig HUP to smartd, rereads the config file
+ shell_exec("/usr/bin/killall -HUP smartd");
}
- // Get users email from the xml file
- $pconfig['smartmonemail'] = $config['system']['smartmonemail'];
-
- ?>
- <!-- Print the tabs across the top -->
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tabs">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Information/Tests"), false, $_SERVER['PHP_SELF'] . "?action=default");
- $tab_array[1] = array(gettext("Config"), true, $_SERVER['PHP_SELF'] . "?action=config");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- </table>
-<!-- user email address -->
- <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="config">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="e-mail">
- <tbody>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Config"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Email Address"); ?></td>
- <td width="78%" class="vtable">
- <input type="text" name="smartmonemail" value="<?=htmlspecialchars($pconfig['smartmonemail'])?>"/>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="action" value="config" />
- <input type="hidden" name="email" value="true" />
- <input type="submit" name="submit" value="<?=gettext("Save"); ?>" class="formbtn" />
- </td>
- </tr>
- </tbody>
- </table>
- </form>
-<!-- test email -->
- <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="config">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="test e-mail">
- <tbody>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Test email"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell">&nbsp;</td>
- <td width="78%" class="vtable">
- <?php printf(gettext("Send test email to %s"), $config['system']['smartmonemail']); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="action" value="config" />
- <input type="hidden" name="testemail" value="true" />
- <input type="submit" name="submit" value="<?=gettext("Send"); ?>" class="formbtn" />
- </td>
- </tr>
- </tbody>
- </table>
- </form>
+ // Was the config changed? if so , print the message
+ if ($savemsg)
+ print_info_box($savemsg, $style);
- <?php
- break;
+ // Get users email from the xml file
+ $pconfig['smartmonemail'] = $config['system']['smartmonemail'];
+
+ $form = new Form();
+
+ $section = new Form_Section('Configuration');
+
+ $section->addInput(new Form_Input(
+ 'smartmonemail',
+ 'Email Address',
+ 'text',
+ $pconfig['smartmonemail']
+ ));
+
+ $form->add($section);
+
+ if(!empty($pconfig['smartmonemail'])) {
+ $form->addGlobal(new Form_Button(
+ 'test',
+ 'Send test email'
+ ))->removeClass('btn-primary')->addClass('btn-default');
+ }
+
+ print($form);
+
+ break;
}
// Default page, prints the forms to view info, test, etc...
- default:
- {
+ default: {
+// Information
$devs = get_smart_drive_list();
- ?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="default page">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Information/Tests"), true, $_SERVER['PHP_SELF']);
- //$tab_array[1] = array("Config", false, $_SERVER['PHP_SELF'] . "?action=config");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- </table>
-<!--INFO-->
- <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="info">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="info">
- <tbody>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Info"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Info type"); ?></td>
- <td width="78%" class="vtable">
- <input type="radio" name="type" value="i" /><?=gettext("Info"); ?><br />
- <input type="radio" name="type" value="H" checked="checked" /><?=gettext("Health"); ?><br />
- <input type="radio" name="type" value="c" /><?=gettext("SMART Capabilities"); ?><br />
- <input type="radio" name="type" value="A" /><?=gettext("Attributes"); ?><br />
- <input type="radio" name="type" value="a" /><?=gettext("All"); ?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Device: /dev/"); ?></td>
- <td width="78%" class="vtable">
- <select name="device">
- <?php
- foreach ($devs as $dev) {
- echo "<option value=\"" . $dev . "\">" . $dev . "</option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="action" value="info" />
- <input type="submit" name="submit" value="<?=gettext("View"); ?>" class="formbtn" />
- </td>
- </tr>
- </tbody>
- </table>
- </form>
-<!--TESTS-->
- <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="tests">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="tests">
- <tbody>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Perform Self-tests"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Test type"); ?></td>
- <td width="78%" class="vtable">
- <input type="radio" name="testType" value="offline" /><?=gettext("Offline"); ?><br />
- <input type="radio" name="testType" value="short" checked="checked" /><?=gettext("Short"); ?><br />
- <input type="radio" name="testType" value="long" /><?=gettext("Long"); ?><br />
- <input type="radio" name="testType" value="conveyance" /><?=gettext("Conveyance (ATA Disks Only)"); ?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Device: /dev/"); ?></td>
- <td width="78%" class="vtable">
- <select name="device">
- <?php
- foreach ($devs as $dev) {
- echo "<option value=\"" . $dev . "\">" . $dev . "</option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="action" value="test" />
- <input type="submit" name="submit" value="<?=gettext("Test"); ?>" class="formbtn" />
- </td>
- </tr>
- </tbody>
- </table>
- </form>
-<!--LOGS-->
- <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="logs">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="logs">
- <tbody>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("View Logs"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Log type"); ?></td>
- <td width="78%" class="vtable">
- <input type="radio" name="type" value="error" checked="checked" /><?=gettext("Error"); ?><br />
- <input type="radio" name="type" value="selftest" /><?=gettext("Self-test"); ?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Device: /dev/"); ?></td>
- <td width="78%" class="vtable">
- <select name="device">
- <?php
- foreach ($devs as $dev) {
- echo "<option value=\"" . $dev . "\">" . $dev . "</option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="action" value="logs" />
- <input type="submit" name="submit" value="<?=gettext("View"); ?>" class="formbtn" />
- </td>
- </tr>
- </tbody>
- </table>
- </form>
-<!--ABORT-->
- <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="abort">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="abort">
- <tbody>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Abort tests"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Device: /dev/"); ?></td>
- <td width="78%" class="vtable">
- <select name="device">
- <?php
- foreach ($devs as $dev) {
- echo "<option value=\"" . $dev . "\">" . $dev . "</option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="action" value="abort" />
- <input type="submit" name="submit" value="<?=gettext("Abort"); ?>" class="formbtn" onclick="return confirm('<?=gettext("Do you really want to abort the test?"); ?>')" />
- </td>
- </tr>
- </tbody>
- </table>
- </form>
- <?php
+ $form = new Form(new Form_Button(
+ 'submit',
+ 'View'
+ ));
+
+ $section = new Form_Section('Information');
+
+ $section->addInput(new Form_Input(
+ 'action',
+ null,
+ 'hidden',
+ 'info'
+ ));
+
+ $group = new Form_Group('Info type');
+
+ $group->add(new Form_Checkbox(
+ 'type',
+ null,
+ 'Info',
+ false,
+ 'i'
+ ))->displayAsRadio();
+
+ $group->add(new Form_Checkbox(
+ 'type',
+ null,
+ 'Health',
+ true,
+ 'H'
+ ))->displayAsRadio();
+
+ $group->add(new Form_Checkbox(
+ 'type',
+ null,
+ 'SMART Capabilities',
+ false,
+ 'c'
+ ))->displayAsRadio();
+
+ $group->add(new Form_Checkbox(
+ 'type',
+ null,
+ 'Attributes',
+ false,
+ 'A'
+ ))->displayAsRadio();
+
+ $group->add(new Form_Checkbox(
+ 'type',
+ null,
+ 'All',
+ false,
+ 'a'
+ ))->displayAsRadio();
+
+ $section->add($group);
+
+ $section->addInput(new Form_Select(
+ 'device',
+ 'Device: /dev/',
+ false,
+ array_combine($devs, $devs)
+ ));
+
+ $form->add($section);
+ print($form);
+
+// Tests
+ $form = new Form(new Form_Button(
+ 'submit',
+ 'Test'
+ ));
+
+ $section = new Form_Section('Perform self-tests');
+
+ $section->addInput(new Form_Input(
+ 'action',
+ null,
+ 'hidden',
+ 'test'
+ ));
+
+ $group = new Form_Group('Test type');
+
+ $group->add(new Form_Checkbox(
+ 'testType',
+ null,
+ 'Offline',
+ false,
+ 'offline'
+ ))->displayAsRadio();
+
+ $group->add(new Form_Checkbox(
+ 'testType',
+ null,
+ 'Short',
+ true,
+ 'short'
+ ))->displayAsRadio();
+
+ $group->add(new Form_Checkbox(
+ 'testType',
+ null,
+ 'Long',
+ false,
+ 'long'
+ ))->displayAsRadio();
+
+ $group->add(new Form_Checkbox(
+ 'testType',
+ null,
+ 'Conveyance',
+ false,
+ 'conveyance'
+ ))->displayAsRadio();
+
+ $group->setHelp('Select "Conveyance" for ATA disks only');
+ $section->add($group);
+
+ $section->addInput(new Form_Select(
+ 'device',
+ 'Device: /dev/',
+ false,
+ array_combine($devs, $devs)
+ ));
+
+ $form->add($section);
+ print($form);
+
+// Logs
+ $form = new Form(new Form_Button(
+ 'submit',
+ 'View'
+ ));
+
+ $section = new Form_Section('View logs');
+
+ $section->addInput(new Form_Input(
+ 'action',
+ null,
+ 'hidden',
+ 'logs'
+ ));
+
+ $group = new Form_Group('Log type');
+
+ $group->add(new Form_Checkbox(
+ 'type',
+ null,
+ 'Error',
+ true,
+ 'error'
+ ))->displayAsRadio();
+
+ $group->add(new Form_Checkbox(
+ 'test',
+ null,
+ 'Self-test',
+ false,
+ 'selftest'
+ ))->displayAsRadio();
+
+ $section->add($group);
+
+ $section->addInput(new Form_Select(
+ 'device',
+ 'Device: /dev/',
+ false,
+ array_combine($devs, $devs)
+ ));
+
+ $form->add($section);
+ print($form);
+
+// Abort
+ $btnabort = new Form_Button(
+ 'submit',
+ 'Abort'
+ );
+
+ $btnabort->removeClass('btn-primary')->addClass('btn-danger');
+
+ $form = new Form($btnabort);
+
+ $section = new Form_Section('Abort');
+
+ $section->addInput(new Form_Input(
+ 'action',
+ null,
+ 'hidden',
+ 'abort'
+ ));
+
+ $section->addInput(new Form_Select(
+ 'device',
+ 'Device: /dev/',
+ false,
+ array_combine($devs, $devs)
+ ));
+
+ $form->add($section);
+ print($form);
+
break;
}
}
-// print back button on pages
-if (isset($_POST['submit']) && $_POST['submit'] != "Save") {
-?>
- <input type="button" class="formbtn" value="<?=gettext("Back");?>" onclick="window.location.href='<?=$_SERVER['PHP_SELF'];?>'" />
-<?php
-}
-?>
-<br />
-<?php
-if ($ulmsg) {
- echo "<p><strong>" . $ulmsg . "</strong></p>\n";
-}
-?>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_sockets.php b/src/usr/local/www/diag_sockets.php
index cdcfeb7..84c9642 100644
--- a/src/usr/local/www/diag_sockets.php
+++ b/src/usr/local/www/diag_sockets.php
@@ -3,32 +3,57 @@
/* $Id$ */
/*
diag_sockets.php
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2012
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/bin/sockstat
@@ -47,7 +72,7 @@ $pgtitle = array(gettext("Diagnostics"), gettext("Sockets"));
include('head.inc');
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
<?php include("fbegin.inc");
$showAll = isset($_GET['showAll']);
@@ -55,18 +80,14 @@ $showAllText = $showAll ? "Show only listening sockets" : "Show all socket conne
$showAllOption = $showAll ? "" : "?showAll";
?>
-<div id="mainarea">
-<table class="tabcont" width="100%" summary="diag sockets">
- <tr>
- <td>Information about listening sockets for both <a href="#IPv4">IPv4</a> and <a href="#IPv6">IPv6</a>.</td>
- </tr>
- <tr>
- <td>For explanation about the meaning of the information listed for each socket click <a href="#about">here</a>.</td>
- </tr>
- <tr>
- <td><input type="button" value="<?=$showAllText?>" onclick="window.location.href='diag_sockets.php<?=$showAllOption?>'"/>To show information about both listening and connected sockets click this.</td>
- </tr>
-</table>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">System socket information for both IPv4 and IPv6</h2></div>
+ <div class="panel-body">
+
+(Click <a href="#about">here </a>for explanation of the information listed for each socket) <br /><br />
+<input class="btn btn-info btn-xs" type="button" value="<?=$showAllText?>" onclick="window.location.href='diag_sockets.php<?=$showAllOption?>'"/>
+
<?php
if (isset($_GET['showAll'])) {
@@ -80,102 +101,74 @@ $showAllOption = $showAll ? "" : "?showAll";
$elements = ($tabindex == 0 ? 7 : 7);
$name = ($tabindex == 0 ? 'IPv4' : 'IPv6');
?>
-<a name="<?=$name;?>"></a>
-<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab">
- <tr>
- <td class="listtopic" colspan="<?=$elements?>"><strong><?=$name;?></strong></td>
- </tr>
- <tr>
- <td>
- <table class="tabcont sortable" id="sortabletable" width="100%" cellspacing="0" cellpadding="6" border="0" summary="results">
- <?php
- foreach (explode("\n", $table) as $i => $line) {
- if ($i == 0) {
- $class = 'listhdrr';
- } else {
- $class = 'listlr';
- }
+ <div class="table table-responsive">
+ <table class="table table-hover table-striped table-condensed">
+ <thead>
+ <tr>
+ <th>
+ <?=$name?>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
- if (trim($line) == "") {
- continue;
- }
- print("<tr id=\"$name$i\">\n");
- $j = 0;
- foreach (explode(' ', $line) as $entry) {
- if ($entry == '' || $entry == "ADDRESS") {
+<?php
+ foreach (explode("\n", $table) as $i => $line) {
+ if ($i == 0)
+ $class = 'info';
+ else
+ $class = '';
+
+ if (trim($line) == "")
continue;
+
+ print("<tr>\n");
+ $j = 0;
+ foreach (explode(' ', $line) as $entry) {
+ if ($entry == '' || $entry == "ADDRESS") continue;
+ if ($i == 0)
+ print("<th class=\"$class\">$entry</th>\n");
+ else
+ print("<td class=\"$class\">$entry</td>\n");
+
+ $j++;
}
- if ($i == 0) {
- print("<th class=\"$class\">$entry</th>\n");
- } else {
- print("<td class=\"$class\">$entry</td>\n");
- }
- if ($i > 0) {
- $class = 'listr';
- }
- $j++;
+ print("</tr>\n");
}
- print("</tr>\n");
- }
- ?>
+?>
+ </tbody>
</table>
- </td>
- </tr>
-</table>
+ </div>
<?php
}
?>
-
-<br />
-<a name="about"></a>
-<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="info">
- <tr>
- <td colspan="2" class="listtopic" >Socket information explanation</td>
- </tr>
- <tr>
- <td colspan="2" class="listhdrr">
-This page show the output for the commands: "sockstat -4lL" and "sockstat -6lL".<br />
-Or in case of showing all sockets the output for: "sockstat -4" and "sockstat -6".<br />
-<br />
-The information listed for each socket is:
- </td>
- </tr>
- <tr>
- <td class="listlr">USER </td>
- <td class="listr">The user who owns the socket.</td>
- </tr>
- <tr>
- <td class="listlr">COMMAND</td>
- <td class="listr">The command which holds the socket.</td>
- </tr>
- <tr>
- <td class="listlr">PID</td>
- <td class="listr">The process ID of the command which holds the socket.</td>
- </tr>
- <tr>
- <td class="listlr">FD</td>
- <td class="listr">The file descriptor number of the socket.</td>
- </tr>
- <tr>
- <td class="listlr">PROTO</td>
- <td class="listr">The transport protocol associated with the socket for Internet sockets, or the type of socket (stream or data-gram) for UNIX sockets.</td>
- </tr>
- <tr>
- <td class="listlr">ADDRESS</td>
- <td class="listr">(UNIX sockets only) For bound sockets, this is the file-name of the socket. For other sockets, it is the name, PID and file descriptor number of the peer, or ``(none)'' if the socket is neither bound nor connected.</td>
- </tr>
- <tr>
- <td class="listlr">LOCAL ADDRESS</td>
- <td class="listr">(Internet sockets only) The address the local end of the socket is bound to (see getsockname(2)).</td>
- </tr>
- <tr>
- <td class="listlr">FOREIGN ADDRESS</td>
- <td class="listr">(Internet sockets only) The address the foreign end of the socket is bound to (see getpeername(2)).</td>
- </tr>
-</table>
+ </div>
+ <a name="about"></a>
+ <div class="alert alert-success" role="alert">
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Socket information - explanation</h2></div>
+ <div class="panel-body">
+ This page show the output for the commands: "sockstat -4lL" and "sockstat -6lL".<br />
+ Or in case of showing all sockets the output for: "sockstat -4" and "sockstat -6".<br />
+ <br />
+ The information listed for each socket is:
+ <br /><br />
+ <dl class="dl-horizontal responsive">
+ <dt>USER</dt> <dd>The user who owns the socket.</dd>
+ <dt>COMMAND</dt> <dd>The command which holds the socket.</dd>
+ <dt>PID</dt> <dd>The process ID of the command which holds the socket.</dd>
+ <dt>FD</dt> <dd>The file descriptor number of the socket.</dd>
+ <dt>PROTO</dt> <dd>The transport protocol associated with the socket for Internet sockets, or the type of socket (stream or data-gram) for UNIX sockets.</dd>
+ <dt>ADDRESS</dt> <dd>(UNIX sockets only) For bound sockets, this is the file-name of the socket. For other sockets, it is the name, PID and file descriptor number of the peer, or ``(none)'' if the socket is neither bound nor connected.</dd>
+ <dt>LOCAL ADDRESS</dt> <dd>(Internet sockets only) The address the local end of the socket is bound to (see getsockname(2)).</dd>
+ <dt>FOREIGN ADDRESS</dt><dd>(Internet sockets only) The address the foreign end of the socket is bound to (see getpeername(2)).</dd>
+ </dl>
+ </div>
+ </div>
+ </div>
</div>
<?php
-include('fend.inc');
-?>
-</body>
-</html>
+
+include('foot.inc');
+
+
diff --git a/src/usr/local/www/diag_states_summary.php b/src/usr/local/www/diag_states_summary.php
index 7aa91d6..587ddcd 100644
--- a/src/usr/local/www/diag_states_summary.php
+++ b/src/usr/local/www/diag_states_summary.php
@@ -1,39 +1,63 @@
<?php
/*
diag_states_summary.php
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2010-2014 Jim Pingle
-
- Portions borrowed from diag_dump_states.php:
- Copyright (C) 2005-2009 Scott Ullrich
- Copyright (C) 2005 Colin Smith
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2005-2009 Scott Ullrich
+ * Copyright (c) 2005 Colin Smith
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/pfctl
- pfSense_MODULE: filter
+ pfSense_MODULE: filter
*/
##|+PRIV
@@ -120,7 +144,6 @@ if (count($states) > 0) {
addipinfo($allipinfo, $srcip, $proto, $srcport, $dstport);
addipinfo($allipinfo, $dstip, $proto, $srcport, $dstport);
-
}
}
@@ -135,7 +158,6 @@ function build_port_info($portarr, $proto) {
$ports = array();
asort($portarr);
foreach (array_reverse($portarr, TRUE) as $port => $count) {
- $str = "";
$service = getservbyport($port, strtolower($proto));
$port = "{$proto}/{$port}";
if ($service) {
@@ -146,61 +168,68 @@ function build_port_info($portarr, $proto) {
return implode($ports, ', ');
}
-function print_summary_table($label, $iparr, $sort = TRUE) { ?>
-
-<h3><?php echo $label; ?></h3>
-<table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="states summary">
- <tr>
- <td class="listhdrr"><?=gettext("IP");?></td>
- <td class="listhdrr"># <?=gettext("States");?></td>
- <td class="listhdrr"><?=gettext("Proto");?></td>
- <td class="listhdrr"># <?=gettext("States");?></td>
- <td class="listhdrr"><?=gettext("Src Ports");?></td>
- <td class="listhdrr"><?=gettext("Dst Ports");?></td>
- </tr>
-<?php
- if ($sort) {
+function print_summary_table($label, $iparr, $sort = TRUE)
+{
+ if ($sort)
uksort($iparr, "sort_by_ip");
- }
- foreach ($iparr as $ip => $ipinfo) { ?>
- <tr>
- <td class="vncell"><?php echo $ip; ?></td>
- <td class="vncell"><?php echo $ipinfo['seen']; ?></td>
- <td class="vncell">&nbsp;</td>
- <td class="vncell">&nbsp;</td>
- <td class="vncell">&nbsp;</td>
- <td class="vncell">&nbsp;</td>
- </tr>
- <?php foreach ($ipinfo['protos'] as $proto => $protoinfo) { ?>
- <tr>
- <td class="list">&nbsp;</td>
- <td class="list">&nbsp;</td>
- <td class="listlr"><?php echo $proto; ?></td>
- <td class="listr" align="center"><?php echo $protoinfo['seen']; ?></td>
- <td class="listr" align="center"><span title="<?php echo build_port_info($protoinfo['srcports'], $proto); ?>"><?php echo count($protoinfo['srcports']); ?></span></td>
- <td class="listr" align="center"><span title="<?php echo build_port_info($protoinfo['dstports'], $proto); ?>"><?php echo count($protoinfo['dstports']); ?></span></td>
- </tr>
- <?php } ?>
-<?php } ?>
-
-</table>
+?>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title"><?=$label?></h2>
+ </div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table-hover table-condensed table-striped">
+ <thead>
+ <tr>
+ <th ><?=gettext("IP");?></th>
+ <th class="text-center"># <?=gettext("States");?></th>
+ <th ><?=gettext("Proto");?></th>
+ <th class="text-center"># <?=gettext("States");?></th>
+ <th class="text-center"><?=gettext("Src Ports");?></th>
+ <th class="text-center"><?=gettext("Dst Ports");?></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php foreach($iparr as $ip => $ipinfo):
+ $protocolCount = count($ipinfo['protos']);
+ $rowSpan = '';
+ $i = 0;
+
+ if ($protocolCount > 1)
+ $rowSpan = ' rowspan="' . $protocolCount . '"';
+?>
+ <tr>
+ <td<?= $rowSpan ?>><?php echo $ip; ?></td>
+ <td<?= $rowSpan ?> class="text-center"><?php echo $ipinfo['seen']; ?></td>
+
+<?php foreach($ipinfo['protos'] as $proto => $protoinfo): ?>
+<?php if ($protocolCount > 1 && $i > 0): ?>
+ </tr><tr>
+<?php endif; ?>
+ <td><?php echo $proto; ?></td>
+ <td class="text-center" ><?php echo $protoinfo['seen']; ?></td>
+ <td class="text-center" ><span title="<?php echo build_port_info($protoinfo['srcports'], $proto); ?>"><?php echo count($protoinfo['srcports']); ?></span></td>
+ <td class="text-center" ><span title="<?php echo build_port_info($protoinfo['dstports'], $proto); ?>"><?php echo count($protoinfo['dstports']); ?></span></td>
+<?php $i++; endforeach; ?>
+ </tr>
+<?php endforeach; ?>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
<?php
}
$pgtitle = array(gettext("Diagnostics"), gettext("State Table Summary"));
require_once("guiconfig.inc");
include("head.inc");
-echo "<body>";
-include("fbegin.inc");
-
print_summary_table(gettext("By Source IP"), $srcipinfo);
print_summary_table(gettext("By Destination IP"), $dstipinfo);
print_summary_table(gettext("Total per IP"), $allipinfo);
print_summary_table(gettext("By IP Pair"), $pairipinfo, FALSE);
-?>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_system_activity.php b/src/usr/local/www/diag_system_activity.php
index 1f6380f..488f69f 100644
--- a/src/usr/local/www/diag_system_activity.php
+++ b/src/usr/local/www/diag_system_activity.php
@@ -2,36 +2,62 @@
/* $Id$ */
/*
diag_system_activity.php
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- Copyright (C) 2008-2009 Scott Ullrich
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2008, 2009 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/bin/top
- pfSense_MODULE: system
+ pfSense_MODULE: system
*/
##|+PRIV
@@ -43,7 +69,7 @@
require("guiconfig.inc");
-$pgtitle = gettext("Diagnostics: System Activity");
+$pgtitle = array(gettext("Diagnostics"),gettext("System Activity"));
if ($_REQUEST['getactivity']) {
$text = `/usr/bin/top -aHS | /usr/bin/cut -c1-105`;
@@ -53,63 +79,38 @@ if ($_REQUEST['getactivity']) {
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
- function getcpuactivity() {
- scroll(0, 0);
- var url = "/diag_system_activity.php";
- var pars = 'getactivity=yes';
- jQuery.ajax(
- url,
- {
- type: 'post',
- data: pars,
- complete: activitycallback
- });
- }
- function activitycallback(transport) {
- jQuery('#cpuactivitydiv').html('<font face="Courier" size="2"><pre style="text-align:left;">' + transport.responseText + '<\/pre><\/font>');
- setTimeout('getcpuactivity()', 2500);
- }
- setTimeout('getcpuactivity()', 1000);
-//]]>
+<script>
+function getcpuactivity() {
+ $.ajax(
+ '/diag_system_activity.php',
+ {
+ method: 'post',
+ data: {
+ getactivity: 'yes'
+ },
+ dataType: "html",
+ success: function (data) {
+ $('#xhrOutput').html(data);
+ },
+ }
+ );
+}
+
+events.push(function(){
+ setInterval('getcpuactivity()', 2500);
+ getcpuactivity();
+});
</script>
-<div id="maincontent">
-<?php
- if ($savemsg) {
- echo "<div id=\"savemsg\">";
- print_info_box($savemsg);
- echo "</div>";
- }
- if ($input_errors) {
- print_input_errors($input_errors);
- }
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag system activity">
- <tr>
- <td>
- <table id="backuptable" class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
- <tr>
- <td align="center">
- <table summary="results">
- <tr>
- <td>
- <div id="cpuactivitydiv">
- <?=gettext("Gathering CPU activity, please wait...");?>
- </div>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('CPU Activity')?></h2></div>
+ <div class="panel panel-body">
+ <pre id="xhrOutput"><?=gettext("Gathering CPU activity, please wait...")?></pre>
+ </div>
</div>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_system_pftop.php b/src/usr/local/www/diag_system_pftop.php
index 7d51c84..be2a493 100644
--- a/src/usr/local/www/diag_system_pftop.php
+++ b/src/usr/local/www/diag_system_pftop.php
@@ -2,31 +2,58 @@
/* $Id$ */
/*
diag_system_pftop.php
- Copyright (C) 2008-2009 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2008, 2009 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: filter
@@ -67,7 +94,7 @@ if ($_REQUEST['getactivity']) {
}
$text = `pftop -b {$sorttype} -v {$viewtype} {$numstate}`;
- echo $text;
+ echo trim($text);
exit;
}
@@ -90,127 +117,100 @@ if ($_REQUEST['sorttype'] && in_array($_REQUEST['sorttype'], $sorttypes) &&
$numstate = "100";
}
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+$form = new Form(false);
+$form->addGlobal(new Form_Input(
+ 'getactivity',
+ null,
+ 'hidden',
+ 'yes'
+));
+$section = new Form_Section('pfTop Configuration');
+
+$validViews = array(
+ 'default', 'label', 'long',
+ 'queue', 'rules', 'size',
+ 'speed', 'state', 'time',
+);
+$section->addInput(new Form_Select(
+ 'viewtype',
+ 'View',
+ $viewtype,
+ array_combine($validViews, $validViews)
+));
+
+$section->addInput(new Form_Select(
+ 'sorttype',
+ 'Sort by',
+ $sorttype,
+ array(
+ 'none' => 'None',
+ 'age' => 'Age',
+ 'bytes' => 'Bytes',
+ 'dest' => 'Destination Address',
+ 'dport' => 'Destination Port',
+ 'exp' => 'Expiry',
+ 'peak' => 'Peak',
+ 'pkt' => 'Packet',
+ 'rate' => 'Rate',
+ 'size' => 'Size',
+ 'sport' => 'Source Port',
+ 'src' => 'Source Address',
+ )
+));
+
+$validStates = array(50, 100, 200, 500, 100, 'all');
+$section->addInput(new Form_Select(
+ 'states',
+ 'Maximum # of States',
+ $numstate,
+ array_combine($validStates, $validStates)
+));
+
+$form->add($section);
+print $form;
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form method="post" action="diag_system_pftop.php">
-<script type="text/javascript">
-//<![CDATA[
+
+<script>
function getpftopactivity() {
- var url = "/diag_system_pftop.php";
- var pars = 'getactivity=yes&sorttype=' + jQuery('#sorttype').val() + '&viewtype=' + jQuery('#viewtype').val() + '&states=' + jQuery('#states').val();
- jQuery.ajax(
- url,
+ $.ajax(
+ '/diag_system_pftop.php',
{
- type: 'post',
- data: pars,
- complete: activitycallback
- });
+ method: 'post',
+ data: $(document.forms[0]).serialize(),
+ dataType: "html",
+ success: function (data) {
+ $('#xhrOutput').html(data);
+ },
+ }
+ );
}
- function activitycallback(transport) {
- jQuery('#pftopactivitydiv').html('<font face="Courier" size="2"><pre style="text-align:left;">' + transport.responseText + '<\/pre><\/font>');
- setTimeout('getpftopactivity()', 2500);
- }
- setTimeout('getpftopactivity()', 1000);
-//]]>
+
+ events.push(function(){
+ setInterval('getpftopactivity()', 2500);
+ getpftopactivity();
+ });
</script>
-<div id="maincontent">
<?php
- if ($savemsg) {
- echo "<div id=\"savemsg\">";
- print_info_box($savemsg);
- echo "</div>";
- }
- if ($input_errors) {
- print_input_errors($input_errors);
- }
?>
- <div id="mainarea" style="padding-bottom: 0px;">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="diag system pftop">
- <tr>
- <td class="list">
- <div id='viewtypediv'><?=gettext("View type:"); ?>
- <select name='viewtype' id='viewtype'>
- <option value='default' <?php echo ($viewtype == "default") ? "selected=\"selected\"" : ""; ?>><?=gettext("Default");?></option>
- <option value='label' <?php echo ($viewtype == "label") ? "selected=\"selected\"" : ""; ?>><?=gettext("Label");?></option>
- <option value='long' <?php echo ($viewtype == "long") ? "selected=\"selected\"" : ""; ?>><?=gettext("Long");?></option>
- <option value='queue' <?php echo ($viewtype == "queue") ? "selected=\"selected\"" : ""; ?>><?=gettext("Queue");?></option>
- <option value='rules' <?php echo ($viewtype == "rules") ? "selected=\"selected\"" : ""; ?>><?=gettext("Rules");?></option>
- <option value='size' <?php echo ($viewtype == "size") ? "selected=\"selected\"" : ""; ?>><?=gettext("Size");?></option>
- <option value='speed' <?php echo ($viewtype == "speed") ? "selected=\"selected\"" : ""; ?>><?=gettext("Speed");?></option>
- <option value='state' <?php echo ($viewtype == "state") ? "selected=\"selected\"" : ""; ?>><?=gettext("State");?></option>
- <option value='time' <?php echo ($viewtype == "time") ? "selected=\"selected\"" : ""; ?>><?=gettext("Time");?></option>
- </select>
- </div>
- </td>
- <td class="list">
- <div id='sorttypediv'><?=gettext("Sort type:"); ?>
- <select name='sorttype' id='sorttype'>
- <option value='age' <?php echo ($sorttype == "age") ? "selected=\"selected\"" : ""; ?>><?=gettext("Age");?></option>
- <option value='bytes' <?php echo ($sorttype == "bytes") ? "selected=\"selected\"" : ""; ?>><?=gettext("Bytes");?></option>
- <option value='dest' <?php echo ($sorttype == "dest") ? "selected=\"selected\"" : ""; ?>><?=gettext("Destination Address");?></option>
- <option value='dport' <?php echo ($sorttype == "dport") ? "selected=\"selected\"" : ""; ?>><?=gettext("Destination Port");?></option>
- <option value='exp' <?php echo ($sorttype == "exp") ? "selected=\"selected\"" : ""; ?>><?=gettext("Expiry");?></option>
- <option value='none' <?php echo ($sorttype == "none") ? "selected=\"selected\"" : ""; ?>><?=gettext("None");?></option>
- <option value='peak' <?php echo ($sorttype == "peak") ? "selected=\"selected\"" : ""; ?>><?=gettext("Peak");?></option>
- <option value='pkt' <?php echo ($sorttype == "pkt") ? "selected=\"selected\"" : ""; ?>><?=gettext("Packet");?></option>
- <option value='rate' <?php echo ($sorttype == "rate") ? "selected=\"selected\"" : ""; ?>><?=gettext("Rate");?></option>
- <option value='size' <?php echo ($sorttype == "size") ? "selected=\"selected\"" : ""; ?>><?=gettext("Size");?></option>
- <option value='sport' <?php echo ($sorttype == "sport") ? "selected=\"selected\"" : ""; ?>><?=gettext("Source Port");?></option>
- <option value='src' <?php echo ($sorttype == "src") ? "selected=\"selected\"" : ""; ?>><?=gettext("Source Address");?></option>
- </select>
- </div>
- </td>
- <td class="list">
- <div id='statesdiv'><?=gettext("Number of States:"); ?>
- <select name='states' id='states'>
- <option value='50' <?php echo ($numstate == "50") ? "selected=\"selected\"" : ""; ?>>50</option>
- <option value='100' <?php echo ($numstate == "100") ? "selected=\"selected\"" : ""; ?>>100</option>
- <option value='200' <?php echo ($numstate == "200") ? "selected=\"selected\"" : ""; ?>>200</option>
- <option value='500' <?php echo ($numstate == "500") ? "selected=\"selected\"" : ""; ?>>500</option>
- <option value='1000' <?php echo ($numstate == "1000") ? "selected=\"selected\"" : ""; ?>>1000</option>
- <option value='all' <?php echo ($numstate == "all") ? "selected=\"selected\"" : ""; ?>>all</option>
- </select>
- </div>
- </td>
- </tr>
- <tr>
- <td colspan="3" align="center">
- <table id="backuptable" class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
- <tr>
- <td align="center">
- <table summary="results">
- <tr>
- <td>
- <div id="pftopactivitydiv"><?=gettext("Gathering pfTOP activity, please wait...");?></div>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Output')?></h2></div>
+ <div class="panel panel-body">
+ <pre id="xhrOutput"><?=gettext("Gathering pfTOP activity, please wait...")?></pre>
</div>
</div>
-</form>
-<?php include("fend.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
-jQuery("#viewtype").change(function() {
- var selected = jQuery("#viewtype option:selected");
- switch (selected.val()) {
- case "queue":
- case "label":
- case "rules":
- jQuery("#sorttype, #sorttypediv, #statesdiv, #states").hide();
- break;
- default:
- jQuery("#sorttype, #sorttypediv, #statesdiv, #states").show();
- }
+
+<script>
+events.push(function(){
+ $('#viewtype').on('change', function(){
+ if (['queue', 'label', 'rules'].indexOf($(this).val()) > -1)
+ $("#sorttype, #sorttypediv, #statesdiv, #states").parents('.form-group').hide();
+ else
+ $("#sorttype, #sorttypediv, #statesdiv, #states").parents('.form-group').show();
+ });
});
-//]]>
</script>
-</body>
-</html>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_tables.php b/src/usr/local/www/diag_tables.php
index fe6778f..762b83e 100644
--- a/src/usr/local/www/diag_tables.php
+++ b/src/usr/local/www/diag_tables.php
@@ -1,38 +1,63 @@
<?php
/*
diag_tables.php
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2010 Jim Pingle
-
- Portions borrowed from diag_dump_states.php:
- Copyright (C) 2010 Scott Ullrich
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
-
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2010 Jim Pingle
+ * Portions borrowed from diag_dump_states.php
+ * Copyright (c) 2010 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/pfctl
- pfSense_MODULE: filter
+ pfSense_MODULE: filter
*/
##|+PRIV
@@ -49,6 +74,7 @@ require_once("guiconfig.inc");
// Set default table
$tablename = "sshlockout";
+$bogons = false;
if ($_REQUEST['type']) {
$tablename = $_REQUEST['type'];
@@ -62,7 +88,7 @@ if ($_REQUEST['delete']) {
exit;
}
-if ($_REQUEST['deleteall']) {
+if($_POST['deleteall']) {
exec("/sbin/pfctl -t " . escapeshellarg($tablename) . " -T show", $entries);
if (is_array($entries)) {
foreach ($entries as $entryA) {
@@ -72,23 +98,24 @@ if ($_REQUEST['deleteall']) {
}
}
-if ((($tablename == "bogons") || ($tablename == "bogonsv6")) && ($_POST['Download'])) {
- mwexec_bg("/etc/rc.update_bogons.sh now");
- $maxtimetowait = 0;
- $loading = true;
- while ($loading == true) {
- $isrunning = `/bin/ps awwwux | /usr/bin/grep -v grep | /usr/bin/grep bogons`;
- if ($isrunning == "") {
- $loading = false;
- }
- $maxtimetowait++;
- if ($maxtimetowait > 89) {
- $loading = false;
+if(($tablename == "bogons") || ($tablename == "bogonsv6")) {
+ $bogons = true;
+
+ if($_POST['Download']) {
+ mwexec_bg("/etc/rc.update_bogons.sh now");
+ $maxtimetowait = 0;
+ $loading = true;
+ while($loading == true) {
+ $isrunning = `/bin/ps awwwux | /usr/bin/grep -v grep | /usr/bin/grep bogons`;
+ if($isrunning == "")
+ $loading = false;
+ $maxtimetowait++;
+ if($maxtimetowait > 89)
+ $loading = false;
+ sleep(1);
}
- sleep(1);
- }
- if ($maxtimetowait < 90) {
- $savemsg = gettext("The bogons database has been updated.");
+ if($maxtimetowait < 90)
+ $savemsg = gettext("The bogons database has been updated.");
}
}
@@ -96,96 +123,105 @@ exec("/sbin/pfctl -t " . escapeshellarg($tablename) . " -T show", $entries);
exec("/sbin/pfctl -sT", $tables);
include("head.inc");
-?>
-<body>
-<?php include("fbegin.inc"); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<form method="post" action="diag_tables.php">
+if ($savemsg)
+ print_info_box($savemsg);
-<script type="text/javascript">
-//<![CDATA[
- function method_change(entrytype) {
- window.location='diag_tables.php?type=' + entrytype;
- }
- function del_entry(entry) {
- jQuery.ajax("diag_tables.php?type=<?php echo htmlspecialchars($tablename);?>&delete=" + entry, {
- complete: function(response) {
- if (200 == response.status) {
- // Escape all dots to not confuse jQuery selectors
- name = response.responseText.replace(/\./g,'\\.');
- name = name.replace(/\//g,'\\-');
- name = "entry_" + name;
- jQuery('#' + name).fadeOut(1000);
- }
- }
- });
- }
-//]]>
-</script>
+require('classes/Form.class.php');
+$form = new Form('Show');
-<?=gettext("Table:");?>
-<select id="type" onchange="method_change(jQuery('#type').val());" name="type">
- <?php
- foreach ($tables as $table) {
- echo "<option value=\"{$table}\"";
- if ($tablename == $table) {
- echo " selected=\"selected\"";
- }
- echo ">{$table}</option>\n";
- }
- ?>
-</select>
+$section = new Form_Section('Table to display');
-<br/><br/>
+$section->addInput(new Form_Select(
+ 'type',
+ 'Table',
+ $tablename,
+ array_combine($tables, $tables)
+));
-<table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="tables">
- <tr>
- <td class="listhdrr"><?=gettext("IP Address");?></td>
- </tr>
-<?php
- $count = 0;
- foreach ($entries as $entryA):
- $entry = trim($entryA);
+$form->add($section);
+print $form;
?>
- <tr id="entry_<?=str_replace("/", "-", $entry);?>">
- <td>
- <?php echo $entry; ?>
- </td>
- <td>
- <?php if (($tablename != "bogons") && ($tablename != "bogonsv6")) { ?>
- <a onclick="del_entry('<?=htmlspecialchars($entry)?>');">
- <img src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" alt="delete" />
- </a>
- <?php } ?>
- </td>
- </tr>
+
+<script>
+events.push(function(){
+ $('a[data-entry]').on('click', function(){
+ var el = $(this);
+
+ $.ajax(
+ '/diag_tables.php',
+ {
+ type: 'post',
+ data: {
+ type: '<?=htmlspecialchars($tablename)?>',
+ delete: $(this).data('entry')
+ },
+ success: function(){
+ el.parents('tr').remove();
+ },
+ });
+ });
+});
+</script>
+
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("IP Address")?></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- $count++;
- endforeach;
- if ($count == 0) {
- if (($tablename == "bogons") || ($tablename == "bogonsv6")) {
- echo "<tr><td>" . gettext("No entries exist in this table.") . "&nbsp;&nbsp;" . "<input name=\"Download\" type=\"submit\" class=\"formbtn\" value=\"" . gettext("Download") . "\" /> " . gettext(" the latest bogon data.");
- } else {
- echo "<tr><td>" . gettext("No entries exist in this table.");
- }
- }
+ foreach ($entries as $entry):
+ $entry = trim($entry);
?>
+ <tr>
+ <td>
+ <?=$entry?>
+ </td>
+ <td>
+ <?php if (!$bogons): ?>
+ <a class="btn btn-xs btn-default" data-entry="<?=htmlspecialchars($entry)?>">Remove</a>
+ <?php endif ?>
+ </td>
+ </tr>
+<?php endforeach ?>
+ </tbody>
+ </table>
+</div>
+<?php if (empty($entries)): ?>
+ <div class="alert alert-warning" role="alert">No entries exist in this table</div>
+<?php endif ?>
<?php
- if ($count > 0) {
- if (($tablename == "bogons") || ($tablename == "bogonsv6")) {
- $last_updated = exec('/usr/bin/grep -i -m 1 -E "^# last updated" /etc/' . escapeshellarg($tablename));
- echo "<tr><td>&nbsp;<b>$count</b> " . gettext("entries in this table.") . "&nbsp;&nbsp;" . "<input name=\"Download\" type=\"submit\" class=\"formbtn\" value=\"" . gettext("Download") . "\" /> " . gettext(" the latest bogon data.") . "<br />" . "$last_updated";
- } else {
- echo "<tr><td>" . gettext("Delete") . " <a href=\"diag_tables.php?deleteall=true&amp;type=" . htmlspecialchars($tablename) . "\">" . gettext("all") . "</a> " . "<b>$count</b> " . gettext("entries in this table.");
- }
+
+if ($bogons || !empty($entries)) {
+ $form = new Form;
+
+ $section = new Form_Section('Table Data');
+
+ if ($bogons) {
+ $last_updated = exec('/usr/bin/grep -i -m 1 -E "^# last updated" /etc/' . escapeshellarg($tablename) . '|cut -d"(" -f2|tr -d ")" ');
+
+ $section->addInput(new Form_StaticText(
+ 'Last update',
+ $last_updated
+ ));
+
+ $section->addInput(new Form_Button(
+ 'Download',
+ 'Download'
+ ))->setHelp('Download the latest bogon data')->addClass('btn-warning');
+ } elseif (!empty($entries)) {
+ $section->addInput(new Form_Button(
+ 'deleteall',
+ 'Clear Table'
+ ))->setHelp('Clear all of the entries in this table')->addClass('btn-danger');
}
-?>
-</td></tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ $form->add($section);
+ print $form;
+}
+
+include("foot.inc");
diff --git a/src/usr/local/www/diag_testport.php b/src/usr/local/www/diag_testport.php
index fbc448a..5ff0140 100644
--- a/src/usr/local/www/diag_testport.php
+++ b/src/usr/local/www/diag_testport.php
@@ -1,40 +1,62 @@
<?php
/*
diag_testport.php
- Copyright (C) 2013 Jim P (jimp@pfsense.org)
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Portions based on diag_ping.php
- part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2005 Bob Zoller (bob@kludgebox.com) and Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2013 Jim P (jimp@pfsense.org)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/bin/nc
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -44,6 +66,9 @@
##|*MATCH=diag_testport.php*
##|-PRIV
+// Calling netcat and parsing hte results has been moved to the if ($_POST) section so that the results are known
+// before we draw the form and any resulting error messages will allear in the correct place
+
$allowautocomplete = true;
$pgtitle = array(gettext("Diagnostics"), gettext("Test Port"));
@@ -51,6 +76,7 @@ require("guiconfig.inc");
define('NC_TIMEOUT', 10);
$do_testport = false;
+$retval = 1;
if ($_POST || $_REQUEST['host']) {
unset($input_errors);
@@ -91,200 +117,188 @@ if ($_POST || $_REQUEST['host']) {
$srcport = $_REQUEST['srcport'];
$showtext = isset($_REQUEST['showtext']);
$ipprotocol = $_REQUEST['ipprotocol'];
-}
-include("head.inc"); ?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag test port">
-<tr><td>
-<?php echo gettext("This page allows you to perform a simple TCP connection test to determine if a host is up and accepting connections on a given port. This test does not function for UDP since there is no way to reliably determine if a UDP port accepts connections in this manner."); ?>
-<br /><br />
-<?php echo gettext("No data is transmitted to the remote host during this test, it will only attempt to open a connection and optionally display the data sent back from the server."); ?>
-<br /><br /><br />
-<?php if ($input_errors) print_input_errors($input_errors); ?>
- <form action="diag_testport.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Test Port"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Host"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?>
- <input name="host" type="text" class="formfld unknown" id="host" size="20" value="<?=htmlspecialchars($host);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?= gettext("Port"); ?></td>
- <td width="78%" class="vtable">
- <input name="port" type="text" class="formfld unknown" id="port" size="10" value="<?=htmlspecialchars($port);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?= gettext("Source Port"); ?></td>
- <td width="78%" class="vtable">
- <input name="srcport" type="text" class="formfld unknown" id="srcport" size="10" value="<?=htmlspecialchars($srcport);?>" />
- <br /><br /><?php echo gettext("This should typically be left blank."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?= gettext("Show Remote Text"); ?></td>
- <td width="78%" class="vtable">
- <input name="showtext" type="checkbox" id="showtext" <?php if ($showtext) echo "checked=\"checked\"" ?> />
- <br /><br /><?php echo gettext("Shows the text given by the server when connecting to the port. Will take 10+ seconds to display if checked."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Source Address"); ?></td>
- <td width="78%" class="vtable">
- <select name="sourceip" class="formselect">
- <option value="">Any</option>
- <?php $sourceips = get_possible_traffic_source_addresses(true);
- foreach ($sourceips as $sipvalue => $sipname):
- $selected = "";
- if (!link_interface_to_bridge($sipvalue) && ($sipvalue == $sourceip)) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$sipvalue;?>" <?=$selected;?>>
- <?=htmlspecialchars($sipname);?>
- </option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IP Protocol"); ?></td>
- <td width="78%" class="vtable">
- <select name="ipprotocol" class="formfld">
- <option value="any" <?php if ("any" == $ipprotocol) echo "selected=\"selected\""; ?>>
- Any
- </option>
- <option value="ipv4" <?php if ($ipprotocol == "ipv4") echo "selected=\"selected\""; ?>>
- <?=gettext("IPv4");?>
- </option>
- <option value="ipv6" <?php if ($ipprotocol == "ipv6") echo "selected=\"selected\""; ?>>
- <?=gettext("IPv6");?>
- </option>
- </select>
- <br /><br />
- <?php echo gettext("If you force IPv4 or IPv6 and use a hostname that does not contain a result using that protocol, it will result in an error. For example if you force IPv4 and use a hostname that only returns an AAAA IPv6 IP address, it will not work."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Test"); ?>" />
- </td>
- </tr>
- <tr>
- <td valign="top" colspan="2">
- <?php if ($do_testport) {
- echo "<font face=\"terminal\" size=\"2\">";
- echo "<strong>" . gettext("Port Test Results") . ":</strong><br />";
- ?>
- <script type="text/javascript">
- //<![CDATA[
- window.onload=function() {
- document.getElementById("testportCaptured").wrap='off';
- }
- //]]>
- </script>
- <?php
- echo "<textarea id=\"testportCaptured\" style=\"width:98%\" name=\"code\" rows=\"15\" cols=\"66\" readonly=\"readonly\">";
- $result = "";
- $nc_base_cmd = "/usr/bin/nc";
- $nc_args = "-w " . escapeshellarg($timeout);
- if (!$showtext) {
- $nc_args .= " -z ";
- }
- if (!empty($srcport)) {
- $nc_args .= " -p " . escapeshellarg($srcport) . " ";
- }
+ if ( $do_testport ) {
+?>
+ <script type="text/javascript">
+ //<![CDATA[
+ window.onload=function(){
+ document.getElementById("testportCaptured").wrap='off';
+ }
+ //]]>
+ </script>
+<?php
+ $result = "";
+ $ncoutput = "";
+ $nc_base_cmd = '/usr/bin/nc';
+ $nc_args = "-w " . escapeshellarg($timeout);
+ if (!$showtext)
+ $nc_args .= ' -z ';
+ if (!empty($srcport))
+ $nc_args .= ' -p ' . escapeshellarg($srcport) . ' ';
- /* Attempt to determine the interface address, if possible. Else try both. */
- if (is_ipaddrv4($host)) {
- $ifaddr = ($sourceip == "any") ? "" : get_interface_ip($sourceip);
- $nc_args .= " -4";
- } elseif (is_ipaddrv6($host)) {
- if ($sourceip == "any") {
- $ifaddr = "";
- } else if (is_linklocal($sourceip)) {
- $ifaddr = $sourceip;
- } else {
- $ifaddr = get_interface_ipv6($sourceip);
- }
- $nc_args .= " -6";
- } else {
- switch ($ipprotocol) {
- case "ipv4":
- $ifaddr = get_interface_ip($sourceip);
- $nc_ipproto = " -4";
- break;
- case "ipv6":
- $ifaddr = (is_linklocal($sourceip) ? $sourceip : get_interface_ipv6($sourceip));
- $nc_ipproto = " -6";
- break;
- case "any":
- $ifaddr = get_interface_ip($sourceip);
- $nc_ipproto = (!empty($ifaddr)) ? " -4" : "";
- if (empty($ifaddr)) {
- $ifaddr = (is_linklocal($sourceip) ? $sourceip : get_interface_ipv6($sourceip));
- $nc_ipproto = (!empty($ifaddr)) ? " -6" : "";
- }
- break;
- }
- /* Netcat doesn't like it if we try to connect using a certain type of IP without specifying the family. */
- if (!empty($ifaddr)) {
- $nc_args .= $nc_ipproto;
- } elseif ($sourceip == "any") {
- switch ($ipprotocol) {
- case "ipv4":
- $nc_ipproto = " -4";
- break;
- case "ipv6":
- $nc_ipproto = " -6";
- break;
- }
- $nc_args .= $nc_ipproto;
- }
- }
- /* Only add on the interface IP if we managed to find one. */
- if (!empty($ifaddr)) {
- $nc_args .= " -s " . escapeshellarg($ifaddr) . " ";
- $scope = get_ll_scope($ifaddr);
- if (!empty($scope) && !strstr($host, "%")) {
- $host .= "%{$scope}";
+ /* Attempt to determine the interface address, if possible. Else try both. */
+ if (is_ipaddrv4($host)) {
+ $ifaddr = ($sourceip == "any") ? "" : get_interface_ip($sourceip);
+ $nc_args .= ' -4';
+ } elseif (is_ipaddrv6($host)) {
+ if ($sourceip == "any")
+ $ifaddr = '';
+ else if (is_linklocal($sourceip))
+ $ifaddr = $sourceip;
+ else
+ $ifaddr = get_interface_ipv6($sourceip);
+ $nc_args .= ' -6';
+ } else {
+ switch ($ipprotocol) {
+ case "ipv4":
+ $ifaddr = get_interface_ip($sourceip);
+ $nc_ipproto = ' -4';
+ break;
+ case "ipv6":
+ $ifaddr = (is_linklocal($sourceip) ? $sourceip : get_interface_ipv6($sourceip));
+ $nc_ipproto = ' -6';
+ break;
+ case "any":
+ $ifaddr = get_interface_ip($sourceip);
+ $nc_ipproto = (!empty($ifaddr)) ? ' -4' : '';
+ if (empty($ifaddr)) {
+ $ifaddr = (is_linklocal($sourceip) ? $sourceip : get_interface_ipv6($sourceip));
+ $nc_ipproto = (!empty($ifaddr)) ? ' -6' : '';
}
+ break;
+ }
+ /* Netcat doesn't like it if we try to connect using a certain type of IP without specifying the family. */
+ if (!empty($ifaddr)) {
+ $nc_args .= $nc_ipproto;
+ } elseif ($sourceip == "any") {
+ switch ($ipprotocol) {
+ case "ipv4":
+ $nc_ipproto = ' -4';
+ break;
+ case "ipv6":
+ $nc_ipproto = ' -6';
+ break;
}
+ $nc_args .= $nc_ipproto;
+ }
+ }
+ /* Only add on the interface IP if we managed to find one. */
+ if (!empty($ifaddr)) {
+ $nc_args .= ' -s ' . escapeshellarg($ifaddr) . ' ';
+ $scope = get_ll_scope($ifaddr);
+ if (!empty($scope) && !strstr($host, "%"))
+ $host .= "%{$scope}";
+ }
- $nc_cmd = "{$nc_base_cmd} {$nc_args} " . escapeshellarg($host) . " " . escapeshellarg($port) . " 2>&1";
- exec($nc_cmd, $result, $retval);
- //echo "NC CMD: {$nc_cmd}\n\n";
- if (empty($result)) {
- if ($showtext) {
- echo gettext("No output received, or connection failed. Try with \"Show Remote Text\" unchecked first.");
- } else {
- echo gettext("Connection failed (Refused/Timeout)");
- }
- } else {
- if (is_array($result)) {
- foreach ($result as $resline) {
- echo htmlspecialchars($resline) . "\n";
- }
- } else {
- echo htmlspecialchars($result);
- }
+ $nc_cmd = "{$nc_base_cmd} {$nc_args} " . escapeshellarg($host) . ' ' . escapeshellarg($port) . ' 2>&1';
+ exec($nc_cmd, $result, $retval);
+ // echo "NC CMD: {$nc_cmd}\n\n";
+
+ if (!empty($result)) {
+ if (is_array($result)) {
+ foreach ($result as $resline) {
+ $ncoutput .= htmlspecialchars($resline) . "\n";
}
- echo '</textarea>&nbsp;</font>' ;
+ } else {
+ $ncoutput .= htmlspecialchars($result);
}
- ?>
- </td>
- </tr>
- </table>
-</form>
-</td></tr></table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ }
+ }
+}
+
+include("head.inc");
+
+// Handle the display of all messages here wher the user can readily see them
+if ($input_errors)
+ print_input_errors($input_errors);
+else {
+ // New page
+ if(empty($result) && $retval != 0 && !$showtext) {
+ print('<div class="alert alert-warning" role="alert">This page allows you to perform a simple TCP connection test to determine if a host is up and accepting connections on a given port.' .
+ ' This test does not function for UDP since there is no way to reliably determine if a UDP port accepts connections in this manner.</div>');
+ }
+
+ // Good host & port
+ if($retval == 0 && $do_testport == 1) {
+ if(!$showtext)
+ print('<div class="alert alert-success" role="alert">'.gettext("Port test to host: " . $host . " Port: " . $port . " successful").'</div>');
+ else
+ print('<div class="alert alert-success" role="alert">'.gettext("Port test to host: " . $host . " Port: " . $port . " successful") . '. Any text received from the host will be shown below the form.</div>');
+ }
+
+ // netcat exit value != 0
+ if($retval != 0 && !empty($result))
+ if($showtext)
+ print('<div class="alert alert-danger" role="alert">'.gettext('No output received, or connection failed. Try with "Show Remote Text" unchecked first.').'</div>');
+ else
+ print('<div class="alert alert-danger" role="alert">'.gettext('Connection failed.').'</div>');
+}
+
+require('classes/Form.class.php');
+
+$form = new Form('Test');
+
+$section = new Form_Section('Test Port');
+
+$section->addInput(new Form_Input(
+ 'host',
+ 'Hostname',
+ 'text',
+ $host,
+ ['placeholder' => 'Hostname to look up.']
+));
+
+$section->addInput(new Form_Input(
+ 'port',
+ 'Port',
+ 'text',
+ $port,
+ ['placeholder' => 'Port to test.']
+));
+
+$section->addInput(new Form_Input(
+ 'srcport',
+ 'Source Port',
+ 'text',
+ $srcport,
+ ['placeholder' => 'Typically left blank.']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'showtext',
+ 'Remote text',
+ 'Show remote text',
+ $showtext
+))->setHelp("Shows the text given by the server when connecting to the port. If checked it will take 10+ seconds to display in a panel below this form.");
+
+$section->addInput(new Form_Select(
+ 'sourceip',
+ 'Source Address',
+ $sourceip,
+ array_merge(array('' => 'Any'), get_possible_traffic_source_addresses(true))
+))->setHelp('Select source address for the trace');
+
+$section->addInput(new Form_Select(
+ 'ipproto',
+ 'IP Protocol',
+ $ipprotocol,
+ array('ipv4' => 'IPv4', 'ipv6' => 'IPv6')
+))->setHelp("If you force IPv4 or IPv6 and use a hostname that does not contain a result using that protocol, it will result in an error." .
+ " For example if you force IPv4 and use a hostname that only returns an AAAA IPv6 IP address, it will not work.");
+
+$form->add($section);
+print $form;
+
+if($ncoutput && !empty($result) && $showtext && $retval == 0): ?>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title">Received Remote Text</h2>
+ </div>
+ <div class="panel-body">
+ <pre><?= $ncoutput ?></pre>
+ </div>
+ </div>
+<?php endif;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/diag_traceroute.php b/src/usr/local/www/diag_traceroute.php
index d094d49..f82b963 100644
--- a/src/usr/local/www/diag_traceroute.php
+++ b/src/usr/local/www/diag_traceroute.php
@@ -1,37 +1,63 @@
<?php
/*
diag_traceroute.php
- part of m0n0wall (http://m0n0.ch/wall)
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2005 Paul Taylor (paultaylor@winndixie.com) and Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2005 Paul Taylor (paultaylor@winndixie.com) and Manuel Kasper <mk@neon1.net>
+ * part of m0n0wall (http://m0n0.ch/wall)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/sbin/traceroute
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -47,14 +73,24 @@ $allowautocomplete = true;
$pgtitle = array(gettext("Diagnostics"), gettext("Traceroute"));
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php
-
define('MAX_TTL', 64);
define('DEFAULT_TTL', 18);
+$pconfig['ttl'] = DEFAULT_TTL;
+$pconfig['ipproto'] = 'IPv4';
+$pconfig['sourceip'] = 'Any';
+
+function create_sourceaddresslist() {
+ $list = array('any' => 'Any');
+
+ $sourceips = get_possible_traffic_source_addresses(true);
+
+ foreach ($sourceips as $sipvalue => $sipname)
+ $list[$sipname[value]] = $sipname[name];
+
+ return($list);
+}
+
if ($_POST || $_REQUEST['host']) {
unset($input_errors);
unset($do_traceroute);
@@ -76,14 +112,18 @@ if ($_POST || $_REQUEST['host']) {
$input_errors[] = gettext("When using IPv6, the target host must be an IPv6 address or hostname.");
}
- if (!$input_errors) {
- $sourceip = $_REQUEST['sourceip'];
- $do_traceroute = true;
- $ttl = $_REQUEST['ttl'];
- $resolve = $_REQUEST['resolve'];
- }
+ if (!$input_errors)
+ $host = $_REQUEST['host'];
+
+ $sourceip = $_REQUEST['sourceip'];
+ $do_traceroute = true;
+ $ttl = $_REQUEST['ttl'];
+ $resolve = $_REQUEST['resolve'];
+ $useicmp = $_REQUEST['useicmp'];
+
} else {
- $resolve = true;
+ $resolve = false;
+ $useicmp = false;
}
if (!isset($do_traceroute)) {
@@ -92,104 +132,66 @@ if (!isset($do_traceroute)) {
$ttl = DEFAULT_TTL;
}
-?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="diag_traceroute.php" method="post" name="iform" id="iform">
-<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="diag traceroute">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Traceroute");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Host");?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="host" type="text" class="formfld unknown" id="host" size="20" value="<?=htmlspecialchars($host);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("IP Protocol"); ?></td>
- <td width="78%" class="vtable">
- <select name="ipproto" class="formselect">
- <option value="ipv4" <?php if ($ipproto == "ipv4") echo "selected=\"selected\"" ?>>IPv4</option>
- <option value="ipv6" <?php if ($ipproto == "ipv6") echo "selected=\"selected\"" ?>>IPv6</option>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Source Address"); ?></td>
- <td width="78%" class="vtable">
- <select name="sourceip" class="formselect">
- <option value="">Any</option>
- <?php $sourceips = get_possible_traffic_source_addresses(true);
- foreach ($sourceips as $sipvalue => $sipname):
- $selected = "";
- if (!link_interface_to_bridge($sipvalue) && ($sipvalue == $sourceip)) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$sipvalue;?>" <?=$selected;?>>
- <?=htmlspecialchars($sipname);?>
- </option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Maximum number of hops");?></td>
- <td width="78%" class="vtable">
- <select name="ttl" class="formfld" id="ttl">
- <?php for ($i = 1; $i <= MAX_TTL; $i++): ?>
- <option value="<?=$i;?>" <?php if ($i == $ttl) echo "selected=\"selected\""; ?>><?=$i;?></option>
- <?php endfor; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Reverse Address Lookup");?></td>
- <td width="78%" class="vtable">
- <input name="resolve" type="checkbox"<?php echo (!isset($resolve) ? "" : " checked=\"checked\""); ?> />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Use ICMP");?></td>
- <td width="78%" class="vtable">
- <input name="useicmp" type="checkbox"<?php if ($_REQUEST['useicmp']) echo " checked=\"checked\""; ?> />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Traceroute");?>" />
- </td>
- </tr>
- <tr>
- <td valign="top" colspan="2">
- <span class="vexpl">
- <span class="red"><b><?=gettext("Note: ");?></b></span>
- <?=gettext("Traceroute may take a while to complete. You may hit the Stop button on your browser at any time to see the progress of failed traceroutes.");?>
- <br /><br />
- <?=gettext("Using a source interface/IP address that does not match selected type (IPv4, IPv6) will result in an error or empty output.");?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" colspan="2">
- <?php
- if ($do_traceroute) {
- echo "<font face=\"terminal\" size=\"2\">\n";
- echo "<strong>" . gettext("Traceroute output:") . "</strong><br />\n";
- ob_end_flush();
- ?>
- <script type="text/javascript">
- //<![CDATA[
- window.onload=function() {
- document.getElementById("tracerouteCaptured").wrap='off';
- }
- //]]>
- </script>
- <?php
- echo "<textarea id=\"tracerouteCaptured\" style=\"width:98%\" name=\"code\" rows=\"15\" cols=\"66\" readonly=\"readonly\">";
- $useicmp = isset($_REQUEST['useicmp']) ? "-I" : "";
- $n = isset($resolve) ? "" : "-n";
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form('Traceroute');
+
+$section = new Form_Section('Traceroute');
+
+$section->addInput(new Form_Input(
+ 'host',
+ 'Hostname',
+ 'text',
+ $host,
+ ['placeholder' => 'Hostname to trace.']
+));
+
+$section->addInput(new Form_Select(
+ 'ipproto',
+ 'IP Protocol',
+ $pconfig['protocol'],
+ array('ipv4' => 'IPv4', 'ipv6' => 'IPv6')
+))->setHelp('Select the protocol to use');
+
+$section->addInput(new Form_Select(
+ 'sourceip',
+ 'Source Address',
+ $pconfig['source'],
+ create_sourceaddresslist()
+))->setHelp('Select source address for the trace');
+
+$section->addInput(new Form_Select(
+ 'ttl',
+ 'Maximum nuber of hops',
+ $ttl,
+ array_combine(range(1, MAX_TTL), range(1, MAX_TTL))
+))->setHelp('Select the maximum number of network hops to trace');
+
+$section->addInput(new Form_Checkbox(
+ 'resolve',
+ 'Reverse Address Lookup',
+ '',
+ $resolve
+))->setHelp('When checked, traceroute will attempt to perform a PTR lookup to locate hostnames for hops along the path. Will slow down the process as it has to wait for DNS replies.');
+
+$section->addInput(new Form_Checkbox(
+ 'useicmp',
+ gettext("Use ICMP"),
+ '',
+ $useicmp
+))->setHelp('By default, traceroute uses UDP but that may be blocked by some routers. Check this box to use ICMP instead, which may succeed. ');
+
+$form->add($section);
+print $form;
+
+/* Show the traceroute results */
+if (!$input_errors && $do_traceroute) {
+
+ $useicmp = isset($_REQUEST['useicmp']) ? "-I" : "";
+ $n = isset($resolve) ? "" : "-n";
$command = "/usr/sbin/traceroute";
if ($ipproto == "ipv6") {
@@ -203,16 +205,21 @@ if (!isset($do_traceroute)) {
$srcip = "-s " . escapeshellarg($ifaddr);
}
- $cmd = "{$command} {$n} {$srcip} -w 2 {$useicmp} -m " . escapeshellarg($ttl) . " " . escapeshellarg($host);
-
- //echo "Traceroute command: {$cmd}\n";
- system($cmd);
- echo "</textarea>&nbsp;</font>";
- } ?>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ $cmd = "{$command} {$n} {$srcip} -w 2 {$useicmp} -m " . escapeshellarg($ttl) . " " . escapeshellarg($host);
+?>
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Results</h2></div>
+ <div class="panel-body">
+<?php
+ if ($result = shell_exec($cmd))
+ print(nl2br($result));
+ else
+ print('Error: ' . $host . ' ' . gettext("could not be traced/resolved"));
+?>
+ </div>
+ </div>
+<?php
+}
+
+include("foot.inc");
+?>
diff --git a/src/usr/local/www/easyrule.php b/src/usr/local/www/easyrule.php
index 74b1051..9f58af0 100644
--- a/src/usr/local/www/easyrule.php
+++ b/src/usr/local/www/easyrule.php
@@ -1,33 +1,59 @@
<?php
/*
easyrule.php
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2009-2010 Jim Pingle (jpingle@gmail.com)
- Originally Sponsored By Anathematic @ pfSense Forums
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2009-2010 Jim Pingle (jpingle@gmail.com)
+ * Originally Sponsored By Anathematic @ pfSense Forums
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: filter
*/
diff --git a/src/usr/local/www/edit.php b/src/usr/local/www/edit.php
index 481b2ce..aedf9ed 100644
--- a/src/usr/local/www/edit.php
+++ b/src/usr/local/www/edit.php
@@ -1,31 +1,58 @@
<?php
/*
edit.php
- Copyright (C) 2004, 2005 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: shell
*/
@@ -45,25 +72,26 @@ require("guiconfig.inc");
if ($_POST['action']) {
switch ($_POST['action']) {
case 'load':
- if (strlen($_POST['file']) < 1) {
- echo "|5|" . gettext("No file name specified") . ".|";
- } elseif (is_dir($_POST['file'])) {
- echo "|4|" . gettext("Loading a directory is not supported") . ".|";
- } elseif (!is_file($_POST['file'])) {
- echo "|3|" . gettext("File does not exist or is not a regular file") . ".|";
+ if(strlen($_POST['file']) < 1) {
+ print('|5|' . '<div class="alert alert-danger" role="alert">'.gettext("No file name specified").'</div>' . '|');
+ } elseif(is_dir($_POST['file'])) {
+ print('|4|' . '<div class="alert alert-danger" role="alert">' . gettext("Loading a directory is not supported") .'</div>' . '|');
+ } elseif(! is_file($_POST['file'])) {
+ print('|3|' . '<div class="alert alert-danger" role="alert">' . gettext("File does not exist or is not a regular file") . '</div>' . '|');
} else {
$data = file_get_contents(urldecode($_POST['file']));
- if ($data === false) {
- echo "|1|" . gettext("Failed to read file") . ".|";
+ if($data === false) {
+ print('|1|' . '<div class="alert alert-danger" role="alert">' . gettext("Failed to read file") . '</div>' . '|');
} else {
$data = base64_encode($data);
- echo "|0|{$_POST['file']}|{$data}|";
+ print("|0|{$_POST['file']}|{$data}|");
}
}
exit;
+
case 'save':
- if (strlen($_POST['file']) < 1) {
- echo "|" . gettext("No file name specified") . ".|";
+ if(strlen($_POST['file']) < 1) {
+ print('|' . '<div class="alert alert-danger" role="alert">'.gettext("No file name specified").'</div>' . '|');
} else {
conf_mount_rw();
$_POST['data'] = str_replace("\r", "", base64_decode($_POST['data']));
@@ -75,12 +103,12 @@ if ($_POST['action']) {
}
disable_security_checks();
}
- if ($ret === false) {
- echo "|" . gettext("Failed to write file") . ".|";
- } elseif ($ret <> strlen($_POST['data'])) {
- echo "|" . gettext("Error while writing file") . ".|";
+ if($ret === false) {
+ print('|' . '<div class="alert alert-danger" role="alert">' . gettext("Failed to write file") . '</div>' . '|');
+ } elseif($ret != strlen($_POST['data'])) {
+ print('|' . '<div class="alert alert-danger" role="alert">' . gettext("Error while writing file") . '</div>' . '|');
} else {
- echo "|" . gettext("File successfully saved") . ".|";
+ print('|' . '<div class="alert alert-success" role="alert">' . gettext("File saved successfully") . '</div>' . '|');
}
}
exit;
@@ -88,25 +116,45 @@ if ($_POST['action']) {
exit;
}
-$closehead = false;
require("head.inc");
-outputCSSFileInline("code-syntax-highlighter/SyntaxHighlighter.css");
-outputJavaScriptFileInline("filebrowser/browser.js");
-outputJavaScriptFileInline("javascript/base64.js");
-
?>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
+<!-- file status box -->
+<div style="display:none; background:#eeeeee;" id="fileStatusBox">
+ <strong id="fileStatus"></strong>
+</div>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Save / Load a file from the filesystem")?></h2></div>
+ <div class="panel-body">
+ <form>
+ <input type="text" class="form-control" id="fbTarget"/>
+ <input type="button" class="btn btn-default btn-sm" onclick="loadFile();" value="<?=gettext('Load')?>" />
+ <input type="button" class="btn btn-default btn-sm" id="fbOpen" value="<?=gettext('Browse')?>" />
+ <input type="button" class="btn btn-default btn-sm" onclick="saveFile();" value="<?=gettext('Save')?>" />
+ </form>
+
+ <div id="fbBrowser" style="display:none; border:1px dashed gray; width:98%;"></div>
+
+ <div style="background:#eeeeee;" id="fileOutput">
+ <script type="text/javascript">
+ //<![CDATA[
+ window.onload=function(){
+ document.getElementById("fileContent").wrap='off';
+ }
+ //]]>
+ </script>
+ <textarea id="fileContent" name="fileContent" class="form-control" rows="30" cols=""></textarea>
+ </div>
-<script type="text/javascript">
-//<![CDATA[
+ </div>
+</div>
+
+<script>
function loadFile() {
- jQuery("#fileStatus").html("<?=gettext("Loading file"); ?> ...");
+ jQuery("#fileStatus").html("");
jQuery("#fileStatusBox").show(500);
-
jQuery.ajax(
- "<?=$_SERVER['SCRIPT_NAME'];?>", {
+ "<?=$_SERVER['SCRIPT_NAME']?>", {
type: "post",
data: "action=load&file=" + jQuery("#fbTarget").val(),
complete: loadComplete
@@ -121,37 +169,27 @@ outputJavaScriptFileInline("javascript/base64.js");
if (values.shift() == "0") {
var file = values.shift();
- var fileContent = Base64.decode(values.join("|"));
- jQuery("#fileStatus").html("<?=gettext("File successfully loaded"); ?>.");
- jQuery("#fileContent").val(fileContent);
-
- var lang = "none";
- if (file.indexOf(".php") > 0) lang = "php";
- else if (file.indexOf(".inc") > 0) lang = "php";
- else if (file.indexOf(".xml") > 0) lang = "xml";
- else if (file.indexOf(".js") > 0) lang = "js";
- else if (file.indexOf(".css") > 0) lang = "css";
+ var fileContent = window.atob(values.join("|"));
- if (jQuery("#highlight").checked && lang != "none") {
- jQuery("fileContent").prop("className", lang + ":showcolumns");
- dp.SyntaxHighlighter.HighlightAll("fileContent", true, false);
- }
- } else {
+ jQuery("#fileContent").val(fileContent);
+ }
+ else {
jQuery("#fileStatus").html(values[0]);
jQuery("#fileContent").val("");
}
+
jQuery("#fileContent").show(1000);
}
function saveFile(file) {
- jQuery("#fileStatus").html("<?=gettext("Saving file"); ?> ...");
+ jQuery("#fileStatus").html("");
jQuery("#fileStatusBox").show(500);
var fileContent = Base64.encode(jQuery("#fileContent").val());
fileContent = fileContent.replace(/\+/g, "%2B");
jQuery.ajax(
- "<?=$_SERVER['SCRIPT_NAME'];?>", {
+ "<?=$_SERVER['SCRIPT_NAME']?>", {
type: "post",
data: "action=save&file=" + jQuery("#fbTarget").val() +
"&data=" + fileContent,
@@ -162,93 +200,15 @@ outputJavaScriptFileInline("javascript/base64.js");
}
);
}
-//]]>
-</script>
-<!-- file status box -->
-<div style="display:none; background:#eeeeee;" id="fileStatusBox">
- <div class="vexpl" style="padding-left:15px;">
- <strong id="fileStatus"></strong>
- </div>
-</div>
-
-<br />
-
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="file editor">
- <tr>
- <td class="tabcont" align="center">
-
-<!-- controls -->
-<table width="100%" cellpadding="9" cellspacing="9" summary="controls">
- <tr>
- <td align="center" class="list">
- <?=gettext("Save / Load from path"); ?>:
- <input type="text" class="formfld file" id="fbTarget" size="45" />
- <input type="button" class="formbtn" onclick="loadFile();" value="<?=gettext('Load');?>" />
- <input type="button" class="formbtn" id="fbOpen" value="<?=gettext('Browse');?>" />
- <input type="button" class="formbtn" onclick="saveFile();" value="<?=gettext('Save');?>" />
- <br />
- <?php
- /*
- <input type="checkbox" id="highlight" /><?=gettext("Enable syntax highlighting");
- */
- ?>
- </td>
- </tr>
-</table>
-
-<!-- filebrowser -->
-<div id="fbBrowser" style="display:none; border:1px dashed gray; width:98%;"></div>
-
-<!-- file viewer/editor -->
-<table width="100%" summary="file editor">
- <tr>
- <td valign="top">
- <div style="background:#eeeeee;" id="fileOutput">
- <script type="text/javascript">
- //<![CDATA[
- window.onload=function() {
- document.getElementById("fileContent").wrap='off';
- }
- //]]>
- </script>
- <textarea id="fileContent" name="fileContent" style="width:100%;" rows="30" cols=""></textarea>
- </div>
- </td>
- </tr>
-</table>
-
- </td>
- </tr>
-</table>
-
-<script type="text/javascript" src="/code-syntax-highlighter/shCore.js"></script>
-<script type="text/javascript" src="/code-syntax-highlighter/shBrushCss.js"></script>
-<script type="text/javascript" src="/code-syntax-highlighter/shBrushJScript.js"></script>
-<script type="text/javascript" src="/code-syntax-highlighter/shBrushPhp.js"></script>
-<script type="text/javascript" src="/code-syntax-highlighter/shBrushXml.js"></script>
-<script type="text/javascript">
-//<![CDATA[
- jQuery(window).load(
- function() {
- jQuery("#fbTarget").focus();
-
- NiftyCheck();
- Rounded("div#fileStatusBox", "all", "#ffffff", "#eeeeee", "smooth");
- }
- );
-
- <?php if ($_GET['action'] == "load"): ?>
- jQuery(window).load(
- function() {
- jQuery("#fbTarget").val("<?=htmlspecialchars($_GET['path']);?>");
- loadFile();
- }
- );
+ <?php if($_GET['action'] == "load"): ?>
+ events.push(function() {
+ jQuery("#fbTarget").val("<?=htmlspecialchars($_GET['path'])?>");
+ loadFile();
+ });
<?php endif; ?>
-//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php include("foot.inc");
+
+outputJavaScriptFileInline("filebrowser/browser.js"); \ No newline at end of file
diff --git a/src/usr/local/www/exec.php b/src/usr/local/www/exec.php
index e0220b7..a7d9cfd 100644
--- a/src/usr/local/www/exec.php
+++ b/src/usr/local/www/exec.php
@@ -1,36 +1,63 @@
<?php
/* $Id$ */
/*
- Exec+ v1.02-000 - Copyright 2001-2003, All rights reserved
- Created by technologEase (http://www.technologEase.com).
-
- (modified for m0n0wall by Manuel Kasper <mk@neon1.net>)
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
+ exec.php
*/
+/* ====================================================================
+ * Exec+ v1.02-000 - Copyright 2001-2003, All rights reserved
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Created by technologEase (http://www.technologEase.com)
+ * (modified for m0n0wall by Manuel Kasper <mk@neon1.net>)\
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: shell
+ pfSense_MODULE: shell
*/
##|+PRIV
@@ -87,24 +114,20 @@ function puts($arg) {
// "Constants".
-$Version = '';
+$Version = '';
$ScriptName = $REQUEST['SCRIPT_NAME'];
// Get year.
-$arrDT = localtime();
+$arrDT = localtime();
$intYear = $arrDT[5] + 1900;
$closehead = false;
$pgtitle = array(gettext("Diagnostics"), gettext("Execute command"));
include("head.inc");
?>
-
-<script type="text/javascript">
-//<![CDATA[
-
+<script>
// Create recall buffer array (of encoded strings).
-
<?php
if (isBlank($_POST['txtRecallBuffer'])) {
@@ -118,8 +141,9 @@ if (isBlank($_POST['txtRecallBuffer'])) {
puts(" '" . htmlspecialchars($arrBuffer[count($arrBuffer) - 1], ENT_QUOTES | ENT_HTML401) . "'");
puts(" );");
}
-
?>
+ // Set pointer to end of recall buffer.
+ var intRecallPtr = arrRecallBuffer.length-1;
// Set pointer to end of recall buffer.
var intRecallPtr = arrRecallBuffer.length-1;
@@ -193,163 +217,86 @@ if (isBlank($_POST['txtRecallBuffer'])) {
}
//]]>
</script>
-<style type="text/css">
-/*<![CDATA[*/
-
-input {
- font-family: courier new, courier;
- font-weight: normal;
- font-size: 9pt;
-}
-
-pre {
- border: 2px solid #435370;
- background: #F0F0F0;
- padding: 1em;
- font-family: courier new, courier;
- white-space: pre;
- line-height: 10pt;
- font-size: 10pt;
-}
-
-.label {
- font-family: tahoma, verdana, arial, helvetica;
- font-size: 11px;
- font-weight: bold;
-}
+<?php
-.button {
- font-family: tahoma, verdana, arial, helvetica;
- font-weight: bold;
- font-size: 11px;
-}
+if (isBlank($_POST['txtCommand']) && isBlank($_POST['txtPHPCommand']) && isBlank($ulmsg))
+ print('<div class="alert alert-warning" role="alert">'.gettext("The capabilities offered here can be dangerous. No support is available. Use them at your own risk!").'</div>');
-/*]]>*/
-</style>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if (isBlank($_POST['txtCommand'])): ?>
-<p class="red"><strong><?=gettext("Note: this function is unsupported. Use it " .
-"on your own risk"); ?>!</strong></p>
-<?php endif; ?>
-<?php if ($ulmsg) echo "<p><strong>" . $ulmsg . "</strong></p>\n"; ?>
+if (!isBlank($_POST['txtCommand'])):?>
+ <div class="panel panel-success responsive">
+ <div class="panel-heading"><h2 class="panel-title">Shell Output - <?=htmlspecialchars($_POST['txtCommand'])?></h2></div>
+ <div class="panel-body">
+ <pre>
<?php
-
-if (!isBlank($_POST['txtCommand'])) {
- puts("<pre>");
- puts("\$ " . htmlspecialchars($_POST['txtCommand']));
putenv("PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin");
- putenv("SCRIPT_FILENAME=" . strtok($_POST['txtCommand'], " ")); /* PHP scripts */
- $ph = popen($_POST['txtCommand'] . ' 2>&1', "r");
- while ($line = fgets($ph)) {
- echo htmlspecialchars($line);
- }
- pclose($ph);
- puts("&nbsp;</pre>");
-}
-
+ putenv("SCRIPT_FILENAME=" . strtok($_POST['txtCommand'], " "));
+ print htmlspecialchars(system($_POST['txtCommand'].' 2>&1'));
+?>
+ </pre>
+ </div>
+ </div>
+<? endif ?>
+
+<form action="exec.php" method="post" enctype="multipart/form-data" name="frmExecPlus" onsubmit="return frmExecPlus_onSubmit( this );">
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Execute Shell Command')?></h2></div>
+ <div class="panel-body">
+ <input id="txtCommand" name="txtCommand" placeholder="Command" type="text" class="col-sm-4" value="<?=htmlspecialchars($_POST['txtCommand'])?>" />
+ <br /><br />
+ <input type="hidden" name="txtRecallBuffer" value="<?=htmlspecialchars($_POST['txtRecallBuffer']) ?>" />
+ <input type="button" class="btn btn-default btn-sm" name="btnRecallPrev" value="<" onclick="btnRecall_onClick( this.form, -1 );" />
+ <input type="submit" class="btn btn-default btn-sm" value="<?=gettext("Execute"); ?>" />
+ <input type="button" class="btn btn-default btn-sm" name="btnRecallNext" value=">" onclick="btnRecall_onClick( this.form, 1 );" />
+ <input type="button" class="btn btn-default btn-sm" value="<?=gettext("Clear"); ?>" onclick="return Reset_onClick( this.form );" />
+ </div>
+ </div>
+
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Download file')?></h2></div>
+ <div class="panel-body">
+ <input name="dlPath" type="text" id="dlPath" placeholder="File to download" class="col-sm-4"/>
+ <br /><br />
+ <input name="submit" type="submit" class="btn btn-default btn-sm" id="download" value="<?=gettext("Download"); ?>" />
+ </div>
+ </div>
-if (!isBlank($_POST['txtPHPCommand'])) {
- puts("<pre>");
- require_once("config.inc");
- require_once("functions.inc");
- echo eval($_POST['txtPHPCommand']);
- puts("&nbsp;</pre>");
+<?php
+ if ($ulmsg)
+ print('<div class="alert alert-success" role="alert">' . $ulmsg .'</div>');
+?>
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Upload a file')?></h2></div>
+ <div class="panel-body">
+ <input name="ulfile" type="file" class="btn btn-default btn-sm btn-file" id="ulfile" />
+ <br />
+ <input name="submit" type="submit" class="btn btn-default btn-sm pull-left" id="upload" value="<?=gettext("Upload"); ?>" />
+
+ </div>
+ </div>
+<?php
+ if (!isBlank($_POST['txtPHPCommand'])) {
+ puts("<div class=\"panel panel-success responsive\"><div class=\"panel-heading\">PHP response</div>");
+ puts("<pre>");
+ require_once("config.inc");
+ require_once("functions.inc");
+ echo eval($_POST['txtPHPCommand']);
+ puts("&nbsp;</pre>");
+ puts("</div>");
}
-
?>
-<div id="niftyOutter">
-<form action="exec.php" method="post" enctype="multipart/form-data" name="frmExecPlus" onsubmit="return frmExecPlus_onSubmit(this);">
- <table summary="exec">
- <tr>
- <td colspan="2" valign="top" class="vnsepcell"><?=gettext("Execute Shell command"); ?></td>
- </tr>
- <tr>
- <td class="label" align="right"><?=gettext("Command"); ?>:</td>
- <td class="type"><input id="txtCommand" name="txtCommand" type="text" class="formfld unknown" size="80" value="<?=htmlspecialchars($_POST['txtCommand']);?>" /></td>
- </tr>
- <tr>
- <td valign="top">&nbsp;&nbsp;&nbsp;</td>
- <td valign="top" class="label">
- <input type="hidden" name="txtRecallBuffer" value="<?=htmlspecialchars($_POST['txtRecallBuffer']) ?>" />
- <input type="button" class="button" name="btnRecallPrev" value="<" onclick="btnRecall_onClick(this.form, -1);" />
- <input type="submit" class="button" value="<?=gettext("Execute"); ?>" />
- <input type="button" class="button" name="btnRecallNext" value=">" onclick="btnRecall_onClick(this.form, 1);" />
- <input type="button" class="button" value="<?=gettext("Clear"); ?>" onclick="return Reset_onClick(this.form);" />
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="vnsepcell"><?=gettext("Download"); ?></td>
- </tr>
- <tr>
- <td align="right"><?=gettext("File to download"); ?>:</td>
- <td>
- <input name="dlPath" type="text" class="formfld file" id="dlPath" size="50" value="<?php echo htmlspecialchars($_GET['dlPath']) ?>" />
- </td>
- </tr>
- <tr>
- <td valign="top">&nbsp;&nbsp;&nbsp;</td>
- <td valign="top" class="label">
- <input name="submit" type="submit" class="button" id="download" value="<?=gettext("Download"); ?>" />
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="vnsepcell"><?=gettext("Upload"); ?></td>
- </tr>
- <tr>
- <td align="right"><?=gettext("File to upload"); ?>:</td>
- <td valign="top" class="label">
- <input name="ulfile" type="file" class="formfld file" id="ulfile" />
- </td>
- </tr>
- <tr>
- <td valign="top">&nbsp;&nbsp;&nbsp;</td>
- <td valign="top" class="label">
- <input name="submit" type="submit" class="button" id="upload" value="<?=gettext("Upload"); ?>" /></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="vnsepcell"><?=gettext("PHP Execute"); ?></td>
- </tr>
- <tr>
- <td align="right"><?=gettext("Command"); ?>:</td>
- <td class="type"><textarea id="txtPHPCommand" name="txtPHPCommand" rows="9" cols="80"><?=htmlspecialchars($_POST['txtPHPCommand']);?></textarea></td>
- </tr>
- <tr>
- <td valign="top">&nbsp;&nbsp;&nbsp;</td>
- <td valign="top" class="label">
- <input type="submit" class="button" value="<?=gettext("Execute"); ?>" />
- <p>
- <strong><?=gettext("Example"); ?>:</strong> interfaces_sync_setup();
- </p>
- </td>
- </tr>
-
- </table>
+ <div class="panel panel-default responsive">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Execute PHP Commands')?></h2></div>
+ <div class="panel-body">
+ <textarea id="txtPHPCommand" placeholder="Command" name="txtPHPCommand" rows="9" cols="80"><?=htmlspecialchars($_POST['txtPHPCommand'])?></textarea>
+ <br />
+ <input type="submit" class="btn btn-default btn-sm" value="<?=gettext("Execute")?>" />
+ <?=gettext("Example"); ?>: <code>print("Hello World!");</code>
+ </div>
+ </div>
</form>
-</div>
-<?php include("fend.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
-document.forms[0].txtCommand.focus();
-//]]>
-</script>
-</body>
-</html>
<?php
+include("foot.inc");
-if ($_POST) {
- conf_mount_ro();
-}
-
-?>
+if($_POST)
+ conf_mount_ro(); \ No newline at end of file
diff --git a/src/usr/local/www/fbegin.inc b/src/usr/local/www/fbegin.inc
index 50a3f2e..20a0066 100755..100644
--- a/src/usr/local/www/fbegin.inc
+++ b/src/usr/local/www/fbegin.inc
@@ -1,459 +1,2 @@
-<?php
-/*
- pfSense_MODULE: header
-*/
-
-require_once("globals.inc");
-require_once("functions.inc");
-require_once("shortcuts.inc");
-require_once("service-utils.inc");
-
-/* $Id$ */
-
-
-/* Determine automated help URL. Should output the page name and
- parameters separately */
-$uri_split = "";
-preg_match("/\/(.*)\?(.*)/", $_SERVER["REQUEST_URI"], $uri_split);
-
-/* If there was no match, there were no parameters, just grab the filename
- Otherwise, use the matched filename from above. */
-if (empty($uri_split[0])) {
- $pagename = ltrim($_SERVER["REQUEST_URI"], '/');
-} else {
- $pagename = $uri_split[1];
-}
-/* If the page name is still empty, the user must have requested / (index.php) */
-if (empty($pagename)) {
- $pagename = "index.php";
-}
-
-/* If the filename is pkg_edit.php or wizard.php, reparse looking for the .xml filename */
-if (($pagename == "pkg.php") || ($pagename == "pkg_edit.php") || ($pagename == "wizard.php")) {
- $param_split = explode('&', $uri_split[2]);
- foreach ($param_split as $param) {
- if (substr($param, 0, 4) == "xml=") {
- $xmlfile = explode('=', $param);
- $pagename = $xmlfile[1];
- }
- }
-}
-
-/* Build the full help URL. */
-$helpurl .= "{$g['help_base_url']}?page={$pagename}";
-
-function return_ext_menu($section) {
- global $config;
- $htmltext = "";
- $extarray = array();
- if ($config['installedpackages']['menu'] <> "") {
- foreach ($config['installedpackages']['menu'] as $menuitem) {
- if ($menuitem['section'] != $section) {
- continue;
- }
- if ($menuitem['url'] <> "") {
- $test_url=$menuitem['url'];
- $addresswithport = getenv("HTTP_HOST");
- $colonpos = strpos($addresswithport, ":");
- if ($colonpos !== False) {
- //my url is actually just the IP address of the pfsense box
- $myurl = substr($addresswithport, 0, $colonpos);
- } else {
- $myurl = $addresswithport;
- }
- $description = str_replace('$myurl', $myurl, $menuitem['url']);
- } else {
- $description = '/pkg.php?xml=' . $menuitem['configfile'];
- $test_url=$description;
- }
- if (isAllowedPage($test_url)) {
- $extarray[] = array($menuitem['name'], $description);
- }
- }
- }
- return $extarray;
-}
-
-function output_menu($arrayitem, $target = null) {
- foreach ($arrayitem as $item) {
- if (isAllowedPage($item[1]) || $item[1] == "/index.php?logout") {
- $attr = sprintf("href=\"%s\"", htmlentities($item[1]));
- if ($target) {
- $attr .= sprintf(" target=\"%s\"", htmlentities($target));
- }
- $class = "navlnk";
- if ($item['class']) {
- $class .= " {$item['class']}";
- }
- $attr .= sprintf(" class=\"%s\"", htmlentities($class));
- if ($item['style']) {
- $attr .= sprintf(" style=\"%s\"", htmlentities($item['style']));
- }
- echo "<li>\n";
- printf("<a %s>%s</a>\n", $attr, $item[0]);
- echo "</li>\n";
- }
- }
-}
-
-// System
-$system_menu = array();
-$system_menu[] = array(gettext("Advanced"), "/system_advanced_admin.php");
-$system_menu[] = array(gettext("Firmware"), "/system_firmware.php");
-$system_menu[] = array(gettext("General Setup"), "/system.php");
-$system_menu[] = array(gettext("High Avail. Sync"), "/system_hasync.php");
-$system_menu[] = array(gettext("Logout"), "/index.php?logout");
-if ($g['platform'] == "pfSense" or $g['platform'] == "nanobsd") {
- $system_menu[] = array(gettext("Packages"), "/pkg_mgr_installed.php");
-}
-$system_menu[] = array(gettext("Setup Wizard"), "/wizard.php?xml=setup_wizard.xml");
-$system_menu[] = array(gettext("Routing"), "/system_gateways.php");
-$system_menu[] = array(gettext("Cert Manager"), "/system_camanager.php");
-if (!isAllowedPage("system_usermanager.php*")) {
- $system_menu[] = array(gettext("User Manager"), "/system_usermanager_passwordmg.php");
-} else {
- $system_menu[] = array(gettext("User Manager"), "/system_usermanager.php");
-}
-$system_menu = msort(array_merge($system_menu, return_ext_menu("System")), 0);
-
-// Interfaces
-$interfaces_menu = array();
-if (!isset($config['system']['webgui']['noassigninterfaces'])) {
- $interfaces_menu[] = array(gettext("(assign)"), "/interfaces_assign.php");
-}
-$opts = get_configured_interface_with_descr(false, true);
-foreach ($opts as $oif => $odescr) {
- if (!isset($config['interfaces'][$oif]['ovpn'])) {
- $interfaces_menu[] = array(htmlspecialchars($odescr), "/interfaces.php?if={$oif}");
- }
-}
-$interfaces_menu = msort(array_merge($interfaces_menu, return_ext_menu("Interfaces")), 0);
-
-// Firewall
-$firewall_menu = array();
-$firewall_menu[] = array(gettext("Aliases"), "/firewall_aliases.php");
-$firewall_menu[] = array(gettext("NAT"), "/firewall_nat.php");
-$firewall_menu[] = array(gettext("Rules"), "/firewall_rules.php");
-$firewall_menu[] = array(gettext("Schedules"), "/firewall_schedule.php");
-$firewall_menu[] = array(gettext("Traffic Shaper"), "/firewall_shaper.php");
-$firewall_menu[] = array(gettext("Virtual IPs"), "/firewall_virtual_ip.php");
-$firewall_menu = msort(array_merge($firewall_menu, return_ext_menu("Firewall")), 0);
-
-// Services
-$services_menu = array();
-$services_menu[] = array(gettext("Captive Portal"), "/services_captiveportal.php");
-$services_menu[] = array(gettext("DNS Forwarder"), "/services_dnsmasq.php");
-$services_menu[] = array(gettext("DNS Resolver"), "/services_unbound.php");
-$services_menu[] = array(gettext("DHCP Relay"), "/services_dhcp_relay.php");
-$services_menu[] = array(gettext("DHCPv6 Relay"), "/services_dhcpv6_relay.php");
-if ($g['services_dhcp_server_enable']) {
- $services_menu[] = array(gettext("DHCP Server"), "/services_dhcp.php");
- $services_menu[] = array(gettext("DHCPv6 Server/RA"), "/services_dhcpv6.php");
-}
-$services_menu[] = array(gettext("Dynamic DNS"), "/services_dyndns.php");
-$services_menu[] = array(gettext("IGMP proxy"), "/services_igmpproxy.php");
-$services_menu[] = array(gettext("Load Balancer"), "/load_balancer_pool.php");
-$services_menu[] = array(gettext("NTP"), "/services_ntpd.php");
-$services_menu[] = array(gettext("PPPoE Server"), "/vpn_pppoe.php");
-$services_menu[] = array(gettext("SNMP"), "/services_snmp.php");
-if (count($config['interfaces']) > 1) {
- /* no use for UPnP in single-interface deployments
- remove to reduce user confusion
- */
- $services_menu[] = array(gettext("UPnP &amp; NAT-PMP"), "/pkg_edit.php?xml=miniupnpd.xml");
-}
-$services_menu[] = array(gettext("Wake on LAN"), "/services_wol.php");
-$services_menu = msort(array_merge($services_menu, return_ext_menu("Services")), 0);
-
-// VPN
-$vpn_menu = array();
-$vpn_menu[] = array(gettext("IPsec"), "/vpn_ipsec.php");
-$vpn_menu[] = array(gettext("OpenVPN"), "/vpn_openvpn_server.php");
-$vpn_menu[] = array(gettext("PPTP"), "/vpn_pptp.php");
-$vpn_menu[] = array(gettext("L2TP"), "/vpn_l2tp.php");
-$vpn_menu = msort(array_merge($vpn_menu, return_ext_menu("VPN")), 0);
-
-// Status
-$status_menu = array();
-if (count($config['captiveportal']) > 0) {
- $status_menu[] = array(gettext("Captive Portal"), "/status_captiveportal.php");
-}
-$status_menu[] = array(gettext("CARP (failover)"), "/carp_status.php");
-$status_menu[] = array(gettext("Dashboard"), "/index.php");
-$status_menu[] = array(gettext("Gateways"), "/status_gateways.php");
-$status_menu[] = array(gettext("DHCP Leases"), "/status_dhcp_leases.php");
-$status_menu[] = array(gettext("DHCPv6 Leases"), "/status_dhcpv6_leases.php");
-$status_menu[] = array(gettext("Filter Reload"), "/status_filter_reload.php");
-$status_menu[] = array(gettext("Interfaces"), "/status_interfaces.php");
-$status_menu[] = array(gettext("IPsec"), "/diag_ipsec.php");
-$status_menu[] = array(gettext("Load Balancer"), "/status_lb_pool.php");
-$status_menu[] = array(gettext("NTP"), "/status_ntpd.php");
-$status_menu[] = array(gettext("OpenVPN"), "/status_openvpn.php");
-if ($g['platform'] == "pfSense") {
- $status_menu[] = array(gettext("Package Logs"), "/diag_pkglogs.php");
-}
-$status_menu[] = array(gettext("Queues"), "/status_queues.php");
-$status_menu[] = array(gettext("RRD Graphs"), "/status_rrd_graph.php");
-$status_menu[] = array(gettext("Services"), "/status_services.php");
-$status_menu[] = array(gettext("System Logs"), "/diag_logs.php");
-$status_menu[] = array(gettext("Traffic Graph"), "/status_graph.php?if=wan");
-if (count($config['interfaces']) > 1) {
- $status_menu[] = array(gettext("UPnP &amp; NAT-PMP"), "/status_upnp.php");
-}
-$ifentries = get_configured_interface_with_descr();
-foreach ($ifentries as $ent => $entdesc) {
- if (is_array($config['interfaces'][$ent]['wireless']) &&
- preg_match($g['wireless_regex'], $config['interfaces'][$ent]['if'])) {
- $wifdescrs[$ent] = $entdesc;
- }
-}
-if (count($wifdescrs) > 0) {
- $status_menu[] = array(gettext("Wireless"), "/status_wireless.php");
-}
-$status_menu = msort(array_merge($status_menu, return_ext_menu("Status")), 0);
-
-// Diagnostics
-$diagnostics_menu = array();
-$diagnostics_menu[] = array(gettext("ARP Table"), "/diag_arp.php");
-$diagnostics_menu[] = array(gettext("Authentication"), "/diag_authentication.php");
-$diagnostics_menu[] = array(gettext("Backup/Restore"), "/diag_backup.php");
-$diagnostics_menu[] = array(gettext("Command Prompt"), "/exec.php");
-$diagnostics_menu[] = array(gettext("DNS Lookup"), "/diag_dns.php");
-$diagnostics_menu[] = array(gettext("Edit File"), "/edit.php");
-$diagnostics_menu[] = array(gettext("Factory Defaults"), "/diag_defaults.php");
-
-if (file_exists("/var/run/gmirror_active")) {
- $diagnostics_menu[] = array(gettext("GEOM Mirrors"), "/diag_gmirror.php");
-}
-$diagnostics_menu[] = array(gettext("Halt System"), "/halt.php");
-$diagnostics_menu[] = array(gettext("Limiter Info"), "/diag_limiter_info.php");
-$diagnostics_menu[] = array(gettext("NDP Table"), "/diag_ndp.php");
-
-$diagnostics_menu[] = array(gettext("Tables"), "/diag_tables.php");
-$diagnostics_menu[] = array(gettext("Ping"), "/diag_ping.php");
-$diagnostics_menu[] = array(gettext("Test Port"), "/diag_testport.php");
-$diagnostics_menu[] = array(gettext("pfInfo"), "/diag_pf_info.php");
-$diagnostics_menu[] = array(gettext("pfTop"), "/diag_system_pftop.php");
-$diagnostics_menu[] = array(gettext("Reboot"), "/reboot.php");
-$diagnostics_menu[] = array(gettext("Routes"), "/diag_routes.php");
-$diagnostics_menu[] = array(gettext("SMART Status"), "/diag_smart.php");
-$diagnostics_menu[] = array(gettext("Sockets"), "/diag_sockets.php");
-$diagnostics_menu[] = array(gettext("States"), "/diag_dump_states.php");
-$diagnostics_menu[] = array(gettext("States Summary"), "/diag_states_summary.php");
-$diagnostics_menu[] = array(gettext("System Activity"), "/diag_system_activity.php");
-$diagnostics_menu[] = array(gettext("Traceroute"), "/diag_traceroute.php");
-$diagnostics_menu[] = array(gettext("Packet Capture"), "/diag_packet_capture.php");
-if ($g['platform'] == "nanobsd") {
- $diagnostics_menu[] = array(gettext("NanoBSD"), "/diag_nanobsd.php");
-}
-
-if (isset($config['system']['developer'])) {
- $diagnostics_menu[] = array(gettext("Restart HTTPD"), "/restart_httpd.php", "style" => "font-weight: bold; color: yellow;");
-}
-$diagnostics_menu = msort(array_merge($diagnostics_menu, return_ext_menu("Diagnostics")), 0);
-
-$gold_menu = array();
-$gold_menu[] = array(gettext("pfSense Gold"), "https://www.pfsense.org/gold");
-$gold_menu = msort(array_merge($gold_menu, return_ext_menu("Gold")), 0);
-
-if (!$g['disablehelpmenu']) {
- $help_menu = array();
- $help_menu[] = array(gettext("About this Page"), $helpurl);
- if ($g['product_name'] == "pfSense") {
- $help_menu[] = array(gettext("Bug Database"), "https://www.pfsense.org/j.php?jumpto=redmine");
- }
- $help_menu[] = array(gettext("User Forum"), "https://www.pfsense.org/j.php?jumpto=forum");
- $help_menu[] = array(gettext("Documentation"), "https://www.pfsense.org/j.php?jumpto=doc");
- $help_menu[] = array(gettext("Developers Wiki"), "https://www.pfsense.org/j.php?jumpto=devwiki");
- $help_menu[] = array(gettext("Paid Support"), "https://www.pfsense.org/j.php?jumpto=portal");
- $help_menu[] = array(gettext("pfSense Book"), "https://www.pfsense.org/j.php?jumpto=book");
- $help_menu[] = array(gettext("Search portal"), "https://www.pfsense.org/j.php?jumpto=searchportal");
- $help_menu[] = array(gettext("FreeBSD Handbook"), "https://www.pfsense.org/j.php?jumpto=fbsdhandbook");
- $help_menu = msort(array_merge($help_menu, return_ext_menu("Help")), 0);
-}
-
-?>
-
-<div id="wrapper">
- <div id="header">
- <div id="header-left"><a href="/index.php" id="status-link"><img src="/themes/<?= $g['theme']; ?>/images/transparent.gif" border="0" alt="transparent" /></a></div>
- <div id="header-right">
- <div class="container">
- <div class="left">webConfigurator</div>
- <div class="right" id="menu_messages">
-<?php
- echo get_menu_messages();
-?>
- </div>
- </div>
- </div>
- </div> <!-- Header DIV -->
- <div id="content">
- <div id="left">
- <div id="navigation" style="z-index:1000;">
- <ul id="menu">
- <li class="firstdrop">
- <div><?php echo gettext("System"); ?></div>
- <ul class="subdrop">
- <?php
- output_menu($system_menu);
- ?>
- </ul>
- </li>
- <li class="drop">
- <div><?php echo gettext("Interfaces"); ?></div>
- <ul class="subdrop">
- <?php
- output_menu($interfaces_menu);
- ?>
- </ul>
- </li>
- <li class="drop">
- <div><?php echo gettext("Firewall"); ?></div>
- <ul class="subdrop">
- <?php
- output_menu($firewall_menu);
- ?>
- </ul>
- </li>
- <li class="drop">
- <div><?php echo gettext("Services"); ?></div>
- <ul class="subdrop">
- <?php
- output_menu($services_menu);
- ?>
- </ul>
- </li>
- <li class="drop">
- <div><?php echo gettext("VPN"); ?></div>
- <ul class="subdrop">
- <?php
- output_menu($vpn_menu);
- ?>
- </ul>
- </li>
- <li class="drop">
- <div><?php echo gettext("Status"); ?></div>
- <ul class="subdrop">
- <?php
- output_menu($status_menu);
- ?>
- </ul>
- </li>
- <li class="drop">
- <div><?php echo gettext("Diagnostics"); ?></div>
- <ul id="diag" class="subdrop">
- <?php
- output_menu($diagnostics_menu);
- ?>
- </ul>
- </li>
- <li class="drop">
- <div><?php echo gettext("Gold"); ?></div>
- <ul id="gold" class="subdrop">
- <?php
- output_menu($gold_menu, "_blank");
- ?>
- </ul>
- </li>
- <?php if (!$g['disablehelpmenu']): ?>
- <li class="lastdrop">
- <div><?php echo gettext("Help"); ?></div>
- <ul id="help" class="subdrop">
- <?php
- output_menu($help_menu, "_blank");
- ?>
- </ul>
- </li>
- <?php endif; ?>
- </ul>
- </div>
-
- </div> <!-- Left DIV -->
-
- <div id="right">
-
-<?php
-echo "\t<script type=\"text/javascript\" src=\"/javascript/domTT/domLib.js\"></script>\n";
-echo "\t<script type=\"text/javascript\" src=\"/javascript/domTT/domTT.js\"></script>\n";
-echo "\t<script type=\"text/javascript\" src=\"/javascript/domTT/behaviour.js\"></script>\n";
-echo "\t<script type=\"text/javascript\" src=\"/javascript/domTT/fadomatic.js\"></script>\n";
-/* display a top alert bar if need be */
-$need_alert_display = false;
-$found_notices = are_notices_pending();
-if ($found_notices == true) {
- $notices = get_notices();
- if (!$notices) {
- $need_alert_display = true;
- $display_text = print_notices($notices) . "<br />";
- }
-}
-if ($need_alert_display == true) {
- echo "<div style=\"background-color:#000000\" id=\"roundalert\">";
- echo "<table summary=\"round alert\">";
- echo "<tr><td><font color=\"#ffffff\">";
- echo "&nbsp;&nbsp;<img align=\"middle\" src=\"/top_notification.gif\" alt=\"notification\" />&nbsp;&nbsp;&nbsp;";
- echo $display_text;
- echo "</font></td>";
- echo "</tr>";
- echo "</table>";
- echo "</div>";
-}
-
-function add_to_menu($url, $name) {
- if (isAllowedPage($url)) {
- echo "<li><a href=\"{$url}\" class=\"navlnk\">{$name}</a></li>\n";
- }
-}
-
-?>
-
-<div>
-<span class="pgtitle"><a href="<?= htmlentities($_SERVER['REQUEST_URI']) ?>"><?=genhtmltitle($pgtitle);?></a></span>
-<span style="float:right; margin: 0 0 20px 20px">
-<?php
-if (!$hide_service_status && !empty($shortcuts[$shortcut_section]['service'])) {
- $ssvc = array();
- switch ($shortcut_section) {
- case "openvpn":
- $ssvc = find_service_by_openvpn_vpnid($vpnid);
- break;
- case "captiveportal":
- $ssvc = find_service_by_cp_zone($cpzone);
- break;
- default:
- $ssvc = find_service_by_name($shortcuts[$shortcut_section]['service']);
-
- }
- if (!empty($ssvc)) {
- echo get_service_status_icon($ssvc, false);
- echo get_service_control_links($ssvc, true);
- }
-}
-
-echo get_shortcut_main_link($shortcut_section, true);
-echo get_shortcut_status_link($shortcut_section, true);
-echo get_shortcut_log_link($shortcut_section, true);
-
-?>
-<?php if (!$g['disablehelpicon']): ?>
-
-<a href="<?php echo $helpurl; ?>" title="<?php echo gettext("Help for items on this page"); ?>"><img style="vertical-align:middle" src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_help.gif" border="0" alt="help" /></a>
-<?php endif; ?>
-</span>
-</div>
-<br />
-
-<?php
-/* if upgrade in progress, alert user */
-if (is_subsystem_dirty('packagelock') || (file_exists('/conf/needs_package_sync') && platform_booting())) {
- if (file_exists('/conf/needs_package_sync') && platform_booting()) {
- $info_text = sprintf(gettext("%s is booting then packages will be reinstalled in the background.<p>Do not make changes in the GUI until this is complete."), $g['product_name']);
- } else {
- $pgtitle = array(gettext("System"), gettext("Package Manager"));
- $info_text = gettext("Packages are currently being reinstalled in the background.<p>Do not make changes in the GUI until this is complete.");
- }
- print_info_box($info_text . "<p><img src='/themes/{$g['theme']}/images/icons/icon_fw-update.gif' alt='firmware update' />");
-}
-$pgtitle_output = true;
-?>
+<!-- temporary until migration to bootstrap has completed -->
+<div style="background-color: gray;"> \ No newline at end of file
diff --git a/src/usr/local/www/fend.inc b/src/usr/local/www/fend.inc
index f1cbdb9..262aeb7 100755..100644
--- a/src/usr/local/www/fend.inc
+++ b/src/usr/local/www/fend.inc
@@ -1,27 +1,2 @@
-<!--
- pfSense_MODULE: footer
--->
-
- </div> <!-- Right DIV -->
-
- </div> <!-- Content DIV -->
-
- <div id="footer">
- <a target="_blank" href="<?=$g['product_website_footer']?>" class="redlnk"><?=$g['product_name']?></a> is &copy;
- <?=$g['product_copyright_years']?> by <a href="<?=$g['product_copyright_url']?>" class="tblnk"><?=$g['product_copyright']?></a>. All Rights Reserved.
- [<a href="/license.php" class="tblnk">view license</a>]
- </div> <!-- Footer DIV -->
-
-</div> <!-- Wrapper Div -->
-
-<?php outputJavaScriptFileInline("/usr/local/www/themes/{$g['theme']}/bottom-loader.js");
-/* Disable form autocomplete on all but the login screen. */
-if (basename($_SERVER["SCRIPT_FILENAME"] != "index.php") && !$allowautocomplete): ?>
-<script type="text/javascript">
-//<![CDATA[
-(function ($) {
- $("input").attr("autocomplete","off");
-})(jQuery);
-//]]>
-</script>
-<?php endif; ?>
+<!-- temporary -->
+<?php include "foot.inc"; ?>
diff --git a/src/usr/local/www/firewall_aliases.php b/src/usr/local/www/firewall_aliases.php
index 950a8a2..c7be7d9 100644
--- a/src/usr/local/www/firewall_aliases.php
+++ b/src/usr/local/www/firewall_aliases.php
@@ -2,35 +2,58 @@
/* $Id$ */
/*
firewall_aliases.php
- Copyright (C) 2004 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: aliases
*/
@@ -104,7 +127,7 @@ if ($_GET['act'] == "del") {
// Alias in an alias
find_alias_reference(array('aliases', 'alias'), array('address'), $alias_name, $is_alias_referenced, $referenced_by);
// Load Balancer
- find_alias_reference(array('load_balancer', 'lbpool'), array('port'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('load_balancer', 'lbpool'), array('port'), $alias_name, $is_alias_referenced, $referenced_by);
find_alias_reference(array('load_balancer', 'virtual_server'), array('port'), $alias_name, $is_alias_referenced, $referenced_by);
// Static routes
find_alias_reference(array('staticroutes', 'route'), array('network'), $alias_name, $is_alias_referenced, $referenced_by);
@@ -165,147 +188,108 @@ $shortcut_section = "aliases";
include("head.inc");
+if ($savemsg)
+ print_info_box($savemsg);
+if (is_subsystem_dirty('aliases'))
+ print_info_box_np(gettext("The alias list has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."));
+
+$tab_array = array();
+$tab_array[] = array(gettext("IP"),($tab=="ip" ? true : ($tab=="host" ? true : ($tab == "network" ? true : false))), "/firewall_aliases.php?tab=ip");
+$tab_array[] = array(gettext("Ports"), ($tab=="port"? true : false), "/firewall_aliases.php?tab=port");
+$tab_array[] = array(gettext("URLs"), ($tab=="url"? true : false), "/firewall_aliases.php?tab=url");
+$tab_array[] = array(gettext("All"), ($tab=="all"? true : false), "/firewall_aliases.php?tab=all");
+display_top_tabs($tab_array);
+
+?>
+<div class="table-responsive">
+<table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><?=gettext("Name")?></th>
+ <th><?=gettext("Values")?></th>
+ <th><?=gettext("Description")?></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+ asort($a_aliases);
+ foreach ($a_aliases as $i=> $alias):
+ unset ($show_alias);
+ switch ($tab){
+ case "all":
+ $show_alias= true;
+ break;
+ case "ip":
+ case "host":
+ case "network":
+ if (preg_match("/(host|network)/",$alias["type"]))
+ $show_alias= true;
+ break;
+ case "url":
+ if (preg_match("/(url)/i",$alias["type"]))
+ $show_alias= true;
+ break;
+ case "port":
+ if($alias["type"] == "port")
+ $show_alias= true;
+ break;
+ }
+ if ($show_alias):
?>
+ <tr>
+ <td>
+ <?=htmlspecialchars($alias['name'])?>
+ </td>
+ <td>
+<?php
+ if ($alias["url"]) {
+ echo $alias["url"] . "<br />";
+ } else {
+ if(is_array($alias["aliasurl"])) {
+ $aliasurls = implode(", ", array_slice($alias["aliasurl"], 0, 10));
+ echo $aliasurls;
+ if(count($aliasurls) > 10) {
+ echo "&hellip;<br />";
+ }
+ echo "<br />\n";
+ }
+ $tmpaddr = explode(" ", $alias['address']);
+ $addresses = implode(", ", array_slice($tmpaddr, 0, 10));
+ echo $addresses;
+ if(count($tmpaddr) > 10) {
+ echo '&hellip;';
+ }
+ }
+?>
+ </td>
+ <td>
+ <?=htmlspecialchars($alias['descr'])?>&nbsp;
+ </td>
+ <td>
+ <a href="firewall_aliases_edit.php?id=<?=$i?>" class="btn btn-xs btn-primary">edit</a>
+ <a href="?act=del&amp;tab=<?=$tab?>&amp;id=<?=$i?>" class="btn btn-xs btn-danger">delete</a>
+ </td>
+ </tr>
+<?php endif?>
+<?php endforeach?>
+ </tbody>
+</table>
+</div>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="firewall_aliases.php" method="post">
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('aliases')): ?><p>
-<?php print_info_box_np(gettext("The alias list has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."));?>
-<?php endif; ?>
-<?php pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases/pre_table"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall aliases">
- <tr>
- <td class="tabnavtbl">
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("IP"), ($tab == "ip" ? true : ($tab == "host" ? true : ($tab == "network" ? true : false))), "/firewall_aliases.php?tab=ip");
- $tab_array[] = array(gettext("Ports"), ($tab == "port"? true : false), "/firewall_aliases.php?tab=port");
- $tab_array[] = array(gettext("URLs"), ($tab == "url"? true : false), "/firewall_aliases.php?tab=url");
- $tab_array[] = array(gettext("All"), ($tab == "all"? true : false), "/firewall_aliases.php?tab=all");
- display_top_tabs($tab_array);
- ?>
- <input type="hidden" name="tab" value="<?=htmlspecialchars($tab);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Name"); ?></td>
- <td width="43%" class="listhdrr"><?=gettext("Values"); ?></td>
- <td width="30%" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="7%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td valign="middle" width="17">&nbsp;</td>
- <td valign="middle"><a href="firewall_aliases_edit.php?tab=<?=$tab?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" <?=dom_title(gettext("Add a new alias"));?> alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <?php
- asort($a_aliases);
- foreach ($a_aliases as $i=> $alias) {
- unset ($show_alias);
- switch ($tab) {
- case "all":
- $show_alias= true;
- break;
- case "ip":
- case "host":
- case "network":
- if (preg_match("/(host|network)/", $alias["type"])) {
- $show_alias= true;
- }
- break;
- case "url":
- if (preg_match("/(url)/i", $alias["type"])) {
- $show_alias= true;
- }
- break;
- case "port":
- if ($alias["type"] == "port") {
- $show_alias= true;
- }
- break;
- }
- if ($show_alias) {
- ?>
- <tr>
- <td class="listlr" ondblclick="document.location='firewall_aliases_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($alias['name']);?>
- </td>
- <td class="listr" ondblclick="document.location='firewall_aliases_edit.php?id=<?=$i;?>';">
- <?php
- if ($alias["url"]) {
- echo $alias["url"] . "<br />";
- } else {
- if (is_array($alias["aliasurl"])) {
- $aliasurls = implode(", ", array_slice($alias["aliasurl"], 0, 10));
- echo $aliasurls;
- if (count($aliasurls) > 10) {
- echo "...<br />";
- }
- echo "<br />\n";
- }
- $tmpaddr = explode(" ", $alias['address']);
- $addresses = implode(", ", array_slice($tmpaddr, 0, 10));
- echo $addresses;
- if (count($tmpaddr) > 10) {
- echo "...";
- }
- }
- ?>
- </td>
- <td class="listbg" ondblclick="document.location='firewall_aliases_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($alias['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
- <tr>
- <td valign="middle"><a href="firewall_aliases_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" <?=dom_title(gettext("Edit alias")." {$alias['name']}");?> alt="edit" /></a></td>
- <td><a href="firewall_aliases.php?act=del&amp;tab=<?=$tab;?>&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this alias? All elements that still use it will become invalid (e.g. filter rules)!");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" <?=dom_title(gettext("Delete alias")." {$alias['name']}");?> alt="delete" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <?php
- } // if ($show_alias)
- } // foreach
- ?>
+<nav class="action-buttons">
+ <a href="firewall_aliases_edit.php?tab=<?=$tab?>" role="button" class="btn btn-success">
+ <?=gettext("add new alias");?>
+ </a>
+ <a href="firewall_aliases_import.php" role="button" class="btn btn-default">
+ <?=gettext("bulk import");?>
+ </a>
+</nav>
- <tr>
- <td colspan="3">&nbsp;</td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tbody>
- <tr>
- <td valign="middle">
- <a href="firewall_aliases_edit.php?tab=<?=$tab?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" <?=dom_title(gettext("Add a new alias")); ?> alt="add" /></a>
- </td>
- <td valign="middle">
- <a href="firewall_aliases_import.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_import_alias.gif" width="17" height="17" border="0" <?=dom_title(gettext("Bulk import aliases from list"));?> alt="import" /></a>
- </td>
- </tr>
- </tbody>
- </table>
- </td>
- </tr>
+<?php
- <tr>
- <td class="tabcont" colspan="3">
- <p><span class="vexpl"><span class="red"><strong><?=gettext("Note:"); ?><br /></strong></span></span></p><div style="overflow:hidden; text-align:justify;"><p><span class="vexpl"><?=gettext("Aliases act as placeholders for real hosts, networks or ports. They can be used to minimize the number of changes that have to be made if a host, network or port changes. You can enter the name of an alias instead of the host, network or port in all fields that have a red background. The alias will be resolved according to the list above. If an alias cannot be resolved (e.g. because you deleted it), the corresponding element (e.g. filter/NAT/shaper rule) will be considered invalid and skipped."); ?></span></p></div>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+print_info_box(gettext('Aliases act as placeholders for real hosts, networks or ports. They can be used to minimize the number ' .
+ 'of changes that have to be made if a host, network or port changes.' . '<br />' .
+ 'You can enter the name of an alias instead of the host, network or port where indicated. The alias will be resolved according to the list above.' . '<br />' .
+ 'If an alias cannot be resolved (e.g. because you deleted it), the corresponding element (e.g. filter/NAT/shaper rule) will be considered invalid and skipped.'));
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_aliases_edit.php b/src/usr/local/www/firewall_aliases_edit.php
index 638d1f1..84d9d96 100755
--- a/src/usr/local/www/firewall_aliases_edit.php
+++ b/src/usr/local/www/firewall_aliases_edit.php
@@ -2,37 +2,61 @@
/* $Id$ */
/*
firewall_aliases_edit.php
- Copyright (C) 2004 Scott Ullrich
- Copyright (C) 2009 Ermal Luçi
- Copyright (C) 2010 Jim Pingle
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004 Scott Ullrich
+ * Copyright (c) 2009 Ermal Luçi
+ * Copyright (c) 2010 Jim Pingle
+ * originally part of m0n0wall (http://m0n0.ch/wall)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /bin/rm /bin/mkdir /usr/bin/fetch
pfSense_MODULE: aliases
@@ -49,6 +73,7 @@ require("guiconfig.inc");
require_once("functions.inc");
require_once("filter.inc");
require_once("shaper.inc");
+require_once("util.inc");
$pgtitle = array(gettext("Firewall"), gettext("Aliases"), gettext("Edit"));
@@ -83,6 +108,13 @@ if ($_POST) {
$origname = $_POST['origname'];
}
+$adrs = count($_POST['address']);
+
+for($idx=0; $idx<$adrs; $idx++) {
+ if($_POST['address'][$idx] == "")
+ unset($_POST['address'][$idx]);
+}
+
// Debugging
if ($debug) {
unlink_if_exists("{$g['tmp_path']}/alias_rename_log.txt");
@@ -124,6 +156,7 @@ if (isset($id) && $a_aliases[$id]) {
if (preg_match("/urltable/i", $a_aliases[$id]['type'])) {
$pconfig['address'] = $a_aliases[$id]['url'];
+
$pconfig['updatefreq'] = $a_aliases[$id]['updatefreq'];
}
if ($a_aliases[$id]['aliasurl'] <> "") {
@@ -190,24 +223,24 @@ if ($_POST) {
$address = "";
/* item is a url table type */
- if ($_POST['address0']) {
+ if ($_POST['address'][0]) {
/* fetch down and add in */
- $_POST['address0'] = trim($_POST['address0']);
- $address[] = $_POST['address0'];
- $alias['url'] = $_POST['address0'];
- $alias['updatefreq'] = $_POST['address_subnet0'] ? $_POST['address_subnet0'] : 7;
+ $_POST['address'][0] = trim($_POST['address'][0]);
+ $address[] = $_POST['address'][0];
+ $alias['url'] = $_POST['address'][0];
+ $alias['updatefreq'] = $_POST['frequency'][0] ? $_POST['frequency'][0] : 7;
if (!is_URL($alias['url']) || empty($alias['url'])) {
$input_errors[] = gettext("You must provide a valid URL.");
} elseif (!process_alias_urltable($alias['name'], $alias['url'], 0, true)) {
$input_errors[] = gettext("Unable to fetch usable data.");
}
- if ($_POST["detail0"] <> "") {
- if ((strpos($_POST["detail0"], "||") === false) && (substr($_POST["detail0"], 0, 1) != "|") && (substr($_POST["detail0"], -1, 1) != "|")) {
- $final_address_details[] = $_POST["detail0"];
+ if ($_POST["detail"][0] != "") {
+ if ((strpos($_POST["detail"][0], "||") === false) && (substr($_POST["detail"][0], 0, 1) != "|") && (substr($_POST["detail"][0], -1, 1) != "|")) {
+ $final_address_details[] = $_POST["detail"][0];
} else {
/* Remove leading and trailing vertical bars and replace multiple vertical bars with single, */
/* and put in the output array so the text is at least redisplayed for the user. */
- $final_address_details[] = preg_replace('/\|\|+/', '|', trim($_POST["detail0"], "|"));
+ $final_address_details[] = preg_replace('/\|\|+/', '|', trim($_POST["detail"][0], "|"));
$input_errors[] = $vertical_bar_err_text;
}
} else {
@@ -218,35 +251,32 @@ if ($_POST) {
$desc_fmt_err_found = false;
/* item is a url type */
- for ($x = 0; $x < $max_alias_addresses - 1; $x++) {
- $_POST['address' . $x] = trim($_POST['address' . $x]);
- if ($_POST['address' . $x]) {
+ foreach ($_POST['address'] as $idx => $post_address) {
/* fetch down and add in */
$temp_filename = tempnam("{$g['tmp_path']}/", "alias_import");
unlink_if_exists($temp_filename);
$verify_ssl = isset($config['system']['checkaliasesurlcert']);
mkdir($temp_filename);
- download_file($_POST['address' . $x], $temp_filename . "/aliases", $verify_ssl);
+ download_file($post_address, $temp_filename . "/aliases", $verify_ssl);
/* if the item is tar gzipped then extract */
- if (stristr($_POST['address' . $x], ".tgz")) {
+ if(stristr($post_address, ".tgz"))
process_alias_tgz($temp_filename);
- } else if (stristr($_POST['address' . $x], ".zip")) {
+ else if(stristr($post_address, ".zip"))
process_alias_unzip($temp_filename);
- }
if (!isset($alias['aliasurl'])) {
$alias['aliasurl'] = array();
}
- $alias['aliasurl'][] = $_POST['address' . $x];
- if ($_POST["detail{$x}"] <> "") {
- if ((strpos($_POST["detail{$x}"], "||") === false) && (substr($_POST["detail{$x}"], 0, 1) != "|") && (substr($_POST["detail{$x}"], -1, 1) != "|")) {
- $final_address_details[] = $_POST["detail{$x}"];
+ $alias['aliasurl'][] = $post_address;
+ if ($_POST['detail'][$idx] != "") {
+ if ((strpos($_POST['detail'][$idx], "||") === false) && (substr($_POST['detail'][$idx], 0, 1) != "|") && (substr($_POST['detail'][$idx], -1, 1) != "|")) {
+ $final_address_details[] = $_POST['detail'][$idx];
} else {
/* Remove leading and trailing vertical bars and replace multiple vertical bars with single, */
/* and put in the output array so the text is at least redisplayed for the user. */
- $final_address_details[] = preg_replace('/\|\|+/', '|', trim($_POST["detail{$x}"], "|"));
+ $final_address_details[] = preg_replace('/\|\|+/', '|', trim($_POST['detail'][$idx], "|"));
if (!$desc_fmt_err_found) {
$input_errors[] = $vertical_bar_err_text;
$desc_fmt_err_found = true;
@@ -260,14 +290,13 @@ if ($_POST) {
$address = parse_aliases_file("{$temp_filename}/aliases", $_POST['type'], 3000);
if ($address == null) {
/* nothing was found */
- $input_errors[] = sprintf(gettext("You must provide a valid URL. Could not fetch usable data from '%s'."), $_POST['address' . $x]);
+ $input_errors[] = sprintf(gettext("You must provide a valid URL. Could not fetch usable data from '%s'."), $post_address);
}
mwexec("/bin/rm -rf " . escapeshellarg($temp_filename));
} else {
- $input_errors[] = sprintf(gettext("URL '%s' is not valid."), $_POST['address' . $x]);
+ $input_errors[] = sprintf(gettext("URL '%s' is not valid."), $post_address);
}
}
- }
unset($desc_fmt_err_found);
if ($_POST['type'] == "url_ports") {
$address = group_ports($address);
@@ -283,15 +312,15 @@ if ($_POST) {
// Users can paste strings like "10.1.2.0/24 10.3.0.0/16 9.10.11.0/24" into an address box.
// They can also put an IP range.
// This loop expands out that stuff so it can easily be validated.
- for ($x = 0; $x < ($max_alias_addresses - 1); $x++) {
- if ($_POST["address{$x}"] <> "") {
- if ($_POST["detail{$x}"] <> "") {
- if ((strpos($_POST["detail{$x}"], "||") === false) && (substr($_POST["detail{$x}"], 0, 1) != "|") && (substr($_POST["detail{$x}"], -1, 1) != "|")) {
- $detail_text = $_POST["detail{$x}"];
+ foreach ($_POST['address'] as $idx => $post_address) {
+ if ($post_address != "") {
+
+ if ((strpos($post_address, "||") === false) && (substr($post_address, 0, 1) != "|") && (substr($post_address, -1, 1) != "|")) {
+ $detail_text = $post_address;
} else {
/* Remove leading and trailing vertical bars and replace multiple vertical bars with single, */
/* and put in the output array so the text is at least redisplayed for the user. */
- $detail_text = preg_replace('/\|\|+/', '|', trim($_POST["detail{$x}"], "|"));
+ $detail_text = preg_replace('/\|\|+/', '|', trim($post_address, "|"));
if (!$desc_fmt_err_found) {
$input_errors[] = $vertical_bar_err_text;
$desc_fmt_err_found = true;
@@ -300,9 +329,11 @@ if ($_POST) {
} else {
$detail_text = sprintf(gettext("Entry added %s"), date('r'));
}
- $address_items = explode(" ", trim($_POST["address{$x}"]));
+
+ $address_items = explode(" ", trim($post_address));
foreach ($address_items as $address_item) {
$iprange_type = is_iprange($address_item);
+
if ($iprange_type == 4) {
list($startip, $endip) = explode('-', $address_item);
if ($_POST['type'] == "network") {
@@ -385,8 +416,9 @@ if ($_POST) {
}
} else {
$input_addresses[] = $address_part;
- $input_address_subnet[] = $_POST["address_subnet{$x}"];
+ $input_address_subnet[] = $_POST["address_subnet"][$idx];
}
+
$final_address_details[] = $detail_text;
$alias_address_count++;
}
@@ -397,7 +429,6 @@ if ($_POST) {
}
}
}
- }
// Validate the input data expanded above.
foreach ($input_addresses as $idx => $input_address) {
@@ -449,7 +480,7 @@ if ($_POST) {
/* Check to see if alias name needs to be
* renamed on referenced rules and such
*/
- if ($_POST['name'] <> $_POST['origname']) {
+ if ($_POST['name'] != $_POST['origname']) {
// Firewall rules
update_alias_names_upon_change(array('filter', 'rule'), array('source', 'address'), $_POST['name'], $origname);
update_alias_names_upon_change(array('filter', 'rule'), array('destination', 'address'), $_POST['name'], $origname);
@@ -467,11 +498,11 @@ if ($_POST) {
//update_alias_names_upon_change(array('nat', 'onetoone'), array('source', 'address'), $_POST['name'], $origname);
update_alias_names_upon_change(array('nat', 'onetoone'), array('destination', 'address'), $_POST['name'], $origname);
// NAT Outbound Rules
- update_alias_names_upon_change(array('nat', 'outbound', 'rule'), array('source', 'network'), $_POST['name'], $origname);
- update_alias_names_upon_change(array('nat', 'outbound', 'rule'), array('sourceport'), $_POST['name'], $origname);
- update_alias_names_upon_change(array('nat', 'outbound', 'rule'), array('destination', 'address'), $_POST['name'], $origname);
- update_alias_names_upon_change(array('nat', 'outbound', 'rule'), array('dstport'), $_POST['name'], $origname);
- update_alias_names_upon_change(array('nat', 'outbound', 'rule'), array('target'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('source', 'network'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('sourceport'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('destination', 'address'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('dstport'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('target'), $_POST['name'], $origname);
// Alias in an alias
update_alias_names_upon_change(array('aliases', 'alias'), array('address'), $_POST['name'], $origname);
}
@@ -479,11 +510,13 @@ if ($_POST) {
pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/pre_write_config");
if (isset($id) && $a_aliases[$id]) {
- if ($a_aliases[$id]['name'] <> $alias['name']) {
+ if ($a_aliases[$id]['name'] != $alias['name']) {
foreach ($a_aliases as $aliasid => $aliasd) {
- if ($aliasd['address'] <> "") {
+
+ if ($aliasd['address'] != "") {
$tmpdirty = false;
$tmpaddr = explode(" ", $aliasd['address']);
+
foreach ($tmpaddr as $tmpidx => $tmpalias) {
if ($tmpalias == $a_aliases[$id]['name']) {
$tmpaddr[$tmpidx] = $alias['name'];
@@ -530,58 +563,6 @@ if ($_POST) {
include("head.inc");
-$jscriptstr = <<<EOD
-
-<script type="text/javascript">
-//<![CDATA[
-var objAlias = new Array(4999);
-function typesel_change() {
- var field_disabled = 0;
- var field_value = "";
- var set_value = false;
- switch (document.iform.type.selectedIndex) {
- case 0: /* host */
- field_disabled = 1;
- field_value = "";
- set_value = true;
- break;
- case 1: /* network */
- field_disabled = 0;
- break;
- case 2: /* port */
- field_disabled = 1;
- field_value = "128";
- set_value = true;
- break;
- case 3: /* url */
- field_disabled = 1;
- break;
- case 4: /* url_ports */
- field_disabled = 1;
- break;
- case 5: /* urltable */
- field_disabled = 0;
- break;
- case 6: /* urltable_ports */
- field_disabled = 0;
- break;
- }
-
- jQuery("select[id^='address_subnet']").prop("disabled", field_disabled);
- if (set_value == true) {
- jQuery("select[id^='address_subnet']").prop("value", field_value);
- }
-}
-
-function add_alias_control() {
- var name = "address" + (totalrows - 1);
- obj = document.getElementById(name);
- obj.setAttribute('class', 'formfldalias');
- obj.setAttribute('autocomplete', 'off');
- objAlias[totalrows - 1] = new AutoSuggestControl(obj, new StateSuggestions(addressarray));
-}
-EOD;
-
$network_str = gettext("Network or FQDN");
$networks_str = gettext("Network(s)");
$cidr_str = gettext("CIDR");
@@ -596,295 +577,205 @@ $urltable_str = gettext("URL Table (IPs)");
$urltable_ports_str = gettext("URL Table (Ports)");
$update_freq_str = gettext("Update Freq. (days)");
-$networks_help = gettext("Networks are specified in CIDR format. Select the CIDR mask that pertains to each entry. /32 specifies a single IPv4 host, /128 specifies a single IPv6 host, /24 specifies 255.255.255.0, /64 specifies a normal IPv6 network, etc. Hostnames (FQDNs) may also be specified, using a /32 mask for IPv4 or /128 for IPv6. You may also enter an IP range such as 192.168.1.1-192.168.1.254 and a list of CIDR networks will be derived to fill the range.");
-$hosts_help = gettext("Enter as many hosts as you would like. Hosts must be specified by their IP address or fully qualified domain name (FQDN). FQDN hostnames are periodically re-resolved and updated. If multiple IPs are returned by a DNS query, all are used. You may also enter an IP range such as 192.168.1.1-192.168.1.10 or a small subnet such as 192.168.1.16/28 and a list of individual IP addresses will be generated.");
-$ports_help = gettext("Enter as many ports as you wish. Port ranges can be expressed by separating with a colon.");
-$url_help = sprintf(gettext("Enter as many URLs as you wish. After saving %s will download the URL and import the items into the alias. Use only with small sets of IP addresses (less than 3000)."), $g['product_name']);
-$url_ports_help = sprintf(gettext("Enter as many URLs as you wish. After saving %s will download the URL and import the items into the alias. Use only with small sets of Ports (less than 3000)."), $g['product_name']);
-$urltable_help = sprintf(gettext("Enter a single URL containing a large number of IPs and/or Subnets. After saving %s will download the URL and create a table file containing these addresses. This will work with large numbers of addresses (30,000+) or small numbers."), $g['product_name']);
-$urltable_ports_help = sprintf(gettext("Enter a single URL containing a list of Port numbers and/or Port ranges. After saving %s will download the URL."), $g['product_name']);
-
-$openvpn_str = gettext("Username");
-$openvpn_user_str = gettext("OpenVPN Users");
-$openvpn_help = gettext("Enter as many usernames as you wish.");
-$openvpn_freq = "";
-
-$jscriptstr .= <<<EOD
-
-function update_box_type() {
- var indexNum = document.forms[0].type.selectedIndex;
- var selected = document.forms[0].type.options[indexNum].text;
- if (selected == '{$networks_str}') {
- document.getElementById ("addressnetworkport").firstChild.data = "{$networks_str}";
- document.getElementById ("onecolumn").firstChild.data = "{$network_str}";
- document.getElementById ("twocolumn").firstChild.data = "{$cidr_str}";
- document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
- document.getElementById ("threecolumn").style.display = 'block';
- document.getElementById ("itemhelp").firstChild.data = "{$networks_help}";
- document.getElementById ("addrowbutton").style.display = 'block';
- } else if (selected == '{$hosts_str}') {
- document.getElementById ("addressnetworkport").firstChild.data = "{$hosts_str}";
- document.getElementById ("onecolumn").firstChild.data = "{$ip_str}";
- document.getElementById ("twocolumn").firstChild.data = "";
- document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
- document.getElementById ("threecolumn").style.display = 'block';
- document.getElementById ("itemhelp").firstChild.data = "{$hosts_help}";
- document.getElementById ("addrowbutton").style.display = 'block';
- } else if (selected == '{$ports_str}') {
- document.getElementById ("addressnetworkport").firstChild.data = "{$ports_str}";
- document.getElementById ("onecolumn").firstChild.data = "{$port_str}";
- document.getElementById ("twocolumn").firstChild.data = "";
- document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
- document.getElementById ("threecolumn").style.display = 'block';
- document.getElementById ("itemhelp").firstChild.data = "{$ports_help}";
- document.getElementById ("addrowbutton").style.display = 'block';
- } else if (selected == '{$url_str}') {
- document.getElementById ("addressnetworkport").firstChild.data = "{$url_str}";
- document.getElementById ("onecolumn").firstChild.data = "{$url_str}";
- document.getElementById ("twocolumn").firstChild.data = "";
- document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
- document.getElementById ("threecolumn").style.display = 'block';
- document.getElementById ("itemhelp").firstChild.data = "{$url_help}";
- document.getElementById ("addrowbutton").style.display = 'block';
- } else if (selected == '{$url_ports_str}') {
- document.getElementById ("addressnetworkport").firstChild.data = "{$url_ports_str}";
- document.getElementById ("onecolumn").firstChild.data = "{$url_ports_str}";
- document.getElementById ("twocolumn").firstChild.data = "";
- document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
- document.getElementById ("threecolumn").style.display = 'block';
- document.getElementById ("itemhelp").firstChild.data = "{$url_ports_help}";
- document.getElementById ("addrowbutton").style.display = 'block';
- } else if (selected == '{$openvpn_user_str}') {
- document.getElementById ("addressnetworkport").firstChild.data = "{$openvpn_user_str}";
- document.getElementById ("onecolumn").firstChild.data = "{$openvpn_str}";
- document.getElementById ("twocolumn").firstChild.data = "{$openvpn_freq}";
- document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
- document.getElementById ("threecolumn").style.display = 'block';
- document.getElementById ("itemhelp").firstChild.data = "{$openvpn_help}";
- document.getElementById ("addrowbutton").style.display = 'block';
- } else if (selected == '{$urltable_str}') {
- if ((typeof(totalrows) == "undefined") || (totalrows < 1)) {
- addRowTo('maintable', 'formfldalias');
- typesel_change();
- add_alias_control(this);
- }
- document.getElementById ("addressnetworkport").firstChild.data = "{$urltable_str}";
- document.getElementById ("onecolumn").firstChild.data = "{$urltable_str}";
- document.getElementById ("twocolumn").firstChild.data = "{$update_freq_str}";
- document.getElementById ("threecolumn").firstChild.data = "";
- document.getElementById ("threecolumn").style.display = 'none';
- document.getElementById ("itemhelp").firstChild.data = "{$urltable_help}";
- document.getElementById ("addrowbutton").style.display = 'none';
- } else if (selected == '{$urltable_ports_str}') {
- if ((typeof(totalrows) == "undefined") || (totalrows < 1)) {
- addRowTo('maintable', 'formfldalias');
- typesel_change();
- add_alias_control(this);
- }
- document.getElementById ("addressnetworkport").firstChild.data = "{$urltable_ports_str}";
- document.getElementById ("onecolumn").firstChild.data = "{$urltable_ports_str}";
- document.getElementById ("twocolumn").firstChild.data = "{$update_freq_str}";
- document.getElementById ("threecolumn").firstChild.data = "";
- document.getElementById ("threecolumn").style.display = 'none';
- document.getElementById ("itemhelp").firstChild.data = "{$urltable_ports_help}";
- document.getElementById ("addrowbutton").style.display = 'none';
- }
-}
-//]]>
-</script>
-
-EOD;
-
-?>
+$help = array(
+ 'network' => "Networks are specified in CIDR format. Select the CIDR mask that pertains to each entry. /32 specifies a single IPv4 host, /128 specifies a single IPv6 host, /24 specifies 255.255.255.0, /64 specifies a normal IPv6 network, etc. Hostnames (FQDNs) may also be specified, using a /32 mask for IPv4 or /128 for IPv6. You may also enter an IP range such as 192.168.1.1-192.168.1.254 and a list of CIDR networks will be derived to fill the range.",
+ 'host' => "Enter as many hosts as you would like. Hosts must be specified by their IP address or fully qualified domain name (FQDN). FQDN hostnames are periodically re-resolved and updated. If multiple IPs are returned by a DNS query, all are used. You may also enter an IP range such as 192.168.1.1-192.168.1.10 or a small subnet such as 192.168.1.16/28 and a list of individual IP addresses will be generated.",
+ 'port' => "Enter as many ports as you wish. Port ranges can be expressed by separating with a colon.",
+ 'url' => "Enter as many URLs as you wish. After saving we will download the URL and import the items into the alias. Use only with small sets of IP addresses (less than 3000).",
+ 'url_ports' => "Enter as many URLs as you wish. After saving we will download the URL and import the items into the alias. Use only with small sets of Ports (less than 3000).",
+ 'urltable' => "Enter a single URL containing a large number of IPs and/or Subnets. After saving we will download the URL and create a table file containing these addresses. This will work with large numbers of addresses (30,000+) or small numbers.",
+ 'urltable_ports' => "Enter a single URL containing a list of Port numbers and/or Port ranges. After saving we will download the URL.",
+);
+
+$types = array(
+ 'host' => 'Host(s)',
+ 'network' => 'Network(s)',
+ 'port' => 'Port(s)',
+ 'url' => 'URL (IPs)',
+ 'url_ports' => 'URL (Ports)',
+ 'urltable' => 'URL Table (IPs)',
+ 'urltable_ports' => 'URL Table (Ports)',
+);
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php
- include("fbegin.inc");
- echo $jscriptstr;
-?>
-
-<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
-<script type="text/javascript" src="/javascript/row_helper.js"></script>
-<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
-<script type="text/javascript" src="/javascript/suggestions.js"></script>
-
-<input type='hidden' name='address_type' value='textbox' />
-<input type='hidden' name='address_subnet_type' value='select' />
-
-<script type="text/javascript">
-//<![CDATA[
- rowname[0] = "address";
- rowtype[0] = "textbox,ipv4v6";
- rowsize[0] = "30";
-
- rowname[1] = "address_subnet";
- rowtype[1] = "select,ipv4v6";
- rowsize[1] = "1";
-
- rowname[2] = "detail";
- rowtype[2] = "textbox";
- rowsize[2] = "50";
-//]]>
-</script>
-
-<?php pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/pre_input_errors"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<div id="inputerrors"></div>
-
-<form action="firewall_aliases_edit.php" method="post" name="iform" id="iform">
-<?php
if (empty($tab)) {
- if (preg_match("/url/i", $pconfig['type'])) {
+ if (preg_match("/url/i", $pconfig['type']))
$tab = 'url';
- } else if ($pconfig['type'] == 'host') {
+ else if ($pconfig['type'] == 'host')
$tab = 'ip';
- } else {
+ else
$tab = $pconfig['type'];
- }
}
-?>
-<input name="tab" type="hidden" id="tab" value="<?=htmlspecialchars($tab);?>" />
-<table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall aliases edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Alias Edit"); ?></td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
- <td class="vtable">
- <input name="origname" type="hidden" id="origname" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['name']);?>" />
- <input name="name" type="text" id="name" class="formfld unknown" size="40" maxlength="31" value="<?=htmlspecialchars($pconfig['name']);?>" />
- <?php if (isset($id) && $a_aliases[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- <br />
- <span class="vexpl">
- <?=gettext("The name of the alias may only consist of the characters \"a-z, A-Z, 0-9 and _\"."); ?>
- </span>
- </td>
- </tr>
- <?php pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/after_first_tr"); ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed)."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Type"); ?></td>
- <td class="vtable">
- <select name="type" class="formselect" id="type" onchange="update_box_type(); typesel_change();">
- <option value="host" <?php if ($pconfig['type'] == "host") echo "selected=\"selected\""; ?>><?=gettext("Host(s)"); ?></option>
- <option value="network" <?php if ($pconfig['type'] == "network") echo "selected=\"selected\""; ?>><?=gettext("Network(s)"); ?></option>
- <option value="port" <?php if (($pconfig['type'] == "port") || (empty($pconfig['type']) && ($tab == "port"))) echo "selected=\"selected\""; ?>><?=gettext("Port(s)"); ?></option>
- <!--<option value="openvpn" <?php if ($pconfig['type'] == "openvpn") echo "selected=\"selected\""; ?>><?=gettext("OpenVPN Users"); ?></option> -->
- <option value="url" <?php if (($pconfig['type'] == "url") || (empty($pconfig['type']) && ($tab == "url"))) echo "selected=\"selected\""; ?>><?=gettext("URL (IPs)");?></option>
- <option value="url_ports" <?php if ($pconfig['type'] == "url_ports") echo "selected=\"selected\""; ?>><?=gettext("URL (Ports)");?></option>
- <option value="urltable" <?php if ($pconfig['type'] == "urltable") echo "selected=\"selected\""; ?>><?=gettext("URL Table (IPs)"); ?></option>
- <option value="urltable_ports" <?php if ($pconfig['type'] == "urltable_ports") echo "selected=\"selected\""; ?>><?=gettext("URL Table (Ports)"); ?></option>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><div id="addressnetworkport"><?=gettext("Host(s)"); ?></div></td>
- <td width="78%" class="vtable">
- <table id="maintable" summary="maintable">
- <tbody>
- <tr>
- <td colspan="4">
- <div style="padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066; background-color: #ffffff; color: #000000; font-size: 8pt;" id="itemhelp"><?=gettext("Item information"); ?></div>
- </td>
- </tr>
- <tr>
- <td><div id="onecolumn"><?=gettext("Network"); ?></div></td>
- <td><div id="twocolumn">CIDR</div></td>
- <td><div id="threecolumn"><?=gettext("Description"); ?></div></td>
- </tr>
-
- <?php
- $counter = 0;
- if ($pconfig['address'] <> ""):
- $addresses = explode(" ", $pconfig['address']);
- $details = explode("||", $pconfig['detail']);
- while ($counter < count($addresses)):
- if (($pconfig['type'] != "host") && is_subnet($addresses[$counter])) {
- list($address, $address_subnet) = explode("/", $addresses[$counter]);
- } else {
- $address = $addresses[$counter];
- $address_subnet = "";
- }
- ?>
- <tr>
- <td>
- <input autocomplete="off" name="address<?php echo $counter; ?>" type="text" class="formfldalias ipv4v6" id="address<?php echo $counter; ?>" size="30" value="<?=htmlspecialchars($address);?>" />
- </td>
- <td>
- <select name="address_subnet<?php echo $counter; ?>" class="formselect ipv4v6" id="address_subnet<?php echo $counter; ?>">
- <option></option>
- <?php for ($i = 128; $i >= 1; $i--): ?>
- <option value="<?=$i;?>" <?php if (($i == $address_subnet) || ($i == $pconfig['updatefreq'])) echo "selected=\"selected\""; ?>><?=$i;?></option>
- <?php endfor; ?>
- </select>
- </td>
- <td>
- <input name="detail<?php echo $counter; ?>" type="text" class="formfld unknown" id="detail<?php echo $counter; ?>" size="50" value="<?=htmlspecialchars($details[$counter]);?>" />
- </td>
- <td>
- <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="" title="<?=gettext("remove this entry"); ?>" /></a>
- </td>
- </tr>
- <?php
- $counter++;
-
- endwhile;
- endif;
- ?>
- </tbody>
- </table>
- <div id="addrowbutton">
- <a onclick="javascript:addRowTo('maintable', 'formfldalias'); typesel_change(); add_alias_control(this); return false;" href="#">
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry"); ?>" />
- </a>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- </td>
- </tr>
-</table>
-</form>
-
-<script type="text/javascript">
-//<![CDATA[
- field_counter_js = 3;
- rows = 1;
- totalrows = <?php echo $counter; ?>;
- loaded = <?php echo $counter; ?>;
- typesel_change();
- update_box_type();
-
- var addressarray = <?= json_encode(array_exclude($pconfig['name'], get_alias_list($pconfig['type']))) ?>;
-
- function createAutoSuggest() {
- <?php
- for ($jv = 0; $jv < $counter; $jv++) {
- echo "objAlias[{$jv}] = new AutoSuggestControl(document.getElementById(\"address{$jv}\"), new StateSuggestions(addressarray));\n";
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+$form = new Form;
+
+$form->addGlobal(new Form_Input(
+ 'tab',
+ null,
+ 'hidden',
+ $tab
+));
+
+$form->addGlobal(new Form_Input(
+ 'tab',
+ null,
+ 'hidden',
+ $tab
+));
+
+$form->addGlobal(new Form_Input(
+ 'origname',
+ null,
+ 'hidden',
+ $pconfig['name']
+));
+
+if (isset($id) && $a_aliases[$id])
+{
+ $form->addGlobal(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$section = new Form_Section('Properties');
+
+$section->addInput(new Form_Input(
+ 'name',
+ 'Name',
+ 'text',
+ $pconfig['name']
+))->setPattern('[a-zA-Z0-9_]+')->setHelp('The name of the alias may only consist '.
+ 'of the characters "a-z, A-Z, 0-9 and _".');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$section->addInput(new Form_Select(
+ 'type',
+ 'Type',
+ isset($pconfig['type']) ? $pconfig['type'] : $tab,
+ $types
+))->toggles();
+
+$form->add($section);
+
+foreach ($types as $type => $typeName)
+{
+ $section = new Form_Section('Details for '. $typeName);
+ $section->addClass('toggle-'.$type.' collapse');
+
+ // Texts are rather long; don't repeat for every input
+ $section->addInput(new Form_StaticText('', $help[$type]));
+
+ // Only include values for the correct type
+ if (isset($pconfig['type']) && $type == $pconfig['type']) {
+ $addresses = explode(' ', $pconfig['address']);
+ $details = explode('||', $pconfig['detail']);
+ }
+ else {
+ // When creating a new entry show at least one input
+ $addresses = array('');
+ $details = array();
+ }
+
+ foreach ($addresses as $idx => $address)
+ {
+ $address_subnet = '';
+ if (($pconfig['type'] != 'host') && is_subnet($address))
+ list($address, $address_subnet) = explode('/', $address);
+
+ if (substr($type, 0, 3) == 'url') {
+ $group = new Form_Group('URL to download');
+
+ $group->add(new Form_Input(
+ 'address',
+ 'URL to download',
+ 'url',
+ $address
+ ));
+
+ if (in_array($type, ['urltable', 'urltable_ports']))
+ {
+ $group->add(new Form_Input(
+ 'frequency',
+ 'Update frequency (days)',
+ 'number',
+ $address_subnet,
+ ['min' => 1]
+ ));
+ }
+ }
+ elseif ($type == 'port') {
+ $group = new Form_Group('Port(s)');
+ $group->add(new Form_Input(
+ 'address',
+ 'Port',
+ $address
+ ));
+
+ $group->add(new Form_Input(
+ 'detail',
+ 'Description (not parsed)',
+ 'text',
+ $details[$idx]
+ ));
}
- ?>
+ else {
+ $group = new Form_Group('IP or FQDN');
+
+ $grpaddress = new Form_IpAddress(
+ 'address',
+ 'IP or FQDN',
+ $address
+ );
+
+ $grpaddress->addMask(address_subnet, $pconfig['address_subnet']);
+
+ $group->add($grpaddress);
+
+ $group->add(new Form_Input(
+ 'detail',
+ 'Description (not parsed)',
+ 'text',
+ $details[$idx]
+ ));
+ }
+
+ $group->enableDuplication();
+ $section->add($group);
}
- setTimeout("createAutoSuggest();", 500);
-//]]>
+ $form->add($section);
+}
+
+print $form;
+?>
+
+<script>
+//<![CDATA[
+events.push(function(){
+
+ // Disable address_subnet if type == 'host'
+
+ $("[id^='address_subnet']").prop("disabled", ($('#type').val() == 'host'));
+
+ $('#type').on('change', function() {
+ $("[id^='address_subnet']").prop("disabled", ($('#type').val() == 'host'));
+ });
+
+});
+//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php
+include("foot.inc");
diff --git a/src/usr/local/www/firewall_aliases_import.php b/src/usr/local/www/firewall_aliases_import.php
index 868f5eb..0199426 100755
--- a/src/usr/local/www/firewall_aliases_import.php
+++ b/src/usr/local/www/firewall_aliases_import.php
@@ -2,31 +2,58 @@
/* $Id$ */
/*
firewall_aliases_import.php
- Copyright (C) 2005 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: filter
*/
@@ -49,11 +76,7 @@ require("shaper.inc");
$pgtitle = array(gettext("Firewall"), gettext("Aliases"), gettext("Bulk import"));
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_aliases.php');
-}
+$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_aliases.php');
// Add all Load balance names to reserved_keywords
if (is_array($config['load_balancer']['lbpool'])) {
@@ -70,7 +93,7 @@ if (!is_array($config['aliases']['alias'])) {
}
$a_aliases = &$config['aliases']['alias'];
-if ($_POST) {
+if($_POST['aliasimport'] != "") {
$reqdfields = explode(" ", "name aliasimport");
$reqdfieldsn = array(gettext("Name"), gettext("Aliases"));
@@ -137,7 +160,7 @@ if ($_POST) {
} else {
if (!$desc_len_err_found) {
/* Note: The 200 character limit is just a practical check to avoid accidents */
- /* if the user pastes a large number of IP addresses without line breaks. */
+ /* if the user pastes a large number of IP addresses without line breaks. */
$input_errors[] = gettext("Descriptions must be less than 200 characters long.");
$desc_len_err_found = true;
}
@@ -170,77 +193,42 @@ if ($_POST) {
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<div id="niftyOutter">
-<form action="firewall_aliases_import.php" method="post" name="iform" id="iform">
-<div id="inputerrors"></div>
-<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall alias import">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Alias Import"); ?></td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Alias Name"); ?></td>
- <td class="vtable">
- <input name="name" type="text" class="formfld unknown" id="name" size="40" maxlength="31" value="<?=htmlspecialchars($_POST['name']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("The name of the alias may only consist of the characters \"a-z, A-Z and 0-9\"."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($_POST['descr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed)"); ?>.
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Aliases to import"); ?></td>
- <td class="vtable">
- <textarea name="aliasimport" rows="15" cols="40"><?php echo $_POST['aliasimport']; ?></textarea>
- <br />
- <span class="vexpl">
- <?=gettext("Paste in the aliases to import separated by a carriage return. Common examples are lists of IPs, networks, blacklists, etc."); ?>
- <br />
- <?=gettext("The list may contain IP addresses, with or without CIDR prefix, IP ranges, blank lines (ignored) and an optional description after each IP. e.g.:"); ?>
- <br />172.16.1.2
- <br />172.16.0.0/24
- <br />10.11.12.100-10.11.12.200
- <br />192.168.1.254 Home router
- <br />10.20.0.0/16 Office network
- <br />10.40.1.10-10.40.1.19 Managed switches
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- </td>
- </tr>
-</table>
-
-
-</form>
-</div>
-
-<?php include("fend.inc"); ?>
-
-<script type="text/javascript">
-//<![CDATA[
- NiftyCheck();
- Rounded("div#nifty","top","#FFF","#EEEEEE","smooth");
-//]]>
-</script>
-
-</body>
-</html>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+$form = new Form;
+$section = new Form_Section('Alias details');
+
+$section->addInput(new Form_Input(
+ 'name',
+ 'Alias Name',
+ 'text',
+ $_POST['name']
+))->setPattern('[a-zA-Z0-9_]+')->setHelp('The name of the alias may only consist '.
+ 'of the characters "a-z, A-Z, 0-9 and _".');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $_POST['descr']
+))->setHelp('You may enter a description here for your reference (not '.
+ 'parsed).');
+
+$section->addInput(new Form_Textarea(
+ 'aliasimport',
+ 'Aliases to import',
+ $_POST["aliasimport"]
+))->setHelp('Paste in the aliases to '.
+ 'import separated by a carriage return. Common examples are lists of IPs, '.
+ 'networks, blacklists, etc.The list may contain IP addresses, with or without '.
+ 'CIDR prefix, IP ranges, blank lines (ignored) and an optional description after '.
+ 'each IP. e.g.:<ul><li>172.16.1.2</li><li>172.16.0.0/24</li><li>10.11.12.100-'.
+ '10.11.12.200</li><li>192.168.1.254 Home router</li><li>10.20.0.0/16 Office '.
+ 'network</li><li>10.40.1.10-10.40.1.19 Managed switches</li></ul>');
+
+$form->add($section);
+print $form;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_nat.php b/src/usr/local/www/firewall_nat.php
index 70c8041..651428d 100644
--- a/src/usr/local/www/firewall_nat.php
+++ b/src/usr/local/www/firewall_nat.php
@@ -2,37 +2,62 @@
/* $Id$ */
/*
firewall_nat.php
- Copyright (C) 2004 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004 Scott Ullrich
+ * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>
+ * originally part of m0n0wall (http://m0n0.ch/wall)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: nat
+ pfSense_MODULE: nat
*/
##|+PRIV
@@ -54,6 +79,23 @@ if (!is_array($config['nat']['rule'])) {
$a_nat = &$config['nat']['rule'];
+/* update rule order, POST[rule] is an array of ordered IDs */
+if (is_array($_POST['rule']) && !empty($_POST['rule'])) {
+ $a_nat_new = array();
+
+ // if a rule is not in POST[rule], it has been deleted by the user
+ foreach ($_POST['rule'] as $id)
+ $a_nat_new[] = $a_nat[$id];
+
+ $a_nat = $a_nat_new;
+
+ if (write_config())
+ mark_subsystem_dirty('filter');
+
+ header("Location: firewall_nat.php");
+ exit;
+}
+
/* if a custom message has been passed along, lets process it */
if ($_GET['savemsg']) {
$savemsg = $_GET['savemsg'];
@@ -95,6 +137,7 @@ if ($_GET['act'] == "del") {
mark_subsystem_dirty('filter');
}
}
+
header("Location: firewall_nat.php");
exit;
}
@@ -174,226 +217,229 @@ $closehead = false;
$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("Port Forward"));
include("head.inc");
-echo "<script type=\"text/javascript\" src=\"/javascript/domTT/domLib.js\"></script>";
-echo "<script type=\"text/javascript\" src=\"/javascript/domTT/domTT.js\"></script>";
-echo "<script type=\"text/javascript\" src=\"/javascript/domTT/behaviour.js\"></script>";
-echo "<script type=\"text/javascript\" src=\"/javascript/domTT/fadomatic.js\"></script>";
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('natconf'))
+ print_info_box_np(gettext('The NAT configuration has been changed.') . '<br />' .
+ gettext('You must apply the changes in order for them to take effect.') . '<br />');
+$tab_array = array();
+$tab_array[] = array(gettext("Port Forward"), true, "firewall_nat.php");
+$tab_array[] = array(gettext("1:1"), false, "firewall_nat_1to1.php");
+$tab_array[] = array(gettext("Outbound"), false, "firewall_nat_out.php");
+$tab_array[] = array(gettext("NPt"), false, "firewall_nat_npt.php");
+display_top_tabs($tab_array);
?>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
<form action="firewall_nat.php" method="post" name="iform">
-<script type="text/javascript" src="/javascript/row_toggle.js"></script>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('natconf')): ?>
-<?php print_info_box_np(gettext("The NAT configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall nat">
- <tr><td>
+ <div class="panel panel-default">
+ <div class="panel-heading"><?=gettext('Rules')?></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><!-- Rule type --></th>
+ <th><?=gettext("If")?></th>
+ <th><?=gettext("Proto")?></th>
+ <th><?=gettext("Src. addr")?></th>
+ <th><?=gettext("Src. ports")?></th>
+ <th><?=gettext("Dest. addr")?></th>
+ <th><?=gettext("Dest. ports")?></th>
+ <th><?=gettext("NAT IP")?></th>
+ <th><?=gettext("NAT Ports")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><?=gettext("Actions")?></th>
+ </tr>
+ </thead>
+ <tbody class='user-entries'>
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Port Forward"), true, "firewall_nat.php");
- $tab_array[] = array(gettext("1:1"), false, "firewall_nat_1to1.php");
- $tab_array[] = array(gettext("Outbound"), false, "firewall_nat_out.php");
- $tab_array[] = array(gettext("NPt"), false, "firewall_nat_npt.php");
- display_top_tabs($tab_array);
+
+$nnats = $i = 0;
+
+foreach ($a_nat as $natent):
+
+ $alias = rule_columns_with_alias(
+ $natent['source']['address'],
+ pprint_port($natent['source']['port']),
+ $natent['destination']['address'],
+ pprint_port($natent['destination']['port'])
+ );
+
+ /* if user does not have access to edit an interface skip on to the next record */
+ if(!have_natpfruleint_access($natent['interface']))
+ continue;
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr id="frheader">
- <td width="3%" class="list">&nbsp;</td>
- <td width="3%" class="list">&nbsp;</td>
- <td width="5%" class="listhdrr"><?=gettext("If");?></td>
- <td width="5%" class="listhdrr"><?=gettext("Proto");?></td>
- <td width="11%" class="listhdrr nowrap"><?=gettext("Src. addr");?></td>
- <td width="11%" class="listhdrr nowrap"><?=gettext("Src. ports");?></td>
- <td width="11%" class="listhdrr nowrap"><?=gettext("Dest. addr");?></td>
- <td width="11%" class="listhdrr nowrap"><?=gettext("Dest. ports");?></td>
- <td width="11%" class="listhdrr nowrap"><?=gettext("NAT IP");?></td>
- <td width="11%" class="listhdrr nowrap"><?=gettext("NAT Ports");?></td>
- <td width="11%" class="listhdr"><?=gettext("Description");?></td>
- <td width="5%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="list">
- <tr>
- <td width="17">
- <?php if (count($a_nat) == 0): ?>
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected rules");?>" border="0" alt="delete" />
- <?php else: ?>
- <input name="del" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" title="<?=gettext("delete selected rules"); ?>" onclick="return confirm('<?=gettext("Do you really want to delete the selected rules?");?>')" />
- <?php endif; ?>
- </td>
- <td><a href="firewall_nat_edit.php?after=-1"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <?php
- $nnats = $i = 0;
- foreach ($a_nat as $natent):
-
- //build Alias popup box
- $span_end = "</U></span>";
-
- $alias_popup = rule_popup($natent['source']['address'], pprint_port($natent['source']['port']), $natent['destination']['address'], pprint_port($natent['destination']['port']));
-
- $alias_src_span_begin = $alias_popup["src"];
- $alias_src_port_span_begin = $alias_popup["srcport"];
- $alias_dst_span_begin = $alias_popup["dst"];
- $alias_dst_port_span_begin = $alias_popup["dstport"];
-
- $alias_src_span_end = $alias_popup["src_end"];
- $alias_src_port_span_end = $alias_popup["srcport_end"];
- $alias_dst_span_end = $alias_popup["dst_end"];
- $alias_dst_port_span_end = $alias_popup["dstport_end"];
-
- $alias_popup = rule_popup("", "", $natent['target'], pprint_port($natent['local-port']));
-
- $alias_target_span_begin = $alias_popup["dst"];
- $alias_local_port_span_begin = $alias_popup["dstport"];
-
- $alias_target_span_end = $alias_popup["dst_end"];
- $alias_local_port_span_end = $alias_popup["dstport_end"];
-
- if (isset($natent['disabled'])) {
- $textss = "<span class=\"gray\">";
- } else {
- $textss = "<span>";
- }
+
+ <tr id="fr<?=$nnats?>">
+ <td>
+<?php
+ if($natent['associated-rule-id'] == "pass"):
+?>
+ <i class="icon-play" title="<?=gettext("All traffic matching this NAT entry is passed")?>"></i>
+<?php
+ elseif (!empty($natent['associated-rule-id'])):
+?>
+ <i class="icon-random" title="<?=gettext("Firewall rule ID ")?><?=htmlspecialchars($nnatid)?> . <?=gettext('is managed by this rule')?>"></i>
+<?php
+ endif;
+?>
+ </td>
+ <td>
+ <?=$textss?>
+<?php
+ if (!$natent['interface'])
+ echo htmlspecialchars(convert_friendly_interface_to_friendly_descr("wan"));
+ else
+ echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface']));
+?>
+ <?=$textse?>
+ </td>
- $textse = "</span>";
+ <td>
+ <input type="hidden" name="rule[]" value="<?=$i?>" />
+ <?=$textss?><?=strtoupper($natent['protocol'])?><?=$textse?>
+ </td>
+
+ <td>
- /* if user does not have access to edit an interface skip on to the next record */
- if (!have_natpfruleint_access($natent['interface'])) {
- continue;
- }
- ?>
- <tr valign="top" id="fr<?=$nnats;?>">
- <td class="listt"><input type="checkbox" id="frc<?=$nnats;?>" name="rule[]" value="<?=$i;?>" onClick="fr_bgcolor('<?=$nnats;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" /></td>
- <td class="listt" align="center">
- <?php if ($natent['associated-rule-id'] == "pass"): ?>
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" title="<?=gettext("All traffic matching this NAT entry is passed"); ?>" border="0" alt="pass" />
- <?php elseif (!empty($natent['associated-rule-id'])): ?>
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_chain.png" width="17" height="17" title="<?=gettext("Firewall rule ID"); ?> <?=htmlspecialchars($nnatid); ?> <?=gettext("is managed with this rule"); ?>" border="0" alt="change" />
- <?php endif; ?>
- </td>
- <td class="listlr" onClick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
- <?=$textss;?>
- <?php
- if (!$natent['interface']) {
- echo htmlspecialchars(convert_friendly_interface_to_friendly_descr("wan"));
- } else {
- echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface']));
- }
- ?>
- <?=$textse;?>
- </td>
-
- <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
- <?=$textss;?><?=strtoupper($natent['protocol']);?><?=$textse;?>
- </td>
-
- <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
- <?=$textss;?><?php echo $alias_src_span_begin;?><?php echo htmlspecialchars(pprint_address($natent['source']));?><?php echo $alias_src_span_end;?><?=$textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
- <?=$textss;?><?php echo $alias_src_port_span_begin;?><?php echo htmlspecialchars(pprint_port($natent['source']['port']));?><?php echo $alias_src_port_span_end;?><?=$textse;?>
- </td>
-
- <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
- <?=$textss;?><?php echo $alias_dst_span_begin;?><?php echo htmlspecialchars(pprint_address($natent['destination']));?><?php echo $alias_dst_span_end;?><?=$textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
- <?=$textss;?><?php echo $alias_dst_port_span_begin;?><?php echo htmlspecialchars(pprint_port($natent['destination']['port']));?><?php echo $alias_dst_port_span_end;?><?=$textse;?>
- </td>
-
- <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
- <?=$textss;?><?php echo $alias_target_span_begin;?><?php echo htmlspecialchars($natent['target']);?><?php echo $alias_target_span_end;?><?=$textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
- <?php
- $localport = $natent['local-port'];
-
- list($dstbeginport, $dstendport) = explode("-", $natent['destination']['port']);
-
- if ($dstendport) {
- $localendport = $natent['local-port'] + $dstendport - $dstbeginport;
- $localport .= '-' . $localendport;
- }
- ?>
- <?=$textss;?><?php echo $alias_local_port_span_begin;?><?php echo htmlspecialchars(pprint_port($localport));?><?php echo $alias_local_port_span_end;?><?=$textse;?>
- </td>
-
- <td class="listbg" onclick="fr_toggle(<?=$nnats;?>)" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
- <?=$textss;?><?=htmlspecialchars($natent['descr']);?>&nbsp;<?=$textse;?>
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="move">
- <tr>
- <td><input onmouseover="fr_insline(<?=$nnats;?>, true)" onmouseout="fr_insline(<?=$nnats;?>, false)" name="move_<?=$i;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" title="<?=gettext("move selected rules before this rule");?>" height="17" type="image" width="17" border="0" /></td>
- <td><a href="firewall_nat_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit rule"); ?>"></a></td>
- </tr>
- <tr>
- <td align="center" valign="middle"><a href="firewall_nat.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this rule?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule");?>" alt="delete" /></a></td>
- <td><a href="firewall_nat_edit.php?dup=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new NAT based on this one");?>" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <?php
- $i++;
- $nnats++;
- endforeach;
- ?>
- <tr>
- <td class="list" colspan="8"></td>
- <td>&nbsp;</td>
- <td>&nbsp;</td>
- <td>&nbsp;</td>
- <td class="list nowrap" valign="middle">
- <table border="0" cellspacing="0" cellpadding="1" summary="move">
- <tr>
- <td><?php if ($nnats == 0): ?><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules to end"); ?>" border="0" alt="move" /><?php else: ?><input name="move_<?=$i;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17;border:0" title="<?=gettext("move selected rules to end");?>" /><?php endif; ?></td>
- </tr>
- <tr>
- <td width="17">
- <?php if (count($a_nat) == 0): ?>
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected rules");?>" border="0" alt="delete" />
- <?php else: ?>
- <input name="del" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" title="<?=gettext("delete selected rules"); ?>" onclick="return confirm('<?=gettext("Do you really want to delete the selected rules?");?>')" />
- <?php endif; ?>
- </td>
- <td><a href="firewall_nat_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr><td>&nbsp;</td></tr>
- <tr>
- <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" width="11" height="11" alt="pass" /></td>
- <td colspan="3"><?=gettext("pass"); ?></td>
- </tr>
- <tr>
- <td width="14"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_chain.png" width="11" height="11" alt="chain" /></td>
- <td colspan="3"><?=gettext("linked rule");?></td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
<?php
-if ($pkg['tabs'] <> "") {
- echo "</td></tr></table>";
-}
+ if (isset($alias['src'])):
+?>
+ <a href="/firewall_aliases_edit.php?id=<?=$alias['src']?>" data-toggle="popover" data-trigger="hover focus" title="Alias details" data-content="<?=alias_info_popup($alias['src'])?>" data-html="true">
+<?php
+ endif;
+?>
+ <?=htmlspecialchars(pprint_address($natent['source']))?>
+<?php
+ if (isset($alias['src'])):
+?>
+ <i class='icon icon-pencil'></i></a>
+<?php
+ endif;
+?>
+ </td>
+ <td>
+<?php
+ if (isset($alias['srcport'])):
+?>
+ <a href="/firewall_aliases_edit.php?id=<?=$alias['srcport']?>" data-toggle="popover" data-trigger="hover focus" title="Alias details" data-content="<?=alias_info_popup($alias['srcport'])?>" data-html="true">
+<?php
+ endif;
+?>
+ <?=htmlspecialchars(pprint_port($natent['source']['port']))?>
+<?php
+ if (isset($alias['srcport'])):
?>
+ <i class='icon icon-pencil'></i></a>
+<?php
+ endif;
+?>
+ </td>
+
+ <td>
+<?php
+ if (isset($alias['dst'])):
+?>
+ <a href="/firewall_aliases_edit.php?id=<?=$alias['dst']?>" data-toggle="popover" data-trigger="hover focus" title="Alias details" data-content="<?=alias_info_popup($alias['dst'])?>" data-html="true">
+<?php
+ endif;
+?>
+ <?=htmlspecialchars(pprint_address($natent['destination']))?>
+<?php
+ if (isset($alias['dst'])):
+?>
+ <i class='icon icon-pencil'></i></a>
+<?php
+ endif;
+?>
+ </td>
+ <td>
+<?php
+ if (isset($alias['dstport'])):
+?>
+ <a href="/firewall_aliases_edit.php?id=<?=$alias['dstport']?>" data-toggle="popover" data-trigger="hover focus" title="Alias details" data-content="<?=alias_info_popup($alias['dstport'])?>" data-html="true">
+<?php
+ endif;
+?>
+ <?=htmlspecialchars(pprint_port($natent['destination']['port']))?>
+<?php
+ if (isset($alias['dstport'])):
+?>
+ <i class='icon icon-pencil'></i></a>
+<?php
+ endif;
+?>
+ </td>
+ <td >
+ <?=htmlspecialchars($natent['target'])?>
+ </td>
+ <td>
+<?php
+ $localport = $natent['local-port'];
+
+ list($dstbeginport, $dstendport) = explode("-", $natent['destination']['port']);
+
+ if ($dstendport) {
+ $localendport = $natent['local-port'] + $dstendport - $dstbeginport;
+ $localport .= '-' . $localendport;
+ }
+?>
+ <?=htmlspecialchars(pprint_port($localport))?>
+ </td>
+
+ <td>
+ <?=htmlspecialchars($natent['descr'])?>
+ </td>
+ <td>
+ <a class="btn btn-xs btn-info" title="<?=gettext("Edit rule"); ?>" href="firewall_nat_edit.php?id=<?=$i?>"><?=gettext("Edit"); ?></a>
+ <a class="btn btn-xs btn-danger" title="<?=gettext("Delete rule")?>" href="firewall_nat.php?act=del&amp;id=<?=$i?>"><?=gettext("Del")?></a>
+ <a class="btn btn-xs btn-success" title="<?=gettext("Add a new NAT based on this one")?>" href="firewall_nat_edit.php?dup=<?=$i?>"><?=gettext("Clone")?></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ $nnats++;
+endforeach;
+?>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+ <div class="pull-right">
+ <a href="firewall_nat_edit.php?after=-1" class="btn btn-sm btn-success" title="<?=gettext('Add new rule')?>"><?=gettext('Add new rule')?></a>
+ <input type="submit" id="order-store" class="btn btn-primary btn-sm" value="store changes" disabled="disabled" />
+ </div>
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<script>
+events.push(function() {
+ // Make rules draggable/sortable
+ $('table tbody.user-entries').sortable({
+ cursor: 'grabbing',
+ update: function(event, ui) {
+ $('#order-store').removeAttr('disabled');
+ }
+ });
+});
+</script>
+<?php
+
+if(count($a_nat) > 0) {
+?>
+<!-- Legend -->
+<div>
+ <dl class="dl-horizontal responsive">
+ <dt><?=gettext('Legend')?></dt> <dd></dd>
+ <dt><i class="icon icon-play"></i></dt> <dd><?=gettext('Pass')?></dd>
+ <dt><i class="icon icon-random"></i></dt> <dd><?=gettext('Linked rule')?></dd>
+ </dl>
+</div>
+
+<?php
+}
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_nat_1to1.php b/src/usr/local/www/firewall_nat_1to1.php
index 10b48dc..753d030 100644
--- a/src/usr/local/www/firewall_nat_1to1.php
+++ b/src/usr/local/www/firewall_nat_1to1.php
@@ -2,36 +2,61 @@
/* $Id$ */
/*
firewall_nat_1to1.php
- part of m0n0wall (http://m0n0.ch/wall)
-
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>
+ * part of m0n0wall (http://m0n0.ch/wall)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: nat
+ pfSense_MODULE: nat
*/
##|+PRIV
@@ -52,6 +77,23 @@ if (!is_array($config['nat']['onetoone'])) {
$a_1to1 = &$config['nat']['onetoone'];
+/* update rule order, POST[rule] is an array of ordered IDs */
+if (is_array($_POST['rule']) && !empty($_POST['rule'])) {
+ $a_1to1_new = array();
+
+ // if a rule is not in POST[rule], it has been deleted by the user
+ foreach ($_POST['rule'] as $id)
+ $a_1to1_new[] = $a_1to1[$id];
+
+ $a_1to1 = $a_1to1_new;
+
+ if (write_config())
+ mark_subsystem_dirty('filter');
+
+ header("Location: firewall_nat_1to1.php");
+ exit;
+}
+
if ($_POST) {
$pconfig = $_POST;
@@ -160,57 +202,37 @@ if (isset($_POST['del_x'])) {
$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("1:1"));
include("head.inc");
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('natconf'))
+ print_info_box_np(gettext('The NAT configuration has been changed.') . '<br />' .
+ gettext('You must apply the changes in order for them to take effect.') . '<br />');
+
+$tab_array = array();
+$tab_array[] = array(gettext("Port Forward"), false, "firewall_nat.php");
+$tab_array[] = array(gettext("1:1"), true, "firewall_nat_1to1.php");
+$tab_array[] = array(gettext("Outbound"), false, "firewall_nat_out.php");
+$tab_array[] = array(gettext("NPt"), false, "firewall_nat_npt.php");
+display_top_tabs($tab_array);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
<form action="firewall_nat_1to1.php" method="post">
-<script type="text/javascript" src="/javascript/row_toggle.js"></script>
-<?php
-if ($savemsg) {
- print_info_box($savemsg);
-}
-if (is_subsystem_dirty('natconf')) {
- print_info_box_np(gettext("The NAT configuration has been changed.") .
- "<br />" .
- gettext("You must apply the changes in order for them to take effect."));
-}
-?>
-<br />
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall nat 1to1">
- <tr><td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Port Forward"), false, "firewall_nat.php");
- $tab_array[] = array(gettext("1:1"), true, "firewall_nat_1to1.php");
- $tab_array[] = array(gettext("Outbound"), false, "firewall_nat_out.php");
- $tab_array[] = array(gettext("NPt"), false, "firewall_nat_npt.php");
- display_top_tabs($tab_array);
-?>
- </td></tr>
- <tr><td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr id="frheader">
- <td width="3%" class="list">&nbsp;</td>
- <td width="3%" class="list">&nbsp;</td>
- <td width="10%" class="listhdrr"><?=gettext("Interface"); ?></td>
- <td width="15%" class="listhdrr"><?=gettext("External IP"); ?></td>
- <td width="15%" class="listhdrr"><?=gettext("Internal IP"); ?></td>
- <td width="15%" class="listhdrr"><?=gettext("Destination IP"); ?></td>
- <td width="29%" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tr>
- <td width="17"></td>
- <td valign="middle">
- <a href="firewall_nat_1to1_edit.php">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add rule"); ?>" alt="add" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+ <div class="panel panel-default">
+ <div class="panel-heading"><?=gettext("NAT 1 to 1 mappings")?></div>
+ <div id="mainarea" class="table-responsive panel-body">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><!-- icon --></th>
+ <th><?=gettext("Interface"); ?></th>
+ <th><?=gettext("External IP"); ?></th>
+ <th><?=gettext("Internal IP"); ?></th>
+ <th><?=gettext("Destination IP"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ <th><?=gettext('Actions')?></th>
+ </tr>
+ </thead>
+ <tbody class="user-entries">
<?php
$textse = "</span>";
$i = 0;
@@ -223,17 +245,13 @@ if (is_subsystem_dirty('natconf')) {
$iconfn = "pass";
}
?>
- <tr valign="top" id="fr<?=$i;?>">
- <td class="listt">
- <input type="checkbox" id="frc<?=$i;?>" name="rule[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
- </td>
- <td class="listt" align="center">
- <a href="?act=toggle&amp;id=<?=$i;?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0"
- title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" />
- </a>
- </td>
- <td class="listlr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';">
+ <tr id="fr<?=$i?>">
+ <td>
+ <a href="?act=toggle&amp;id=<?=$i?>">
+ <i class="<?= ($iconfn == "pass") ? "icon-ok":"icon-remove"?>" title="<?=gettext("click to toggle enabled/disabled status")?>"></i>
+ </a>
+ </td>
+ <td>
<?php
echo $textss;
if (!$natent['interface']) {
@@ -243,129 +261,74 @@ if (is_subsystem_dirty('natconf')) {
}
echo $textse;
?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';">
+ </td>
+ <td>
+ <input type="hidden" name="rule[]" value="<?=$i?>" />
<?php
$source_net = pprint_address($natent['source']);
$source_cidr = strstr($source_net, '/');
echo $textss . $natent['external'] . $source_cidr . $textse;
?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';">
+ </td>
+ <td>
<?php
echo $textss . $source_net . $textse;
?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';">
+ </td>
+ <td>
<?php
echo $textss . pprint_address($natent['destination']) . $textse;
?>
- </td>
- <td class="listbg" onclick="fr_toggle(<?=$i;?>)" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';">
+ </td>
+ <td>
<?php
echo $textss . htmlspecialchars($natent['descr']) . '&nbsp;' . $textse;
?>
- </td>
- <td class="list nowrap" valign="middle">
- <table border="0" cellspacing="0" cellpadding="1" summary="move">
- <tr>
- <td>
- <input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)" name="move_<?=$i;?>"
- src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif"
- title="<?=gettext("move selected rules before this rule");?>"
- type="image" style="height:17;width:17;border:0" />
- </td>
- <td>
- <a href="firewall_nat_1to1_edit.php?id=<?=$i;?>">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit rule");?>" alt="edit" />
- </a>
- </td>
- </tr>
- <tr>
- <td align="center" valign="middle">
- <a href="firewall_nat_1to1.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this rule?");?>')">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule");?>" alt="delete" />
- </a>
- </td>
- <td>
- <a href="firewall_nat_1to1_edit.php?dup=<?=$i;?>">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new rule based on this one");?>" width="17" height="17" border="0" alt="duplicate" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+ </td>
+
+ <td>
+ <a class="btn btn-xs btn-info" title="<?=gettext("Edit rule")?>" href="firewall_nat_1to1.php?id=<?=$i?>"><?=gettext("Edit")?></a>
+ <a class="btn btn-xs btn-danger" title="<?=gettext("Delete rule")?>" href="firewall_nat_1to1.php?act=del&amp;id=<?=$i?>"><?=gettext("Del")?></a>
+ <a class="btn btn-xs btn-success" title="<?=gettext("Add a new rule based on this one")?>" href="firewall_nat_1to1_edit.php?dup=<?=$i?>"><?=gettext("Clone")?></a>
+ </td>
+
+ </tr>
<?php
$i++;
endforeach;
?>
- <tr>
- <td class="list" colspan="7"></td>
- <td class="list nowrap" valign="middle">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tr>
- <td>
-<?php
- if ($i == 0):
-?>
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17"
- title="<?=gettext("move selected mappings to end");?>" border="0" alt="move" />
-<?php
- else:
-?>
- <input name="move_<?=$i;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif"
- style="width:17;height:17;border:0" title="<?=gettext("move selected mappings to end");?>" />
-<?php
- endif;
-?>
- </td>
- <td>
- <a href="firewall_nat_1to1_edit.php">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0"
- title="<?=gettext("add new mapping");?>" alt="add" />
- </a>
- </td>
- </tr>
- <tr>
- <td>
-<?php
- if ($i == 0):
-?>
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17"
- title="<?=gettext("delete selected rules");?>" border="0" alt="delete" />
-<?php
- else:
-?>
- <input name="del" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif"
- style="width:17;height:17" title="<?=gettext("delete selected mappings");?>"
- onclick="return confirm('<?=gettext("Do you really want to delete the selected mappings?");?>')" />
-<?php
- endif;
-?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td colspan="7">
- <p><span class="vexpl">
- <span class="red"><strong><?=gettext("Note:"); ?><br /></strong></span>
- <?=gettext("Depending on the way your WAN connection is setup, you may also need a"); ?>
- <a href="firewall_virtual_ip.php"><?=gettext("Virtual IP."); ?></a><br />
- <?=gettext("If you add a 1:1 NAT entry for any of the interface IPs on this system, " .
- "it will make this system inaccessible on that IP address. i.e. if " .
- "you use your WAN IP address, any services on this system (IPsec, OpenVPN server, etc.) " .
- "using the WAN IP address will no longer function."); ?>
- </span></p>
- </td>
- </tr>
- </table>
+ </tbody>
+ </table>
</div>
- </td></tr>
-</table>
+ </div>
+
+ <nav class="action-buttons">
+ <a href="firewall_nat_1to1_edit.php?after=-1" class="btn btn-sm btn-success" title="<?=gettext('Add new mapping')?>"><?=gettext('Add new mapping')?></a>
+ <input type="submit" id="order-store" class="btn btn-primary btn-sm" value="store changes" disabled="disabled" />
+ </nav>
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<div>
+<?php
+
+print_info_box(gettext('Depending on the way your WAN connection is setup, you may also need a ') . '<a href="firewall_virtual_ip.php">' .
+ gettext("Virtual IP.") . '</a>' . '<br />' .
+ gettext('If you add a 1:1 NAT entry for any of the interface IPs on this system, ' .
+ 'it will make this system inaccessible on that IP address. i.e. if ' .
+ 'you use your WAN IP address, any services on this system (IPsec, OpenVPN server, etc.) ' .
+ 'using the WAN IP address will no longer function.'));
+?>
+</div>
+
+<script>
+events.push(function() {
+ // Make rules draggable/sortable
+ $('table tbody.user-entries').sortable({
+ cursor: 'grabbing',
+ update: function(event, ui) {
+ $('#order-store').removeAttr('disabled');
+ }
+ });
+});
+</script>
+<?php include("foot.inc"); ?> \ No newline at end of file
diff --git a/src/usr/local/www/firewall_nat_1to1_edit.php b/src/usr/local/www/firewall_nat_1to1_edit.php
index e415015..ba92003 100644
--- a/src/usr/local/www/firewall_nat_1to1_edit.php
+++ b/src/usr/local/www/firewall_nat_1to1_edit.php
@@ -2,36 +2,61 @@
/* $Id$ */
/*
firewall_nat_1to1_edit.php
- part of m0n0wall (http://m0n0.ch/wall)
-
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>
+ * part of m0n0wall (http://m0n0.ch/wall)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: nat
+ pfSense_MODULE: nat
*/
##|+PRIV
@@ -46,14 +71,11 @@ require_once("interfaces.inc");
require_once("filter.inc");
require("shaper.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_nat_1to1.php');
-}
+$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_nat_1to1.php');
$specialsrcdst = explode(" ", "any pptp pppoe l2tp openvpn");
$ifdisp = get_configured_interface_with_descr();
+
foreach ($ifdisp as $kif => $kdescr) {
$specialsrcdst[] = "{$kif}";
$specialsrcdst[] = "{$kif}ip";
@@ -119,18 +141,20 @@ if ($_POST) {
foreach ($_POST as $key => $value) {
$temp = str_replace(">", "", $value);
$newpost = htmlentities($temp);
- if ($newpost <> $temp) {
- $input_errors[] = sprintf(gettext("Invalid characters detected (%s). Please remove invalid characters and save again."), $temp);
- }
+
+ if($newpost != $temp)
+ $input_errors[] = sprintf(gettext("Invalid characters detected (%s). Please remove invalid characters and save again."),$temp);
}
/* input validation */
$reqdfields = explode(" ", "interface external");
$reqdfieldsn = array(gettext("Interface"), gettext("External subnet"));
+
if ($_POST['srctype'] == "single" || $_POST['srctype'] == "network") {
$reqdfields[] = "src";
$reqdfieldsn[] = gettext("Source address");
}
+
if ($_POST['dsttype'] == "single" || $_POST['dsttype'] == "network") {
$reqdfields[] = "dst";
$reqdfieldsn[] = gettext("Destination address");
@@ -154,6 +178,7 @@ if ($_POST) {
} else if ($_POST['srctype'] == "single") {
$_POST['srcmask'] = 32;
}
+
if (is_specialnet($_POST['dsttype'])) {
$_POST['dst'] = $_POST['dsttype'];
$_POST['dstmask'] = 0;
@@ -180,6 +205,7 @@ if ($_POST) {
if (($_POST['src'] && !is_ipaddr($_POST['src']))) {
$input_errors[] = sprintf(gettext("%s is not a valid internal IP address."), $_POST['src']);
}
+
if (($_POST['srcmask'] && !is_numericint($_POST['srcmask']))) {
$input_errors[] = gettext("A valid internal bit count must be specified.");
}
@@ -190,6 +216,7 @@ if ($_POST) {
if (($_POST['dst'] && !is_ipaddroralias($_POST['dst']))) {
$input_errors[] = sprintf(gettext("%s is not a valid destination IP address or alias."), $_POST['dst']);
}
+
if (($_POST['dstmask'] && !is_numericint($_POST['dstmask']))) {
$input_errors[] = gettext("A valid destination bit count must be specified.");
}
@@ -248,345 +275,307 @@ if ($_POST) {
$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("1:1"), gettext("Edit"));
include("head.inc");
-?>
+function build_srctype_list() {
+ global $pconfig, $ifdisp;
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<script type="text/javascript" src="/javascript/suggestions.js"></script>
-<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
-<script type="text/javascript">
-//<![CDATA[
-function typesel_change() {
- switch (document.iform.srctype.selectedIndex) {
- case 1: /* single */
- document.iform.src.disabled = 0;
- document.iform.srcmask.value = "";
- document.iform.srcmask.disabled = 1;
- break;
- case 2: /* network */
- document.iform.src.disabled = 0;
- document.iform.srcmask.disabled = 0;
- break;
- default:
- document.iform.src.value = "";
- document.iform.src.disabled = 1;
- document.iform.srcmask.value = "";
- document.iform.srcmask.disabled = 1;
- break;
+ $list = array('any' => 'Any', 'single' => 'Single host or alias', 'network' => 'Network');
+
+ $sel = is_specialnet($pconfig['src']);
+
+ if(have_ruleint_access("pptp"))
+ $list['pptp'] = 'PPTP clients';
+
+ if(have_ruleint_access("pppoe"))
+ $list['pppoe'] = 'PPPoE clients';
+
+ if(have_ruleint_access("l2tp"))
+ $list['l2tp'] = 'L2TP clients';
+
+ foreach ($ifdisp as $ifent => $ifdesc) {
+ if(have_ruleint_access($ifent)) {
+ $list[$ifent] = $ifdesc . ' net';
+ $list[$ifent . 'ip'] = $ifdesc . ' address';
+ }
}
- switch (document.iform.dsttype.selectedIndex) {
- case 1: /* single */
- document.iform.dst.disabled = 0;
- document.iform.dstmask.value = "";
- document.iform.dstmask.disabled = 1;
- break;
- case 2: /* network */
- document.iform.dst.disabled = 0;
- document.iform.dstmask.disabled = 0;
- break;
- default:
- document.iform.dst.value = "";
- document.iform.dst.disabled = 1;
- document.iform.dstmask.value = "";
- document.iform.dstmask.disabled = 1;
- break;
+
+ return($list);
+}
+
+function srctype_selected() {
+ global $pconfig;
+
+ $sel = is_specialnet($pconfig['src']);
+
+ if(!$sel) {
+ if(($pconfig['srcmask'] == 32) || (!isset($pconfig['srcmask'])))
+ return('single');
+
+ return('network');
}
+
+ return($pconfig['src']);
}
-//]]>
-</script>
-<?php
-include("fbegin.inc");
-if ($input_errors) {
- print_input_errors($input_errors);
+function build_dsttype_list() {
+ global $pconfig, $config, $ifdisp;
+
+ $sel = is_specialnet($pconfig['dst']);
+ $list = array('any' => 'Any', 'single' => 'Single host or alias', 'network' => 'Network', '(self)' => 'This Firewall (self)');
+
+ if(have_ruleint_access("pptp"))
+ $list['pptp'] = 'PPTP clients';
+
+ if(have_ruleint_access("pppoe"))
+ $list['pppoe'] = 'PPPoE clients';
+
+ if(have_ruleint_access("l2tp"))
+ $list['l2tp'] = 'L2TP clients';
+
+ foreach ($ifdisp as $if => $ifdesc) {
+ if(have_ruleint_access($if)) {
+ $list[$if] = $ifdesc;
+ $list[$if . 'ip'] = $ifdesc . ' address';
+ }
+ }
+
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $sn) {
+ if (isset($sn['noexpand']))
+ continue;
+
+ if ($sn['mode'] == "proxyarp" && $sn['type'] == "network") {
+ $start = ip2long32(gen_subnet($sn['subnet'], $sn['subnet_bits']));
+ $end = ip2long32(gen_subnet_max($sn['subnet'], $sn['subnet_bits']));
+ $len = $end - $start;
+
+ for ($i = 0; $i <= $len; $i++) {
+ $snip = long2ip32($start+$i);
+
+ $list[$snip] = $snip . ' (' . $sn['descr'] . ')';
+ }
+
+ $list[$sn['subnet']] = $sn['subnet'] . ' (' . $sn['descr'] . ')';
+ }
+ }
+ }
+
+ return($list);
}
-?>
-<form action="firewall_nat_1to1_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall nat 1to1 edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit NAT 1:1 entry"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
- <td width="78%" class="vtable">
- <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable this rule"); ?></strong><br />
- <span class="vexpl"><?=gettext("Set this option to disable this rule without removing it from the list."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
- <td width="78%" class="vtable">
- <select name="interface" class="formselect">
-<?php
- foreach ($ifdisp as $if => $ifdesc) {
- if (have_ruleint_access($if)) {
- $interfaces[$if] = $ifdesc;
- }
- }
-
- if ($config['l2tp']['mode'] == "server") {
- if (have_ruleint_access("l2tp")) {
- $interfaces['l2tp'] = "L2TP VPN";
- }
- }
-
- if ($config['pptpd']['mode'] == "server") {
- if (have_ruleint_access("pptp")) {
- $interfaces['pptp'] = "PPTP VPN";
- }
- }
-
- if (is_pppoe_server_enabled() && have_ruleint_access("pppoe")) {
- $interfaces['pppoe'] = "PPPoE Server";
- }
-
- /* add ipsec interfaces */
- if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
- if (have_ruleint_access("enc0")) {
- $interfaces["enc0"] = "IPsec";
- }
- }
-
- /* add openvpn/tun interfaces */
- if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
- $interfaces["openvpn"] = "OpenVPN";
- }
-
- foreach ($interfaces as $iface => $ifacename):
-?>
- <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
-<?php
- endforeach;
-?>
- </select><br />
- <span class="vexpl"><?=gettext("Choose which interface this rule applies to"); ?>.<br />
- <?=gettext("Hint: in most cases, you'll want to use WAN here"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("External subnet IP"); ?></td>
- <td width="78%" class="vtable">
- <input name="external" type="text" class="formfld unknown" id="external" size="20" value="<?=htmlspecialchars($pconfig['external']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Enter the external (usually on a WAN) subnet's starting address for the 1:1 mapping. " .
- "The subnet mask from the internal address below will be applied to this IP address."); ?><br />
- <?=gettext("Hint: this is generally an address owned by the router itself on the selected interface."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Internal IP"); ?></td>
- <td width="78%" class="vtable">
- <input name="srcnot" type="checkbox" id="srcnot" value="yes" <?php if ($pconfig['srcnot']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("not"); ?></strong>
- <br />
- <?=gettext("Use this option to invert the sense of the match."); ?>
- <br />
- <br />
- <table border="0" cellspacing="0" cellpadding="0" summary="source">
- <tr>
- <td><?=gettext("Type:"); ?>&nbsp;&nbsp;</td>
- <td>
- <select name="srctype" class="formselect" onchange="typesel_change()">
-<?php
- $sel = is_specialnet($pconfig['src']);
-?>
- <option value="any" <?php if ($pconfig['src'] == "any") { echo "selected=\"selected\""; } ?>><?=gettext("any"); ?></option>
- <option value="single" <?php if ((($pconfig['srcmask'] == 32) || !isset($pconfig['srcmask'])) && !$sel) { echo "selected=\"selected\""; $sel = 1; } ?>>
- <?=gettext("Single host"); ?>
- </option>
- <option value="network" <?php if (!$sel) echo "selected=\"selected\""; ?>><?=gettext("Network"); ?></option>
-<?php
- if (have_ruleint_access("pptp")):
-?>
- <option value="pptp" <?php if ($pconfig['src'] == "pptp") { echo "selected=\"selected\""; } ?>><?=gettext("PPTP clients"); ?></option>
-<?php
- endif;
- if (have_ruleint_access("pppoe")):
-?>
- <option value="pppoe" <?php if ($pconfig['src'] == "pppoe") { echo "selected=\"selected\""; } ?>><?=gettext("PPPoE clients"); ?></option>
-<?php
- endif;
- if (have_ruleint_access("l2tp")):
-?>
- <option value="l2tp" <?php if ($pconfig['src'] == "l2tp") { echo "selected=\"selected\""; } ?>><?=gettext("L2TP clients"); ?></option>
-<?php
- endif;
- foreach ($ifdisp as $ifent => $ifdesc):
- if (have_ruleint_access($ifent)):
-?>
- <option value="<?=$ifent;?>" <?php if ($pconfig['src'] == $ifent) { echo "selected=\"selected\""; } ?>>
- <?=htmlspecialchars($ifdesc);?> <?=gettext("net"); ?>
- </option>
- <option value="<?=$ifent;?>ip"<?php if ($pconfig['src'] == $ifent . "ip") { echo "selected=\"selected\""; } ?>>
- <?=$ifdesc?> <?=gettext("address");?>
- </option>
-<?php
- endif;
- endforeach;
-?>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Address:"); ?>&nbsp;&nbsp;</td>
- <td>
- <input name="src" type="text" class="formfld" id="src" size="20" value="<?php if (!is_specialnet($pconfig['src'])) echo htmlspecialchars($pconfig['src']);?>" /> /
- <select name="srcmask" class="formselect" id="srcmask">
-<?php
- for ($i = 31; $i > 0; $i--):
-?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['srcmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
-<?php
- endfor;
-?>
- </select>
- </td>
- </tr>
- </table>
- <br />
- <span class="vexpl"><?=gettext("Enter the internal (LAN) subnet for the 1:1 mapping. The subnet size specified for the internal subnet will be applied to the external subnet."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination"); ?></td>
- <td width="78%" class="vtable">
- <input name="dstnot" type="checkbox" id="dstnot" value="yes" <?php if ($pconfig['dstnot']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("not"); ?></strong>
- <br />
- <?=gettext("Use this option to invert the sense of the match."); ?>
- <br />
- <br />
- <table border="0" cellspacing="0" cellpadding="0" summary="destination">
- <tr>
- <td><?=gettext("Type:"); ?>&nbsp;&nbsp;</td>
- <td>
- <select name="dsttype" class="formselect" onchange="typesel_change()">
-<?php
- $sel = is_specialnet($pconfig['dst']); ?>
- <option value="any" <?php if (empty($pconfig['dst']) || $pconfig['dst'] == "any") { echo "selected=\"selected\""; } ?>><?=gettext("any"); ?></option>
- <option value="single" <?php if (($pconfig['dstmask'] == 32) && !$sel) { echo "selected=\"selected\""; $sel = 1; } ?>>
- <?=gettext("Single host or alias"); ?>
- </option>
- <option value="network" <?php if (!$sel && !empty($pconfig['dst'])) echo "selected=\"selected\""; ?>>
- <?=gettext("Network"); ?>
- </option>
-<?php
- if (have_ruleint_access("pptp")):
-?>
- <option value="pptp" <?php if ($pconfig['dst'] == "pptp") { echo "selected=\"selected\""; } ?>>
- <?=gettext("PPTP clients"); ?>
- </option>
-<?php
- endif;
- if (have_ruleint_access("pppoe")):
-?>
- <option value="pppoe" <?php if ($pconfig['dst'] == "pppoe") { echo "selected=\"selected\""; } ?>>
- <?=gettext("PPPoE clients"); ?>
- </option>
-<?php
- endif;
- if (have_ruleint_access("l2tp")):
-?>
- <option value="l2tp" <?php if ($pconfig['dst'] == "l2tp") { echo "selected=\"selected\""; } ?>>
- <?=gettext("L2TP clients"); ?>
- </option>
-<?php
- endif;
- foreach ($ifdisp as $if => $ifdesc):
- if (have_ruleint_access($if)):
-?>
- <option value="<?=$if;?>" <?php if ($pconfig['dst'] == $if) { echo "selected=\"selected\""; } ?>><?=htmlspecialchars($ifdesc);?>
- <?=gettext("net"); ?>
- </option>
- <option value="<?=$if;?>ip"<?php if ($pconfig['dst'] == $if . "ip") { echo "selected=\"selected\""; } ?>>
- <?=$ifdesc;?> <?=gettext("address");?>
- </option>
-<?php
- endif;
- endforeach;
-?>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Address:"); ?>&nbsp;&nbsp;</td>
- <td>
- <input name="dst" type="text" autocomplete="off" class="formfldalias" id="dst" size="20" value="<?php if (!is_specialnet($pconfig['dst'])) echo htmlspecialchars($pconfig['dst']);?>" />
- /
- <select name="dstmask" class="formselect" id="dstmask">
-<?php
- for ($i = 31; $i > 0; $i--):
-?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['dstmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
-<?php
- endfor;
+function dsttype_selected() {
+ global $pconfig;
+
+ $sel = is_specialnet($pconfig['dst']);
+
+ if(empty($pconfig['dst'] || $pconfig['dst'] == "any"))
+ return('any');
+
+ if(!$sel) {
+ if($pconfig['dstmask'] == 32)
+ return('single');
+
+ return('network');
+ }
+
+ return($pconfig['dst']);
+}
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'Submit',
+ gettext("Save")
+));
+
+$section = new Form_Section('Edit NAT 1 to 1 entry');
+
+$section->addInput(new Form_Checkbox(
+ 'nordr',
+ 'No RDR (NOT)',
+ 'Disable redirection for traffic matching this rule',
+ $pconfig['nordr']
+))->setHelp('This option is rarely needed, don\'t use this unless you know what you\'re doing.');
+
+$iflist = get_configured_interface_with_descr(false, true);
+
+foreach ($iflist as $if => $ifdesc)
+ if(have_ruleint_access($if))
+ $interfaces[$if] = $ifdesc;
+
+if ($config['l2tp']['mode'] == "server")
+ if(have_ruleint_access("l2tp"))
+ $interfaces['l2tp'] = "L2TP VPN";
+
+if ($config['pptpd']['mode'] == "server")
+ if(have_ruleint_access("pptp"))
+ $interfaces['pptp'] = "PPTP VPN";
+
+if (is_pppoe_server_enabled() && have_ruleint_access("pppoe"))
+ $interfaces['pppoe'] = "PPPoE Server";
+
+/* add ipsec interfaces */
+if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable']))
+ if(have_ruleint_access("enc0"))
+ $interfaces["enc0"] = "IPsec";
+
+/* add openvpn/tun interfaces */
+if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"])
+ $interfaces["openvpn"] = "OpenVPN";
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ $pconfig['interface'],
+ $interfaces
+))->setHelp('Choose which interface this rule applies to. In most cases "WAN" is specified.');
+
+$section->addInput(new Form_IpAddress(
+ 'external',
+ 'External subnet IP',
+ $pconfig['external']
+))->setHelp('Enter the external (usually on a WAN) subnet\'s starting address for the 1:1 mapping. ' .
+ 'The subnet mask from the internal address below will be applied to this IP address.');
+
+$group = new Form_Group('Internal IP');
+
+$group->add(new Form_Checkbox(
+ 'srcnot',
+ null,
+ 'Not',
+ $pconfig['srcnot']
+))->setHelp('Invert the sense of the match.');
+
+$group->add(new Form_Select(
+ 'srctype',
+ null,
+ srctype_selected(),
+ build_srctype_list()
+))->setHelp('Type');
+
+$group->add(new Form_IpAddress(
+ 'src',
+ null,
+ is_specialnet($pconfig['src']) ? '': $pconfig['src']
+))->addMask('srcmask', $pconfig['srcmask'], 31)->setHelp('Address/mask');
+
+$group->setHelp('Enter the internal (LAN) subnet for the 1:1 mapping. ' .
+ 'The subnet size specified for the internal subnet will be applied to the external subnet.');
+
+$section->add($group);
+
+$group = new Form_Group('Destination');
+
+$group->add(new Form_Checkbox(
+ 'dstnot',
+ null,
+ 'Not',
+ $pconfig['srcnot']
+))->setHelp('Invert the sense of the match.');
+
+$group->add(new Form_Select(
+ 'dsttype',
+ null,
+ dsttype_selected(),
+ build_dsttype_list()
+))->setHelp('Type');
+
+$group->add(new Form_IpAddress(
+ 'dst',
+ null,
+ is_specialnet($pconfig['dst']) ? '': $pconfig['dst']
+))->addMask('dstmask', $pconfig['dstmask'], 31)->setHelp('Address/mask');
+
+$group->setHelp('The 1:1 mapping will only be used for connections to or from the specified destination. Hint: this is usually "Any".');
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$section->addInput(new Form_Select(
+ 'natreflection',
+ 'NAT reflection',
+ $pconfig['natreflection'],
+ array(
+ 'default' => 'Use system default',
+ 'enable' => 'Enable',
+ 'disable' => 'Disable'
+ )
+));
+
+$form->add($section);
+
+print($form);
?>
- </select>
- </td>
- </tr>
- </table>
- <br />
- <span class="vexpl">
- <?=gettext("The 1:1 mapping will only be used for connections to or from the specified destination."); ?><br />
- <?=gettext("Hint: this is usually 'any'."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed)."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("NAT reflection"); ?></td>
- <td width="78%" class="vtable">
- <select name="natreflection" class="formselect">
- <option value="default" <?php if ($pconfig['natreflection'] != "enable" && $pconfig['natreflection'] != "disable") echo "selected=\"selected\""; ?>>
- <?=gettext("use system default"); ?>
- </option>
- <option value="enable" <?php if ($pconfig['natreflection'] == "enable") echo "selected=\"selected\""; ?>>
- <?=gettext("enable"); ?>
- </option>
- <option value="disable" <?php if ($pconfig['natreflection'] == "disable") echo "selected=\"selected\""; ?>>
- <?=gettext("disable"); ?>
- </option>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_1to1[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
+
<script type="text/javascript">
//<![CDATA[
+events.push(function(){
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
+ }
+
+ function typesel_change() {
+ switch ($('#srctype').find(":selected").index()) {
+ case 1: // single
+ disableInput('src', false);
+ $('#srcmask').val('');
+ disableInput('srcmask', true);
+ break;
+ case 2: // network
+ disableInput('src', false);
+ disableInput('srcmask', false);
+ break;
+ default:
+ $('#src').val('');
+ disableInput('src', true);
+ $('#srcmask').val('');
+ disableInput('srcmask', true);
+ break;
+ }
+
+ switch ($('#dsttype').find(":selected").index()) {
+ case 1: // single
+ disableInput('dst', false);
+ $('#dstmask').val('');
+ disableInput('dstmask', true);;
+ break;
+ case 2: // network /
+ disableInput('dst', false);
+ disableInput('dstmask', false);
+ break;
+ default:
+ $('#dst').val('');
+ disableInput('dst', true);
+ $('#dstmask').val('');
+ disableInput('dstmask', true);
+ break;
+ }
+ }
+
+ // On-click . .
+
+ $('#srctype').click(function () {
+ typesel_change();
+ });
+
+ $('#dsttype').click(function () {
+ typesel_change();
+ });
+
+ // Initial page load
typesel_change();
+});
//]]>
</script>
-<script type="text/javascript">
-//<![CDATA[
- var addressarray = <?= json_encode(get_alias_list(array("host", "network", "openvpn", "urltable"))) ?>;
- var oTextbox1 = new AutoSuggestControl(document.getElementById("dst"), new StateSuggestions(addressarray));
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include("foot.inc");
diff --git a/src/usr/local/www/firewall_nat_edit.php b/src/usr/local/www/firewall_nat_edit.php
index db8a174..2b15c80 100644
--- a/src/usr/local/www/firewall_nat_edit.php
+++ b/src/usr/local/www/firewall_nat_edit.php
@@ -2,36 +2,61 @@
/* $Id$ */
/*
firewall_nat_edit.php
- part of m0n0wall (http://m0n0.ch/wall)
-
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>
+ * part of m0n0wall (http://m0n0.ch/wall)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: nat
+ pfSense_MODULE: nat
*/
##|+PRIV
@@ -46,14 +71,11 @@ require_once("itemid.inc");
require_once("filter.inc");
require("shaper.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_nat.php');
-}
+$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_nat.php');
$specialsrcdst = explode(" ", "any (self) pptp pppoe l2tp openvpn");
$ifdisp = get_configured_interface_with_descr();
+
foreach ($ifdisp as $kif => $kdescr) {
$specialsrcdst[] = "{$kif}";
$specialsrcdst[] = "{$kif}ip";
@@ -62,6 +84,7 @@ foreach ($ifdisp as $kif => $kdescr) {
if (!is_array($config['nat']['rule'])) {
$config['nat']['rule'] = array();
}
+
$a_nat = &$config['nat']['rule'];
if (is_numericint($_GET['id'])) {
@@ -94,6 +117,7 @@ if (isset($id) && $a_nat[$id]) {
$pconfig['disabled'] = isset($a_nat[$id]['disabled']);
$pconfig['nordr'] = isset($a_nat[$id]['nordr']);
+
address_to_pconfig($a_nat[$id]['source'], $pconfig['src'],
$pconfig['srcmask'], $pconfig['srcnot'],
$pconfig['srcbeginport'], $pconfig['srcendport']);
@@ -129,12 +153,12 @@ if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
* cannot think he is slick and perform a XSS attack on the unwilling
*/
unset($input_errors);
+
foreach ($_POST as $key => $value) {
$temp = $value;
$newpost = htmlentities($temp);
- if ($newpost <> $temp) {
+ if($newpost != $temp)
$input_errors[] = sprintf(gettext("Invalid characters detected %s. Please remove invalid characters and save again."), $temp);
- }
}
if ($_POST) {
@@ -202,6 +226,7 @@ if ($_POST) {
} else if ($_POST['srctype'] == "single") {
$_POST['srcmask'] = 32;
}
+
if (is_specialnet($_POST['dsttype'])) {
$_POST['dst'] = $_POST['dsttype'];
$_POST['dstmask'] = 0;
@@ -228,10 +253,12 @@ if ($_POST) {
$reqdfields[] = "src";
$reqdfieldsn[] = gettext("Source address");
}
+
if ($_POST['dsttype'] == "single" || $_POST['dsttype'] == "network") {
$reqdfields[] = "dst";
$reqdfieldsn[] = gettext("Destination address");
}
+
if (!isset($_POST['nordr'])) {
$reqdfields[] = "localip";
$reqdfieldsn[] = gettext("Redirect target IP");
@@ -243,6 +270,7 @@ if ($_POST) {
$_POST['srcbeginport'] = 0;
$_POST['srcendport'] = 0;
}
+
if (!$_POST['dstbeginport']) {
$_POST['dstbeginport'] = 0;
$_POST['dstendport'] = 0;
@@ -293,6 +321,7 @@ if ($_POST) {
$input_errors[] = gettext("A valid source bit count must be specified.");
}
}
+
if (!is_specialnet($_POST['dsttype'])) {
if (($_POST['dst'] && !is_ipaddroralias($_POST['dst']))) {
$input_errors[] = sprintf(gettext("%s is not a valid destination IP address or alias."), $_POST['dst']);
@@ -308,6 +337,7 @@ if ($_POST) {
$_POST['srcendport'] = $_POST['srcbeginport'];
$_POST['srcbeginport'] = $tmp;
}
+
if ($_POST['dstbeginport'] > $_POST['dstendport']) {
/* swap */
$tmp = $_POST['dstendport'];
@@ -348,9 +378,6 @@ if ($_POST) {
}
}
- // Allow extending of the firewall edit page and include custom input validation
- pfSense_handle_custom_code("/usr/local/pkg/firewall_nat/input_validation");
-
if (!$input_errors) {
$natent = array();
@@ -376,6 +403,7 @@ if ($_POST) {
$natent['target'] = $_POST['localip'];
$natent['local-port'] = $_POST['localbeginport'];
}
+
$natent['interface'] = $_POST['interface'];
$natent['descr'] = $_POST['descr'];
$natent['associated-rule-id'] = $_POST['associated-rule-id'];
@@ -422,7 +450,6 @@ if ($_POST) {
}
if ($need_filter_rule == true) {
-
/* auto-generate a matching firewall rule */
$filterent = array();
unset($filterentid);
@@ -435,6 +462,7 @@ if ($_POST) {
$filterent =& $config['filter']['rule'][$filterentid];
}
}
+
pconfig_to_address($filterent['source'], $_POST['src'],
$_POST['srcmask'], $_POST['srcnot'],
$_POST['srcbeginport'], $_POST['srcendport']);
@@ -499,518 +527,731 @@ if ($_POST) {
}
}
+function build_srctype_list() {
+ global $pconfig, $ifdisp;
+
+ $list = array('any' => 'Any', 'single' => 'Single host or alias', 'network' => 'Network');
+
+ $sel = is_specialnet($pconfig['src']);
+
+ if(have_ruleint_access("pptp"))
+ $list['pptp'] = 'PPTP clients';
+
+ if(have_ruleint_access("pppoe"))
+ $list['pppoe'] = 'PPPoE clients';
+
+ if(have_ruleint_access("l2tp"))
+ $list['l2tp'] = 'L2TP clients';
+
+ foreach ($ifdisp as $ifent => $ifdesc) {
+ if(have_ruleint_access($ifent)) {
+ $list[$ifent] = $ifdesc . ' net';
+ $list[$ifent . 'ip'] = $ifdesc . ' address';
+ }
+ }
+
+ return($list);
+}
+
+function build_dsttype_list() {
+ global $pconfig, $config, $ifdisp;
+
+ $sel = is_specialnet($pconfig['dst']);
+ $list = array('any' => 'Any', 'single' => 'Single host or alias', 'network' => 'Network', '(self)' => 'This Firewall (self)');
+
+ if(have_ruleint_access("pptp"))
+ $list['pptp'] = 'PPTP clients';
+
+ if(have_ruleint_access("pppoe"))
+ $list['pppoe'] = 'PPPoE clients';
+
+ if(have_ruleint_access("l2tp"))
+ $list['l2tp'] = 'L2TP clients';
+
+ foreach ($ifdisp as $if => $ifdesc) {
+ if(have_ruleint_access($if)) {
+ $list[$if] = $ifdesc;
+ $list[$if . 'ip'] = $ifdesc . ' address';
+ }
+ }
+
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $sn) {
+ if (isset($sn['noexpand']))
+ continue;
+
+ if ($sn['mode'] == "proxyarp" && $sn['type'] == "network") {
+ $start = ip2long32(gen_subnet($sn['subnet'], $sn['subnet_bits']));
+ $end = ip2long32(gen_subnet_max($sn['subnet'], $sn['subnet_bits']));
+ $len = $end - $start;
+
+ for ($i = 0; $i <= $len; $i++) {
+ $snip = long2ip32($start+$i);
+
+ $list[$snip] = $snip . ' (' . $sn['descr'] . ')';
+ }
+
+ $list[$sn['subnet']] = $sn['subnet'] . ' (' . $sn['descr'] . ')';
+ }
+ }
+ }
+
+ return($list);
+}
+
+function dsttype_selected() {
+ global $pconfig;
+
+ $sel = is_specialnet($pconfig['dst']);
+
+ if(!$sel) {
+ if($pconfig['dstmask'] == 32)
+ return('single');
+
+ return('network');
+ }
+
+ return($pconfig['dst']);
+}
+
+function srctype_selected() {
+ global $pconfig;
+
+ $sel = is_specialnet($pconfig['src']);
+
+ if(!$sel) {
+ if($pconfig['srcmask'] == 32)
+ return('single');
+
+ return('network');
+ }
+
+ return($pconfig['src']);
+}
+
$closehead = false;
$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("Port Forward"), gettext("Edit"));
include("head.inc");
-?>
-<link type="text/css" rel="stylesheet" href="/javascript/chosen/chosen.css" />
-</head>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'Submit',
+ gettext("Save")
+));
+
+$section = new Form_Section('Edit Redirect entry');
+
+$section->addInput(new Form_Checkbox(
+ 'disabled',
+ 'Disabled',
+ 'Disable this rule',
+ $pconfig['disabled']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'nordr',
+ 'No RDR (NOT)',
+ 'Disable redirection for traffic matching this rule',
+ $pconfig['nordr']
+))->setHelp('This option is rarely needed, don\'t use this unless you know what you\'re doing.');
+
+$iflist = get_configured_interface_with_descr(false, true);
+
+foreach ($iflist as $if => $ifdesc)
+ if(have_ruleint_access($if))
+ $interfaces[$if] = $ifdesc;
+
+if ($config['l2tp']['mode'] == "server")
+ if(have_ruleint_access("l2tp"))
+ $interfaces['l2tp'] = "L2TP VPN";
+
+if ($config['pptpd']['mode'] == "server")
+ if(have_ruleint_access("pptp"))
+ $interfaces['pptp'] = "PPTP VPN";
+
+if (is_pppoe_server_enabled() && have_ruleint_access("pppoe"))
+ $interfaces['pppoe'] = "PPPoE Server";
+
+/* add ipsec interfaces */
+if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable']))
+ if(have_ruleint_access("enc0"))
+ $interfaces["enc0"] = "IPsec";
+
+/* add openvpn/tun interfaces */
+if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"])
+ $interfaces["openvpn"] = "OpenVPN";
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ $pconfig['interface'],
+ $interfaces
+))->setHelp('Choose which interface this rule applies to. In most cases "WAN" is specified.');
+
+$protocols = "TCP UDP TCP/UDP ICMP ESP AH GRE IPV6 IGMP PIM OSPF";
+
+$section->addInput(new Form_Select(
+ 'proto',
+ 'Protocol',
+ $pconfig['proto'],
+ array_combine(explode(" ", strtolower($protocols)), explode(" ", $protocols))
+))->setHelp('Choose which protocol this rule should match. In most cases "TCP" is specified.');
+
+$group = new Form_Group('Source');
+
+$group->add(new Form_Select(
+ 'srctype',
+ null,
+ srctype_selected(),
+ build_srctype_list()
+))->setHelp('Type');
+
+$group->add(new Form_IpAddress(
+ 'src',
+ null,
+ is_specialnet($pconfig['src']) ? '': $pconfig['src']
+))->setPattern('[.a-zA-Z0-9_]+')->addMask('srcmask', $pconfig['srcmask'])->setHelp('Address/mask');
+
+$section->add($group);
+
+$portlist = array("" => 'Other', 'any' => 'Any');
+
+foreach ($wkports as $wkport => $wkportdesc)
+ $portlist[$wkport] = $wkportdesc;
+
+$group = new Form_Group('Source port range');
+$group->addClass('srcportrange');
+
+$group->add(new Form_Select(
+ 'srcbeginport',
+ null,
+ $pconfig['srcbeginport'],
+ $portlist
+))->setHelp('From port');
+
+$group->add(new Form_Input(
+ 'srcbeginport_cust',
+ null,
+ 'number',
+ $pconfig['srcbeginport'],
+ ['min' => '1', 'max' => '65536']
+))->setHelp('Custom');
+
+$group->add(new Form_Select(
+ 'srcendport',
+ null,
+ $pconfig['srcendport'],
+ $portlist
+))->setHelp('To port');
+
+$group->add(new Form_Input(
+ 'srcendport_cust',
+ null,
+ 'number',
+ $pconfig['srcendport'],
+ ['min' => '1', 'max' => '65536']
+))->setHelp('Custom');
+
+$group->setHelp('Specify the source port or port range for this rule. This is usually random and almost never ' .
+ 'equal to the destination port range (and should usually be \'any\'). You can leave the \'to\' field ' .
+ 'empty if you only want to filter a single port.');
+
+$section->add($group);
+
+$group = new Form_Group('Destination');
+
+$group->add(new Form_Select(
+ 'dsttype',
+ null,
+ dsttype_selected(),
+ build_dsttype_list()
+))->setHelp('Type');
+
+$group->add(new Form_IpAddress(
+ 'dst',
+ null,
+ is_specialnet($pconfig['dst']) ? '': $pconfig['dst']
+))->setPattern('[.a-zA-Z0-9_]+')->addMask('dstmask', $pconfig['dstmask'], 31)->setHelp('Address/mask');
+
+$section->add($group);
+
+$group = new Form_Group('Destination port range');
+$group->addClass('dstportrange');
+
+$group->add(new Form_Select(
+ 'dstbeginport',
+ null,
+ $pconfig['dstbeginport'],
+ $portlist
+))->setHelp('From port');
+
+$group->add(new Form_Input(
+ 'dstbeginport_cust',
+ null,
+ 'number',
+ $pconfig['dstbeginport'],
+ ['min' => '1', 'max' => '65536']
+))->setHelp('Custom');
+
+$group->add(new Form_Select(
+ 'dstendport',
+ null,
+ $pconfig['dstendport'],
+ $portlist
+))->setHelp('To port');
+
+$group->add(new Form_Input(
+ 'dstendport_cust',
+ null,
+ 'number',
+ $pconfig['dstendport'],
+ ['min' => '1', 'max' => '65536']
+))->setHelp('Custom');
+
+$group->setHelp('Specify the port or port range for the destination of the packet for this mapping. ' .
+ 'You can leave the \'to\' field empty if you only want to map a single port ');
+
+$section->add($group);
+
+$section->addInput(new Form_Checkbox(
+ 'dstnot',
+ null,
+ 'Not (Invert the sense of the match)',
+ $pconfig['dstnot'],
+ 'yes'
+));
+
+$section->addInput(new Form_IpAddress(
+ 'localip',
+ 'Redirect target IP',
+ $pconfig['localip']
+))->setPattern('[.a-zA-Z0-9_]+')->setHelp('Enter the internal IP address of the server on which you want to map the ports.' . '<br />' .
+ 'e.g.: 192.168.1.12');
+
+$group = new Form_Group('Redirect target port');
+$group->addClass('lclportrange');
+
+$group->add(new Form_Select(
+ 'localbeginport',
+ null,
+ $pconfig['localbeginport'],
+ array('' => 'Other') + $wkports
+))->setHelp('Port');
+
+$group->setHelp('Specify the port on the machine with the IP address entered above. In case of a port range, specify the ' .
+ 'beginning port of the range (the end port will be calculated automatically).' . '<br />' .
+ 'this is usually identical to "From port" above');
+
+$group->add(new Form_Input(
+ 'localbeginport_cust',
+ null,
+ 'number',
+ $pconfig['localbeginport_cust'],
+ ['min' => '1', 'max' => '65536']
+))->setHelp('Custom');
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+
+$section->addInput(new Form_Checkbox(
+ 'nosync',
+ 'No XMLRPC Sync',
+ null,
+ $pconfig['nosync']
+))->setHelp('This prevents the rule on Master from automatically syncing to other CARP members. ' .
+ 'This does NOT prevent the rule from being overwritten on Slave.');
+
+$section->addInput(new Form_Select(
+ 'natreflection',
+ 'NAT reflection',
+ $pconfig['natreflection'],
+ array(
+ 'default' => 'Use system default',
+ 'enable' => 'Enable (NAT + Proxy)',
+ 'purenat' => 'Enable (Pure NAT)',
+ 'disable' => 'Disable'
+ )
+));
+
+if (isset($id) && $a_nat[$id] && (!isset($_GET['dup']) || !is_numericint($_GET['dup']))) {
+ $hlpstr = '';
+ $rulelist = array('' => 'None', 'pass' => 'Pass');
+
+ if (is_array($config['filter']['rule'])) {
+ filter_rules_sort();
+ foreach ($config['filter']['rule'] as $filter_id => $filter_rule) {
+ if (isset($filter_rule['associated-rule-id'])) {
+ $rulelist[$filter_rule['associated-rule-id']] = 'Rule ' . $filter_rule['descr'];
+
+ if ($filter_rule['associated-rule-id']==$pconfig['associated-rule-id']) {
+ $hlpstr = '<a href="firewall_rules_edit.php?id=' . $filter_id . '">' . gettext("View the filter rule") . '</a><br />';
+ }
+ }
+ }
+ }
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<script src="/javascript/chosen/chosen.jquery.js" type="text/javascript"></script>
-<?php
-include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="firewall_nat_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall nat edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Redirect entry"); ?></td>
- </tr>
-<?php
- // Allow extending of the firewall edit page and include custom input validation
- pfSense_handle_custom_code("/usr/local/pkg/firewall_nat/htmlphpearly");
-?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
- <td width="78%" class="vtable">
- <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable this rule"); ?></strong><br />
- <span class="vexpl"><?=gettext("Set this option to disable this rule without removing it from the list."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("No RDR (NOT)"); ?></td>
- <td width="78%" class="vtable">
- <input type="checkbox" name="nordr" id="nordr" onclick="nordr_change();" <?php if ($pconfig['nordr']) echo "checked=\"checked\""; ?> />
- <span class="vexpl"><?=gettext("Enabling this option will disable redirection for traffic matching this rule."); ?>
- <br /><?=gettext("Hint: this option is rarely needed, don't use this unless you know what you're doing."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
- <td width="78%" class="vtable">
- <select name="interface" class="formselect" onchange="dst_change(this.value, iface_old, document.iform.dsttype.value);iface_old = document.iform.interface.value;typesel_change();">
- <?php
- $iflist = get_configured_interface_with_descr(false, true);
- // Allow extending of the firewall edit interfaces
- pfSense_handle_custom_code("/usr/local/pkg/firewall_nat/pre_interfaces_edit");
- foreach ($iflist as $if => $ifdesc) {
- if (have_ruleint_access($if)) {
- $interfaces[$if] = $ifdesc;
- }
- }
-
- if ($config['l2tp']['mode'] == "server") {
- if (have_ruleint_access("l2tp")) {
- $interfaces['l2tp'] = "L2TP VPN";
- }
- }
-
- if ($config['pptpd']['mode'] == "server") {
- if (have_ruleint_access("pptp")) {
- $interfaces['pptp'] = "PPTP VPN";
- }
- }
-
- if (is_pppoe_server_enabled() && have_ruleint_access("pppoe")) {
- $interfaces['pppoe'] = "PPPoE Server";
- }
-
- /* add ipsec interfaces */
- if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
- if (have_ruleint_access("enc0")) {
- $interfaces["enc0"] = "IPsec";
- }
- }
-
- /* add openvpn/tun interfaces */
- if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
- $interfaces["openvpn"] = "OpenVPN";
- }
-
- foreach ($interfaces as $iface => $ifacename): ?>
- <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
- <?php endforeach; ?>
- </select><br />
- <span class="vexpl"><?=gettext("Choose which interface this rule applies to."); ?><br />
- <?=gettext("Hint: in most cases, you'll want to use WAN here."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol"); ?></td>
- <td width="78%" class="vtable">
- <select name="proto" class="formselect" onchange="proto_change(); check_for_aliases();">
- <?php
- $protocols = explode(" ", "TCP UDP TCP/UDP ICMP ESP AH GRE IPV6 IGMP PIM OSPF");
- foreach ($protocols as $proto): ?>
- <option value="<?=strtolower($proto);?>" <?php if (strtolower($proto) == $pconfig['proto']) echo "selected=\"selected\""; ?>><?=htmlspecialchars($proto);?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Choose which IP protocol this rule should match."); ?><br />
- <?=gettext("Hint: in most cases, you should specify"); ?> <em><?=gettext("TCP"); ?></em> &nbsp;<?=gettext("here."); ?>
- </span>
- </td>
- </tr>
- <tr id="showadvancedboxsrc" name="showadvancedboxsrc">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Source"); ?></td>
- <td width="78%" class="vtable">
- <input type="button" onclick="show_source()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show source address and port range"); ?>
- </td>
- </tr>
- <tr style="display: none;" id="srctable" name="srctable">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Source"); ?></td>
- <td width="78%" class="vtable">
- <input name="srcnot" type="checkbox" id="srcnot" value="yes" <?php if ($pconfig['srcnot']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("not"); ?></strong>
- <br />
- <?=gettext("Use this option to invert the sense of the match."); ?>
- <br />
- <br />
- <table border="0" cellspacing="0" cellpadding="0" summary="type">
- <tr>
- <td><?=gettext("Type:"); ?>&nbsp;&nbsp;</td>
- <td>
- <select name="srctype" class="formselect" onchange="typesel_change()">
-<?php
- $sel = is_specialnet($pconfig['src']); ?>
- <option value="any" <?php if ($pconfig['src'] == "any") { echo "selected=\"selected\""; } ?>><?=gettext("any"); ?></option>
- <option value="single" <?php if (($pconfig['srcmask'] == 32) && !$sel) { echo "selected=\"selected\""; $sel = 1; } ?>><?=gettext("Single host or alias"); ?></option>
- <option value="network" <?php if (!$sel) echo "selected=\"selected\""; ?>><?=gettext("Network"); ?></option>
- <?php if (have_ruleint_access("pptp")): ?>
- <option value="pptp" <?php if ($pconfig['src'] == "pptp") { echo "selected=\"selected\""; } ?>><?=gettext("PPTP clients"); ?></option>
- <?php endif; ?>
- <?php if (have_ruleint_access("pppoe")): ?>
- <option value="pppoe" <?php if ($pconfig['src'] == "pppoe") { echo "selected=\"selected\""; } ?>><?=gettext("PPPoE clients"); ?></option>
- <?php endif; ?>
- <?php if (have_ruleint_access("l2tp")): ?>
- <option value="l2tp" <?php if ($pconfig['src'] == "l2tp") { echo "selected=\"selected\""; } ?>><?=gettext("L2TP clients"); ?></option>
- <?php endif; ?>
-<?php
- foreach ($ifdisp as $ifent => $ifdesc):
- if (have_ruleint_access($ifent)):
-?>
- <option value="<?=$ifent;?>" <?php if ($pconfig['src'] == $ifent) { echo "selected=\"selected\""; } ?>><?=htmlspecialchars($ifdesc);?> <?=gettext("net"); ?></option>
- <option value="<?=$ifent;?>ip"<?php if ($pconfig['src'] == $ifent . "ip") { echo "selected=\"selected\""; } ?>>
- <?=$ifdesc?> <?=gettext("address");?>
- </option>
-<?php
- endif;
- endforeach;
-?>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Address:"); ?>&nbsp;&nbsp;</td>
- <td>
- <input autocomplete='off' name="src" type="text" class="formfldalias" id="src" size="20" value="<?php if (!is_specialnet($pconfig['src'])) echo htmlspecialchars($pconfig['src']);?>" /> /
- <select name="srcmask" class="formselect" id="srcmask">
-<?php for ($i = 31; $i > 0; $i--): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['srcmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
-<?php endfor; ?>
- </select>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr style="display:none" id="sprtable" name="sprtable">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Source port range"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="0" summary="source port range">
- <tr>
- <td><?=gettext("from:"); ?>&nbsp;&nbsp;</td>
- <td>
- <select name="srcbeginport" class="formselect" onchange="src_rep_change();ext_change()">
- <option value="">(<?=gettext("other"); ?>)</option>
- <option value="any" <?php $bfound = 0; if ($pconfig['srcbeginport'] == "any") { echo "selected=\"selected\""; $bfound = 1; } ?>><?=gettext("any"); ?></option>
-<?php foreach ($wkports as $wkport => $wkportdesc): ?>
- <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['srcbeginport']) { echo "selected=\"selected\""; $bfound = 1; } ?>><?=htmlspecialchars($wkportdesc);?></option>
-<?php endforeach; ?>
- </select>
- <input autocomplete='off' class="formfldalias" name="srcbeginport_cust" id="srcbeginport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['srcbeginport']) echo htmlspecialchars($pconfig['srcbeginport']); ?>" />
- </td>
- </tr>
- <tr>
- <td><?=gettext("to:"); ?></td>
- <td>
- <select name="srcendport" class="formselect" onchange="ext_change()">
- <option value="">(<?=gettext("other"); ?>)</option>
- <option value="any" <?php $bfound = 0; if ($pconfig['srcendport'] == "any") { echo "selected=\"selected\""; $bfound = 1; } ?>><?=gettext("any"); ?></option>
-<?php foreach ($wkports as $wkport => $wkportdesc): ?>
- <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['srcendport']) { echo "selected=\"selected\""; $bfound = 1; } ?>><?=htmlspecialchars($wkportdesc);?></option>
-<?php endforeach; ?>
- </select>
- <input autocomplete='off' class="formfldalias" name="srcendport_cust" id="srcendport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['srcendport']) echo htmlspecialchars($pconfig['srcendport']); ?>" />
- </td>
- </tr>
- </table>
- <br />
- <span class="vexpl"><?=gettext("Specify the source port or port range for this rule"); ?>. <b><?=gettext("This is usually"); ?> <em><?=gettext("random"); ?></em> <?=gettext("and almost never equal to the destination port range (and should usually be 'any')"); ?>.</b> <br /> <?=gettext("Hint: you can leave the"); ?> <em>'<?=gettext("to"); ?>'</em> <?=gettext("field empty if you only want to filter a single port."); ?></span><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination"); ?></td>
- <td width="78%" class="vtable">
- <input name="dstnot" type="checkbox" id="dstnot" value="yes" <?php if ($pconfig['dstnot']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("not"); ?></strong>
- <br />
- <?=gettext("Use this option to invert the sense of the match."); ?>
- <br />
- <br />
- <table border="0" cellspacing="0" cellpadding="0" summary="type">
- <tr>
- <td><?=gettext("Type:"); ?>&nbsp;&nbsp;</td>
- <td>
- <select name="dsttype" class="formselect" onchange="typesel_change()">
- <?php $sel = is_specialnet($pconfig['dst']); ?>
- <option value="any" <?php if ($pconfig['dst'] == "any") { echo "selected=\"selected\""; } ?>><?=gettext("any"); ?></option>
- <option value="single" <?php if (($pconfig['dstmask'] == 32) && !$sel) { echo "selected=\"selected\""; $sel = 1; } ?>><?=gettext("Single host or alias"); ?></option>
- <option value="network" <?php if (!$sel) echo "selected=\"selected\""; ?>><?=gettext("Network"); ?></option>
- <option value="(self)" <?PHP if ($pconfig['dst'] == "(self)") echo "selected=\"selected\""; ?>><?=gettext("This Firewall (self)");?></option>
- <?php if (have_ruleint_access("pptp")): ?>
- <option value="pptp" <?php if ($pconfig['dst'] == "pptp") { echo "selected=\"selected\""; } ?>><?=gettext("PPTP clients"); ?></option>
- <?php endif; ?>
- <?php if (have_ruleint_access("pppoe")): ?>
- <option value="pppoe" <?php if ($pconfig['dst'] == "pppoe") { echo "selected=\"selected\""; } ?>><?=gettext("PPPoE clients"); ?></option>
- <?php endif; ?>
- <?php if (have_ruleint_access("l2tp")): ?>
- <option value="l2tp" <?php if ($pconfig['dst'] == "l2tp") { echo "selected=\"selected\""; } ?>><?=gettext("L2TP clients"); ?></option>
- <?php endif; ?>
-
-<?php foreach ($ifdisp as $if => $ifdesc):
- if (have_ruleint_access($if)):
-?>
- <option value="<?=$if;?>" <?php if ($pconfig['dst'] == $if) { echo "selected=\"selected\""; } ?>><?=htmlspecialchars($ifdesc);?> <?=gettext("net"); ?></option>
- <option value="<?=$if;?>ip"<?php if ($pconfig['dst'] == $if . "ip") { echo "selected=\"selected\""; } ?>>
- <?=$ifdesc;?> <?=gettext("address");?>
- </option>
-<?php
- endif;
- endforeach;
-?>
+ if (isset($pconfig['associated-rule-id']))
+ $rulelist['new'] = 'Create new associated filter rule';
-<?php if (is_array($config['virtualip']['vip'])):
- foreach ($config['virtualip']['vip'] as $sn):
- if (isset($sn['noexpand'])) {
- continue;
- }
- if ($sn['mode'] == "proxyarp" && $sn['type'] == "network"):
- $start = ip2long32(gen_subnet($sn['subnet'], $sn['subnet_bits']));
- $end = ip2long32(gen_subnet_max($sn['subnet'], $sn['subnet_bits']));
- $len = $end - $start;
- for ($i = 0; $i <= $len; $i++):
- $snip = long2ip32($start+$i);
-?>
- <option value="<?=$snip;?>" <?php if ($snip == $pconfig['dst']) echo "selected=\"selected\""; ?>><?=htmlspecialchars("{$snip} ({$sn['descr']})");?></option>
-<?php endfor;
- else:
-?>
- <option value="<?=$sn['subnet'];?>" <?php if ($sn['subnet'] == $pconfig['dst']) echo "selected=\"selected\""; ?>><?=htmlspecialchars("{$sn['subnet']} ({$sn['descr']})");?></option>
-<?php endif;
- endforeach;
- endif;
-?>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Address:"); ?>&nbsp;&nbsp;</td>
- <td>
- <input autocomplete='off' name="dst" type="text" class="formfldalias" id="dst" size="20" value="<?php if (!is_specialnet($pconfig['dst'])) echo htmlspecialchars($pconfig['dst']);?>" />
- /
- <select name="dstmask" class="formselect" id="dstmask">
-<?php
- for ($i = 31; $i > 0; $i--): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['dstmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
-<?php endfor; ?>
- </select>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr id="dprtr" name="dprtr">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination port range"); ?> </td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="0" summary="destination port range">
- <tr>
- <td><?=gettext("from:"); ?>&nbsp;&nbsp;</td>
- <td>
- <select name="dstbeginport" id="dstbeginport" class="formselect" onchange="dst_rep_change();ext_change()">
- <option value="">(<?=gettext("other"); ?>)</option>
-<?php $bfound = 0;
- foreach ($wkports as $wkport => $wkportdesc): ?>
- <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['dstbeginport']) { echo "selected=\"selected\""; $bfound = 1; }?>><?=htmlspecialchars($wkportdesc);?></option>
-<?php endforeach; ?>
- </select>
- <input autocomplete='off' class="formfldalias" name="dstbeginport_cust" id="dstbeginport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['dstbeginport']) echo htmlspecialchars($pconfig['dstbeginport']); ?>" />
- </td>
- </tr>
- <tr>
- <td><?=gettext("to:"); ?></td>
- <td>
- <select name="dstendport" id="dstendport" class="formselect" onchange="ext_change()">
- <option value="">(<?=gettext("other"); ?>)</option>
-<?php $bfound = 0;
- foreach ($wkports as $wkport => $wkportdesc): ?>
- <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['dstendport']) { echo "selected=\"selected\""; $bfound = 1; } ?>><?=htmlspecialchars($wkportdesc);?></option>
-<?php endforeach; ?>
- </select>
- <input autocomplete='off' class="formfldalias" name="dstendport_cust" id="dstendport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['dstendport']) echo htmlspecialchars($pconfig['dstendport']); ?>" />
- </td>
- </tr>
- </table>
- <br />
- <span class="vexpl">
- <?=gettext("Specify the port or port range for the destination of the packet for this mapping."); ?>
- <br />
- <?=gettext("Hint: you can leave the"); ?> <em>'<?=gettext("to"); ?>'</em> <?=gettext("field empty if you only want to map a single port"); ?>
- </span>
- </td>
- </tr>
- <tr name="localiptable" id="localiptable">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Redirect target IP"); ?></td>
- <td width="78%" class="vtable">
- <input autocomplete='off' name="localip" type="text" class="formfldalias" id="localip" size="20" value="<?=htmlspecialchars($pconfig['localip']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Enter the internal IP address of the server on which you want to map the ports."); ?>
- <br />
- <?=gettext("e.g."); ?>
- <em>192.168.1.12</em>
- </span>
- </td>
- </tr>
- <tr name="lprtr" id="lprtr">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Redirect target port"); ?></td>
- <td width="78%" class="vtable">
- <select name="localbeginport" id="localbeginport" class="formselect" onchange="ext_change();check_for_aliases();">
- <option value="">(<?=gettext("other"); ?>)</option>
- <?php
- $bfound = 0;
- foreach ($wkports as $wkport => $wkportdesc):
- ?>
- <option value="<?=$wkport;?>"
- <?php if ($wkport == $pconfig['localbeginport']) {
- echo "selected=\"selected\"";
- $bfound = 1;
- }?>>
- <?=htmlspecialchars($wkportdesc);?>
- </option>
- <?php endforeach; ?>
- </select> <input onchange="check_for_aliases();" autocomplete='off' class="formfldalias" name="localbeginport_cust" id="localbeginport_cust" type="text" size="5" value="<?php if (!$bfound) echo htmlspecialchars($pconfig['localbeginport']); ?>" />
- <br />
- <span class="vexpl"><?=gettext("Specify the port on the machine with the " .
- "IP address entered above. In case of a port range, specify " .
- "the beginning port of the range (the end port will be calculated " .
- "automatically)."); ?><br />
- <?=gettext("Hint: this is usually identical to the 'from' port above"); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("No XMLRPC Sync"); ?></td>
- <td width="78%" class="vtable">
- <input type="checkbox" value="yes" name="nosync"<?php if ($pconfig['nosync']) echo " checked=\"checked\""; ?> /><br />
- <?=gettext("Hint: This prevents the rule on Master from automatically syncing to other CARP members. This does NOT prevent the rule from being overwritten on Slave.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("NAT reflection"); ?></td>
- <td width="78%" class="vtable">
- <select name="natreflection" class="formselect">
- <option value="default" <?php if ($pconfig['natreflection'] != "enable" && $pconfig['natreflection'] != "purenat" && $pconfig['natreflection'] != "disable") echo "selected=\"selected\""; ?>><?=gettext("Use system default"); ?></option>
- <option value="enable" <?php if ($pconfig['natreflection'] == "enable") echo "selected=\"selected\""; ?>><?=gettext("Enable (NAT + Proxy)"); ?></option>
- <option value="purenat" <?php if ($pconfig['natreflection'] == "purenat") echo "selected=\"selected\""; ?>><?=gettext("Enable (Pure NAT)"); ?></option>
- <option value="disable" <?php if ($pconfig['natreflection'] == "disable") echo "selected=\"selected\""; ?>><?=gettext("Disable"); ?></option>
- </select>
- </td>
- </tr>
- <?php if (isset($id) && $a_nat[$id] && (!isset($_GET['dup']) || !is_numericint($_GET['dup']))): ?>
- <tr name="assoctable" id="assoctable">
- <td width="22%" valign="top" class="vncell"><?=gettext("Filter rule association"); ?></td>
- <td width="78%" class="vtable">
- <select name="associated-rule-id">
- <option value=""><?=gettext("None"); ?></option>
- <option value="pass" <?php if ($pconfig['associated-rule-id'] == "pass") echo " selected=\"selected\""; ?>><?=gettext("Pass"); ?></option>
- <?php
- $linkedrule = "";
- if (is_array($config['filter']['rule'])) {
- filter_rules_sort();
- foreach ($config['filter']['rule'] as $filter_id => $filter_rule) {
- if (isset($filter_rule['associated-rule-id'])) {
- echo "<option value=\"{$filter_rule['associated-rule-id']}\"";
- if ($filter_rule['associated-rule-id'] == $pconfig['associated-rule-id']) {
- echo " selected=\"selected\"";
- $linkedrule = "<br /><a href=\"firewall_rules_edit.php?id={$filter_id}\">" . gettext("View the filter rule") . "</a><br />";
- }
- echo ">". htmlspecialchars('Rule ' . $filter_rule['descr']) . "</option>\n";
- }
- }
- }
- if (isset($pconfig['associated-rule-id'])) {
- echo "<option value=\"new\">" . gettext("Create new associated filter rule") . "</option>\n";
- }
- echo "</select>\n";
- echo $linkedrule;
- ?>
- </td>
- </tr>
- <?php endif; ?>
- <?php if ((!(isset($id) && $a_nat[$id])) || (isset($_GET['dup']) && is_numericint($_GET['dup']))): ?>
- <tr name="assoctable" id="assoctable">
- <td width="22%" valign="top" class="vncell"><?=gettext("Filter rule association"); ?></td>
- <td width="78%" class="vtable">
- <select name="filter-rule-association" id="filter-rule-association">
- <option value=""><?=gettext("None"); ?></option>
- <option value="add-associated" selected="selected"><?=gettext("Add associated filter rule"); ?></option>
- <option value="add-unassociated"><?=gettext("Add unassociated filter rule"); ?></option>
- <option value="pass"><?=gettext("Pass"); ?></option>
- </select>
- <br /><br /><?=gettext("NOTE: The \"pass\" selection does not work properly with Multi-WAN. It will only work on an interface containing the default gateway.")?>
- </td>
- </tr>
- <?php endif; ?>
-<?php
- // Allow extending of the firewall edit page and include custom input validation
- pfSense_handle_custom_code("/usr/local/pkg/firewall_nat/htmlphplate");
-?>
-<?php
- $has_created_time = (isset($a_nat[$id]['created']) && is_array($a_nat[$id]['created']));
- $has_updated_time = (isset($a_nat[$id]['updated']) && is_array($a_nat[$id]['updated']));
+ $section->addInput(new Form_Select(
+ 'associated-rule-id',
+ 'Filter rule association',
+ 'add-associated',
+ $rulelist
+ ))->setHelp($hlpstr);
+} else {
+ $section->addInput(new Form_Select(
+ 'associated-rule-id',
+ 'Filter rule association',
+ 'add-associated',
+ array(
+ '' => 'None',
+ 'add-associated' => 'Add associated filter rule',
+ 'add-unassociated' => 'Add unassociated filter rule',
+ 'pass' => 'Pass'
+ )
+ ))->setHelp('The "pass" selection does not work properly with Multi-WAN. It will only work on an interface containing the default gateway.');
+}
+
+$form->add($section);
+
+$has_created_time = (isset($a_nat[$id]['created']) && is_array($a_nat[$id]['created']));
+$has_updated_time = (isset($a_nat[$id]['updated']) && is_array($a_nat[$id]['updated']));
+
+if ($has_created_time || $has_updated_time) {
+ $section = new Form_Section('Rule Information');
+
+ if($has_created_time) {
+ $section->addInput(new Form_StaticText(
+ 'Created',
+ date(gettext("n/j/y H:i:s"), $a_nat[$id]['created']['time']) . gettext("by") . $a_nat[$id]['created']['username']
+ ));
+ }
+
+ if($has_updated_time) {
+ $section->addInput(new Form_StaticText(
+ 'Updated',
+ date(gettext("n/j/y H:i:s"), $a_nat[$id]['updated']['time']) . gettext("by") . $a_nat[$id]['updated']['username']
+ ));
+ }
+
+ $form->add($section);
+}
+
+if (isset($id) && $a_nat[$id]) {
+ $form->addGlobal(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->addGlobal(new Form_Input(
+ 'after',
+ null,
+ 'hidden',
+ $after
+));
+
+print($form);
?>
- <?php if ($has_created_time || $has_updated_time): ?>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Rule Information");?></td>
- </tr>
- <?php if ($has_created_time): ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Created");?></td>
- <td width="78%" class="vtable">
- <?= date(gettext("n/j/y H:i:s"), $a_nat[$id]['created']['time']) ?> <?= gettext("by") ?> <strong><?= $a_nat[$id]['created']['username'] ?></strong>
- </td>
- </tr>
- <?php endif; ?>
- <?php if ($has_updated_time): ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Updated");?></td>
- <td width="78%" class="vtable">
- <?= date(gettext("n/j/y H:i:s"), $a_nat[$id]['updated']['time']) ?> <?= gettext("by") ?> <strong><?= $a_nat[$id]['updated']['username'] ?></strong>
- </td>
- </tr>
- <?php endif; ?>
- <?php endif; ?>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">&nbsp;</td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_nat[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- <input name="after" type="hidden" value="<?=htmlspecialchars($after);?>" />
- </td>
- </tr>
- </table>
-</form>
+
<script type="text/javascript">
//<![CDATA[
+events.push(function(){
+ var portsenabled = 1;
+ var dstenabled = 1;
+ var showsource = 0;
+ var iface_old = '';
+
+ // ---------- "Library" functions ---------------------------------------------------------------------------------
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
+ }
+
+ // Hides all elements of the specified class. This will usually be a section
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ // ---------- jQuery functions, lovingly converted from the original javascript------------------------------------------
+ function ext_change() {
+
+ if (($('#srcbeginport').find(":selected").index() == 0) && portsenabled) {
+ disableInput('srcbeginport_cust', false);
+ } else {
+ $('#srcbeginport_cust').val('');
+ disableInput('srcbeginport_cust', true);
+ }
+
+ if (($('#srcendport').find(":selected").index() == 0) && portsenabled) {
+ disableInput('srcendport_cust', false);
+ } else {
+ $('#srcendport_cust').val('');
+ disableInput('srcendport_cust', true);
+ }
+
+ if (($('#dstbeginport').find(":selected").index() == 0) && portsenabled && dstenabled) {
+ disableInput('dstbeginport_cust', false);
+ } else {
+ $('#dstbeginport_cust').val('');
+ disableInput('dstbeginport_cust', true);
+ }
+
+ if (($('#dstendport').find(":selected").index() == 0) && portsenabled && dstenabled) {
+ disableInput('dstendport_cust', false);
+ } else {
+ $('#dstendport_cust').val('');
+ disableInput('dstendport_cust', true);
+ }
+
+ if (($('#localbeginport').find(":selected").index() == 0) && portsenabled) {
+ disableInput('localbeginport_cust', false);
+ } else {
+ $('#localbeginport_cust').val('');
+ disableInput('localbeginport_cust', true);
+ }
+
+ if (!portsenabled) {
+ disableInput('srcbeginport', true);
+ disableInput('srcendport', true);
+ disableInput('dstbeginport', true);
+ disableInput('dstendport', true);
+ disableInput('localbeginport_cust', true);
+ } else {
+ disableInput('srcbeginport', false);
+ disableInput('srcendport', false);
+ disableInput('localbeginport_cust', false);
+ if( dstenabled ) {
+ disableInput('dstbeginport', false);
+ disableInput('dstendport', false);
+ }
+ }
+ }
+
+ function nordr_change() {
+ if( $('#nordr').prop('checked') ) {
+ hideInput('localip', true);
+ hideClass('lclportrange', true);
+ hideInput('associated-rule-id', true);
+ } else {
+ hideInput('localip', false);
+ hideClass('lclportrange', !portsenabled);
+ hideInput('associated-rule-id', false);
+ }
+ }
+
+ var customarray = <?= json_encode(get_alias_list(array("port", "url_ports", "urltable_ports"))) ?>;
+
+ function check_for_aliases() {
+ // if External port range is an alias, then disallow
+ // entry of Local port
+ //
+ for(i=0; i<customarray.length; i++) {
+ if($('#dstbeginport_cust').val() == customarray[i]) {
+ $('#dstendport_cust').val(customarray[i]);
+ $('#localbeginport_cust').val(customarray[i]);
+ disableInput('dstendport_cust', true);
+ disableInput('localbeginport', true);
+ disableInput('localbeginport_cust', true);
+ disableInput('dstendport_cust', false);
+ disableInput('localbeginport', false);
+ disableInput('localbeginport_cust', false);
+ }
+ if($('#dstbeginport').val() == customarray[i]) {
+ $('#dstendport_cust').val(customarray[i]);
+ $('#localbeginport_cust').val(customarray[i]);
+ disableInput('dstendport_cust', true);
+ disableInput('localbeginport', true);
+ disableInput('localbeginport_cust', true);
+ disableInput('dstendport_cust', false);
+ disableInput('localbeginport', false);
+ disableInput('localbeginport_cust', false);
+ }
+ if($('#dstendport_cust').val() == customarray[i]) {
+ $('#dstendport_cust').val(customarray[i]);
+ $('#localbeginport_cust').val(customarray[i]);
+ disableInput('dstendport_cust', true);
+ disableInput('localbeginport', true);
+ disableInput('localbeginport_cust', true);
+ disableInput('dstendport_cust', false);
+ disableInput('localbeginport', false);
+ disableInput('localbeginport_cust', false);
+ }
+ if($('#dstendport').val() == customarray[i]) {
+ $('#dstendport_cust').val(customarray[i]);
+ $('#localbeginport_cust').val(customarray[i]);
+ disableInput('dstendport_cust', true);
+ disableInput('localbeginport', true);
+ disableInput('localbeginport_cust', true);
+ disableInput('dstendport_cust', false);
+ ddisableInput('localbeginport', false);
+ disableInput('localbeginport_cust', false);
+ }
+
+ }
+ }
+
+ function proto_change() {
+ if ($('#proto').find(":selected").index() >= 0 && $('#proto').find(":selected").index() <= 2) {
+ portsenabled = 1;
+ } else {
+ portsenabled = 0;
+ }
+
+ if (portsenabled) {
+ hideClass('srcportrange', showsource == 1);
+ hideClass('dstportrange', false);
+ hideClass('lclportrange', false);
+ } else {
+ hideClass('srcportrange', true);
+ hideClass('dstportrange', true);
+ hideClass('lclportrange', true);
+ $('#dstbeginport').prop("selectedIndex", 0).selectmenu('refresh');
+ $('#dstbeginport_cust').val('');
+ $('#dstendport').prop("selectedIndex", 0).selectmenu('refresh');
+ $('#dstendport_cust').val('');
+ $('#localbeginport').prop("selectedIndex", 0).selectmenu('refresh');
+ $('#localbeginport_cust').val('');
+ }
+ }
+
+ function typesel_change() {
+ switch ($('#srctype').find(":selected").index()) {
+ case 1: // single
+ disableInput('src', false);
+ $('#srcmask').val('');
+ disableInput('srcmask', true);
+ break;
+ case 2: // network
+ disableInput('src', false);
+ disableInput('srcmask', false);
+ break;
+ default:
+ $('#src').val('');
+ disableInput('src', true);
+ $('#srcmask').val('');
+ disableInput('srcmask', true);
+ break;
+ }
+
+ if(dstenabled) {
+ switch ($('#dsttype').find(":selected").index()) {
+ case 1: // single
+ disableInput('dst', false);
+ $('#dstmask').val('');
+ disableInput('dstmask', true);;
+ break;
+ case 2: // network /
+ disableInput('dst', false);
+ disableInput('dstmask', false);
+ break;
+ default:
+ $('#dst').val('');
+ disableInput('dst', true);
+ $('#dstmask').val('');
+ disableInput('dstmask', true);
+ break;
+ }
+ }
+ }
+
+ function src_rep_change() {
+ $('#srcendport').prop("selectedIndex", $('#srcbeginport').find(":selected").index());
+ }
+
+ function dst_rep_change() {
+ $('#dstendport').prop("selectedIndex", $('#dstbeginport').find(":selected").index());
+ }
+
+ function dst_change( iface, old_iface, old_dst ) {
+ if ( ( old_dst == "" ) || ( old_iface.concat("ip") == old_dst ) ) {
+ $('#dsttype').val(iface + "ip");
+ }
+ }
+
+ // ---------- "onclick" functions ---------------------------------------------------------------------------------
+ $('#srcbeginport').on('change', function() {
+ src_rep_change();
+ ext_change();
+ });
+
+ $('#srcendport').on('change', function() {
+ ext_change();
+ });
+
+ $('#dstbeginport').on('change', function() {
+ dst_rep_change();
+ ext_change();
+ });
+
+ $('#dstendport').on('change', function() {
+ ext_change();
+ });
+
+ $('#localbeginport').on('change', function() {
+ ext_change();
+ check_for_aliases();
+ });
+
+ $('#proto').on('change', function() {
+ proto_change();
+ check_for_aliases()
+ });
+
+ $('#nordr').click(function () {
+ nordr_change();
+ });
+
+ $('#interface').click(function () {
+ dst_change($('#interface').val(), iface_old, $('#dsttype').val());
+ iface_old = $('#interface').val();
+ typesel_change();
+ });
+
+ $('#srctype').click(function () {
+ typesel_change();
+ });
+
+ $('#dsttype').click(function () {
+ typesel_change();
+ });
+
+ // ---------- On initial page load --------------------------------------------------------------------------------
+
ext_change();
- dst_change(document.iform.interface.value,'<?=htmlspecialchars($pconfig['interface'])?>','<?=htmlspecialchars($pconfig['dst'])?>');
- var iface_old = document.iform.interface.value;
+ dst_change($('#interface').val(),'<?=htmlspecialchars($pconfig['interface'])?>','<?=htmlspecialchars($pconfig['dst'])?>');
+ iface_old = $('#interface').val();
typesel_change();
proto_change();
- <?php if ($pconfig['srcnot'] || $pconfig['src'] != "any" || $pconfig['srcbeginport'] != "any" || $pconfig['srcendport'] != "any"): ?>
- show_source();
- <?php endif; ?>
nordr_change();
+
+});
//]]>
</script>
-<script type="text/javascript">
-//<![CDATA[
- var addressarray = <?= json_encode(get_alias_list(array("host", "network", "openvpn", "urltable"))) ?>;
- var customarray = <?= json_encode(get_alias_list(array("port", "url_ports", "urltable_ports"))) ?>;
-
- var oTextbox1 = new AutoSuggestControl(document.getElementById("localip"), new StateSuggestions(addressarray));
- var oTextbox2 = new AutoSuggestControl(document.getElementById("src"), new StateSuggestions(addressarray));
- var oTextbox3 = new AutoSuggestControl(document.getElementById("dst"), new StateSuggestions(addressarray));
- var oTextbox4 = new AutoSuggestControl(document.getElementById("dstbeginport_cust"), new StateSuggestions(customarray));
- var oTextbox5 = new AutoSuggestControl(document.getElementById("dstendport_cust"), new StateSuggestions(customarray));
- var oTextbox6 = new AutoSuggestControl(document.getElementById("srcbeginport_cust"), new StateSuggestions(customarray));
- var oTextbox7 = new AutoSuggestControl(document.getElementById("srcendport_cust"), new StateSuggestions(customarray));
- var oTextbox8 = new AutoSuggestControl(document.getElementById("localbeginport_cust"), new StateSuggestions(customarray));
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_nat_npt.php b/src/usr/local/www/firewall_nat_npt.php
index 003bd88..aedb2dc 100644
--- a/src/usr/local/www/firewall_nat_npt.php
+++ b/src/usr/local/www/firewall_nat_npt.php
@@ -2,37 +2,61 @@
/* $Id$ */
/*
firewall_nat_npt.php
- part of pfSense (https://www.pfsense.org)
-
- Copyright (C) 2011 Seth Mos <seth.mos@dds.nl>.
- All rights reserved.
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) Copyright (C) 2011 Seth Mos <seth.mos@dds.nl>
+ * part of m0n0wall (http://m0n0.ch/wall)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: nat
+ pfSense_MODULE: nat
*/
##|+PRIV
@@ -47,13 +71,12 @@ require_once("functions.inc");
require_once("filter.inc");
require_once("shaper.inc");
-if (!is_array($config['nat']['npt'])) {
+if (!is_array($config['nat']['npt']))
$config['nat']['npt'] = array();
-}
+
$a_npt = &$config['nat']['npt'];
if ($_POST) {
-
$pconfig = $_POST;
if ($_POST['apply']) {
@@ -82,114 +105,94 @@ if ($_GET['act'] == "del") {
$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("NPt"));
include("head.inc");
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('natconf'))
+ print_info_box_np(gettext("The NAT configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
+
+$tab_array = array();
+$tab_array[] = array(gettext("Port Forward"), false, "firewall_nat.php");
+$tab_array[] = array(gettext("1:1"), false, "firewall_nat_1to1.php");
+$tab_array[] = array(gettext("Outbound"), false, "firewall_nat_out.php");
+$tab_array[] = array(gettext("NPt"), true, "firewall_nat_npt.php");
+display_top_tabs($tab_array);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="firewall_nat_npt.php" method="post">
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('natconf')): ?>
-<?php print_info_box_np(gettext("The NAT configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall nat npt">
- <tr><td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Port Forward"), false, "firewall_nat.php");
- $tab_array[] = array(gettext("1:1"), false, "firewall_nat_1to1.php");
- $tab_array[] = array(gettext("Outbound"), false, "firewall_nat_out.php");
- $tab_array[] = array(gettext("NPt"), true, "firewall_nat_npt.php");
- display_top_tabs($tab_array);
-?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="10%" class="listhdrr"><?=gettext("Interface"); ?></td>
- <td width="20%" class="listhdrr"><?=gettext("External Prefix"); ?></td>
- <td width="15%" class="listhdrr"><?=gettext("Internal prefix"); ?></td>
- <td width="30%" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td width="17"></td>
- <td valign="middle"><a href="firewall_nat_npt_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add rule"); ?>" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
-<?php
- $textse = "</span>";
- $i = 0;
- foreach ($a_npt as $natent):
+<div class="panel-body table responsive">
+ <form method="post">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Interface")?></th>
+ <th><?=gettext("External Prefix")?></th>
+ <th><?=gettext("Internal prefix")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><!-- Buttons --></th>
+ </tr>
+ </thead>
+ <tbody class="user-entries">
+<?php
- if (isset($natent['disabled'])) {
- $textss = "<span class=\"gray\">";
- } else {
- $textss = "<span>";
- }
+$i = 0;
+foreach ($a_npt as $natent):
?>
- <tr>
- <td class="listlr" ondblclick="document.location='firewall_nat_npt_edit.php?id=<?=$i;?>';">
+ <tr<?=isset($natent['disabled'])? ' class="disabled"' : ''?>>
+ <td>
+ <input type="hidden" name="rule[]" value="<?=$i?>" />
<?php
- echo $textss;
- if (!$natent['interface']) {
- echo htmlspecialchars(convert_friendly_interface_to_friendly_descr("wan"));
- } else {
- echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface']));
- }
- echo $textse;
+ if (!$natent['interface'])
+ print(htmlspecialchars(convert_friendly_interface_to_friendly_descr("wan")));
+ else
+ print(htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface'])));
?>
- </td>
+ </td>
<?php
- $source_net = pprint_address($natent['source']);
- $source_cidr = strstr($source_net, '/');
- $destination_net = pprint_address($natent['destination']);
- $destination_cidr = strstr($destination_net, '/');
+ $source_net = pprint_address($natent['source']);
+ $source_cidr = strstr($source_net, '/');
+ $destination_net = pprint_address($natent['destination']);
+ $destination_cidr = strstr($destination_net, '/');
?>
- <td class="listr" ondblclick="document.location='firewall_nat_npt_edit.php?id=<?=$i;?>';">
- <?php echo $textss . $destination_net . $textse; ?>
- </td>
- <td class="listr" ondblclick="document.location='firewall_nat_npt_edit.php?id=<?=$i;?>';">
- <?php echo $textss . $source_net . $textse; ?>
- </td>
- <td class="listbg" ondblclick="document.location='firewall_nat_npt_edit.php?id=<?=$i;?>';">
- <?=$textss;?>
- <?=htmlspecialchars($natent['descr']);?>&nbsp;
- <?=$textse;?>
- </td>
- <td class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tr>
- <td valign="middle"><a href="firewall_nat_npt_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit rule"); ?>" alt="edit" /></a></td>
- <td valign="middle"><a href="firewall_nat_npt.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this mapping?");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule"); ?>" alt="delete" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
+ <td>
+ <?=$destination_net?>
+ </td>
+ <td>
+ <?=$source_net?>
+ </td>
+ <td>
+ <?=htmlspecialchars($natent['descr'])?>
+ </td>
+ <td>
+ <a href="firewall_nat_npt_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext("Edit")?></a>
+ <a href="firewall_nat_npt.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext("Delete")?></a>
+ </td>
+ </tr>
<?php
- $i++;
- endforeach;
+ $i++;
+endforeach;
?>
- <tr>
- <td class="list" colspan="4"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td width="17"></td>
- <td valign="middle"><a href="firewall_nat_npt_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add rule"); ?>" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
+ </tbody>
+ </table>
+</div>
+
+<nav class="action-buttons">
+ <a href="firewall_nat_npt_edit.php" class="btn btn-sm btn-success"><?=gettext("Add rule")?></a>
+ <input type="submit" id="order-store" class="btn btn-primary btn-sm" value="store changes" disabled="disabled" />
+</nav>
+
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<script>
+events.push(function() {
+ // Make rules draggable/sortable
+ $('table tbody.user-entries').sortable({
+ cursor: 'grabbing',
+ update: function(event, ui) {
+ $('#order-store').removeAttr('disabled');
+ }
+ });
+});
+</script>
+
+<?php
+
+include("foot.inc");
diff --git a/src/usr/local/www/firewall_nat_npt_edit.php b/src/usr/local/www/firewall_nat_npt_edit.php
index addddd2..7e385e5 100644
--- a/src/usr/local/www/firewall_nat_npt_edit.php
+++ b/src/usr/local/www/firewall_nat_npt_edit.php
@@ -2,35 +2,61 @@
/* $Id$ */
/*
firewall_nat_npt_edit.php
- part of pfSense (https://www.pfsense.org)
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2011 Seth Mos <seth.mos@dds.nl>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2011 Seth Mos <seth.mos@dds.nl>
+ * part of pfSense (https://www.pfsense.org)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: nat
+ pfSense_MODULE: nat
*/
##|+PRIV
@@ -59,21 +85,16 @@ require_once("interfaces.inc");
require_once("filter.inc");
require("shaper.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_nat_npt.php');
-}
-
$ifdisp = get_configured_interface_with_descr();
+
foreach ($ifdisp as $kif => $kdescr) {
$specialsrcdst[] = "{$kif}";
$specialsrcdst[] = "{$kif}ip";
}
-if (!is_array($config['nat']['npt'])) {
+if (!is_array($config['nat']['npt']))
$config['nat']['npt'] = array();
-}
+
$a_npt = &$config['nat']['npt'];
if (is_numericint($_GET['id'])) {
@@ -155,157 +176,110 @@ if ($_POST) {
}
}
-$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("NPt"), gettext("Edit"));
+function build_if_list() {
+ global $ifdisp;
+
+ foreach ($ifdisp as $if => $ifdesc) {
+ if(have_ruleint_access($if))
+ $interfaces[$if] = $ifdesc;
+ }
+
+ if ($config['l2tp']['mode'] == "server")
+ if(have_ruleint_access("l2tp"))
+ $interfaces['l2tp'] = "L2TP VPN";
+
+ if ($config['pptpd']['mode'] == "server")
+ if(have_ruleint_access("pptp"))
+ $interfaces['pptp'] = "PPTP VPN";
+
+ if ($config['pppoe']['mode'] == "server")
+ if(have_ruleint_access("pppoe"))
+ $interfaces['pppoe'] = "PPPoE Server";
+
+ /* add ipsec interfaces */
+ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['mobileclients']['enable'])) {
+ if(have_ruleint_access("enc0"))
+ $interfaces["enc0"] = "IPsec";
+ }
+
+ /* add openvpn/tun interfaces */
+ if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"])
+ $interfaces["openvpn"] = "OpenVPN";
+
+ return($interfaces);
+}
+
+$pgtitle = array(gettext("Firewall"),gettext("NAT"),gettext("NPt"),gettext("Edit"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<script type="text/javascript" src="/javascript/suggestions.js"></script>
-<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
-
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="firewall_nat_npt_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall nat npt edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit NAT NPt entry"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
- <td width="78%" class="vtable">
- <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable this rule"); ?></strong><br />
- <span class="vexpl"><?=gettext("Set this option to disable this rule without removing it from the list."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
- <td width="78%" class="vtable">
- <select name="interface" class="formselect">
- <?php
- foreach ($ifdisp as $if => $ifdesc) {
- if (have_ruleint_access($if)) {
- $interfaces[$if] = $ifdesc;
- }
- }
-
- if ($config['l2tp']['mode'] == "server") {
- if (have_ruleint_access("l2tp")) {
- $interfaces['l2tp'] = "L2TP VPN";
- }
- }
-
- if ($config['pptpd']['mode'] == "server") {
- if (have_ruleint_access("pptp")) {
- $interfaces['pptp'] = "PPTP VPN";
- }
- }
-
- if ($config['pppoe']['mode'] == "server") {
- if (have_ruleint_access("pppoe")) {
- $interfaces['pppoe'] = "PPPoE Server";
- }
- }
-
- /* add ipsec interfaces */
- if (isset($config['ipsec']['enable']) || isset($config['ipsec']['mobileclients']['enable'])) {
- if (have_ruleint_access("enc0")) {
- $interfaces["enc0"] = "IPsec";
- }
- }
-
- /* add openvpn/tun interfaces */
- if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
- $interfaces["openvpn"] = "OpenVPN";
- }
-
- foreach ($interfaces as $iface => $ifacename):
- ?>
- <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
- <?php endforeach; ?>
- </select><br />
- <span class="vexpl"><?=gettext("Choose which interface this rule applies to"); ?>.<br />
- <?=gettext("Hint: in most cases, you'll want to use WAN here"); ?>.
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Internal IPv6 Prefix"); ?></td>
- <td width="78%" class="vtable">
- <input name="srcnot" type="checkbox" id="srcnot" value="yes" <?php if ($pconfig['srcnot']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("not"); ?></strong>
- <br />
- <?=gettext("Use this option to invert the sense of the match."); ?>
- <br />
- <br />
- <table border="0" cellspacing="0" cellpadding="0" summary="internal">
- <tr>
- <td><?=gettext("Address:"); ?>&nbsp;&nbsp;</td>
- <td>
- <input name="src" type="text" class="formfldalias" id="src" size="20" value="<?php if (!is_specialnet($pconfig['src'])) echo htmlspecialchars($pconfig['src']);?>" /> /
- <select name="srcmask" class="formselect" id="srcmask">
-<?php for ($i = 128; $i > 0; $i--): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['srcmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
-<?php endfor; ?>
- </select>
- </td>
- </tr>
- </table>
- <br />
- <span class="vexpl"><?=gettext("Enter the internal (LAN) ULA IPv6 Prefix for the Network Prefix translation. The prefix size specified for the internal IPv6 prefix will be applied to the external prefix.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination IPv6 Prefix"); ?></td>
- <td width="78%" class="vtable">
- <input name="dstnot" type="checkbox" id="dstnot" value="yes" <?php if ($pconfig['dstnot']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("not"); ?></strong>
- <br />
- <?=gettext("Use this option to invert the sense of the match."); ?>
- <br />
- <br />
- <table border="0" cellspacing="0" cellpadding="0" summary="destination">
- <tr>
- <td><?=gettext("Address:"); ?>&nbsp;&nbsp;</td>
- <td>
- <input name="dst" type="text" class="formfldalias" id="dst" size="20" value="<?php if (!is_specialnet($pconfig['dst'])) echo htmlspecialchars($pconfig['dst']);?>" />
- /
- <select name="dstmask" class="formselect" id="dstmask">
-<?php
- for ($i = 128; $i > 0; $i--): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['dstmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
-<?php endfor; ?>
- </select>
- </td>
- </tr>
- </table>
- <br />
- <span class="vexpl"><?=gettext("Enter the Global Unicast routable IPv6 prefix here"); ?><br /></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br /> <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_npt[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Edit NAT NPt entry');
+
+$section->addInput(new Form_Checkbox(
+ 'disabled',
+ 'Disabled',
+ 'Disable this rule',
+ $pconfig['disabled']
+));
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ $pconfig['interface'],
+ build_if_list()
+))->setHelp('Choose which interface this rule applies to.' . '<br />' .
+ 'Hint: in most cases, you\'ll want to use "WAN" here.');
+
+$section->addInput(new Form_Checkbox(
+ 'srcnot',
+ 'Internal IPv6 prefix',
+ 'Not',
+ $pconfig['srcnot']
+))->setHelp('Use this option to invert the sense of the match. ');
+
+$section->addInput(new Form_IpAddress(
+ 'src',
+ 'Address',
+ $pconfig['src']
+))->addMask('srcmask', $pconfig['srcmask'])->setHelp('Internal (LAN) ULA IPv6 Prefix for the Network Prefix translation. ' .
+ 'The prefix size specified for the internal IPv6 prefix will be applied to the external prefix.');
+
+$section->addInput(new Form_Checkbox(
+ 'dstnot',
+ 'Destination IPv6 prefix',
+ 'Not',
+ $pconfig['dstnot']
+))->setHelp('Use this option to invert the sense of the match. ');
+
+$section->addInput(new Form_IpAddress(
+ 'dst',
+ 'Address',
+ $pconfig['dst']
+))->addMask('dstmask', $pconfig['dstmask'])->setHelp('Global Unicast routable IPv6 prefix');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+if (isset($id) && $a_npt[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_nat_out.php b/src/usr/local/www/firewall_nat_out.php
index d560abe..8f3d458 100644
--- a/src/usr/local/www/firewall_nat_out.php
+++ b/src/usr/local/www/firewall_nat_out.php
@@ -2,37 +2,62 @@
/* $Id$ */
/*
firewall_nat_out.php
- Copyright (C) 2004 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004 Scott Ullrich
+ * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>
+ * Originally part of pfSense (https://www.pfsense.org)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: nat
+ pfSense_MODULE: nat
*/
##|+PRIV
@@ -60,10 +85,26 @@ if (!is_array($config['nat']['outbound']['rule'])) {
$a_out = &$config['nat']['outbound']['rule'];
-if (!isset($config['nat']['outbound']['mode'])) {
- $config['nat']['outbound']['mode'] = "automatic";
+/* update rule order, POST[rule] is an array of ordered IDs */
+if (is_array($_POST['rule']) && !empty($_POST['rule'])) {
+ $a_out_new = array();
+
+ // if a rule is not in POST[rule], it has been deleted by the user
+ foreach ($_POST['rule'] as $id)
+ $a_out_new[] = $a_out[$id];
+
+ $a_out = $a_out_new;
+
+ if (write_config())
+ mark_subsystem_dirty('filter');
+
+ header("Location: firewall_nat_out.php");
+ exit;
}
+if (!isset($config['nat']['outbound']['mode']))
+ $config['nat']['outbound']['mode'] = "automatic";
+
$mode = $config['nat']['outbound']['mode'];
if ($_POST['apply']) {
@@ -86,9 +127,9 @@ if (isset($_POST['save']) && $_POST['save'] == "Save") {
/* mutually exclusive settings - if user wants advanced NAT, we don't generate automatic rules */
if ($_POST['mode'] == "advanced" && ($mode == "automatic" || $mode == "hybrid")) {
/*
- * user has enabled advanced outbound NAT and doesn't have rules
- * lets automatically create entries
- * for all of the interfaces to make life easier on the pip-o-chap
+ * user has enabled advanced outbound NAT and doesn't have rules
+ * lets automatically create entries
+ * for all of the interfaces to make life easier on the pip-o-chap
*/
if (empty($FilterIflist)) {
filter_generate_optcfg_array();
@@ -111,10 +152,10 @@ if (isset($_POST['save']) && $_POST['save'] == "Save") {
$found = false;
foreach ($a_out as $rule) {
if ($rule['interface'] == $natent['interface'] &&
- $rule['source']['network'] == $natent['source']['network'] &&
- $rule['dstport'] == $natent['dstport'] &&
- $rule['target'] == $natent['target'] &&
- $rule['descr'] == $natent['descr']) {
+ $rule['source']['network'] == $natent['source']['network'] &&
+ $rule['dstport'] == $natent['dstport'] &&
+ $rule['target'] == $natent['target'] &&
+ $rule['descr'] == $natent['descr']) {
$found = true;
break;
}
@@ -228,468 +269,468 @@ if (isset($_POST['del_x'])) {
}
}
-$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("Outbound"));
-include("head.inc");
+function rule_popup($src,$srcport,$dst,$dstport){
+ global $config,$g;
+ $aliases_array = array();
+ if ($config['aliases']['alias'] <> "" and is_array($config['aliases']['alias'])) {
+ $descriptions = array ();
+
+ foreach ($config['aliases']['alias'] as $alias_id=>$alias_name){
+ $loading_image="<a><img src=\'/themes/{$g['theme']}/images/misc/loader.gif\' alt=\'loader\' /> " .gettext("loading...")."</a>";
+
+ switch ($alias_name['type']){
+ case "port":
+ $width="250";
+ break;
+ case "urltable":
+ $width="500";
+ break;
+ default:
+ $width="350";
+
+ break;
+ }
+ $span_begin = "<span style=\"cursor: help;\" onmouseover=\"var response_html=domTT_activate(this, event, 'id','ttalias_{$alias_id}','content','{$loading_image}', 'trail', true, 'delay', 300, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle','type','velcro','width',{$width});alias_popup('{$alias_id}','{$g['theme']}','".gettext('loading...')."');\" onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\"><u>";
+ $span_end = "</u></span>";
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="firewall_nat_out.php" method="post" name="iform">
-<script type="text/javascript" src="/javascript/row_toggle.js"></script>
-<?php
-if ($savemsg) {
- print_info_box($savemsg);
+ if ($alias_name['name'] == $src) {
+ $descriptions['src'] = $span_begin;
+ $descriptions['src_end'] = $span_end;
+ }
+
+ if ($alias_name['name'] == $srcport) {
+ $descriptions['srcport'] = $span_begin;
+ $descriptions['srcport_end'] = $span_end;
+ }
+
+ if ($alias_name['name'] == $dst ) {
+ $descriptions['dst'] = $span_begin;
+ $descriptions['dst_end'] = $span_end;
+ }
+
+ if ($alias_name['name'] == $dstport) {
+ $descriptions['dstport'] = $span_begin;
+ $descriptions['dstport_end'] = $span_end;
+ }
+ }
+
+ return $descriptions;
+ }
}
-if (is_subsystem_dirty('natconf')) {
+
+$pgtitle = array(gettext("Firewall"),gettext("NAT"),gettext("Outbound"));
+include("head.inc");
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('natconf'))
print_info_box_np(gettext("The NAT configuration has been changed.")."<br />".gettext("You must apply the changes in order for them to take effect."));
-}
+
+$tab_array = array();
+$tab_array[] = array(gettext("Port Forward"), false, "firewall_nat.php");
+$tab_array[] = array(gettext("1:1"), false, "firewall_nat_1to1.php");
+$tab_array[] = array(gettext("Outbound"), true, "firewall_nat_out.php");
+$tab_array[] = array(gettext("NPt"), false, "firewall_nat_npt.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('General Logging Options');
+
+$group = new Form_Group('Mode');
+
+$group->add(new Form_Checkbox(
+ 'mode',
+ 'Mode',
+ null,
+ $mode == 'automatic',
+ 'automatic'
+))->displayAsRadio()->setHelp('Automatic outbound NAT rule generation.' . '<br />' . '(IPsec passthrough included)');
+
+$group->add(new Form_Checkbox(
+ 'mode',
+ null,
+ null,
+ $mode == 'hybrid',
+ 'hybrid'
+))->displayAsRadio()->setHelp('Hybrid Outbound NAT rule generation.' . '<br />' . '(Automatic Outbound NAT + rules below)');
+
+$group->add(new Form_Checkbox(
+ 'mode',
+ null,
+ null,
+ $mode == 'advanced',
+ 'advanced'
+))->displayAsRadio()->setHelp('Manual Outbound NAT rule generation.' . '<br />' . '(AON - Advanced Outbound NAT)');
+
+$group->add(new Form_Checkbox(
+ 'mode',
+ null,
+ null,
+ $mode == 'disabled',
+ 'disabled'
+))->displayAsRadio()->setHelp('Disable Outbound NAT rule generation.' . '<br />' . '(No Outbound NAT rules)');
+
+$section->add($group);
+
+$form->add($section);
+print($form);
?>
-<br />
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall nat outbound">
- <tr><td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Port Forward"), false, "firewall_nat.php");
- $tab_array[] = array(gettext("1:1"), false, "firewall_nat_1to1.php");
- $tab_array[] = array(gettext("Outbound"), true, "firewall_nat_out.php");
- $tab_array[] = array(gettext("NPt"), false, "firewall_nat_npt.php");
- display_top_tabs($tab_array);
-?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td rowspan="3" align="right" valign="middle"><b><?=gettext("Mode:"); ?></b></td>
- <td>
- <input name="mode" type="radio" id="automatic" value="automatic" <?php if ($mode == "automatic") echo "checked=\"checked\"";?> />
- </td>
- <td>
- <strong>
- <?=gettext("Automatic outbound NAT rule generation"); ?><br />
- <?=gettext("(IPsec passthrough included)");?>
- </strong>
- </td>
- <td>
- <input name="mode" type="radio" id="hybrid" value="hybrid" <?php if ($mode == "hybrid") echo "checked=\"checked\"";?> />
- </td>
- <td>
- <strong>
- <?=gettext("Hybrid Outbound NAT rule generation"); ?><br />
- <?=gettext("(Automatic Outbound NAT + rules below)");?>
- </strong>
- </td>
- <td rowspan="3" valign="middle" align="left">
- <input name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- </td>
- </tr>
- <tr>
- <td colspan="4">
- &nbsp;
- </td>
- </tr>
- <tr>
- <td>
- <input name="mode" type="radio" id="advanced" value="advanced" <?php if ($mode == "advanced") echo "checked=\"checked\"";?> />
- </td>
- <td>
- <strong>
- <?=gettext("Manual Outbound NAT rule generation"); ?><br />
- <?=gettext("(AON - Advanced Outbound NAT)");?>
- </strong>
- </td>
- <td>
- <input name="mode" type="radio" id="disabled" value="disabled" <?php if ($mode == "disabled") echo "checked=\"checked\"";?> />
- </td>
- <td>
- <strong>
- <?=gettext("Disable Outbound NAT rule generation"); ?><br />
- <?=gettext("(No Outbound NAT rules)");?>
- </strong>
- </td>
- </tr>
- <tr>
- <td colspan="6">
- &nbsp;
- </td>
- </tr>
- </table>
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="mappings">
- <tr><td colspan="5"><b>&nbsp;<?=gettext("Mappings:"); ?></b></td></tr>
- <tr><td>&nbsp;</td></tr>
- <tr id="frheader">
- <td width="3%" class="list">&nbsp;</td>
- <td width="3%" class="list">&nbsp;</td>
- <td width="10%" class="listhdrr"><?=gettext("Interface");?></td>
- <td width="15%" class="listhdrr"><?=gettext("Source");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Source Port");?></td>
- <td width="15%" class="listhdrr"><?=gettext("Destination");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Destination Port");?></td>
- <td width="15%" class="listhdrr"><?=gettext("NAT Address");?></td>
- <td width="10%" class="listhdrr"><?=gettext("NAT Port");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Static Port");?></td>
- <td width="25%" class="listhdr"><?=gettext("Description");?></td>
- <td width="5%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td width="17"></td>
- <td>
- <a href="firewall_nat_out_edit.php?after=-1">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add new mapping");?>" alt="add" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+
+<form action="firewall_nat_out.php" method="post" name="iform">
+ <div class="panel panel-default">
+ <div class="panel-heading"><?=gettext('Mappings')?></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><!-- status --></th>
+ <th><?=gettext("Interface")?></th>
+ <th><?=gettext("Source")?></th>
+ <th><?=gettext("Source Port")?></th>
+ <th><?=gettext("Destination")?></th>
+ <th><?=gettext("Destination Port")?></th>
+ <th><?=gettext("NAT Address")?></th>
+ <th><?=gettext("NAT Port")?></th>
+ <th><?=gettext("Static Port")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><?=gettext("Actions")?></th>
+ </tr>
+ </thead>
+ <tbody class="user-entries">
<?php
$i = 0;
foreach ($a_out as $natent):
$iconfn = "pass";
$textss = $textse = "";
- if ($mode == "disabled" || $mode == "automatic" || isset($natent['disabled'])) {
- $textss = "<span class=\"gray\">";
- $textse = "</span>";
+ if ($mode == "disabled" || $mode == "automatic" || isset($natent['disabled']))
$iconfn .= "_d";
- }
-
- //build Alias popup box
- $alias_src_span_begin = "";
- $alias_src_port_span_begin = "";
- $alias_dst_span_begin = "";
- $alias_dst_port_span_begin = "";
- $alias_popup = rule_popup($natent['source']['network'], pprint_port($natent['sourceport']), $natent['destination']['address'], pprint_port($natent['dstport']));
- $alias_src_span_begin = $alias_popup["src"];
- $alias_src_port_span_begin = $alias_popup["srcport"];
- $alias_dst_span_begin = $alias_popup["dst"];
- $alias_dst_port_span_begin = $alias_popup["dstport"];
-
- $alias_src_span_end = $alias_popup["src_end"];
- $alias_src_port_span_end = $alias_popup["srcport_end"];
- $alias_dst_span_end = $alias_popup["dst_end"];
- $alias_dst_port_span_end = $alias_popup["dstport_end"];
+ $alias = rule_columns_with_alias(
+ $natent['source']['address'],
+ pprint_port($natent['source']['port']),
+ $natent['destination']['address'],
+ pprint_port($natent['destination']['port'])
+ );
?>
- <tr valign="top" id="fr<?=$i;?>">
- <td class="listt">
- <input type="checkbox" id="frc<?=$i;?>" name="rule[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
- </td>
- <td class="listt" align="center">
+ <tr id="fr<?=$i?>">
+ <td>
<?php
if ($mode == "disabled" || $mode == "automatic"):
?>
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0"
- title="<?=gettext("This rule is being ignored");?>" alt="icon" />
+ <i class="<?= ($iconfn == "pass") ? "icon-ok":"icon-remove"?>"title="<?=gettext("Click to toggle enabled/disabled status")?>"></i>
<?php
else:
?>
- <a href="?act=toggle&amp;id=<?=$i;?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0"
- title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" />
- </a>
+ <a href="?act=toggle&amp;id=<?=$i?>">
+ <i class="<?= ($iconfn == "pass") ? "icon-ok":"icon-remove"?>" title="<?=gettext("Click to toggle enabled/disabled status")?>"></i>
+ </a>
+
<?php
endif;
?>
- </td>
- <td class="listlr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
- <?php echo $textss . htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface'])) . $textse; ?>
- &nbsp;
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
- <?php $natent['source']['network'] = ($natent['source']['network'] == "(self)") ? "This Firewall" : $natent['source']['network']; ?>
- <?php echo $textss . $alias_src_span_begin . $natent['source']['network'] . $alias_src_span_end . $textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
-<?php
- echo $textss;
+ </td>
+
+ <td>
+ <input type="hidden" name="rule[]" value="<?=$i?>" />
+ <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface']))?>
+ </td>
+
+ <td>
+<?php
+ $natent['source']['network'] = ($natent['source']['network'] == "(self)") ? "This Firewall" : $natent['source']['network'];
+?>
+<?php
+ if (isset($alias['src'])):
+?>
+ <a href="/firewall_aliases_edit.php?id=<?=$alias['src']?>" data-toggle="popover" data-trigger="hover focus" title="Alias details" data-content="<?=alias_info_popup($alias['src'])?>" data-html="true">
+<?php
+ endif;
+?>
+ <?=htmlspecialchars($natent['source']['network'])?>
+<?php
+ if (isset($alias['src'])):
+?>
+ <i class='icon icon-pencil'></i></a>
+<?php
+ endif;
+?>
+ </td>
+
+ <td>
+<?php
echo ($natent['protocol']) ? $natent['protocol'] . '/' : "" ;
- if (!$natent['sourceport']) {
+ if (!$natent['sourceport'])
echo "*";
- } else {
- echo $alias_src_port_span_begin . $natent['sourceport'] . $alias_src_port_span_end;
+ else {
+
+ if (isset($alias['srcport'])):
+?>
+ <a href="/firewall_aliases_edit.php?id=<?=$alias['srcport']?>" data-toggle="popover" data-trigger="hover focus" title="Alias details" data-content="<?=alias_info_popup($alias['srcport'])?>" data-html="true">
+<?php
+ endif;
+?>
+ <?=htmlspecialchars($natent['sourceport'])?>
+<?php
+ if (isset($alias['srcport'])):
+?>
+ <i class='icon icon-pencil'></i></a>
+<?php
+ endif;
}
- echo $textse;
?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
+ </td>
+
+ <td>
<?php
- echo $textss;
- if (isset($natent['destination']['any'])) {
+ if (isset($natent['destination']['any']))
echo "*";
- } else {
- if (isset($natent['destination']['not'])) {
+ else {
+ if (isset($natent['destination']['not']))
echo "!&nbsp;";
- }
- echo $alias_dst_span_begin . $natent['destination']['address'] . $alias_dst_span_end;
+
+
+ if (isset($alias['dst'])):
+?>
+ <a href="/firewall_aliases_edit.php?id=<?=$alias['dst']?>" data-toggle="popover" data-trigger="hover focus" title="Alias details" data-content="<?=alias_info_popup($alias['dst'])?>" data-html="true">
+<?php
+ endif;
+?>
+ <?=htmlspecialchars($natent['destination']['address'])?>
+<?php
+ if (isset($alias['dst'])):
+?>
+ <i class='icon icon-pencil'></i></a>
+<?php
+ endif;
}
- echo $textse;
?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
+ </td>
+
+ <td>
<?php
- echo $textss;
echo ($natent['protocol']) ? $natent['protocol'] . '/' : "" ;
- if (!$natent['dstport']) {
+
+ if (!$natent['dstport'])
echo "*";
- } else {
- echo $alias_dst_port_span_begin . $natent['dstport'] . $alias_dst_port_span_end;
+ else {
+ if (isset($alias['dstport'])):
+?>
+ <a href="/firewall_aliases_edit.php?id=<?=$alias['dstport']?>" data-toggle="popover" data-trigger="hover focus" title="Alias details" data-content="<?=alias_info_popup($alias['dstport'])?>" data-html="true">
+<?php
+ endif;
+?>
+ <?=htmlspecialchars($natent['dstport'])?>
+<?php
+ if (isset($alias['dstport'])):
+?>
+ <i class='icon icon-pencil'></i></a>
+<?php
+ endif;
}
- echo $textse;
?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
+
+ </td>
+
+ <td>
<?php
- echo $textss;
- if (isset($natent['nonat'])) {
+ if (isset($natent['nonat']))
echo '<I>NO NAT</I>';
- } elseif (!$natent['target']) {
+ elseif (!$natent['target'])
echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface'])) . " address";
- } elseif ($natent['target'] == "other-subnet") {
+ elseif ($natent['target'] == "other-subnet")
echo $natent['targetip'] . '/' . $natent['targetip_subnet'];
- } else {
+ else
echo $natent['target'];
- }
- echo $textse;
?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
+ </td>
+
+ <td>
<?php
- echo $textss;
- if (!$natent['natport']) {
+ if (!$natent['natport'])
echo "*";
- } else {
+ else
echo $natent['natport'];
- }
- echo $textse;
?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';" align="center">
+ </td>
+
+ <td>
<?php
- echo $textss;
- if (isset($natent['staticnatport'])) {
+ if(isset($natent['staticnatport']))
echo gettext("YES");
- } else {
+ else
echo gettext("NO");
- }
- echo $textse;
-?>
- </td>
- <td class="listbg" onclick="fr_toggle(<?=$i;?>)" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($natent['descr']);?>&nbsp;
- </td>
- <td class="list nowrap" valign="middle">
- <table border="0" cellspacing="0" cellpadding="1" summary="move">
- <tr>
- <td><input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)" name="move_<?=$i;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" title="<?=gettext("move selected rules before this rule");?>" type="image" style="height:17;width:17;border:0" /></td>
- <td>
- <a href="firewall_nat_out_edit.php?id=<?=$i;?>">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit mapping");?>" alt="edit" />
- </a>
- </td>
- </tr>
- <tr>
- <td align="center" valign="middle">
- <a href="firewall_nat_out.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this rule?");?>')">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule");?>" alt="delete" />
- </a>
- </td>
- <td>
- <a href="firewall_nat_out_edit.php?dup=<?=$i;?>">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new NAT based on this one");?>" width="17" height="17" border="0" alt="duplicate" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+?>
+ </td>
+
+ <td>
+ <?=htmlspecialchars($natent['descr'])?>
+ </td>
+
+ <!-- Action icons -->
+ <td>
+ <a class="btn btn-xs btn-info" title="<?=gettext("Edit mapping")?>" href="firewall_nat_out_edit.php?id=<?=$i?>"><?=gettext("Edit")?></a>
+ <a class="btn btn-xs btn-danger" title="<?=gettext("Delete mapping")?>" href="firewall_nat_out.php?act=del&amp;id=<?=$i?>"><?=gettext("Del")?></a>
+ <a class="btn btn-xs btn-success" title="<?=gettext("Add a new mapping based on this one")?>" href="firewall_nat_out_edit.php?dup=<?=$i?>"><?=gettext("Clone")?></a>
+ </td>
<?php
$i++;
endforeach;
?>
- <tr valign="top" id="fr<?=$i;?>">
- <td class="list" colspan="11"></td>
- <td class="list nowrap" valign="middle">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tr>
- <td>
-<?php
- if ($i == 0):
-?>
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected mappings to end");?>" border="0" alt="move" />
-<?php
- else:
-?>
- <input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)" name="move_<?=$i;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17;border:0" title="<?=gettext("move selected mappings to end");?>" />
-<?php
- endif;
-?>
- </td>
- <td>
- <a href="firewall_nat_out_edit.php">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add new mapping");?>" alt="add" />
- </a>
- </td>
- </tr>
- <tr>
- <td>
-<?php
- if ($i == 0):
-?>
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected rules");?>" border="0" alt="delete" />
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+ <nav class="action-buttons">
+ <a href="firewall_nat_out_edit.php?after=-1" class="btn btn-sm btn-success" title="<?=gettext('Add new mapping')?>"><?=gettext('Add new mapping')?></a>&nbsp;
+ <input type="submit" id="order-store" class="btn btn-primary btn-sm" value="store changes" disabled="disabled" />
+ </nav>
+
<?php
- else:
+if ($mode == "automatic" || $mode == "hybrid"):
+ if(empty($FilterIflist))
+ filter_generate_optcfg_array();
+
+ if(empty($GatewaysList))
+ filter_generate_gateways();
+
+ $automatic_rules = filter_nat_rules_outbound_automatic(implode(" ", filter_nat_rules_automatic_tonathosts()));
+ unset($FilterIflist, $GatewaysList);
?>
- <input name="del" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" style="width:17;height:17" title="<?=gettext("delete selected mappings");?>" onclick="return confirm('<?=gettext("Do you really want to delete the selected mappings?");?>')" />
+ <div class="panel panel-default">
+ <div class="panel-heading"><?=gettext("Automatic rules:")?></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><!-- status --></th>
+ <th><?=gettext("Interface")?></th>
+ <th><?=gettext("Source")?></th>
+ <th><?=gettext("Source Port")?></th>
+ <th><?=gettext("Destination")?></th>
+ <th><?=gettext("Destination Port")?></th>
+ <th><?=gettext("NAT Address")?></th>
+ <th><?=gettext("NAT Port")?></th>
+ <th><?=gettext("Static Port")?></th>
+ <th><?=gettext("Description")?></th>
+
+ </tr>
<?php
- endif;
+ foreach ($automatic_rules as $natent):
?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-<?php
- if ($mode == "automatic" || $mode == "hybrid"):
- if (empty($FilterIflist)) {
- filter_generate_optcfg_array();
- }
- if (empty($GatewaysList)) {
- filter_generate_gateways();
- }
- $automatic_rules = filter_nat_rules_outbound_automatic(implode(" ", filter_nat_rules_automatic_tonathosts()));
- unset($FilterIflist, $GatewaysList);
-?>
- <tr><td colspan="5"><b>&nbsp;<?=gettext("Automatic rules:"); ?></b></td></tr>
- <tr><td>&nbsp;</td></tr>
- <tr id="frheader">
- <td width="3%" class="list">&nbsp;</td>
- <td width="3%" class="list">&nbsp;</td>
- <td width="10%" class="listhdrr"><?=gettext("Interface");?></td>
- <td width="15%" class="listhdrr"><?=gettext("Source");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Source Port");?></td>
- <td width="15%" class="listhdrr"><?=gettext("Destination");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Destination Port");?></td>
- <td width="15%" class="listhdrr"><?=gettext("NAT Address");?></td>
- <td width="10%" class="listhdrr"><?=gettext("NAT Port");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Static Port");?></td>
- <td width="25%" class="listhdr"><?=gettext("Description");?></td>
- <td width="5%" class="list">&nbsp;</td>
- </tr>
-<?php
- foreach ($automatic_rules as $natent):
-?>
- <tr valign="top">
- <td class="list">&nbsp;</td>
- <td class="listt" align="center">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" width="11" height="11" border="0" title="<?=gettext("automatic outbound nat");?>" alt="icon" />
+ <tr>
+ <td>
+ <i class="icon-ok" title="<?=gettext("automatic outbound nat")?>"></i>
</td>
- <td class="listlr" style="background-color: #E0E0E0">
- <?php echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface'])); ?>
- &nbsp;
+ <td>
+ <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface'])); ?>
</td>
- <td class="listr" style="background-color: #E0E0E0">
- <?=$natent['source']['network'];?>
+ <td>
+ <?=$natent['source']['network']?>
</td>
- <td class="listr" style="background-color: #E0E0E0">
+ <td>
<?php
- echo ($natent['protocol']) ? $natent['protocol'] . '/' : "" ;
- if (!$natent['sourceport']) {
- echo "*";
- } else {
- echo $natent['sourceport'];
- }
+ echo ($natent['protocol']) ? $natent['protocol'] . '/' : "" ;
+
+ if (!$natent['sourceport'])
+ echo "*";
+ else
+ echo $natent['sourceport'];
?>
</td>
- <td class="listr" style="background-color: #E0E0E0">
-<?php
- if (isset($natent['destination']['any'])) {
- echo "*";
- } else {
- if (isset($natent['destination']['not'])) {
- echo "!&nbsp;";
- }
- echo $natent['destination']['address'];
+ <td>
+<?php
+ if (isset($natent['destination']['any']))
+ echo "*";
+ else {
+ if (isset($natent['destination']['not']))
+ echo "!&nbsp;";
+
+ echo $natent['destination']['address'];
}
?>
</td>
- <td class="listr" style="background-color: #E0E0E0">
+ <td>
<?php
- echo ($natent['protocol']) ? $natent['protocol'] . '/' : "" ;
- if (!$natent['dstport']) {
- echo "*";
- } else {
- echo $natent['dstport'];
- }
+ echo ($natent['protocol']) ? $natent['protocol'] . '/' : "" ;
+ if (!$natent['dstport'])
+ echo "*";
+ else
+ echo $natent['dstport'];
?>
</td>
- <td class="listr" style="background-color: #E0E0E0">
-<?php
- if (isset($natent['nonat'])) {
- echo '<I>NO NAT</I>';
- } elseif (!$natent['target']) {
- echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface'])) . " address";
- } elseif ($natent['target'] == "other-subnet") {
- echo $natent['targetip'] . '/' . $natent['targetip_subnet'];
- } else {
- echo $natent['target'];
- }
+ <td>
+<?php
+ if (isset($natent['nonat']))
+ echo 'NO NAT';
+ elseif (!$natent['target'])
+ echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface'])) . " address";
+ elseif ($natent['target'] == "other-subnet")
+ echo $natent['targetip'] . '/' . $natent['targetip_subnet'];
+ else
+ echo $natent['target'];
?>
</td>
- <td class="listr" style="background-color: #E0E0E0">
+ <td>
<?php
- if (!$natent['natport']) {
- echo "*";
- } else {
- echo $natent['natport'];
- }
+ if (!$natent['natport'])
+ echo "*";
+ else
+ echo $natent['natport'];
?>
</td>
- <td class="listr" style="background-color: #E0E0E0">
+ <td>
<?php
- if (isset($natent['staticnatport'])) {
- echo gettext("YES");
- } else {
- echo gettext("NO");
- }
+ if(isset($natent['staticnatport']))
+ echo gettext("YES");
+ else
+ echo gettext("NO");
?>
</td>
- <td class="listbg">
- <?=htmlspecialchars($natent['descr']);?>&nbsp;
+ <td>
+ <?=htmlspecialchars($natent['descr'])?>
</td>
- <td class="list">&nbsp;</td>
</tr>
<?php
- endforeach;
- endif;
-?>
- <tr>
- <td colspan="12">
- <p><span class="vexpl">
- <span class="red"><strong><?=gettext("Note:"); ?><br /></strong></span>
- <?=gettext("If automatic outbound NAT selected, a mapping is automatically created " .
- "for each interface's subnet (except WAN-type connections) and the rules " .
- "on \"Mappings\" section of this page are ignored.<br /><br /> " .
- "If manual outbound NAT is selected, outbound NAT rules will not be " .
- "automatically generated and only the mappings you specify on this page " .
- "will be used. <br /><br /> " .
- "If hybrid outbound NAT is selected, mappings you specify on this page will " .
- "be used, followed by the automatically generated ones. <br /><br />" .
- "If disable outbound NAT is selected, no rules will be used. <br /><br />" .
- "If a target address other than an interface's IP address is used, " .
- "then depending on the way the WAN connection is setup, a "); ?>
- <a href="firewall_virtual_ip.php"><?=gettext("Virtual IP"); ?></a>
- <?= gettext(" may also be required.") ?>
- </span></p>
- </td>
- </tr>
+ endforeach;
+endif;
+?>
+ </tbody>
</table>
- </div>
- </td>
- </tr>
-</table>
+ </div>
+ </div>
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<div>
+<?php
+ print_info_box(gettext('If automatic outbound NAT selected, a mapping is automatically generated for each interface\'s subnet (except WAN-type connections) and the rules ' .
+ 'on "Mappings" section of this page are ignored.' . '<br />' .
+ 'If manual outbound NAT is selected, outbound NAT rules will not be automatically generated and only the mappings you specify on this page ' .
+ 'will be used.' . '<br />' .
+ 'If hybrid outbound NAT is selected, mappings you specify on this page will be used, followed by the automatically generated ones.' . '<br />' .
+ 'If disable outbound NAT is selected, no rules will be used.' . '<br />' .
+ 'If a target address other than an interface\'s IP address is used, then depending on the way the WAN connection is setup, a ') .
+ '<a href="firewall_virtual_ip.php">' . gettext("Virtual IP") . '</a>' . gettext(" may also be required.")
+ );
+?>
+</div>
+
+<script>
+events.push(function() {
+ // Make rules draggable/sortable
+ $('table tbody.user-entries').sortable({
+ cursor: 'grabbing',
+ update: function(event, ui) {
+ $('#order-store').removeAttr('disabled');
+ }
+ });
+});
+</script>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_nat_out_edit.php b/src/usr/local/www/firewall_nat_out_edit.php
index e99cebb..4d85609 100644
--- a/src/usr/local/www/firewall_nat_out_edit.php
+++ b/src/usr/local/www/firewall_nat_out_edit.php
@@ -2,37 +2,62 @@
/* $Id$ */
/*
firewall_nat_out_edit.php
- Copyright (C) 2004 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004 Scott Ullrich
+ * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>
+ * Originally part of pfSense (https://www.pfsense.org)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: nat
+ pfSense_MODULE: nat
*/
##|+PRIV
@@ -46,15 +71,8 @@ require("guiconfig.inc");
require_once("filter.inc");
require("shaper.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_nat_out.php');
-}
-
-if (!is_array($config['nat']['outbound'])) {
+if (!is_array($config['nat']['outbound']))
$config['nat']['outbound'] = array();
-}
if (!is_array($config['nat']['outbound']['rule'])) {
$config['nat']['outbound']['rule'] = array();
@@ -104,6 +122,7 @@ if (isset($id) && $a_out[$id]) {
address_to_pconfig($a_out[$id]['destination'], $pconfig['destination'],
$pconfig['destination_subnet'], $pconfig['destination_not'],
$none, $none);
+
$pconfig['dstport'] = $a_out[$id]['dstport'];
$pconfig['natport'] = $a_out[$id]['natport'];
$pconfig['target'] = $a_out[$id]['target'];
@@ -111,9 +130,11 @@ if (isset($id) && $a_out[$id]) {
$pconfig['targetip_subnet'] = $a_out[$id]['targetip_subnet'];
$pconfig['poolopts'] = $a_out[$id]['poolopts'];
$pconfig['interface'] = $a_out[$id]['interface'];
+
if (!$pconfig['interface']) {
$pconfig['interface'] = "wan";
}
+
$pconfig['descr'] = $a_out[$id]['descr'];
$pconfig['nonat'] = $a_out[$id]['nonat'];
$pconfig['disabled'] = isset($a_out[$id]['disabled']);
@@ -135,6 +156,7 @@ if ($_POST) {
$_POST['destination'] = "any";
$_POST['destination_subnet'] = 24;
}
+
if ($_POST['source_type'] == "any") {
$_POST['source'] = "any";
$_POST['source_subnet'] = 24;
@@ -196,21 +218,25 @@ if ($_POST) {
}
if (($_POST['source_type'] != "any") && ($_POST['source_type'] != "(self)")) {
- if ($_POST['source'] && !is_ipaddroralias($_POST['source']) && $_POST['source'] <> "any") {
+ if ($_POST['source'] && !is_ipaddroralias($_POST['source']) && $_POST['source'] != "any") {
$input_errors[] = gettext("A valid source must be specified.");
}
}
+
if ($_POST['source_subnet'] && !is_numericint($_POST['source_subnet'])) {
$input_errors[] = gettext("A valid source bit count must be specified.");
}
+
if ($_POST['destination_type'] != "any") {
if ($_POST['destination'] && !is_ipaddroralias($_POST['destination'])) {
$input_errors[] = gettext("A valid destination must be specified.");
}
}
+
if ($_POST['destination_subnet'] && !is_numericint($_POST['destination_subnet'])) {
$input_errors[] = gettext("A valid destination bit count must be specified.");
}
+
if ($_POST['destination_type'] == "any") {
if ($_POST['destination_not']) {
$input_errors[] = gettext("Negating destination address of \"any\" is invalid.");
@@ -225,6 +251,7 @@ if ($_POST) {
if (!is_ipaddr($_POST['targetip'])) {
$input_errors[] = gettext("A valid target IP must be specified when using the 'Other Subnet' type.");
}
+
if (!is_numericint($_POST['targetip_subnet'])) {
$input_errors[] = gettext("A valid target bit count must be specified when using the 'Other Subnet' type.");
}
@@ -270,13 +297,10 @@ if ($_POST) {
}
if (!$natent['interface']) {
- $natent['interface'] == "wan";
+ $natent['interface'] = "wan";
}
}
- // Allow extending of the firewall edit page and include custom input validation
- pfSense_handle_custom_code("/usr/local/pkg/firewall_aon/input_validation");
-
if (!$input_errors) {
$natent = array();
$natent['source']['network'] = $osn;
@@ -372,534 +396,456 @@ $pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("Outbound"), gette
$closehead = false;
include("head.inc");
-?>
+function build_target_list() {
+ global $config, $sn, $a_aliases;
+ $list = array();
-<script type="text/javascript" src="/javascript/suggestions.js"></script>
-<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
-<script type="text/javascript">
-//<![CDATA[
-var portsenabled = 1;
-function staticportchange() {
- if (document.iform.staticnatport.checked) {
- document.iform.natport.value = "";
- document.iform.natport.disabled = 1;
- } else {
- document.iform.natport.disabled = 0;
- }
-}
-function typesel_change() {
- switch (document.iform.destination_type.selectedIndex) {
- case 1: // network
- document.iform.destination.disabled = 0;
- document.iform.destination_subnet.disabled = 0;
- break;
- default:
- document.iform.destination.value = "";
- document.iform.destination.disabled = 1;
- document.iform.destination_subnet.value = "24";
- document.iform.destination_subnet.disabled = 1;
- break;
+ $list[""] = 'Interface Address';
+
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $sn) {
+ if (isset($sn['noexpand']))
+ continue;
+
+ if ($sn['mode'] == "proxyarp" && $sn['type'] == "network") {
+ $start = ip2long32(gen_subnet($sn['subnet'], $sn['subnet_bits']));
+ $end = ip2long32(gen_subnet_max($sn['subnet'], $sn['subnet_bits']));
+ $len = $end - $start;
+ $list[$sn['subnet'] . '/' . $sn['subnet_bits']] = 'Subnet: ' . $sn['subnet'] . '/' . $sn['subnet_bits'] . ' (' . $sn['descr'] . ')';
+
+ for ($i = 0; $i <= $len; $i++) {
+ $snip = long2ip32($start+$i);
+
+ $list[$snip] = $snip . ' (' . $sn['descr'] . ')';
+ }
+ } else {
+ $list[$sn['subnet']] = $sn['subnet'] . ' (' . $sn['descr'] . ')';
+ }
+ }
}
-}
-function sourcesel_change() {
- switch (document.iform.source_type.selectedIndex) {
- case 2: // network
- document.iform.source.disabled = 0;
- document.iform.source_subnet.disabled = 0;
- break;
- default:
- document.iform.source.value = "";
- document.iform.source.disabled = 1;
- document.iform.source_subnet.value = "24";
- document.iform.source_subnet.disabled = 1;
- break;
+
+ foreach ($a_aliases as $alias) {
+ if ($alias['type'] != "host")
+ continue;
+
+ $list[$alias['name']] = 'Host Alias: ' . $alias['name'] . ' (' . $alias['descr'] . ')';
}
+
+ $list['other-subnet'] = 'Other Subnet (Enter Below)';
+
+ return($list);
}
-function nonat_change() {
- if (document.iform.nonat.checked) {
- document.getElementById("transtable").style.display = 'none';
- } else {
- document.getElementById("transtable").style.display = '';
- }
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'Submit',
+ gettext("Save")
+));
+
+$section = new Form_Section('Edit Advanced Outbound NAT entry');
+
+$section->addInput(new Form_Checkbox(
+ 'disabled',
+ 'Disabled',
+ 'Disable this rule',
+ $pconfig['disabled']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'nonat',
+ 'Do not NAT',
+ 'Enabling this option will disable NAT for traffic matching this rule and stop processing Outbound NAT rules',
+ $pconfig['nonat']
+))->setHelp('In most cases this option is not required');
+
+$iflist = get_configured_interface_with_descr(false, true);
+
+foreach ($iflist as $if => $ifdesc)
+ if(have_ruleint_access($if))
+ $interfaces[$if] = $ifdesc;
+
+if ($config['l2tp']['mode'] == "server")
+ if(have_ruleint_access("l2tp"))
+ $interfaces['l2tp'] = "L2TP VPN";
+
+if ($config['pptpd']['mode'] == "server")
+ if(have_ruleint_access("pptp"))
+ $interfaces['pptp'] = "PPTP VPN";
+
+if (is_pppoe_server_enabled() && have_ruleint_access("pppoe"))
+ $interfaces['pppoe'] = "PPPoE Server";
+
+/* add ipsec interfaces */
+if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable']))
+ if(have_ruleint_access("enc0"))
+ $interfaces["enc0"] = "IPsec";
+
+/* add openvpn/tun interfaces */
+if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"])
+ $interfaces["openvpn"] = "OpenVPN";
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ $pconfig['interface'],
+ $interfaces
+))->setHelp('Choose which interface this rule applies to. In most cases "WAN" is specified.');
+
+$protocols = "any TCP UDP TCP/UDP ICMP ESP AH GRE IPV6 IGMP carp pfsync";
+
+$section->addInput(new Form_Select(
+ 'protocol',
+ 'Protocol',
+ $pconfig['protocol'],
+ array_combine(explode(" ", strtolower($protocols)), explode(" ", $protocols))
+))->setHelp('Choose which protocol this rule should match. In most cases "any" is specified.');
+
+$group = new Form_Group('Source');
+
+$group->add(new Form_Select(
+ 'source_type',
+ null,
+ $pconfig['source_type'],
+ array('any' => 'Any', '(self)' => 'This Firewall (self)', 'network' => 'Network')
+))->setHelp('Type')->setWidth('3');
+
+$group->add(new Form_IpAddress(
+ 'source',
+ null,
+ $pconfig['source']
+))->addMask('source_subnet', $pconfig['source_subnet'])->setHelp('Source network for the outbound NAT mapping.');
+
+$group->add(new Form_Input(
+ 'sourceport',
+ null,
+ 'number',
+ $pconfig['sourceport'],
+ ['min' => '1', 'max' => '65536']
+))->setHelp('Port')->setWidth('2');
+
+$section->add($group);
+
+$group = new Form_Group('Destination');
+
+$group->add(new Form_Select(
+ 'destination_type',
+ null,
+ $pconfig['destination'] == "any" ? "any":"network",
+ array('any' => 'Any', 'network' => 'Network')
+))->setHelp('Type')->setWidth('3');
+
+$group->add(new Form_IpAddress(
+ 'destination',
+ null,
+ $pconfig['destination'] == "any" ? "":$pconfig['destination']
+))->addMask('destination_subnet', $pconfig['destination_subnet'])->setHelp('Destination network for the outbound NAT mapping.');
+
+$group->add(new Form_Input(
+ 'dstport',
+ null,
+ 'number',
+ $pconfig['dstport'],
+ ['min' => '1', 'max' => '65536']
+))->setHelp('Port')->setWidth('2');
+
+$section->add($group);
+
+$section->addInput(new Form_Checkbox(
+ 'destination_not',
+ null,
+ 'Not',
+ $pconfig['destination_not']
+))->setHelp('Invert the sense of the destination match');
+
+$form->add($section);
+
+$section = new Form_Section('Translation');
+$section->addClass('translation');
+
+$section->addInput(new Form_Select(
+ 'target',
+ 'Address',
+ $pconfig['target'],
+ build_target_list()
+));
+
+$section->addInput(new Form_IpAddress(
+ 'targetip',
+ 'Other subnet',
+ $pconfig['targetip']
+))->addMask('targetip_subnet', $pconfig['targetip_subnet'])->addClass('othersubnet')->setHelp(
+ 'Packets matching this rule will be mapped to the IP address given here.' . '<br />' .
+ 'If you want this rule to apply to another IP address rather than the IP address of the interface chosen above, ' .
+ 'select it here (you will need to define ' .
+ '<a href="firewall_virtual_ip.php">' . gettext("Virtual IP") . '</a> ' .
+ 'addresses on the interface first)');
+
+$section->addInput(new Form_Select(
+ 'poolopts',
+ 'Pool options',
+ $pconfig['poolopts'],
+ array(
+ '' => 'Default',
+ 'round-robin' => 'Round Robin',
+ 'round-robin sticky-address' => 'Round Robin with Sticky Address',
+ 'random' => 'Random',
+ 'random sticky-address' => 'Random with Sticky Address',
+ 'source-hash' => 'Source hash',
+ 'bitmask' => 'Bit mask'
+ )
+))->setHelp('Only Round Robin types work with Host Aliases. Any type can be used with a Subnet.' . '<br />' .
+ '<ul>' .
+ '<li>' . 'Round Robin: Loops through the translation addresses.' . '</li>' . '<br />' .
+ '<li>' . 'Random: Selects an address from the translation address pool at random.' . '</li>' . '<br />' .
+ '<li>' . 'Source Hash: Uses a hash of the source address to determine the translation address, ensuring that the redirection address is always the same for a given source.' . '</li>' . '<br />' .
+ '<li>' . 'Bitmask: Applies the subnet mask and keeps the last portion identical; 10.0.1.50 -&gt; x.x.x.50.' . '</li>' . '<br />' .
+ '<li>' . 'Sticky Address: The Sticky Address option can be used with the Random and Round Robin pool types to ensure that a particular source address is always mapped to the same translation address.' . '</li>' .
+ '</ul>');
+
+$group = new Form_Group('Port');
+$group->addClass('natportgrp');
+
+$group->add(new Form_Input(
+ 'natport',
+ null,
+ 'number',
+ $pconfig['natport'],
+ ['min' => '1', 'max' => '65536']
+))->setHelp('Enter the source port for the outbound NAT mapping.');
+
+$group->add(new Form_Checkbox(
+ 'staticnatport',
+ null,
+ 'Static port',
+ $pconfig['staticnatport']
+));
+
+$section->add($group);
+$form->add($section);
+
+$section = new Form_Section('Misc');
+
+$section->addInput(new Form_Checkbox(
+ 'nosync',
+ 'No XMLRPC Sync',
+ null,
+ $pconfig['nosync'],
+ 'yes'
+))->setHelp('Prevents the rule on Master from automatically syncing to other CARP members. ' .
+ 'This does NOT prevent the rule from being overwritten on Slave.');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+if (isset($id) && $a_out[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
}
-function proto_change() {
- if (document.iform.protocol.selectedIndex >= 0 && document.iform.protocol.selectedIndex <= 3) {
- portsenabled = 1;
- } else {
- portsenabled = 0;
- }
- if (portsenabled) {
- document.getElementById("sport_tr").style.display = '';
- document.getElementById("dport_tr").style.display = '';
- document.getElementById("tport_tr").style.display = '';
- document.getElementById("tporttext_tr").style.display = '';
- document.getElementById("tportstatic_tr").style.display = '';
- } else {
- document.getElementById("sport_tr").style.display = 'none';
- document.getElementById("dport_tr").style.display = 'none';
- document.getElementById("tport_tr").style.display = 'none';
- document.getElementById("tporttext_tr").style.display = 'none';
- document.getElementById("tportstatic_tr").style.display = 'none';
+$section->addInput(new Form_Input(
+ 'after',
+ null,
+ 'hidden',
+ $after
+));
+
+$form->add($section);
+
+$has_created_time = (isset($a_out[$id]['created']) && is_array($a_out[$id]['created']));
+$has_updated_time = (isset($a_out[$id]['updated']) && is_array($a_out[$id]['updated']));
+
+if ($has_created_time || $has_updated_time) {
+ $section = new Form_Section('Rule Information');
+
+ if($has_created_time) {
+ $section->addInput(new Form_StaticText(
+ 'Created',
+ date(gettext("n/j/y H:i:s"), $a_out[$id]['created']['time']) . gettext("by") . $a_out[$id]['created']['username']
+ ));
}
-}
-function poolopts_change() {
- if (jQuery('#target option:selected').text().trim().substring(0, 4) == "Host") {
- jQuery('#poolopts_tr').css('display', '');
- jQuery('#target_network').css('display', 'none');
- } else if (jQuery('#target option:selected').text().trim().substring(0, 6) == "Subnet") {
- jQuery('#poolopts_tr').css('display', '');
- jQuery('#target_network').css('display', 'none');
- } else if (jQuery('#target option:selected').text().trim().substring(0, 5) == "Other") {
- jQuery('#poolopts_tr').css('display', '');
- jQuery('#target_network').css('display', '');
- } else {
- jQuery('#poolopts').prop('selectedIndex', 0);
- jQuery('#poolopts_tr').css('display', 'none');
- jQuery('#target_network').css('display', 'none');
- jQuery('#targetip').val('');
- jQuery('#targetip_subnet').val('0');
+
+ if($has_updated_time) {
+ $section->addInput(new Form_StaticText(
+ 'Updated',
+ date(gettext("n/j/y H:i:s"), $a_out[$id]['updated']['time']) . gettext("by") . $a_out[$id]['updated']['username']
+ ));
}
+
+ $form->add($section);
}
-//]]>
-</script>
-</head>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="firewall_nat_out_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="1" summary="firewall nat outbound edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Advanced Outbound NAT entry");?></td>
- </tr>
-<?php
- // Allow extending of the firewall edit page and include custom input validation
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/htmlphpearly");
-?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled");?></td>
- <td width="78%" class="vtable">
- <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable this rule");?></strong><br />
- <span class="vexpl"><?=gettext("Set this option to disable this rule without removing it from the list.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Do not NAT");?></td>
- <td width="78%" class="vtable">
- <input type="checkbox" name="nonat" id="nonat" onclick="nonat_change();" <?php if (isset($pconfig['nonat'])) echo " checked=\"checked\""; ?> />
- <span class="vexpl"><?=gettext("Enabling this option will disable NAT for traffic matching this rule and stop processing Outbound NAT rules.");?>
- <br /><?=gettext("Hint: in most cases, you won't use this option.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
- <td width="78%" class="vtable">
- <select name="interface" class="formselect">
-<?php
- $iflist = get_configured_interface_with_descr(false, true);
- foreach ($iflist as $if => $ifdesc) {
- if (have_ruleint_access($if)) {
- $interfaces[$if] = $ifdesc;
- }
- }
-
- if ($config['l2tp']['mode'] == "server") {
- if (have_ruleint_access("l2tp")) {
- $interfaces['l2tp'] = "L2TP VPN";
- }
- }
-
- if ($config['pptpd']['mode'] == "server") {
- if (have_ruleint_access("pptp")) {
- $interfaces['pptp'] = "PPTP VPN";
- }
- }
-
- if (is_pppoe_server_enabled() && have_ruleint_access("pppoe")) {
- $interfaces['pppoe'] = "PPPoE Server";
- }
-
- /* add ipsec interfaces */
- if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
- if (have_ruleint_access("enc0")) {
- $interfaces["enc0"] = "IPsec";
- }
- }
-
- /* add openvpn/tun interfaces */
- if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
- $interfaces["openvpn"] = "OpenVPN";
- }
-
- foreach ($interfaces as $iface => $ifacename):
-?>
- <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
-<?php
- endforeach;
-?>
- </select><br />
- <span class="vexpl"><?=gettext("Choose which interface this rule applies to.");?><br />
- <?=gettext("Hint: in most cases, you'll want to use WAN here.");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol");?></td>
- <td width="78%" class="vtable">
- <select name="protocol" class="formselect" onchange="proto_change();">
-<?php
- $protocols = explode(" ", "any TCP UDP TCP/UDP ICMP ESP AH GRE IPV6 IGMP carp pfsync");
- foreach ($protocols as $proto):
-?>
- <option value="<?=strtolower($proto);?>" <?php if (strtolower($proto) == $pconfig['protocol']) echo "selected=\"selected\""; ?>><?=htmlspecialchars($proto);?></option>
-<?php
- endforeach;
-?>
- </select><br />
- <span class="vexpl"><?=gettext("Choose which protocol this rule should match.");?><br />
-<?php
- printf(gettext("Hint: in most cases, you should specify %s any %s here."), "<em>", "</em>&nbsp;");
-?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Source");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="1" cellpadding="1" summary="source">
- <tr>
- <td><?=gettext("Type:");?>&nbsp;&nbsp;</td>
- <td>
- <select name="source_type" class="formselect" onchange="sourcesel_change()">
- <option value="any" <?php if ($pconfig['source'] == "any") echo "selected=\"selected\""; ?>><?=gettext("any");?></option>
- <option value="(self)" <?PHP if ($pconfig['source'] == "(self)") echo "selected=\"selected\""; ?>><?=gettext("This Firewall (self)");?></option>
- <option value="network" <?php if (($pconfig['source'] != "any") && ($pconfig['source'] != "(self)")) echo "selected=\"selected\""; ?>><?=gettext("Network");?></option>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
- <td>
- <input name="source" type="text" autocomplete="off" class="formfldalias" id="source" size="20" value="<?=htmlspecialchars($pconfig['source']);?>" />/
- <select name="source_subnet" class="formfld" id="source_subnet">
-<?php
- for ($i = 32; $i >= 0; $i--):
-?>
- <option value="<?=$i;?>"<?php if ($i == $pconfig['source_subnet']) echo " selected=\"selected\""; ?>><?=$i;?></option>
-<?php
- endfor;
-?>
- </select>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>
- <span class="vexpl"><?=gettext("Enter the source network for the outbound NAT mapping.");?></span>
- </td>
- </tr>
- <tr name="sport_tr" id="sport_tr">
- <td><?=gettext("Source port:");?>&nbsp;&nbsp;</td>
- <td>
- <input name="sourceport" type="text" autocomplete="off" class="formfldalias" id="sourceport" size="5" value="<?=htmlspecialchars($pconfig['sourceport']);?>" />
- <?=gettext("(leave blank for any)");?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination");?></td>
- <td width="78%" class="vtable">
- <input name="destination_not" type="checkbox" id="destination_not" value="yes" <?php if ($pconfig['destination_not']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("not");?></strong><br />
- <?=gettext("Use this option to invert the sense of the match.");?><br />
- <br />
- <table border="0" cellspacing="1" cellpadding="1" summary="destination">
- <tr>
- <td><?=gettext("Type:");?>&nbsp;&nbsp;</td>
- <td>
- <select name="destination_type" class="formselect" onchange="typesel_change()">
- <option value="any"<?php if ($pconfig['destination'] == "any") echo " selected=\"selected\""; ?>>
- <?=gettext("any");?>
- </option>
- <option value="network"<?php if ($pconfig['destination'] != "any") echo " selected=\"selected\""; ?>>
- <?=gettext("Network");?>
- </option>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
- <td>
- <input name="destination" type="text" autocomplete="off" class="formfldalias" id="destination" size="20" value="<?=htmlspecialchars($pconfig['destination']);?>" />/
- <select name="destination_subnet" class="formselect" id="destination_subnet">
-<?php
- for ($i = 32; $i >= 0; $i--):
-?>
- <option value="<?=$i;?>"<?php if ($i == $pconfig['destination_subnet']) echo " selected=\"selected\""; ?>><?=$i;?></option>
-<?php
- endfor;
-?>
- </select>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>
- <span class="vexpl"><?=gettext("Enter the destination network for the outbound NAT mapping.");?></span>
- </td>
- </tr>
- <tr name="dport_tr" id="dport_tr">
- <td><?=gettext("Destination port:");?>&nbsp;&nbsp;</td>
- <td>
- <input name="dstport" type="text" autocomplete="off" class="formfldalias" id="dstport" size="5" value="<?=htmlspecialchars($pconfig['dstport']);?>" />
- <?=gettext("(leave blank for any)");?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr name="transtable" id="transtable">
- <td width="22%" valign="top" class="vncell"><?=gettext("Translation");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="1" cellpadding="1" summary="translation">
- <tr>
- <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
- <td>
- <select name="target" class="formselect" id="target" onchange="poolopts_change();">
- <option value=""<?php if (!$pconfig['target']) echo " selected=\"selected\""; ?>>
- <?=gettext("Interface address");?>
- </option>
-<?php
- if (is_array($config['virtualip']['vip'])):
- foreach ($config['virtualip']['vip'] as $sn):
- if (isset($sn['noexpand'])) {
- continue;
- }
- if ($sn['mode'] == "proxyarp" && $sn['type'] == "network"):
- $start = ip2long32(gen_subnet($sn['subnet'], $sn['subnet_bits']));
- $end = ip2long32(gen_subnet_max($sn['subnet'], $sn['subnet_bits']));
- $len = $end - $start;
-?>
- <option value="<?=$sn['subnet'].'/'.$sn['subnet_bits'];?>" <?php if ($sn['subnet'].'/'.$sn['subnet_bits'] == $pconfig['target']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars("Subnet: {$sn['subnet']}/{$sn['subnet_bits']} ({$sn['descr']})");?>
- </option>
-<?php
- for ($i = 0; $i <= $len; $i++):
- $snip = long2ip32($start+$i);
-?>
- <option value="<?=$snip;?>" <?php if ($snip == $pconfig['target']) echo "selected"; ?>>
- <?=htmlspecialchars("{$snip} ({$sn['descr']})");?>
- </option>
-<?php
- endfor;
-?>
-<?php
- else:
-?>
- <option value="<?=$sn['subnet'];?>" <?php if ($sn['subnet'] == $pconfig['target']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars("{$sn['subnet']} ({$sn['descr']})");?>
- </option>
-<?php
- endif;
- endforeach;
- endif;
- foreach ($a_aliases as $alias):
- if ($alias['type'] != "host") {
- continue;
- }
-?>
- <option value="<?=$alias['name'];?>" <?php if ($alias['name'] == $pconfig['target']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars("Host Alias: {$alias['name']} ({$alias['descr']})");?>
- </option>
-<?php
- endforeach;
-?>
- <option value="other-subnet"<?php if ($pconfig['target'] == "other-subnet") echo " selected=\"selected\""; ?>>
- <?=gettext("Other Subnet (Enter Below)");?>
- </option>
- </select>
- </td>
- </tr>
-
- <tr id="target_network">
- <td><?=gettext("Other Subnet:");?>&nbsp;&nbsp;</td>
- <td>
- <input name="targetip" type="text" class="formfld unknown" id="targetip" size="20" value="<?=htmlspecialchars($pconfig['targetip']);?>" />/
- <select name="targetip_subnet" class="formfld" id="targetip_subnet">
-<?php
- for ($i = 32; $i >= 0; $i--):
-?>
- <option value="<?=$i;?>"<?php if ($i == $pconfig['targetip_subnet']) echo " selected=\"selected\""; ?>><?=$i;?></option>
-<?php
- endfor;
-?>
- </select>
- </td>
- </tr>
-
- <tr>
- <td>&nbsp;</td>
- <td>
- <span class="vexpl"><?=gettext("Packets matching this rule will be mapped to the IP address given here.");?><br />
- <?=gettext("If you want this rule to apply to another IP address rather than the IP address of the interface chosen above, ".
- "select it here (you will need to define ");?>
- <a href="firewall_virtual_ip.php"><?=gettext("Virtual IP");?></a>
- <?=gettext("addresses on the interface first).");?>
- </span><br />
- </td>
- </tr>
- <tr id="poolopts_tr">
- <td valign="top">Pool Options</td>
- <td>
- <select name="poolopts" id="poolopts">
- <option value="" <?php if ($pconfig['poolopts'] == "") echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars("Default");?>
- </option>
- <option value="round-robin" <?php if ($pconfig['poolopts'] == "round-robin") echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars("Round Robin");?>
- </option>
- <option value="round-robin sticky-address" <?php if ($pconfig['poolopts'] == "round-robin sticky-address") echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars("Round Robin with Sticky Address");?>
- </option>
- <option value="random" <?php if ($pconfig['poolopts'] == "random") echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars("Random");?>
- </option>
- <option value="random sticky-address" <?php if ($pconfig['poolopts'] == "random sticky-address") echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars("Random with Sticky Address");?>
- </option>
- <option value="source-hash" <?php if ($pconfig['poolopts'] == "source-hash") echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars("Source Hash");?>
- </option>
- <option value="bitmask" <?php if ($pconfig['poolopts'] == "bitmask") echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars("Bitmask");?>
- </option>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Only Round Robin types work with Host Aliases. Any type can be used with a Subnet.");?><br />
- * <?=gettext("Round Robin: Loops through the translation addresses.");?><br />
- * <?=gettext("Random: Selects an address from the translation address pool at random.");?><br />
- * <?=gettext("Source Hash: Uses a hash of the source address to determine the translation address, ensuring that the redirection address is always the same for a given source.");?><br />
- * <?=gettext("Bitmask: Applies the subnet mask and keeps the last portion identical; 10.0.1.50 -&gt; x.x.x.50.");?><br />
- * <?=gettext("Sticky Address: The Sticky Address option can be used with the Random and Round Robin pool types to ensure that a particular source address is always mapped to the same translation address.");?><br />
- </span><br />
- </td>
- </tr>
- <tr name="tport_tr" id="tport_tr">
- <td><?=gettext("Port:");?>&nbsp;&nbsp;</td>
- <td>
- <input name="natport" type="text" class="formfld unknown" id="natport" size="5" value="<?=htmlspecialchars($pconfig['natport']);?>" />
- </td>
- </tr>
- <tr name="tporttext_tr" id="tporttext_tr">
- <td>&nbsp;</td>
- <td>
- <span class="vexpl"><?=gettext("Enter the source port for the outbound NAT mapping.");?></span>
- </td>
- </tr>
- <tr name="tportstatic_tr" id="tportstatic_tr">
- <td><?=gettext("Static-port:");?>&nbsp;&nbsp;</td>
- <td>
- <input onchange="staticportchange();" name="staticnatport" type="checkbox" class="formfld" id="staticnatport" size="5"<?php if ($pconfig['staticnatport']) echo " checked=\"checked\"";?> />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("No XMLRPC Sync");?></td>
- <td width="78%" class="vtable">
- <input value="yes" name="nosync" type="checkbox" class="formfld" id="nosync"<?php if ($pconfig['nosync']) echo " checked=\"checked\""; ?> /><br />
- <?=gettext("Hint: This prevents the rule on Master from automatically syncing to other CARP members. This does NOT prevent the rule from being overwritten on Slave.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
- </td>
- </tr>
-<?php
- $has_created_time = (isset($a_out[$id]['created']) && is_array($a_out[$id]['created']));
- $has_updated_time = (isset($a_out[$id]['updated']) && is_array($a_out[$id]['updated']));
- if ($has_created_time || $has_updated_time):
-?>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Rule Information");?></td>
- </tr>
-<?php
- if ($has_created_time):
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Created");?></td>
- <td width="78%" class="vtable">
- <?= date(gettext("n/j/y H:i:s"), $a_out[$id]['created']['time']) ?> <?= gettext("by") ?> <strong><?= $a_out[$id]['created']['username'] ?></strong>
- </td>
- </tr>
-<?php
- endif;
- if ($has_updated_time):
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Updated");?></td>
- <td width="78%" class="vtable">
- <?= date(gettext("n/j/y H:i:s"), $a_out[$id]['updated']['time']) ?> <?= gettext("by") ?> <strong><?= $a_out[$id]['updated']['username'] ?></strong>
- </td>
- </tr>
-<?php
- endif;
- endif;
- // Allow extending of the firewall edit page and include custom input validation
- pfSense_handle_custom_code("/usr/local/pkg/firewall_aon/htmlphplate");
-?>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
-<?php
- if (isset($id) && $a_out[$id]):
-?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
-<?php
- endif;
+print($form);
+
?>
- <input name="after" type="hidden" value="<?=htmlspecialchars($after);?>" />
- </td>
- </tr>
- </table>
-</form>
+
<script type="text/javascript">
//<![CDATA[
+events.push(function(){
+ var portsenabled = 1;
+
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
+
+ // Hides the <div> in which the specified group input element lives so that the input,
+ // its label and help text are hidden
+ function hideGroupInput(id, hide) {
+ if(hide)
+ $('#' + id).parent('div').addClass('hidden');
+ else
+ $('#' + id).parent('div').removeClass('hidden');
+ }
+
+ // Hides the <div> in which the specified checkbox lives so that the checkbox, its label and help text are hidden
+ function hideCheckbox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
+ }
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
+ }
+
+ // Hides all elements of the specified class. This will usually be a section
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ // Hides all elements of the specified class assigned to a group. This will usually be a group
+ function hideGroupClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).parent().parent().parent().hide();
+ else
+ $('.' + s_class).parent().parent().parent().show();
+ }
+
+ function staticportchange() {
+ if($('#staticnatport').prop('checked')) {
+ $('#natport').val("");
+ disableInput('natport' , true);
+ } else {
+ disableInput('natport' , false);
+ }
+ }
+
+ function sourcesel_change() {
+ if($('#source_type').find(":selected").val() == "network") {
+ disableInput('source', false);
+ disableInput('source_subnet', false);
+ }
+ else {
+ $('#source').val("");
+ disableInput('source', true);
+ $('#source_subnet').val("24");
+ disableInput('source_subnet', true);
+ }
+ }
+
+ function typesel_change() {
+ if($('#destination_type').find(":selected").val() == "network") {
+ disableInput('destination', false);
+ disableInput('destination_subnet', false);
+ }
+ else {
+ $('#destination').val("");
+ disableInput('destination', true);
+ $('#destination_subnet').val("24");
+ disableInput('destination_subnet', true);
+ }
+ }
+
+ function nonat_change() {
+ hideClass('translation', $('#nonat').prop('checked'));
+ }
+
+ function proto_change() {
+ if( ($('#protocol').find(":selected").index() > 0) && ($('#protocol').find(":selected").index() <= 3) ) {
+ hideGroupInput('sourceport', false);
+ hideGroupInput('dstport', false);
+ hideClass('natportgrp', false);
+ } else {
+ hideGroupInput('sourceport', true);
+ hideGroupInput('dstport', true);
+ hideClass('natportgrp', true);
+ }
+ }
+
+ function poolopts_change() {
+ if ($('#target option:selected').text().trim().substring(0,4) == "Host") {
+ hideInput('poolopts', false);
+ hideGroupClass('othersubnet', true);
+ } else if ($('#target option:selected').text().trim().substring(0,6) == "Subnet") {
+ hideInput('poolopts', false);
+ hideGroupClass('othersubnet', true);
+ } else if ($('#target option:selected').text().trim().substring(0,5) == "Other") {
+ hideInput('poolopts', false);
+ hideGroupClass('othersubnet', false);
+ } else {
+ $('#poolopts').prop('selectedIndex',0);
+ hideInput('poolopts', true);
+ hideGroupClass('othersubnet', true);
+ $('#targetip').val('');
+ $('#targetip_subnet').val('0');
+ }
+ }
+
+ // When controls are clicked . .
+ $('#staticnatport').click(function () {
+ staticportchange();
+ });
+
+ $('#source_type').on('change', function() {
+ sourcesel_change();
+ });
+
+ $('#destination_type').on('change', function() {
+ typesel_change();
+ });
+
+ $('#nonat').on('change', function() {
+ nonat_change();
+ });
+
+ $('#protocol').on('change', function() {
+ proto_change();
+ });
+
+ $('#target').on('change', function() {
+ poolopts_change();
+ });
+
+ // Set initial states
+ staticportchange();
sourcesel_change();
typesel_change();
- staticportchange();
nonat_change();
proto_change();
poolopts_change();
- var addressarray = <?= json_encode(get_alias_list(array("host", "network", "openvpn", "urltable"))) ?>;
- var customarray = <?= json_encode(get_alias_list(array("port", "url_ports", "urltable_ports"))) ?>;
-
- var oTextbox1 = new AutoSuggestControl(document.getElementById("source"), new StateSuggestions(addressarray));
- var oTextbox2 = new AutoSuggestControl(document.getElementById("sourceport"), new StateSuggestions(customarray));
- var oTextbox3 = new AutoSuggestControl(document.getElementById("destination"), new StateSuggestions(addressarray));
- var oTextbox4 = new AutoSuggestControl(document.getElementById("dstport"), new StateSuggestions(customarray));
+});
//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_rules.php b/src/usr/local/www/firewall_rules.php
index d3e8f24..cf5497b 100644
--- a/src/usr/local/www/firewall_rules.php
+++ b/src/usr/local/www/firewall_rules.php
@@ -2,37 +2,62 @@
/* $Id$ */
/*
firewall_rules.php
- part of pfSense (https://www.pfsense.org)
- Copyright (C) 2005 Scott Ullrich (sullrich@gmail.com)
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004 Scott Ullrich
+ * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>
+ * Originally part of pfSense (https://www.pfsense.org)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: filter
+ pfSense_MODULE: filter
*/
##|+PRIV
@@ -69,6 +94,7 @@ function delete_nat_association($id) {
if (!is_array($config['filter']['rule'])) {
$config['filter']['rule'] = array();
}
+
filter_rules_sort();
$a_filter = &$config['filter']['rule'];
@@ -126,8 +152,6 @@ if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]
$iflist["openvpn"] = "OpenVPN";
}
-pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/interfaces_override");
-
if (!$if || !isset($iflist[$if])) {
if ("any" == $if) {
$if = "FloatingRules";
@@ -141,7 +165,6 @@ if (!$if || !isset($iflist[$if])) {
}
if ($_POST) {
-
$pconfig = $_POST;
if ($_POST['apply']) {
@@ -150,9 +173,7 @@ if ($_POST) {
clear_subsystem_dirty('filter');
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/apply");
-
- $savemsg = sprintf(gettext("The settings have been applied. The firewall rules are now reloading in the background.<br />You can also %s monitor %s the reload progress"), "<a href='status_filter_reload.php'>", "</a>");
+ $savemsg = sprintf(gettext("The settings have been applied. The firewall rules are now reloading in the background.<br />You can also %s monitor %s the reload progress"),"<a href='status_filter_reload.php'>","</a>");
}
}
@@ -175,20 +196,7 @@ if ($_REQUEST['savemsg']) {
$savemsg = htmlentities($_REQUEST['savemsg']);
}
-if (isset($_POST['del_x'])) {
- /* delete selected rules */
- if (is_array($_POST['rule']) && count($_POST['rule'])) {
- foreach ($_POST['rule'] as $rulei) {
- delete_nat_association($a_filter[$rulei]['associated-rule-id']);
- unset($a_filter[$rulei]);
- }
- if (write_config()) {
- mark_subsystem_dirty('filter');
- }
- header("Location: firewall_rules.php?if=" . htmlspecialchars($if));
- exit;
- }
-} else if ($_GET['act'] == "toggle") {
+if ($_GET['act'] == "toggle") {
if ($a_filter[$_GET['id']]) {
if (isset($a_filter[$_GET['id']]['disabled'])) {
unset($a_filter[$_GET['id']]['disabled']);
@@ -202,47 +210,13 @@ if (isset($_POST['del_x'])) {
exit;
}
} else {
- /* yuck - IE won't send value attributes for image buttons, while Mozilla does -
- so we use .x/.y to fine move button clicks instead... */
- unset($movebtn);
- foreach ($_POST as $pn => $pd) {
- if (preg_match("/move_(\d+)_x/", $pn, $matches)) {
- $movebtn = $matches[1];
- break;
- }
- }
- /* move selected rules before this rule */
- if (isset($movebtn) && is_array($_POST['rule']) && count($_POST['rule'])) {
+ /* update rule order, POST[rule] is an array of ordered IDs */
+ if (is_array($_POST['rule']) && !empty($_POST['rule'])) {
$a_filter_new = array();
- /* copy all rules < $movebtn and not selected */
- for ($i = 0; $i < $movebtn; $i++) {
- if (!in_array($i, $_POST['rule'])) {
- $a_filter_new[] = $a_filter[$i];
- }
- }
-
- /* copy all selected rules */
- for ($i = 0; $i < count($a_filter); $i++) {
- if ($i == $movebtn) {
- continue;
- }
- if (in_array($i, $_POST['rule'])) {
- $a_filter_new[] = $a_filter[$i];
- }
- }
-
- /* copy $movebtn rule */
- if ($movebtn < count($a_filter)) {
- $a_filter_new[] = $a_filter[$movebtn];
- }
-
- /* copy all rules > $movebtn and not selected */
- for ($i = $movebtn+1; $i < count($a_filter); $i++) {
- if (!in_array($i, $_POST['rule'])) {
- $a_filter_new[] = $a_filter[$i];
- }
- }
+ // if a rule is not in POST[rule], it has been deleted by the user
+ foreach ($_POST['rule'] as $id)
+ $a_filter_new[] = $a_filter[$id];
$a_filter = $a_filter_new;
if (write_config()) {
@@ -252,693 +226,458 @@ if (isset($_POST['del_x'])) {
exit;
}
}
-$closehead = false;
include("head.inc");
+$nrules = 0;
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('filter'))
+ print_info_box_np(gettext("The firewall rule configuration has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."), "apply", "", true);
+
+$tab_array = array(array(gettext("Floating"), ("FloatingRules" == $if), "firewall_rules.php?if=FloatingRules"));
+
+foreach ($iflist as $ifent => $ifname)
+ $tab_array[] = array($ifname, ($ifent == $if), "firewall_rules.php?if={$ifent}");
+
+display_top_tabs($tab_array);
+
?>
-<link type="text/css" rel="stylesheet" href="/javascript/chosen/chosen.css" />
-</head>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<script src="/javascript/chosen/chosen.jquery.js" type="text/javascript"></script>
-<?php include("fbegin.inc"); ?>
-<form action="firewall_rules.php" method="post">
-
-<script type="text/javascript" src="/javascript/row_toggle.js"></script>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('filter')): ?><p>
-<?php print_info_box_np(gettext("The firewall rule configuration has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."), "apply", "", true); ?>
-<br />
-<?php endif; ?>
+<form method="post">
+ <div class="panel panel-default">
+ <div class="panel-heading"><?=gettext("Rules (Drag to change order)")?></div>
+ <div id="mainarea" class="table-responsive panel-body">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><!-- status icons --></th>
+ <th><?=gettext("Proto");?></th>
+ <th><?=gettext("Source");?></th>
+ <th><?=gettext("Port");?></th>
+ <th><?=gettext("Destination");?></th>
+ <th><?=gettext("Port");?></th>
+ <th><?=gettext("Gateway");?></th>
+ <th><?=gettext("Queue");?></th>
+ <th><?=gettext("Schedule");?></th>
+ <th><?=gettext("Description");?></th>
+ <th><!-- buttons --></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/before_table");
+ // Show the anti-lockout rule if it's enabled, and we are on LAN with an if count > 1, or WAN with an if count of 1.
+ if (!isset($config['system']['webgui']['noantilockout']) &&
+ (((count($config['interfaces']) > 1) && ($if == 'lan'))
+ || ((count($config['interfaces']) == 1) && ($if == 'wan')))):
+ $alports = implode('<br />', filter_get_antilockout_ports(true));
?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall rules">
- <tr><td class="tabnavtbl">
- <?php
- /* active tabs */
- $tab_array = array();
- if ("FloatingRules" == $if) {
- $active = true;
- } else {
- $active = false;
- }
- $tab_array[] = array(gettext("Floating"), $active, "firewall_rules.php?if=FloatingRules");
- $tabscounter = 0;
- $i = 0;
- foreach ($iflist as $ifent => $ifname) {
- if ($ifent == $if) {
- $active = true;
- } else {
- $active = false;
- }
- $tab_array[] = array($ifname, $active, "firewall_rules.php?if={$ifent}");
- }
- display_top_tabs($tab_array);
- ?>
- </td></tr>
- <tr><td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <?php
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/before_first_tr");
- ?>
- <tr id="frheader">
- <td width="3%" class="list">&nbsp;</td>
- <td width="5%" class="list">&nbsp;</td>
- <td width="3%" class="listhdrr"><?=gettext("ID");?></td>
- <?php
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_id_tablehead");
- ?>
- <?php
- if ('FloatingRules' == $if) {
- ?>
- <td width="3%" class="listhdrr"><?=gettext('Interfaces');?></td>
- <?php
- }
- ?>
- <td width="6%" class="listhdrr"><?=gettext("Proto");?></td>
- <td width="12%" class="listhdrr"><?=gettext("Source");?></td>
- <td width="6%" class="listhdrr"><?=gettext("Port");?></td>
- <td width="12%" class="listhdrr"><?=gettext("Destination");?></td>
- <td width="6%" class="listhdrr"><?=gettext("Port");?></td>
- <td width="5%" class="listhdrr"><?=gettext("Gateway");?></td>
- <td width="8%" class="listhdrr"><?=gettext("Queue");?></td>
- <td width="5%" class="listhdrr"><?=gettext("Schedule");?></td>
- <?php
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_desc_tablehead");
- ?>
- <td width="19%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="delete selected rules">
- <tr>
- <?php
- $nrules = 0;
- for ($i = 0; isset($a_filter[$i]); $i++) {
- $filterent = $a_filter[$i];
- if ($filterent['interface'] != $if && !isset($filterent['floating'])) {
- continue;
- }
- if (isset($filterent['floating']) && "FloatingRules" != $if) {
- continue;
- }
- $nrules++;
- }
- ?>
- <td>
- <?php if ($nrules == 0): ?>
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?gettext("delete selected rules"); ?>" border="0" alt="delete" /><?php else: ?>
- <input name="del" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" style="width:17;height:17" title="<?=gettext("delete selected rules");?>" onclick="return confirm('<?=gettext('Do you really want to delete the selected rules?');?>')" />
- <?php endif; ?>
- </td>
- <td align="center" valign="middle">
- <a href="firewall_rules_edit.php?if=<?=htmlspecialchars($if);?>&amp;after=-1">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add new rule");?>" width="17" height="17" border="0" alt="add" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <?php // Show the anti-lockout rule if it's enabled, and we are on LAN with an if count > 1, or WAN with an if count of 1.
- if (!isset($config['system']['webgui']['noantilockout']) &&
- (((count($config['interfaces']) > 1) && ($if == 'lan')) ||
- ((count($config['interfaces']) == 1) && ($if == 'wan')))):
-
- $alports = implode('<br />', filter_get_antilockout_ports(true));
- ?>
- <tr valign="top" id="antilockout">
- <td class="list">&nbsp;</td>
- <td class="listt" align="center"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" width="11" height="11" border="0" alt="pass" /></td>
- <td class="listlr" style="background-color: #E0E0E0">&nbsp;</td>
- <?php
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_id_tr_antilockout");
- ?>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0"><?=$iflist[$if];?> Address</td>
- <td class="listr" style="background-color: #E0E0E0"><?= $alports ?></td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">&nbsp;</td>
- <td class="listbg"><?=gettext("Anti-Lockout Rule");?></td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="move rules before">
- <tr>
- <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules before this rule");?>" alt="move" /></td>
- <td><a href="system_advanced_admin.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit rule");?>" width="17" height="17" border="0" alt="edit" /></a></td>
- </tr>
- <tr>
- <td align="center" valign="middle"></td>
- <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus_d.gif" title="<?=gettext("add a new rule based on this one");?>" width="17" height="17" border="0" alt="add" /></td>
- </tr>
- </table>
- </td>
- </tr>
-<?php endif; ?>
-
+ <tr id="antilockout">
+ <td title="<?=gettext("traffic is passed")?>"><i class="icon icon-ok"></i></td>
+ <td>*</td>
+ <td>*</td>
+ <td>*</td>
+ <td><?=$iflist[$if];?> Address</td>
+ <td><?=$alports?></td>
+ <td>*</td>
+ <td>*</td>
+ <td></td>
+ <td><?=gettext("Anti-Lockout Rule");?></td>
+ <td>
+ <a href="system_advanced_admin.php" class="btn btn-xs btn-primary">edit</a>
+ </td>
+ </tr>
+<?php endif;?>
<?php if (isset($config['interfaces'][$if]['blockpriv'])): ?>
- <tr valign="top" id="frrfc1918">
- <td class="list">&nbsp;</td>
- <td class="listt" align="center"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" width="11" height="11" border="0" alt="block" /></td>
- <td class="listlr" style="background-color: #E0E0E0">&nbsp;</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0"><?=gettext("RFC 1918 networks");?></td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">&nbsp;</td>
- <td class="listbg"><?=gettext("Block private networks");?></td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="move rules before">
- <tr>
- <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules before this rule");?>" alt="edit" /></td>
- <td><a href="interfaces.php?if=<?=htmlspecialchars($if)?>#rfc1918"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit rule");?>" width="17" height="17" border="0" alt="edit" /></a></td>
- </tr>
- <tr>
- <td align="center" valign="middle"></td>
- <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus_d.gif" title="<?=gettext("add a new rule based on this one");?>" width="17" height="17" border="0" alt="add" /></td>
- </tr>
- </table>
- </td>
- </tr>
-<?php endif; ?>
+ <tr id="frrfc1918">
+ <td title="<?=gettext("traffic is blocked")?>"><i class="icon icon-remove"></i></td>
+ <td>*</td>
+ <td><?=gettext("RFC 1918 networks");?></td>
+ <td>*</td>
+ <td>*</td>
+ <td>*</td>
+ <td>*</td>
+ <td>*</td>
+ <td></td>
+ <td><?=gettext("Block private networks");?></td>
+ <td>
+ <a href="system_advanced_admin.php" class="btn btn-xs btn-primary" title="<?=gettext("edit rule");?>">edit</a>
+ </td>
+ </tr>
+<?php endif;?>
<?php if (isset($config['interfaces'][$if]['blockbogons'])): ?>
- <tr valign="top" id="frrfc1918">
- <td class="list">&nbsp;</td>
- <td class="listt" align="center"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" width="11" height="11" border="0" alt="block" /></td>
- <td class="listlr" style="background-color: #E0E0E0">&nbsp;</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0"><?=gettext("Reserved/not assigned by IANA");?></td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listr" style="background-color: #E0E0E0">*</td>
- <td class="listbg"><?=gettext("Block bogon networks");?></td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="move rules before">
- <tr>
- <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules before this rule");?>" alt="move" /></td>
- <td><a href="interfaces.php?if=<?=htmlspecialchars($if)?>#rfc1918"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit rule");?>" width="17" height="17" border="0" alt=" edit" /></a></td>
- </tr>
- <tr>
- <td align="center" valign="middle"></td>
- <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus_d.gif" title="<?=gettext("add a new rule based on this one");?>" width="17" height="17" border="0" alt="add" /></td>
- </tr>
- </table>
- </td>
- </tr>
-<?php endif; ?>
- <tbody>
-<?php
- $nrules = 0;
- for ($i = 0; isset($a_filter[$i]); $i++):
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/row_start");
- $filterent = $a_filter[$i];
- if ($filterent['interface'] != $if && !isset($filterent['floating'])) {
- continue;
- }
- if (isset($filterent['floating']) && "FloatingRules" != $if) {
- continue;
- }
- $isadvset = firewall_check_for_advanced_options($filterent);
- if ($isadvset) {
- $advanced_set = "<img src=\"./themes/{$g['theme']}/images/icons/icon_advanced.gif\" title=\"" . gettext("advanced settings set") . ": {$isadvset}\" border=\"0\" alt=\"advanced\" />";
- } else {
- $advanced_set = "";
- }
-?>
- <tr valign="top" id="fr<?=$nrules;?>">
- <td class="listt">
- <input type="checkbox" id="frc<?=$nrules;?>" name="rule[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$nrules;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
- <?php echo $advanced_set; ?>
- </td>
- <td class="listt" align="center">
- <?php
- if ($filterent['type'] == "block") {
- $iconfn = "block";
- } else if ($filterent['type'] == "reject") {
- $iconfn = "reject";
- } else if ($filterent['type'] == "match") {
- $iconfn = "match";
- } else {
- $iconfn = "pass";
- }
- if (isset($filterent['disabled'])) {
- $textss = "<span class=\"gray\">";
- $textse = "</span>";
- $iconfn .= "_d";
- } else {
- $textss = $textse = "";
- }
- ?>
- <a href="?if=<?=htmlspecialchars($if);?>&amp;act=toggle&amp;id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0" title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" /></a>
-<?php
- if (isset($filterent['log'])):
- $iconfnlog = "log_s";
- if (isset($filterent['disabled'])) {
- $iconfnlog .= "_d";
- }
+ <tr id="frrfc1918">
+ <td title="<?=gettext("traffic is blocked")?>"><i class="icon icon-remove"></i></td>
+ <td>*</td>
+ <td><?=gettext("Reserved/not assigned by IANA");?></td>
+ <td>*</td>
+ <td>*</td>
+ <td>*</td>
+ <td>*</td>
+ <td>*</td>
+ <td>*</td>
+ <td><?=gettext("Block bogon networks");?></td>
+ <td>
+ <a href="system_advanced_admin.php" class="btn btn-xs btn-primary">edit</a>
+ </td>
+ </tr>
+<?php endif;?>
+ </tbody>
+
+ <tbody class="user-entries">
+<?php for ($i = 0; isset($a_filter[$i]); $i++):
+ $filterent = $a_filter[$i];
+
+ if ($filterent['interface'] != $if && !isset($filterent['floating']))
+ continue;
+ if (isset($filterent['floating']) && "FloatingRules" != $if)
+ continue;
+
+ $nrules++;
?>
- <br /><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfnlog;?>.gif" width="11" height="15" border="0" alt="icon" />
-<?php endif; ?>
+ <tr<?=(isset($filterent['disabled']) ? ' class="disabled"' : '')?>>
+ <td title="<?=gettext("traffic is ").$filterent['type']."ed"?>">
+ <input type="hidden" name="rule[]" value="<?=$i?>" />
+
+ <?php
+ if ($filterent['type'] == "block")
+ $iconfn = "remove";
+ else if ($filterent['type'] == "reject")
+ $iconfn = "fire";
+ else if ($filterent['type'] == "match")
+ $iconfn = "filter";
+ else
+ $iconfn = "ok";
+ ?>
+ <i class="icon icon-<?=$iconfn?>"></i>
+ <?php
+ $isadvset = firewall_check_for_advanced_options($filterent);
+ if ($isadvset)
+ print '<i class="icon icon-cog" title="'. gettext("advanced setting") .': '. $isadvset .'"></i>';
+
+ if (isset($filterent['log']))
+ print '<i class="icon icon-tasks" title="'. gettext("traffic is logged") .'"></i>';
+ ?>
</td>
- <?php
-
- //build Alias popup box
- $alias_src_span_begin = "";
- $alias_src_port_span_begin = "";
- $alias_dst_span_begin = "";
- $alias_dst_port_span_begin = "";
-
- $alias_popup = rule_popup($filterent['source']['address'], pprint_port($filterent['source']['port']), $filterent['destination']['address'], pprint_port($filterent['destination']['port']));
-
- $alias_src_span_begin = $alias_popup["src"];
- $alias_src_port_span_begin = $alias_popup["srcport"];
- $alias_dst_span_begin = $alias_popup["dst"];
- $alias_dst_port_span_begin = $alias_popup["dstport"];
-
- $alias_src_span_end = $alias_popup["src_end"];
- $alias_src_port_span_end = $alias_popup["srcport_end"];
- $alias_dst_span_end = $alias_popup["dst_end"];
- $alias_dst_port_span_end = $alias_popup["dstport_end"];
-
- //build Schedule popup box
- $a_schedules = &$config['schedules']['schedule'];
- $schedule_span_begin = "";
- $schedule_span_end = "";
- $sched_caption_escaped = "";
- $sched_content = "";
- $schedstatus = false;
- $dayArray = array (gettext('Mon'), gettext('Tues'), gettext('Wed'), gettext('Thur'), gettext('Fri'), gettext('Sat'), gettext('Sun'));
- $monthArray = array (gettext('January'), gettext('February'), gettext('March'), gettext('April'), gettext('May'), gettext('June'), gettext('July'), gettext('August'), gettext('September'), gettext('October'), gettext('November'), gettext('December'));
- if ($config['schedules']['schedule'] <> "" and is_array($config['schedules']['schedule'])) {
- foreach ($a_schedules as $schedule) {
- if ($schedule['name'] == $filterent['sched']) {
- $schedstatus = filter_get_time_based_rule_status($schedule);
-
- foreach ($schedule['timerange'] as $timerange) {
- $tempFriendlyTime = "";
- $tempID = "";
- $firstprint = false;
- if ($timerange) {
- $dayFriendly = "";
- $tempFriendlyTime = "";
-
- //get hours
- $temptimerange = $timerange['hour'];
- $temptimeseparator = strrpos($temptimerange, "-");
-
- $starttime = substr ($temptimerange, 0, $temptimeseparator);
- $stoptime = substr ($temptimerange, $temptimeseparator+1);
-
- if ($timerange['month']) {
- $tempmontharray = explode(",", $timerange['month']);
- $tempdayarray = explode(",", $timerange['day']);
- $arraycounter = 0;
- $firstDayFound = false;
- $firstPrint = false;
- foreach ($tempmontharray as $monthtmp) {
- $month = $tempmontharray[$arraycounter];
- $day = $tempdayarray[$arraycounter];
-
- if (!$firstDayFound) {
- $firstDay = $day;
- $firstmonth = $month;
- $firstDayFound = true;
- }
-
- $currentDay = $day;
- $nextDay = $tempdayarray[$arraycounter+1];
- $currentDay++;
- if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])) {
- if ($firstPrint) {
- $dayFriendly .= ", ";
- }
- $currentDay--;
- if ($currentDay != $firstDay) {
- $dayFriendly .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ;
- } else {
- $dayFriendly .= $monthArray[$month-1] . " " . $day;
- }
- $firstDayFound = false;
- $firstPrint = true;
- }
- $arraycounter++;
- }
- } else {
- $tempdayFriendly = $timerange['position'];
+ <?php
+ $alias = rule_columns_with_alias(
+ $filterent['source']['address'],
+ pprint_port($filterent['source']['port']),
+ $filterent['destination']['address'],
+ pprint_port($filterent['destination']['port'])
+ );
+
+ //build Schedule popup box
+ $a_schedules = &$config['schedules']['schedule'];
+ $schedule_span_begin = "";
+ $schedule_span_end = "";
+ $sched_caption_escaped = "";
+ $sched_content = "";
+ $schedstatus = false;
+ $dayArray = array (gettext('Mon'),gettext('Tues'),gettext('Wed'),gettext('Thur'),gettext('Fri'),gettext('Sat'),gettext('Sun'));
+ $monthArray = array (gettext('January'),gettext('February'),gettext('March'),gettext('April'),gettext('May'),gettext('June'),gettext('July'),gettext('August'),gettext('September'),gettext('October'),gettext('November'),gettext('December'));
+ if ($config['schedules']['schedule'] != "" && is_array($config['schedules']['schedule'])) {
+ foreach ($a_schedules as $schedule)
+ {
+ if ($schedule['name'] == $filterent['sched'] ){
+ $schedstatus = filter_get_time_based_rule_status($schedule);
+
+ foreach($schedule['timerange'] as $timerange) {
+ $tempFriendlyTime = "";
+ $tempID = "";
+ $firstprint = false;
+ if ($timerange){
+ $dayFriendly = "";
+ $tempFriendlyTime = "";
+
+ //get hours
+ $temptimerange = $timerange['hour'];
+ $temptimeseparator = strrpos($temptimerange, "-");
+
+ $starttime = substr ($temptimerange, 0, $temptimeseparator);
+ $stoptime = substr ($temptimerange, $temptimeseparator+1);
+
+ if ($timerange['month']){
+ $tempmontharray = explode(",", $timerange['month']);
+ $tempdayarray = explode(",",$timerange['day']);
+ $arraycounter = 0;
+ $firstDayFound = false;
+ $firstPrint = false;
+ foreach ($tempmontharray as $monthtmp){
+ $month = $tempmontharray[$arraycounter];
+ $day = $tempdayarray[$arraycounter];
+
+ if (!$firstDayFound)
+ {
+ $firstDay = $day;
+ $firstmonth = $month;
+ $firstDayFound = true;
+ }
+
+ $currentDay = $day;
+ $nextDay = $tempdayarray[$arraycounter+1];
+ $currentDay++;
+ if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])){
+ if ($firstPrint)
+ $dayFriendly .= ", ";
+ $currentDay--;
+ if ($currentDay != $firstDay)
+ $dayFriendly .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ;
+ else
+ $dayFriendly .= $monthArray[$month-1] . " " . $day;
$firstDayFound = false;
- $tempFriendlyDayArray = explode(",", $tempdayFriendly);
- $currentDay = "";
- $firstDay = "";
- $nextDay = "";
- $counter = 0;
- foreach ($tempFriendlyDayArray as $day) {
- if ($day != "") {
- if (!$firstDayFound) {
- $firstDay = $tempFriendlyDayArray[$counter];
- $firstDayFound = true;
- }
- $currentDay =$tempFriendlyDayArray[$counter];
- //get next day
- $nextDay = $tempFriendlyDayArray[$counter+1];
- $currentDay++;
- if ($currentDay != $nextDay) {
- if ($firstprint) {
- $dayFriendly .= ", ";
- }
- $currentDay--;
- if ($currentDay != $firstDay) {
- $dayFriendly .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1];
- } else {
- $dayFriendly .= $dayArray[$firstDay-1];
- }
- $firstDayFound = false;
- $firstprint = true;
- }
- $counter++;
- }
- }
+ $firstPrint = true;
}
- $timeFriendly = $starttime . " - " . $stoptime;
- $description = $timerange['rangedescr'];
- $sched_content .= $dayFriendly . "; " . $timeFriendly . "<br />";
+ $arraycounter++;
}
}
- $sched_caption_escaped = str_replace("'", "\'", $schedule['descr']);
- $schedule_span_begin = "<span style=\"cursor: help;\" onmouseover=\"domTT_activate(this, event, 'content', '<h1>{$sched_caption_escaped}</h1><p>{$sched_content}</p>', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle');\" onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\"><u>";
- $schedule_span_end = "</u></span>";
- }
- }
- }
- $printicon = false;
- $alttext = "";
- $image = "";
- if (!isset($filterent['disabled'])) {
- if ($schedstatus) {
- if ($iconfn == "block" || $iconfn == "reject") {
- $image = "icon_block";
- $alttext = gettext("Traffic matching this rule is currently being denied");
- } else {
- $image = "icon_pass";
- $alttext = gettext("Traffic matching this rule is currently being allowed");
- }
- $printicon = true;
- } else if ($filterent['sched']) {
- if ($iconfn == "block" || $iconfn == "reject") {
- $image = "icon_block_d";
- } else {
- $image = "icon_block";
- }
- $alttext = gettext("This rule is not currently active because its period has expired");
- $printicon = true;
- }
- }
- ?>
- <td class="listlr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
- <?=$textss;?><?php if (isset($filterent['id'])) echo $filterent['id']."&nbsp;"; else echo "&nbsp;"; ?><?=$textse;?>
- </td>
- <?php
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_id_tr");
- ?>
- <?php
- if ('FloatingRules' == $if) {
- ?>
- <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
- <?=$textss;?>
- <?php
- if (isset($filterent['interface'])) {
- $selected_interfaces = explode(',', $filterent['interface']);
- unset($selected_descs);
- foreach ($selected_interfaces as $interface) {
- if (isset($ifdescs[$interface])) {
- $selected_descs[] = $ifdescs[$interface];
- } else {
- switch ($interface) {
- case 'l2tp':
- if ($config['l2tp']['mode'] == 'server') {
- $selected_descs[] = 'L2TP VPN';
- }
- break;
- case 'pptp':
- if ($config['pptpd']['mode'] == 'server') {
- $selected_descs[] = 'PPTP VPN';
- }
- break;
- case 'pppoe':
- if (is_pppoe_server_enabled()) {
- $selected_descs[] = 'PPPoE Server';
+ else
+ {
+ $tempdayFriendly = $timerange['position'];
+ $firstDayFound = false;
+ $tempFriendlyDayArray = explode(",", $tempdayFriendly);
+ $currentDay = "";
+ $firstDay = "";
+ $nextDay = "";
+ $counter = 0;
+ foreach ($tempFriendlyDayArray as $day){
+ if ($day != ""){
+ if (!$firstDayFound)
+ {
+ $firstDay = $tempFriendlyDayArray[$counter];
+ $firstDayFound = true;
}
- break;
- case 'enc0':
- if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
- $selected_descs[] = 'IPsec';
+ $currentDay =$tempFriendlyDayArray[$counter];
+ //get next day
+ $nextDay = $tempFriendlyDayArray[$counter+1];
+ $currentDay++;
+ if ($currentDay != $nextDay){
+ if ($firstprint)
+ $dayFriendly .= ", ";
+ $currentDay--;
+ if ($currentDay != $firstDay)
+ $dayFriendly .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1];
+ else
+ $dayFriendly .= $dayArray[$firstDay-1];
+ $firstDayFound = false;
+ $firstprint = true;
}
- break;
- case 'openvpn':
- if ($config['openvpn']['openvpn-server'] || $config['openvpn']['openvpn-client']) {
- $selected_descs[] = 'OpenVPN';
- }
- break;
- default:
- $selected_descs[] = $interface;
- break;
+ $counter++;
+ }
}
}
+ $timeFriendly = $starttime . " - " . $stoptime;
+ $description = $timerange['rangedescr'];
+ $sched_content .= $dayFriendly . "; " . $timeFriendly . "<br />";
}
-
- echo implode('<br/>', $selected_descs);
}
- ?>
- <?=$textse;?>
- </td>
- <?php
+ #FIXME
+ $sched_caption_escaped = str_replace("'", "\'", $schedule['descr']);
+ $schedule_span_begin = "<span style=\"cursor: help;\" onmouseover=\"domTT_activate(this, event, 'content', '<h1>{$sched_caption_escaped}</h1><p>{$sched_content}</p>', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle');\" onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\"><u>";
+ $schedule_span_end = "</u></span>";
}
- ?>
- <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
- <?=$textss;?>
- <?php
- if (isset($filterent['ipprotocol'])) {
- switch ($filterent['ipprotocol']) {
- case "inet":
- echo "IPv4 ";
- break;
- case "inet6":
- echo "IPv6 ";
- break;
- case "inet46":
- echo "IPv4+6 ";
- break;
- }
- } else {
- echo "IPv4 ";
- }
- if (isset($filterent['protocol'])) {
- echo strtoupper($filterent['protocol']);
- if (strtoupper($filterent['protocol']) == "ICMP" && !empty($filterent['icmptype'])) {
- echo ' <span style="cursor: help;" title="ICMP type: ' .
- ($filterent['ipprotocol'] == "inet6" ? $icmp6types[$filterent['icmptype']] : $icmptypes[$filterent['icmptype']]) .
- '"><u>';
- echo $filterent['icmptype'];
- echo '</u></span>';
- }
- } else {
- echo "*";
- }
- ?>
- <?=$textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
- <?=$textss;?><?php echo $alias_src_span_begin;?><?php echo htmlspecialchars(pprint_address($filterent['source']));?><?php echo $alias_src_span_end;?><?=$textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
- <?=$textss;?><?php echo $alias_src_port_span_begin;?><?php echo htmlspecialchars(pprint_port($filterent['source']['port'])); ?><?php echo $alias_src_port_span_end;?><?=$textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
- <?=$textss;?><?php echo $alias_dst_span_begin;?><?php echo htmlspecialchars(pprint_address($filterent['destination'])); ?><?php echo $alias_dst_span_end;?><?=$textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
- <?=$textss;?><?php echo $alias_dst_port_span_begin;?><?php echo htmlspecialchars(pprint_port($filterent['destination']['port'])); ?><?php echo $alias_dst_port_span_end;?><?=$textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
- <?=$textss;?><?php if (isset($config['interfaces'][$filterent['gateway']]['descr'])) echo htmlspecialchars($config['interfaces'][$filterent['gateway']]['descr']); else echo htmlspecialchars(pprint_port($filterent['gateway'])); ?><?=$textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
- <?=$textss;?>
- <?php
- if (isset($filterent['ackqueue']) && isset($filterent['defaultqueue'])) {
- $desc = $filterent['ackqueue'] ;
- echo "<a href=\"firewall_shaper_queues.php?queue={$filterent['ackqueue']}&amp;action=show\">{$desc}</a>";
- $desc = $filterent['defaultqueue'];
- echo "/<a href=\"firewall_shaper_queues.php?queue={$filterent['defaultqueue']}&amp;action=show\">{$desc}</a>";
- } else if (isset($filterent['defaultqueue'])) {
- $desc = $filterent['defaultqueue'];
- echo "<a href=\"firewall_shaper_queues.php?queue={$filterent['defaultqueue']}&amp;action=show\">{$desc}</a>";
+ }
+ }
+ $printicon = false;
+ $alttext = "";
+ $image = "";
+ if (!isset($filterent['disabled'])) {
+ if ($schedstatus) {
+ if ($iconfn == "block" || $iconfn == "reject") {
+ $image = "icon_block";
+ $alttext = gettext("Traffic matching this rule is currently being denied");
} else {
- echo gettext("none");
+ $image = "icon_pass";
+ $alttext = gettext("Traffic matching this rule is currently being allowed");
}
- ?>
- <?=$textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
- <font color="black">
- <?php if ($printicon) { ?><img src="./themes/<?= $g['theme']; ?>/images/icons/<?php echo $image; ?>.gif" title="<?php echo $alttext;?>" border="0" alt="icon" /><?php } ?><?=$textss;?><?php echo $schedule_span_begin;?><?=htmlspecialchars($filterent['sched']);?>&nbsp;<?php echo $schedule_span_end; ?><?=$textse;?>
- </font>
- </td>
- <?php
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_descr_tr");
- ?>
- <td class="listbg descr" onclick="fr_toggle(<?=$nrules;?>)" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
- <?=$textss;?><?=htmlspecialchars($filterent['descr']);?>&nbsp;<?=$textse;?>
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="move before">
- <tr>
- <td><input name="move_<?=$i;?>" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17" title="<?=gettext("move selected rules before this rule"); ?>" onmouseover="fr_insline(<?=$nrules;?>, true)" onmouseout="fr_insline(<?=$nrules;?>, false)" /></td>
- <td><a href="firewall_rules_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit rule"); ?>" width="17" height="17" border="0" alt="edit" /></a></td>
- </tr>
- <tr>
- <td align="center" valign="middle"><a href="firewall_rules.php?act=del&amp;if=<?=htmlspecialchars($if);?>&amp;id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule"); ?>" onclick="return confirm('Do you really want to delete this rule?')" alt="delete" /></a></td>
- <td><a href="firewall_rules_edit.php?dup=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new rule based on this one"); ?>" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <?php $nrules++; endfor; ?>
- <tr><td></td></tr>
- </tbody>
-<?php if ($nrules == 0): ?>
- <tr>
- <td class="listt"></td>
- <td class="listt"></td>
+ $printicon = true;
+ } else if ($filterent['sched']) {
+ if ($iconfn == "block" || $iconfn == "reject")
+ $image = "icon_block_d";
+ else
+ $image = "icon_block";
+ $alttext = gettext("This rule is not currently active because its period has expired");
+ $printicon = true;
+ }
+ }
+ ?>
+ <td>
<?php
- if ($_REQUEST['if'] == "FloatingRules") {
- $ncolumns = "11";
+ if (isset($filterent['ipprotocol'])) {
+ switch($filterent['ipprotocol']) {
+ case "inet":
+ echo "IPv4 ";
+ break;
+ case "inet6":
+ echo "IPv6 ";
+ break;
+ case "inet46":
+ echo "IPv4+6 ";
+ break;
+ }
} else {
- $ncolumns = "10";
+ echo "IPv4 ";
}
+
+ if (isset($filterent['protocol'])) {
+ echo strtoupper($filterent['protocol']);
+
+ if (strtoupper($filterent['protocol']) == "ICMP" && !empty($filterent['icmptype'])) {
+ echo ' <span style="cursor: help;" title="ICMP type: ' .
+ ( $filterent['ipprotocol'] == "inet6" ? $icmp6types[$filterent['icmptype']] : $icmptypes[$filterent['icmptype']] ) .
+ '"><u>';
+ echo $filterent['icmptype'];
+ echo '</u></span>';
+ }
+ } else echo "*";
?>
- <td class="listlr" colspan=<?=$ncolumns;?> align="center" valign="middle">
- <span class="gray">
- <?php if ($_REQUEST['if'] == "FloatingRules"): ?>
- <?=gettext("No floating rules are currently defined."); ?><br /><br />
- <?php else: ?>
- <?=gettext("No rules are currently defined for this interface"); ?><br />
- <?=gettext("All incoming connections on this interface will be blocked until you add pass rules."); ?><br /><br />
- <?php endif; ?>
- <?=gettext("Click the"); ?> <a href="firewall_rules_edit.php?if=<?=htmlspecialchars($if);?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add new rule");?>" border="0" width="17" height="17" align="middle" alt="add" /></a><?=gettext(" button to add a new rule.");?></span>
- </td>
- </tr>
-<?php endif; ?>
- <tr id="fr<?=$nrules;?>">
- <td class="list"></td>
- <td class="list"></td>
- <?php
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_id_tr_belowtable");
- ?>
- <td class="list">&nbsp;</td>
- <td class="list">&nbsp;</td>
- <td class="list">&nbsp;</td>
- <td class="list">&nbsp;</td>
- <td class="list">&nbsp;</td>
- <td class="list">&nbsp;</td>
- <td class="list">&nbsp;</td>
- <td class="list">&nbsp;</td>
- <td class="list">&nbsp;</td>
- <td class="list">&nbsp;</td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="move rules">
- <tr>
- <td>
- <?php if ($nrules == 0): ?><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules to end");?>" border="0" alt="move" /><?php else: ?><input name="move_<?=$i;?>" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17" title="<?=gettext("move selected rules to end");?>" onmouseover="fr_insline(<?=$nrules;?>, true)" onmouseout="fr_insline(<?=$nrules;?>, false)" /><?php endif; ?>
- </td>
- <td></td>
- </tr>
- <tr>
- <td>
-<?php if ($nrules == 0): ?>
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected rules");?>" border="0" alt="delete" /><?php else: ?>
- <input name="del" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" style="width:17;height:17" title="<?=gettext("delete selected rules");?>" onclick="return confirm('<?=gettext('Do you really want to delete the selected rules?');?>')" />
-<?php endif; ?>
- </td>
- <td>
- <a href="firewall_rules_edit.php?if=<?=htmlspecialchars($if);?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add new rule");?>" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="icons">
- <tr>
- <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" width="11" height="11" alt="pass" /></td>
- <td width="100"><?=gettext("pass");?></td>
- <td width="14"></td>
- <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_match.gif" width="11" height="11" alt="match" /></td>
- <td width="100"><?=gettext("match");?></td>
- <td width="14"></td>
- <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" width="11" height="11" alt="block" /></td>
- <td width="100"><?=gettext("block");?></td>
- <td width="14"></td>
- <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_reject.gif" width="11" height="11" alt="reject" /></td>
- <td width="100"><?=gettext("reject");?></td>
- <td width="14"></td>
- <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_log.gif" width="11" height="11" alt="log" /></td>
- <td width="100"><?=gettext("log");?></td>
- </tr>
- <tr>
- <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass_d.gif" width="11" height="11" alt="pass disabled" /></td>
- <td class="nowrap"><?=gettext("pass (disabled)");?></td>
- <td>&nbsp;</td>
- <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_match_d.gif" width="11" height="11" alt="match disabled" /></td>
- <td class="nowrap"><?=gettext("match (disabled)");?></td>
- <td>&nbsp;</td>
- <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block_d.gif" width="11" height="11" alt="block disabled" /></td>
- <td class="nowrap"><?=gettext("block (disabled)");?></td>
- <td>&nbsp;</td>
- <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_reject_d.gif" width="11" height="11" alt="reject disabled" /></td>
- <td class="nowrap"><?=gettext("reject (disabled)");?></td>
- <td>&nbsp;</td>
- <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_log_d.gif" width="11" height="11" alt="log disabled" /></td>
- <td class="nowrap"><?=gettext("log (disabled)");?></td>
- </tr>
- <tr>
- <td colspan="10">
- <p>&nbsp;</p>
- <strong>
- <span class="red"><?=gettext("Hint:");?></span>
- </strong><br />
- <ul>
- <?php if ("FloatingRules" != $if): ?>
- <li><?=gettext("Rules are evaluated on a first-match basis (i.e. " .
- "the action of the first rule to match a packet will be executed). " .
- "This means that if you use block rules, you'll have to pay attention " .
- "to the rule order. Everything that isn't explicitly passed is blocked " .
- "by default. ");?>
- </li>
- <?php else: ?>
- <li><?=gettext("Floating rules are evaluated on a first-match basis (i.e. " .
- "the action of the first rule to match a packet will be executed) only " .
- "if the 'quick' option is checked on a rule. Otherwise they will only apply if no " .
- "other rules match. Pay close attention to the rule order and options " .
- "chosen. If no rule here matches, the per-interface or default rules are used. ");?>
- </li>
- <?php endif; ?>
- </ul>
- </td>
- </tr>
- </table>
+ </td>
+ <td>
+ <?php if (isset($alias['src'])): ?>
+ <a href="/firewall_aliases_edit.php?id=<?=$alias['src']?>" data-toggle="popover" data-trigger="hover focus" title="Alias details" data-content="<?=alias_info_popup($alias['src'])?>" data-html="true">
+ <?php endif; ?>
+ <?=htmlspecialchars(pprint_address($filterent['source']))?>
+ <?php if (isset($alias['src'])): ?>
+ <i class='icon icon-pencil'></i></a>
+ <?php endif; ?>
+ </td>
+ <td>
+ <?php if (isset($alias['srcport'])): ?>
+ <a href="/firewall_aliases_edit.php?id=<?=$alias['srcport']?>" data-toggle="popover" data-trigger="hover focus" title="Alias details" data-content="<?=alias_info_popup($alias['srcport'])?>" data-html="true">
+ <?php endif; ?>
+ <?=htmlspecialchars(pprint_port($filterent['source']['port']))?>
+ <?php if (isset($alias['srcport'])): ?>
+ <i class='icon icon-pencil'></i></a>
+ <?php endif; ?>
+ </td>
+ <td>
+ <?php if (isset($alias['dst'])): ?>
+ <a href="/firewall_aliases_edit.php?id=<?=$alias['dst']?>" data-toggle="popover" data-trigger="hover focus" title="Alias details" data-content="<?=alias_info_popup($alias['dstport'])?>" data-html="true">
+ <?php endif; ?>
+ <?=htmlspecialchars(pprint_address($filterent['destination']))?>
+ <?php if (isset($alias['dst'])): ?>
+ <i class='icon icon-pencil'></i></a>
+ <?php endif; ?>
+ </td>
+ <td>
+ <?php if (isset($alias['dstport'])): ?>
+ <a href="/firewall_aliases_edit.php?id=<?=$alias['dstport']?>" data-toggle="popover" data-trigger="hover focus" title="Alias details" data-content="<?=alias_info_popup($alias['dstport'])?>" data-html="true">
+ <?php endif; ?>
+ <?=htmlspecialchars(pprint_port($filterent['destination']['port']))?>
+ <?php if (isset($alias['dstport'])): ?>
+ <i class='icon icon-pencil'></i></a>
+ <?php endif; ?>
+ </td>
+ <td>
+ <?php if (isset($config['interfaces'][$filterent['gateway']]['descr'])):?>
+ <?=htmlspecialchars($config['interfaces'][$filterent['gateway']]['descr'])?>
+ <?php else: ?>
+ <?=htmlspecialchars(pprint_port($filterent['gateway']))?>
+ <?php endif; ?>
+ </td>
+ <td>
+ <?php
+ if (isset($filterent['ackqueue']) && isset($filterent['defaultqueue'])) {
+ $desc = $filterent['ackqueue'] ;
+ echo "<a href=\"firewall_shaper_queues.php?queue={$filterent['ackqueue']}&amp;action=show\">{$desc}</a>";
+ $desc = $filterent['defaultqueue'];
+ echo "/<a href=\"firewall_shaper_queues.php?queue={$filterent['defaultqueue']}&amp;action=show\">{$desc}</a>";
+ } else if (isset($filterent['defaultqueue'])) {
+ $desc = $filterent['defaultqueue'];
+ echo "<a href=\"firewall_shaper_queues.php?queue={$filterent['defaultqueue']}&amp;action=show\">{$desc}</a>";
+ } else
+ echo gettext("none");
+ ?>
+ </td>
+ <td>
+ <?php if ($printicon) { ?><img src="./themes/<?= $g['theme'];?>/images/icons/<?=$image;?>.gif" title="<?=$alttext;?>" border="0" alt="icon" /><?php } ?>
+ <?=$schedule_span_begin;?><?=htmlspecialchars($filterent['sched']);?>&nbsp;<?=$schedule_span_end;?>
+ </td>
+ <td>
+ <?=htmlspecialchars($filterent['descr']);?>
+ </td>
+ <td>
+ <a href="firewall_rules_edit.php?id=<?=$i;?>" class="btn btn-xs btn-primary">edit</a>
+ <a href="firewall_rules_edit.php?dup=<?=$i;?>" class="btn btn-xs btn-default">copy</a>
+ <a href="?act=toggle&amp;if=<?=htmlspecialchars($if);?>&amp;id=<?=$i;?>" class="btn btn-xs btn-warning"><?=(isset($filterent['disabled']) ? 'enable' : 'disable')?></a>
+ <a href="?act=del&amp;if=<?=htmlspecialchars($if);?>&amp;id=<?=$i;?>" class="btn btn-xs btn-danger">delete</a>
+ </td>
+ </tr>
+<?php
+ endfor;
+?>
+ </tbody>
+ </table>
</div>
- </td></tr>
-</table>
-<input type="hidden" name="if" value="<?=htmlspecialchars($if);?>" />
+ </div>
+
+<?php if ($nrules == 0): ?>
+ <div class="alert alert-warning" role="alert">
+ <p>
+ <?php if ($_REQUEST['if'] == "FloatingRules"): ?>
+ <?=gettext("No floating rules are currently defined.");?>
+ <?php else: ?>
+ <?=gettext("No rules are currently defined for this interface");?><br />
+ <?=gettext("All incoming connections on this interface will be blocked until you add pass rules.");?>
+ <?php endif;?>
+ <?=gettext("Click the button to add a new rule.");?>
+ </p>
+ </div>
+<?php endif;?>
+
+ <nav class="action-buttons">
+ <input type="submit" id="order-store" class="btn btn-sm btn-primary" value="store changes" disabled="disabled" />
+ <a href="firewall_rules_edit.php?if=<?=htmlspecialchars($if);?>" role="button" class="btn btn-sm btn-success">
+ <?=gettext("add new");?>
+ </a>
+ </nav>
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<!-- Legend -->
+<div>
+ <dl class="dl-horizontal responsive">
+ <dt><?=gettext('Legend')?></dt> <dd></dd>
+ <dt><i class="icon icon-ok"></i></dt> <dd><?=gettext("pass");?></dd>
+ <dt><i class="icon icon-filter"></i></dt> <dd><?=gettext("match");?></dd>
+ <dt><i class="icon icon-remove"></i></dt> <dd><?=gettext("block");?></dd>
+ <dt><i class="icon icon-fire"></i></dt> <dd><?=gettext("reject");?></dd>
+ <dt><i class="icon icon-tasks"></i></dt> <dd> <?=gettext("log");?></dd>
+ <dt><i class="icon icon-cog"></i></dt> <dd> <?=gettext("advanced filter");?></dd>
+ </dl>
+</div>
+
+<?php
+if ("FloatingRules" != $if)
+ print_info_box(gettext("Rules are evaluated on a first-match basis (i.e. " .
+ "the action of the first rule to match a packet will be executed). ") . '<br />' .
+ gettext("This means that if you use block rules, you'll have to pay attention " .
+ "to the rule order. Everything that isn't explicitly passed is blocked " .
+ "by default. "));
+else
+ print_info_box(gettext("Floating rules are evaluated on a first-match basis (i.e. " .
+ "the action of the first rule to match a packet will be executed) only " .
+ "if the 'quick' option is checked on a rule. Otherwise they will only apply if no " .
+ "other rules match. Pay close attention to the rule order and options " .
+ "chosen. If no rule here matches, the per-interface or default rules are used. "));
+
+?>
+
+<script>
+events.push(function() {
+ // Make rules sortable
+ $('table tbody.user-entries').sortable({
+ cursor: 'grabbing',
+ update: function(event, ui) {
+ $('#order-store').removeAttr('disabled');
+ }
+ });
+
+ // Replace direct delete with quicker front-end action
+/*FIXME: event ordering
+ $('.btn-danger').on('click', function(e){
+ $(this).parents('tr').remove();
+
+ $('#order-store').removeAttr('disabled');
+ });
+*/});
+</script>
+<?php include("foot.inc");?> \ No newline at end of file
diff --git a/src/usr/local/www/firewall_rules_edit.php b/src/usr/local/www/firewall_rules_edit.php
index b0af4cc..1f6c1d1 100644
--- a/src/usr/local/www/firewall_rules_edit.php
+++ b/src/usr/local/www/firewall_rules_edit.php
@@ -2,35 +2,60 @@
/* $Id$ */
/*
firewall_rules_edit.php
- part of pfSense (https://www.pfsense.org)
- Copyright (C) 2005 Scott Ullrich (sullrich@gmail.com)
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004 Scott Ullrich
+ * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>
+ * Originally part of pfSense (https://www.pfsense.org)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: filter
*/
@@ -185,7 +210,7 @@ if (isset($id) && $a_filter[$id]) {
$pconfig['srcmask'], $pconfig['srcnot'],
$pconfig['srcbeginport'], $pconfig['srcendport']);
- if ($a_filter[$id]['os'] <> "") {
+ if ($a_filter[$id]['os'] != "") {
$pconfig['os'] = $a_filter[$id]['os'];
}
@@ -923,6 +948,47 @@ if ($_POST) {
}
}
+function build_flag_table() {
+ global $pconfig, $tcpflags;
+
+ $flagtable = '<table class="table table-condensed table-flags" style="width: auto;">';
+
+ $setflags = explode(",", $pconfig['tcpflags1']);
+ $outofflags = explode(",", $pconfig['tcpflags2']);
+ $header = "<td></td>";
+ $tcpflags1 = "<td>set</td>";
+ $tcpflags2 = "<td>out of</td>";
+
+ foreach ($tcpflags as $tcpflag) {
+ $header .= "<td><strong>" . strtoupper($tcpflag) . "</strong></td>\n";
+ $tcpflags1 .= "<td> <input type='checkbox' name='tcpflags1_{$tcpflag}' value='on' ";
+
+ if (array_search($tcpflag, $setflags) !== false) {
+ $tcpflags1 .= "checked=\"checked\"";
+ }
+
+ $tcpflags1 .= " /></td>\n";
+ $tcpflags2 .= "<td> <input type='checkbox' name='tcpflags2_{$tcpflag}' value='on' ";
+
+ if (array_search($tcpflag, $outofflags) !== false) {
+ $tcpflags2 .= "checked=\"checked\"";
+ }
+
+ $tcpflags2 .= " /></td>\n";
+ }
+
+ $flagtable .= "<tr id='tcpheader'>{$header}</tr>\n";
+ $flagtable .= "<tr id='tcpflags1'>{$tcpflags1}</tr>\n";
+ $flagtable .= "<tr id='tcpflags2'>{$tcpflags2}</tr>\n";
+ $flagtable .= "</table>";
+
+ $flagtable .= '<input type="checkbox" name="tcpflags_any" id="tcpflags_any" value="on"';
+ $flagtable .= $pconfig['tcpflags_any'] ? 'checked="checked"':'' . '/>';
+ $flagtable .= '<strong>' . gettext(" Any flags.") . '</strong>';
+
+ return($flagtable);
+}
+
$pgtitle = array(gettext("Firewall"), gettext("Rules"), gettext("Edit"));
$shortcut_section = "firewall";
@@ -931,1016 +997,953 @@ $closehead = false;
$page_filename = "firewall_rules_edit.php";
include("head.inc");
-?>
-<link rel="stylesheet" href="/javascript/chosen/chosen.css" />
-</head>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
-<script src="/javascript/chosen/chosen.jquery.js" type="text/javascript"></script>
-<?php include("fbegin.inc"); ?>
-<?php pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_input_errors"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-
-<form action="firewall_rules_edit.php" method="post" name="iform" id="iform">
-<input type='hidden' name="ruleid" value="<?=(isset($pconfig['ruleid'])&&$pconfig['ruleid']>0)?htmlspecialchars($pconfig['ruleid']):''?>" />
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall rules edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Firewall rule");?></td>
- </tr>
-<?php
- // Allow extending of the firewall edit page and include custom input validation
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/htmlphpearly");
-?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Action");?></td>
- <td width="78%" class="vtable">
- <select name="type" class="formselect">
- <?php $types = explode(" ", "Pass Block Reject"); foreach ($types as $type): ?>
- <option value="<?=strtolower($type);?>" <?php if (strtolower($type) == strtolower($pconfig['type'])) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($type);?>
- </option>
- <?php endforeach; ?>
-<?php if ($if == "FloatingRules" || isset($pconfig['floating'])): ?>
- <option value="match" <?php if ("match" == strtolower($pconfig['type'])) echo "selected=\"selected\""; ?>>Match</option>
-<?php endif; ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Choose what to do with packets that match the criteria specified below.");?> <br />
- <?=gettext("Hint: the difference between block and reject is that with reject, a packet (TCP RST or ICMP port unreachable for UDP) is returned to the sender, whereas with block the packet is dropped silently. In either case, the original packet is discarded.");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled");?></td>
- <td width="78%" class="vtable">
- <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable this rule");?></strong><br />
- <span class="vexpl"><?=gettext("Set this option to disable this rule without removing it from the list.");?></span>
- </td>
- </tr>
-<?php if ($if == "FloatingRules" || isset($pconfig['floating'])): ?>
- <tr>
- <td width="22%" valign="top" class="vncellreq">
- <?=gettext("Quick");?>
- </td>
- <td width="78%" class="vtable">
- <input name="quick" type="checkbox" id="quick" value="yes" <?php if ($pconfig['quick']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Apply the action immediately on match.");?></strong><br />
- <span class="vexpl"><?=gettext("Set this option if you need to apply this action to traffic that matches this rule immediately.");?></span>
- </td>
- </tr>
-<?php endif; ?>
-<?php $edit_disabled = ""; ?>
-<?php if (isset($pconfig['associated-rule-id'])): ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Associated filter rule");?></td>
- <td width="78%" class="vtable">
- <span class="red"><strong><?=gettext("Note: ");?></strong></span><?=gettext("This is associated to a NAT rule.");?><br />
- <?=gettext("You cannot edit the interface, protocol, source, or destination of associated filter rules.");?><br />
- <br />
- <?php
- $edit_disabled = "disabled";
- if (is_array($config['nat']['rule'])) {
- foreach ($config['nat']['rule'] as $index => $nat_rule) {
- if (isset($nat_rule['associated-rule-id']) && $nat_rule['associated-rule-id'] == $pconfig['associated-rule-id']) {
- echo "<a href=\"firewall_nat_edit.php?id={$index}\">" . gettext("View the NAT rule") . "</a><br />";
- break;
- }
- }
- }
- echo "<input name='associated-rule-id' id='associated-rule-id' type='hidden' value='{$pconfig['associated-rule-id']}' />";
- if (!empty($pconfig['interface'])) {
- echo "<input name='interface' id='interface' type='hidden' value='{$pconfig['interface']}' />";
- }
- ?>
- <script type="text/javascript">
- //<![CDATA[
- editenabled = 0;
- //]]>
- </script>
- </td>
- </tr>
-<?php endif; ?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
- <td width="78%" class="vtable">
-<?php if ($if == "FloatingRules" || isset($pconfig['floating'])): ?>
- <select name="interface[]" title="Select interfaces..." multiple="multiple" style="width:350px;" class="chzn-select" tabindex="2" <?=$edit_disabled;?>>
-<?php else: ?>
- <select name="interface" class="formselect" <?=$edit_disabled;?>>
-<?php endif;
- /* add group interfaces */
- if (is_array($config['ifgroups']['ifgroupentry'])) {
- foreach ($config['ifgroups']['ifgroupentry'] as $ifgen) {
- if (have_ruleint_access($ifgen['ifname'])) {
- $interfaces[$ifgen['ifname']] = $ifgen['ifname'];
- }
- }
- }
- $ifdescs = get_configured_interface_with_descr();
- // Allow extending of the firewall edit page and include custom input validation
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_interfaces_edit");
- foreach ($ifdescs as $ifent => $ifdesc) {
- if (have_ruleint_access($ifent)) {
- $interfaces[$ifent] = $ifdesc;
- }
- }
- if ($config['l2tp']['mode'] == "server") {
- if (have_ruleint_access("l2tp")) {
- $interfaces['l2tp'] = "L2TP VPN";
- }
- }
- if ($config['pptpd']['mode'] == "server") {
- if (have_ruleint_access("pptp")) {
- $interfaces['pptp'] = "PPTP VPN";
- }
- }
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+$form = new Form;
+$section = new Form_Section('Edit Firewall rule');
+
+if (isset($id))
+{
+ $form->addGlobal(new Form_Input(
+ 'id',
+ 'ID',
+ 'hidden',
+ $id
+ ));
+}
- if (is_pppoe_server_enabled() && have_ruleint_access("pppoe")) {
- $interfaces['pppoe'] = "PPPoE Server";
- }
- /* add ipsec interfaces */
- if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
- if (have_ruleint_access("enc0")) {
- $interfaces["enc0"] = "IPsec";
- }
- }
- /* add openvpn/tun interfaces */
- if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
- $interfaces["openvpn"] = "OpenVPN";
- }
- if (is_array($pconfig['interface'])) {
- $pconfig['interface'] = implode(",", $pconfig['interface']);
- }
- $selected_interfaces = explode(",", $pconfig['interface']);
- foreach ($interfaces as $iface => $ifacename): ?>
- <option value="<?=$iface;?>" <?php if ($pconfig['interface'] <> "" && (strcasecmp($pconfig['interface'], $iface) == 0 || in_array($iface, $selected_interfaces))) echo "selected=\"selected\""; ?>><?=$ifacename?></option>
-<?php endforeach; ?>
- </select>
- <br />
- <?php if ($if == "FloatingRules" || isset($pconfig['floating'])): ?>
- <span class="vexpl"><?=gettext("Choose the interface(s) for this rule.");?></span>
- <?php else: ?>
- <span class="vexpl"><?=gettext("Choose which interface packets must be sourced on to match this rule.");?></span>
- <?php endif; ?>
- </td>
- </tr>
-<?php if ($if == "FloatingRules" || isset($pconfig['floating'])): ?>
- <tr>
- <td width="22%" valign="top" class="vncellreq">
- <?=gettext("Direction");?>
- </td>
- <td width="78%" class="vtable">
- <select name="direction" class="formselect">
- <?php $directions = array('any', 'in', 'out');
- foreach ($directions as $direction): ?>
- <option value="<?=$direction;?>"
- <?php if ($direction == $pconfig['direction']): ?>
- selected="selected"
- <?php endif; ?>
- ><?=$direction;?></option>
- <?php endforeach; ?>
- </select>
- <input type="hidden" id="floating" name="floating" value="floating" />
- </td>
- </tr>
-<?php endif; ?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("TCP/IP Version");?></td>
- <td width="78%" class="vtable">
- <select name="ipprotocol" class="formselect" onchange="proto_change()">
- <?php
- $ipproto = array('inet' => 'IPv4', 'inet6' => 'IPv6', 'inet46' => 'IPv4+IPv6');
- foreach ($ipproto as $proto => $name):
- ?>
- <option value="<?=$proto;?>"
- <?php if ($proto == $pconfig['ipprotocol']): ?>
- selected="selected"
- <?php endif; ?>
- ><?=$name;?></option>
- <?php endforeach; ?>
- </select>
- <strong><?=gettext("Select the Internet Protocol version this rule applies to");?></strong><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol");?></td>
- <td width="78%" class="vtable">
- <select <?=$edit_disabled;?> name="proto" class="formselect" onchange="proto_change()">
-<?php
- $protocols = explode(" ", "TCP UDP TCP/UDP ICMP ESP AH GRE IPV6 IGMP PIM OSPF SCTP any carp pfsync");
- foreach ($protocols as $proto): ?>
- <option value="<?=strtolower($proto);?>" <?php if (strtolower($proto) == $pconfig['proto']) echo "selected=\"selected\""; ?>><?=htmlspecialchars($proto);?></option>
-<?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Choose which IP protocol this rule should match.");?> <br /> <?=gettext("Hint: in most cases, you should specify ");?><em>TCP</em> &nbsp;<?=gettext("here.");?></span>
- </td>
- </tr>
- <tr id="icmpbox">
- <td valign="top" class="vncell"><?=gettext("ICMP type");?></td>
- <td class="vtable">
- <select <?=$edit_disabled;?> name="icmptype" class="formselect">
-<?php
- foreach ($icmptypes as $icmptype => $descr):
-?>
- <option value="<?=$icmptype;?>" <?php if ($icmptype == $pconfig['icmptype']) echo "selected=\"selected\""; ?>><?=htmlspecialchars($descr);?></option>
-<?php
- endforeach;
-?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("If you selected ICMP for the protocol above, you may specify an ICMP type here.");?></span>
- </td>
- </tr>
- <tr id="icmp6box">
- <td valign="top" class="vncell"><?=gettext("ICMPv6 type");?></td>
- <td class="vtable">
- <select <?=$edit_disabled;?> name="icmp6type" class="formselect">
-<?php
- foreach ($icmp6types as $icmptype => $descr):
-?>
- <option value="<?=$icmptype;?>" <?php if ($icmptype == $pconfig['icmptype']) echo "selected=\"selected\""; ?>><?=htmlspecialchars($descr);?></option>
-<?php
- endforeach;
-?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("If you selected ICMP for the protocol above, you may specify an ICMP type here.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Source");?></td>
- <td width="78%" class="vtable">
- <input <?=$edit_disabled;?> name="srcnot" type="checkbox" id="srcnot" value="yes" <?php if ($pconfig['srcnot']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("not");?></strong>
- <br />
- <?=gettext("Use this option to invert the sense of the match.");?>
- <br />
- <br />
- <table border="0" cellspacing="0" cellpadding="0">
- <tr>
- <td><?=gettext("Type:");?>&nbsp;&nbsp;</td>
- <td>
- <select <?=$edit_disabled;?> name="srctype" class="formselect" onchange="typesel_change()">
-<?php
- $sel = is_specialnet($pconfig['src']);
-?>
- <option value="any" <?php if ($pconfig['src'] == "any") { echo "selected=\"selected\""; } ?>><?=gettext("any");?></option>
- <option value="single"
- <?php
- if (!$sel &&
- ((is_ipaddrv6($pconfig['src']) && $pconfig['srcmask'] == 128) ||
- (is_ipaddrv4($pconfig['src']) && $pconfig['srcmask'] == 32) || is_alias($pconfig['src']))) {
- echo "selected=\"selected\""; $sel = 1;
- }
- ?>
- > <?=gettext("Single host or alias");?></option>
- <option value="network" <?php if (!$sel) echo "selected=\"selected\""; ?>><?=gettext("Network");?></option>
- <?php if (isset($a_filter[$id]['floating']) || $if == "FloatingRules"): ?>
- <option value="(self)" <?php if ($pconfig['src'] == "(self)") echo "selected=\"selected\""; ?>><?=gettext("This Firewall (self)");?></option>
- <?php endif;?>
- <?php if (have_ruleint_access("pptp")): ?>
- <option value="pptp" <?php if ($pconfig['src'] == "pptp") { echo "selected=\"selected\""; } ?>><?=gettext("PPTP clients");?></option>
- <?php endif; ?>
- <?php if (have_ruleint_access("pppoe")): ?>
- <option value="pppoe" <?php if ($pconfig['src'] == "pppoe") { echo "selected=\"selected\""; } ?>><?=gettext("PPPoE clients");?></option>
- <?php endif; ?>
- <?php if (have_ruleint_access("l2tp")): ?>
- <option value="l2tp" <?php if ($pconfig['src'] == "l2tp") { echo "selected=\"selected\""; } ?>><?=gettext("L2TP clients");?></option>
- <?php endif; ?>
-<?php
- foreach ($ifdisp as $ifent => $ifdesc):
-?>
- <?php if (have_ruleint_access($ifent)): ?>
- <option value="<?=$ifent;?>" <?php if ($pconfig['src'] == $ifent) { echo "selected=\"selected\""; } ?>><?=htmlspecialchars($ifdesc);?> <?=gettext("net");?></option>
- <option value="<?=$ifent;?>ip"<?php if ($pconfig['src'] == $ifent . "ip") { echo "selected=\"selected\""; } ?>>
- <?=$ifdesc?> <?=gettext("address");?>
- </option>
- <?php endif; ?>
-<?php
- endforeach;
-?>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
- <td>
- <input <?=$edit_disabled;?> autocomplete='off' name="src" type="text" class="formfldalias ipv4v6" id="src" size="20" value="<?php if (!is_specialnet($pconfig['src'])) echo htmlspecialchars($pconfig['src']);?>" /> /
- <select <?=$edit_disabled;?> name="srcmask" class="formselect ipv4v6" id="srcmask">
-<?php for ($i = 127; $i > 0; $i--): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['srcmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
-<?php endfor; ?>
- </select>
- </td>
- </tr>
- </table>
- <div id="showadvancedboxspr">
- <p>
- <input <?=$edit_disabled;?> type="button" onclick="show_source_port_range()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show source port range");?>
- </p>
- </div>
- </td>
- </tr>
- <tr style="display:none" id="sprtable">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Source port range");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="0">
- <tr>
- <td><?=gettext("from:");?>&nbsp;&nbsp;</td>
- <td>
- <select <?=$edit_disabled;?> name="srcbeginport" class="formselect" onchange="src_rep_change();ext_change()">
- <option value="">(<?=gettext("other"); ?>)</option>
- <option value="any" <?php $bfound = 0; if ($pconfig['srcbeginport'] == "any") { echo "selected=\"selected\""; $bfound = 1; } ?>><?=gettext("any");?></option>
-<?php foreach ($wkports as $wkport => $wkportdesc): ?>
- <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['srcbeginport']) { echo "selected=\"selected\""; $bfound = 1; } ?>><?=htmlspecialchars("{$wkportdesc} ({$wkport})");?></option>
-<?php endforeach; ?>
- </select>
- <input <?=$edit_disabled;?> autocomplete='off' class="formfldalias" name="srcbeginport_cust" id="srcbeginport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['srcbeginport']) echo htmlspecialchars($pconfig['srcbeginport']); ?>" />
- </td>
- </tr>
- <tr>
- <td><?=gettext("to:");?></td>
- <td>
- <select <?=$edit_disabled;?> name="srcendport" class="formselect" onchange="ext_change()">
- <option value="">(<?=gettext("other"); ?>)</option>
- <option value="any" <?php $bfound = 0; if ($pconfig['srcendport'] == "any") { echo "selected=\"selected\""; $bfound = 1; } ?>><?=gettext("any");?></option>
-<?php foreach ($wkports as $wkport => $wkportdesc): ?>
- <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['srcendport']) { echo "selected=\"selected\""; $bfound = 1; } ?>><?=htmlspecialchars("{$wkportdesc} ({$wkport})");?></option>
-<?php endforeach; ?>
- </select>
- <input <?=$edit_disabled;?> autocomplete='off' class="formfldalias" name="srcendport_cust" id="srcendport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['srcendport']) echo htmlspecialchars($pconfig['srcendport']); ?>" />
- </td>
- </tr>
- </table>
- <br />
- <span class="vexpl"><?=gettext("Specify the source port or port range for this rule."); ?> <b><?=gettext("This is usually"); ?> <em><?=gettext("random"); ?></em> <?=gettext("and almost never equal to the destination port range (and should usually be"); ?> &quot;<?=gettext("any"); ?>&quot;).</b><br /><?=gettext("Hint: you can leave the"); ?> <em><?=gettext("'to'"); ?></em> <?=gettext("field empty if you only want to filter a single port.");?></span><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination");?></td>
- <td width="78%" class="vtable">
- <input <?=$edit_disabled;?> name="dstnot" type="checkbox" id="dstnot" value="yes" <?php if ($pconfig['dstnot']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("not");?></strong>
- <br />
- <?=gettext("Use this option to invert the sense of the match.");?>
- <br />
- <br />
- <table border="0" cellspacing="0" cellpadding="0">
- <tr>
- <td><?=gettext("Type:");?>&nbsp;&nbsp;</td>
- <td>
- <select <?=$edit_disabled;?> name="dsttype" class="formselect" onchange="typesel_change()">
-<?php
- $sel = is_specialnet($pconfig['dst']); ?>
- <option value="any" <?php if ($pconfig['dst'] == "any") { echo "selected=\"selected\""; } ?>><?=gettext("any");?></option>
- <option value="single"
- <?php
- if (!$sel &&
- ((is_ipaddrv6($pconfig['dst']) && $pconfig['dstmask'] == 128) ||
- (is_ipaddrv4($pconfig['dst']) && $pconfig['dstmask'] == 32) || is_alias($pconfig['dst']))) {
- echo "selected=\"selected\""; $sel = 1;
- }
- ?>
- ><?=gettext("Single host or alias");?></option>
- <option value="network" <?php if (!$sel) echo "selected=\"selected\""; ?>><?=gettext("Network");?></option>
- <option value="(self)" <?PHP if ($pconfig['dst'] == "(self)") echo "selected=\"selected\""; ?>><?=gettext("This Firewall (self)");?></option>
- <?php if (have_ruleint_access("pptp")): ?>
- <option value="pptp" <?php if ($pconfig['dst'] == "pptp") { echo "selected=\"selected\""; } ?>><?=gettext("PPTP clients");?></option>
- <?php endif; ?>
- <?php if (have_ruleint_access("pppoe")): ?>
- <option value="pppoe" <?php if ($pconfig['dst'] == "pppoe") { echo "selected=\"selected\""; } ?>><?=gettext("PPPoE clients");?></option>
- <?php endif; ?>
- <?php if (have_ruleint_access("l2tp")): ?>
- <option value="l2tp" <?php if ($pconfig['dst'] == "l2tp") { echo "selected=\"selected\""; } ?>><?=gettext("L2TP clients");?></option>
- <?php endif; ?>
-
-<?php foreach ($ifdisp as $if => $ifdesc): ?>
- <?php if (have_ruleint_access($if)): ?>
- <option value="<?=$if;?>" <?php if ($pconfig['dst'] == $if) { echo "selected=\"selected\""; } ?>><?=htmlspecialchars($ifdesc);?> <?=gettext("net");?></option>
- <option value="<?=$if;?>ip"<?php if ($pconfig['dst'] == $if . "ip") { echo "selected=\"selected\""; } ?>>
- <?=$ifdesc;?> <?=gettext("address");?>
- </option>
- <?php endif; ?>
-<?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
- <td>
- <input <?=$edit_disabled;?> autocomplete='off' name="dst" type="text" class="formfldalias ipv4v6" id="dst" size="20" value="<?php if (!is_specialnet($pconfig['dst'])) echo htmlspecialchars($pconfig['dst']);?>" />
- /
- <select <?=$edit_disabled;?> name="dstmask" class="formselect ipv4v6" id="dstmask">
-<?php for ($i = 127; $i > 0; $i--): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['dstmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
-<?php endfor; ?>
- </select>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr id="dprtr">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination port range ");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="0">
- <tr>
- <td><?=gettext("from:");?>&nbsp;&nbsp;</td>
- <td>
- <select <?=$edit_disabled;?> name="dstbeginport" class="formselect" onchange="dst_rep_change();ext_change()">
- <option value="">(<?=gettext("other"); ?>)</option>
- <option value="any" <?php $bfound = 0; if ($pconfig['dstbeginport'] == "any") { echo "selected=\"selected\""; $bfound = 1; } ?>><?=gettext("any");?></option>
-<?php foreach ($wkports as $wkport => $wkportdesc): ?>
- <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['dstbeginport']) { echo "selected=\"selected\""; $bfound = 1; }?>><?=htmlspecialchars("{$wkportdesc} ({$wkport})");?></option>
-<?php endforeach; ?>
- </select>
- <input <?=$edit_disabled;?> autocomplete='off' class="formfldalias" name="dstbeginport_cust" id="dstbeginport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['dstbeginport']) echo htmlspecialchars($pconfig['dstbeginport']); ?>" />
- </td>
- </tr>
- <tr>
- <td><?=gettext("to:");?></td>
- <td>
- <select <?=$edit_disabled;?> name="dstendport" class="formselect" onchange="ext_change()">
- <option value="">(<?=gettext("other"); ?>)</option>
- <option value="any" <?php $bfound = 0; if ($pconfig['dstendport'] == "any") { echo "selected=\"selected\""; $bfound = 1; } ?>><?=gettext("any");?></option>
-<?php foreach ($wkports as $wkport => $wkportdesc): ?>
- <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['dstendport']) { echo "selected=\"selected\""; $bfound = 1; } ?>><?=htmlspecialchars("{$wkportdesc} ({$wkport})");?></option>
-<?php endforeach; ?>
- </select>
- <input <?=$edit_disabled;?> autocomplete='off' class="formfldalias" name="dstendport_cust" id="dstendport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['dstendport']) echo htmlspecialchars($pconfig['dstendport']); ?>" />
- </td>
- </tr>
- </table>
- <br />
- <span class="vexpl">
- <?=gettext("Specify the port or port range for the destination of the packet for this rule.");?>
- <br />
- <?=gettext("Hint: you can leave the"); ?> <em><?=gettext("'to'"); ?></em> <?=gettext("field empty if you only want to filter a single port");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Log");?></td>
- <td width="78%" class="vtable">
- <input name="log" type="checkbox" id="log" value="yes" <?php if ($pconfig['log']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Log packets that are handled by this rule");?></strong>
- <br />
- <span class="vexpl"><?=gettext("Hint: the firewall has limited local log space. Don't turn on logging for everything. If you want to do a lot of logging, consider using a remote syslog server"); ?> (<?=gettext("see the"); ?> <a href="diag_logs_settings.php"><?=gettext("Diagnostics: System logs: Settings"); ?></a> <?=gettext("page"); ?>).</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="52" maxlength="52" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference.");?></span>
- </td>
- </tr>
-<?php if (!isset($id) || !($a_filter[$id] && firewall_check_for_advanced_options($a_filter[$id]) <> "")): ?>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- &nbsp;<br />&nbsp;
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
-<?php if (isset($id) && $a_filter[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
-<?php endif; ?>
- <input name="after" type="hidden" value="<?=htmlspecialchars($after);?>" />
- </td>
- </tr>
-<?php endif; ?>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced features");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Source OS");?></td>
- <td width="78%" class="vtable">
- <div id="showadvsourceosbox" <?php if ($pconfig['os']) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_sourceos()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="showsourceosadv" <?php if (empty($pconfig['os'])) echo "style='display:none'"; ?>>
- <?=gettext("OS Type:");?>&nbsp;
- <select name="os" id="os" class="formselect">
- <option value="" <?php if (empty($pconfig['os'])) echo "selected=\"selected\""; ?>>Any</option>
-<?php foreach ($ostypes as $ostype): ?>
- <option value="<?=$ostype;?>" <?php if ($ostype == $pconfig['os']) echo "selected=\"selected\""; ?>><?=htmlspecialchars($ostype);?></option>
-<?php endforeach; ?>
- </select>
- <br />
- <?=gettext("Note: this only works for TCP rules. General OS choice matches all subtypes.");?>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Diffserv Code Point");?></td>
- <td width="78%" class="vtable">
- <div id="dsadv" <?php if ($pconfig['dscp']) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_dsdiv();" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="dsdivmain" <?php if (empty($pconfig['dscp'])) echo "style='display:none'"; ?>>
- <select name="dscp" id="dscp">
- <option value=""></option>
- <?php foreach ($firewall_rules_dscp_types as $frdt): ?>
- <option value="<?=$frdt?>"<?php if ($pconfig['dscp'] == $frdt) echo " selected=\"selected\""; ?>><?=$frdt?></option>
- <?php endforeach; ?>
- </select>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Advanced Options");?></td>
- <td width="78%" class="vtable">
- <div id="aoadv" <?php if (is_aoadv_used($pconfig)) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_aodiv();" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="aodivmain" <?php if (!is_aoadv_used($pconfig)) echo "style='display:none'"; ?>>
- <input type="checkbox" id="allowopts" value="yes" name="allowopts"<?php if ($pconfig['allowopts'] == true) echo " checked=\"checked\""; ?> />
- <br /><span class="vexpl"><?=gettext("This allows packets with IP options to pass. Otherwise they are blocked by default. This is usually only seen with multicast traffic.");?>
- </span><p>
- <input type="checkbox" id="disablereplyto" value="yes" name="disablereplyto"<?php if ($pconfig['disablereplyto'] == true) echo " checked=\"checked\""; ?> />
- <br /><span class="vexpl"><?=gettext("This will disable auto generated reply-to for this rule.");?>
- </span></p><p>
- <input name="tag" id="tag" value="<?=htmlspecialchars($pconfig['tag']);?>" />
- <br /><span class="vexpl"><?=gettext("You can mark a packet matching this rule and use this mark to match on other NAT/filter rules. It is called"); ?> <b><?=gettext("Policy filtering"); ?></b>
- </span></p><p>
- <input name="tagged" id="tagged" value="<?=htmlspecialchars($pconfig['tagged']);?>" />
- <br /><span class="vexpl"><?=gettext("You can match packet on a mark placed before on another rule.")?>
- </span></p><p>
- <input name="max" id="max" value="<?php echo htmlspecialchars($pconfig['max']) ?>" /><br /><?=gettext(" Maximum state entries this rule can create");?></p><p>
- <input name="max-src-nodes" id="max-src-nodes" value="<?php echo htmlspecialchars($pconfig['max-src-nodes']) ?>" /><br /><?=gettext(" Maximum number of unique source hosts");?></p><p>
- <input name="max-src-conn" id="max-src-conn" value="<?php echo htmlspecialchars($pconfig['max-src-conn']) ?>" /><br /><?=gettext(" Maximum number of established connections per host (TCP only)");?></p><p>
- <input name="max-src-states" id="max-src-states" value="<?php echo htmlspecialchars($pconfig['max-src-states']) ?>" /><br /><?=gettext(" Maximum state entries per host");?></p><p>
- <input name="max-src-conn-rate" id="max-src-conn-rate" value="<?php echo htmlspecialchars($pconfig['max-src-conn-rate']) ?>" /> /
- <select name="max-src-conn-rates" id="max-src-conn-rates">
- <option value=""<?php if (intval($pconfig['max-src-conn-rates']) < 1) echo " selected=\"selected\""; ?>></option>
-<?php for ($x=1; $x<255; $x++) {
- if ($x == $pconfig['max-src-conn-rates']) $selected = " selected=\"selected\""; else $selected = ""; {
- echo "<option value=\"{$x}\"{$selected}>{$x}</option>\n";
- }
- } ?>
- </select><br />
- <?=gettext("Maximum new connections per host / per second(s) (TCP only)");?>
- </p><p>
- <input name="statetimeout" value="<?php echo htmlspecialchars($pconfig['statetimeout']) ?>" /><br />
- <?=gettext("State Timeout in seconds (TCP only)");?>
- </p>
- <p><strong><?=gettext("Note: Leave fields blank to disable that feature.");?></strong></p>
- </div>
- </td>
- </tr>
- <tr id="tcpflags">
- <td width="22%" valign="top" class="vncell"><?=gettext("TCP flags");?></td>
- <td width="78%" class="vtable">
- <div id="showtcpflagsbox" <?php if ($pconfig['tcpflags_any'] || $pconfig['tcpflags1'] || $pconfig['tcpflags2']) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_tcpflags()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="showtcpflagsadv" <?php if (empty($pconfig['tcpflags_any']) && empty($pconfig['tcpflags1']) && empty($pconfig['tcpflags2'])) echo "style='display:none'"; ?>>
- <div id="tcpheader" align="center">
- <table border="0" cellspacing="0" cellpadding="0">
- <?php
- $setflags = explode(",", $pconfig['tcpflags1']);
- $outofflags = explode(",", $pconfig['tcpflags2']);
- $header = "<td width='40' class='nowrap'></td>";
- $tcpflags1 = "<td width='40' class='nowrap'>set</td>";
- $tcpflags2 = "<td width='40' class='nowrap'>out of</td>";
- foreach ($tcpflags as $tcpflag) {
- $header .= "<td width='40' class='nowrap'><strong>" . strtoupper($tcpflag) . "</strong></td>\n";
- $tcpflags1 .= "<td width='40' class='nowrap'> <input type='checkbox' name='tcpflags1_{$tcpflag}' value='on' ";
- if (array_search($tcpflag, $setflags) !== false) {
- $tcpflags1 .= "checked=\"checked\"";
- }
- $tcpflags1 .= " /></td>\n";
- $tcpflags2 .= "<td width='40' class='nowrap'> <input type='checkbox' name='tcpflags2_{$tcpflag}' value='on' ";
- if (array_search($tcpflag, $outofflags) !== false) {
- $tcpflags2 .= "checked=\"checked\"";
- }
- $tcpflags2 .= " /></td>\n";
- }
- echo "<tr id='tcpheader'>{$header}</tr>\n";
- echo "<tr id='tcpflags1'>{$tcpflags1}</tr>\n";
- echo "<tr id='tcpflags2'>{$tcpflags2}</tr>\n";
- ?>
- </table>
- </div>
- <br /><center>
- <input onclick='tcpflags_anyclick(this);' type='checkbox' name='tcpflags_any' value='on' <?php if ($pconfig['tcpflags_any']) echo "checked=\"checked\""; ?> /><strong><?=gettext("Any flags.");?></strong><br /></center>
- <br />
- <span class="vexpl"><?=gettext("Use this to choose TCP flags that must ".
- "be set or cleared for this rule to match.");?></span>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("State Type");?></td>
- <td width="78%" class="vtable">
- <div id="showadvstatebox" <?php if (!empty($pconfig['nopfsync']) || (!empty($pconfig['statetype']) && $pconfig['statetype'] != "keep state")) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_state()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="showstateadv" <?php if (empty($pconfig['nopfsync']) && (empty($pconfig['statetype']) || $pconfig['statetype'] == "keep state")) echo "style='display:none'"; ?>>
- <input name="nopfsync" type="checkbox" id="nopfsync" value="yes" <?php if ($pconfig['nopfsync']) echo "checked=\"checked\""; ?> />
- <span class="vexpl">
- NO pfsync<br />
- <?=gettext("Hint: This prevents states created by this rule to be sync'ed over pfsync.");?><br />
- </span><br />
- <select name="statetype">
- <option value="keep state" <?php if (!isset($pconfig['statetype']) or $pconfig['statetype'] == "keep state") echo "selected=\"selected\""; ?>><?=gettext("keep state");?></option>
- <option value="sloppy state" <?php if ($pconfig['statetype'] == "sloppy state") echo "selected=\"selected\""; ?>><?=gettext("sloppy state");?></option>
- <option value="synproxy state"<?php if ($pconfig['statetype'] == "synproxy state") echo "selected=\"selected\""; ?>><?=gettext("synproxy state");?></option>
- <option value="none"<?php if ($pconfig['statetype'] == "none") echo "selected=\"selected\""; ?>><?=gettext("none");?></option>
- </select><br />
- <span class="vexpl">
- <?=gettext("Hint: Select which type of state tracking mechanism you would like to use. If in doubt, use keep state.");?>
- </span>
- <table width="90%">
- <tr><td width="25%"><ul><li><?=gettext("keep state");?></li></ul></td><td><?=gettext("Works with all IP protocols.");?></td></tr>
- <tr><td width="25%"><ul><li><?=gettext("sloppy state");?></li></ul></td><td><?=gettext("Works with all IP protocols.");?></td></tr>
- <tr><td width="25%"><ul><li><?=gettext("synproxy state");?></li></ul></td><td><?=gettext("Proxies incoming TCP connections to help protect servers from spoofed TCP SYN floods. This option includes the functionality of keep state and modulate state combined.");?></td></tr>
- <tr><td width="25%"><ul><li><?=gettext("none");?></li></ul></td><td><?=gettext("Do not use state mechanisms to keep track. This is only useful if you're doing advanced queueing in certain situations. Please check the documentation.");?></td></tr>
- </table>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("No XMLRPC Sync");?></td>
- <td width="78%" class="vtable">
- <div id="showadvnoxmlrpcsyncbox" <?php if ($pconfig['nosync']) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_noxmlrpc()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="shownoxmlrpcadv" <?php if (empty($pconfig['nosync'])) echo "style='display:none'"; ?>>
- <input type="checkbox" name="nosync"<?php if ($pconfig['nosync']) echo " checked=\"checked\""; ?> /><br />
- <?=gettext("Hint: This prevents the rule on Master from automatically syncing to other CARP members. This does NOT prevent the rule from being overwritten on Slave.");?>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("802.1p");?></td>
- <td width="78%" class="vtable">
- <div id="showadvvlanpriobox" <?php if (!empty($pconfig['vlanprio'])) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_vlanprio()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="showvlanprioadv" <?php if (empty($pconfig['vlanprio'])) echo "style='display:none'"; ?>>
- <?php $vlanprio = array("none", "be", "bk", "ee", "ca", "vi", "vo", "ic", "nc"); ?>
-<?php
- $opts = "";
- foreach ($vlanprio as $vprio) {
- if ($vprio == $pconfig['vlanprio']) {
- $selected = " selected=\"selected\"";
- } else {
- $selected = "";
- }
- if ($vprio == "none") {
- $opts .= "<option value=\"\">{$vprio}</option>\n";
- } else {
- $opts .= "<option value=\"{$vprio}\" {$selected}>" . strtoupper($vprio) . "</option>\n";
- }
- }
+if (isset($a_filter[$id]))
+{
+ $form->addGlobal(new Form_Input(
+ 'tracker',
+ 'Tracker',
+ 'hidden',
+ $pconfig['tracker']
+ ));
+}
- $optsset = "";
- foreach ($vlanprio as $vprioset) {
- if ($vprioset == $pconfig['vlanprioset']) {
- $selected = " selected=\"selected\"";
- } else {
- $selected = "";
- }
- if ($vprioset == "none") {
- $optsset .= "<option value=\"\">{$vprioset}</option>\n";
- } else {
- $optsset .= "<option value=\"{$vprioset}\" {$selected}>" . strtoupper($vprioset) . "</option>\n";
- }
- }
+$form->addGlobal(new Form_Input(
+ 'after',
+ 'After',
+ 'hidden',
+ $after
+));
+
+$form->addGlobal(new Form_Input(
+ 'ruleid',
+ 'Ruleid',
+ 'hidden',
+ $pconfig['ruleid']
+));
+
+// Allow extending of the firewall edit page and include custom input validation
+pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/htmlphpearly");
+
+$values = array(
+ 'pass' => 'Pass',
+ 'block' => 'Block',
+ 'reject' => 'Reject',
+);
+
+if ($if == "FloatingRules" || isset($pconfig['floating']))
+ $values['match'] = 'Match';
+
+$section->addInput(new Form_Select(
+ 'type',
+ 'Action',
+ $pconfig['type'],
+ $values
+))->setHelp('Choose what to do with packets that match the criteria specified '.
+ 'below.<br/>Hint: the difference between block and reject is that with '.
+ 'reject, a packet (TCP RST or ICMP port unreachable for UDP) is returned '.
+ 'to the sender, whereas with block the packet is dropped silently. In '.
+ 'either case, the original packet is discarded.');
+
+$section->addInput(new Form_Checkbox(
+ 'disabled',
+ 'Disabled',
+ 'Disable this rule',
+ $pconfig['disabled']
+))->setHelp('Set this option to disable this rule without removing it from the '.
+ 'list.');
+
+if ($if == "FloatingRules" || isset($pconfig['floating']))
+{
+ $section->addInput(new Form_Checkbox(
+ 'floating',
+ 'Quick',
+ 'Apply the action immediately on match.',
+ $pconfig['quick']
+ ))->setHelp('Set this option if you need to apply this action to traffic that '.
+ 'matches this rule immediately.');
+}
+
+$edit_disabled = isset($pconfig['associated-rule-id']);
+
+if ($edit_disabled)
+{
+ $extra = '';
+ foreach( $config['nat']['rule'] as $index => $nat_rule )
+ {
+ if ($nat_rule['associated-rule-id'] === $pconfig['associated-rule-id'] )
+ $extra = '<br/><a href="firewall_nat_edit.php?id='. $index .'">'. gettext('View the NAT rule') .'</a>';
+ }
+
+ $section->add(new Form_Group(
+ 'Associated filter rule'
+ ))->setHelp('Note: This is associated to a NAT rule.<br/>You cannot edit '.
+ 'the interface, protocol, source, or destination of associated filter '.
+ 'rules.'. $extra);
+
+ $section->addGlobal(new Form_Input(
+ 'associated-rule-id',
+ 'Associated Rule ID',
+ 'hidden',
+ $pconfig['associated-rule-id']
+ ));
+
+ if (!empty($pconfig['interface']))
+ {
+ $section->addInput(new Form_Input(
+ 'interface',
+ 'Interface',
+ 'hidden',
+ $pconfig['interface']
+ ));
+ }
+}
+
+$interfaces = array();
+
+/* add group interfaces */
+if (is_array($config['ifgroups']['ifgroupentry']))
+ foreach ($config['ifgroups']['ifgroupentry'] as $ifgen)
+ if (have_ruleint_access($ifgen['ifname']))
+ $interfaces[$ifgen['ifname']] = $ifgen['ifname'];
+
+foreach (get_configured_interface_with_descr() as $ifent => $ifdesc)
+{
+ if (have_ruleint_access($ifent))
+ $interfaces[$ifent] = $ifdesc;
+}
+
+if ($config['l2tp']['mode'] == "server" && have_ruleint_access("l2tp"))
+ $interfaces['l2tp'] = 'L2TP VPN';
+
+if ($config['pptpd']['mode'] == "server" && have_ruleint_access("pptp"))
+ $interfaces['pptp'] = 'PPTP VPN';
+
+if (is_pppoe_server_enabled() && have_ruleint_access("pppoe"))
+ $interfaces['pppoe'] = "PPPoE Server";
+
+/* add ipsec interfaces */
+if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable']) && have_ruleint_access("enc0"))
+ $interfaces["enc0"] = "IPsec";
+
+/* add openvpn/tun interfaces */
+if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"])
+ $interfaces["openvpn"] = "OpenVPN";
+
+$section->addInput($input = new Form_Select(
+ 'interface',
+ 'Interface',
+ $pconfig['interface'],
+ $interfaces,
+ ($if == "FloatingRules" || isset($pconfig['floating']))
+))->setHelp('Choose on which interface packets must come in to match this '.
+ 'rule.');
+
+if ($if == "FloatingRules" || isset($pconfig['floating']))
+ $input->setHelp('Choose the interface(s) for this rule.');
+
+if ($if == "FloatingRules" || isset($pconfig['floating']))
+{
+ $section->addInput(new Form_Select(
+ 'direction',
+ 'Direction',
+ $pconfig['direction'],
+ array(
+ 'any' => 'any',
+ 'in' => 'in',
+ 'out' => 'out',
+ )
+ ));
+
+ $section->addInput(new Form_Input(
+ 'floating',
+ 'Floating',
+ 'hidden',
+ 'floating'
+ ));
+}
+
+$section->addInput(new Form_Select(
+ 'ipprotocol',
+ 'TCP/IP Version',
+ $pconfig['ipprotocol'],
+ array(
+ 'inet' => 'IPv4',
+ 'inet6' => 'IPv6',
+ 'inet46' => 'IPv4+IPv6',
+ )
+))->setHelp('Select the Internet Protocol version this rule applies to');
+
+$section->addInput(new Form_Select(
+ 'proto',
+ 'Protocol',
+ $pconfig['ipprotocol'],
+ array(
+ 'tcp' => 'TCP',
+ 'udp' => 'UDP',
+ 'tcp/udp' => 'TCP/UDP',
+ 'icmp' => 'ICMP',
+ 'esp' => 'ESP',
+ 'ah' => 'AH',
+ 'gre' => 'GRE',
+ 'ipv6' => 'IPV6',
+ 'igmp' => 'IGMP',
+ 'pim' => 'PIM',
+ 'ospf' => 'OSPF',
+ 'sctp' => 'SCTP',
+ 'any' => 'any',
+ 'carp' => 'CARP',
+ 'pfsync' => 'PFSYNC',
+ )
+))->setHelp('Choose which IP protocol this rule should match. In most cases, you should specify TCP here.');
+
+$section->addInput(new Form_Select(
+ 'icmptype',
+ 'ICMP type',
+ $pconfig['icmptype'],
+ $icmptypes
+))->setHelp('If you selected ICMP for the protocol above, you may specify an ICMP type here.');
+
+$section->addInput(new Form_Select(
+ 'icmp6type',
+ 'ICMPv6 type',
+ $pconfig['icmptype'],
+ $icmp6types
+))->setHelp('If you selected ICMP for the protocol above, you may specify an ICMP type here.');
+
+$form->add($section);
+
+// Source and destination share a lot of logic. Loop over the two
+foreach (['src' => 'Source', 'dst' => 'Destination'] as $type => $name) {
+ $section = new Form_Section($name);
+
+ $group = new Form_Group($name);
+ $group->add(new Form_Checkbox(
+ $type .'not',
+ $name .' not',
+ 'Invert match.',
+ $pconfig[$type.'not']
+ ))->setWidth(2);
+
+ $ruleType = $pconfig[$type];
+ if (is_specialnet($pconfig[$type]))
+ $ruleType = 'network';
+ elseif ((is_ipaddrv6($pconfig[$type]) && $pconfig[$type.'mask'] == 128) ||
+ (is_ipaddrv4($pconfig[$type]) && $pconfig[$type.'mask'] == 32) ||
+ (is_alias($pconfig[$type])))
+ $ruleType = 'single';
+
+ $ruleValues = array(
+ 'any' => 'any',
+ 'single' => 'Single host or alias',
+ 'network' => 'Network',
+ );
+ if (isset($a_filter[$id]['floating']) || $if == "FloatingRules")
+ $ruleValues['(self)'] = 'This Firewall (self)';
+ if (have_ruleint_access("pptp"))
+ $ruleValues['pptp'] = 'PPTP clients';
+ if (have_ruleint_access("pppoe"))
+ $ruleValues['pppoe'] = 'PPPoE clients';
+ if (have_ruleint_access("l2tp"))
+ $ruleValues['l2tp'] = 'L2TP clients';
+
+ foreach ($ifdisp as $ifent => $ifdesc)
+ {
+ if (!have_ruleint_access($ifent))
+ continue;
+
+ $ruleValues[$ifent] = $ifdesc.' net';
+ $ruleValues[$ifent.'ip'] = $ifdesc.' address';
+ }
+
+ $group->add(new Form_Select(
+ $type . 'type',
+ $name .' Type',
+ $type == 'src' ? $pconfig['src']:$pconfig['dst'],
+ $ruleValues
+ ));
+
+ $group->add(new Form_IpAddress(
+ $type,
+ $name .' Address',
+ $pconfig[$type]
+ ))->addMask($type .'mask', $pconfig[$type.'mask']);
+
+ $section->add($group);
+
+ if($type == 'src') {
+ $section->addInput(new Form_Button(
+ 'btnsrcadv',
+ 'Show advanced'
+ ))->removeClass('btn-primary');
+ }
+
+ $portValues = ['any' => 'any', '' => '(other)'];
+
+ foreach ($wkports as $port => $portName)
+ $portValues[$port] = $portName.' ('. $port .')';
+
+ $group = new Form_Group($name .' port range');
+ $group->addClass('srcportrange');
+
+ $group->add(new Form_Select(
+ $type .'beginport',
+ $name .' port begin',
+ $pconfig[$type .'beginport'],
+ $portValues
+ ))->setHelp('From');
+
+ $group->add(new Form_Input(
+ $type .'beginport_cust',
+ null,//$name .' port begin custom',
+ 'number',
+ (isset($portValues[ $pconfig[$type .'beginport'] ]) ? null : $pconfig[$type .'beginport']),
+ ['min' => 1, 'max' => 65535]
+ ))->setHelp('Custom');;
+
+ $group->add(new Form_Select(
+ $type .'endport',
+ $name .' port end',
+ $pconfig[$type .'endport'],
+ $portValues
+ ))->setHelp('To');
+
+ $group->add(new Form_Input(
+ $type .'endport_cust',
+ null,//$name .' port end custom',
+ 'number',
+ (isset($portValues[ $pconfig[$type .'endport'] ]) ? null : $pconfig[$type .'endport']),
+ ['min' => 1, 'max' => 65535]
+ ))->setHelp('Custom');
+
+
+ if ($type == 'src')
+ $group->setHelp('Specify the source port or port range for this rule. This is '.
+ 'usually random and almost never equal to the destination port range (and '.
+ 'should usually be <b>any.</b> You can leave the "To" field '.
+ 'empty if you only want to filter a single port.');
+ else
+ $group->setHelp('Specify the destination port or port range for this rule. ' .
+ 'You can leave the "To" field empty if you only want to filter a '.
+ 'single port.');
+
+ $group->addClass( ($type == 'src') ? 'srcprtr':'dstprtr');
+ $section->add($group);
+ $form->add($section);
+}
+
+$section = new Form_Section('Extra options');
+$section->addInput(new Form_Checkbox(
+ 'log',
+ 'Log',
+ 'Log packets that are handled by this rule',
+ $pconfig['log']
+))->setHelp('Hint: the firewall has limited local log space. Don\'t turn on logging '.
+ 'for everything. If you want to do a lot of logging, consider using a remote '.
+ 'syslog server (see the <a href="diag_logs_settings.php">Diagnostics: System logs: '.
+ 'Settings</a> page).');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference.');
+
+$btnadvanced = new Form_Button(
+ 'toggle-advanced',
+ 'Advanced options'
+);
+
+$btnadvanced->removeClass('btn-primary')->addClass('btn-info');
+
+$section->addInput(new Form_StaticText(
+ null,
+ $btnadvanced
+));
+
+$form->add($section);
+$section = new Form_Section('Advanced options');
+$section->addClass('advanced-options');
+
+$section->addInput(new Form_Select(
+ 'os',
+ 'Source OS',
+ (empty($pconfig['os']) ? '':$pconfig['os']),
+ ['' => 'Any'] + array_combine($ostypes, $ostypes)
+))->setHelp('Note: this only works for TCP rules. General OS choice matches all subtypes.');
+
+$section->addInput(new Form_Select(
+ 'dscp',
+ 'Diffserv Code Point',
+ $pconfig['dscp'],
+ ["" => ''] + array_combine($firewall_rules_dscp_types, $firewall_rules_dscp_types)
+));
+
+$section->addInput(new Form_Checkbox(
+ 'allowopts',
+ 'Allow IP options',
+ 'Allow packets with IP options to pass. Otherwise they are blocked by '.
+ 'default. This is usually only seen with multicast traffic.',
+ $pconfig['allowopts']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'disablereplyto',
+ 'Disable reply-to',
+ 'Disable auto generated reply-to for this rule.',
+ $pconfig['disablereplyto']
+));
+
+$section->addInput(new Form_Input(
+ 'tag',
+ 'Tag',
+ 'text',
+ $pconfig['tag']
+))->setHelp('You can mark a packet matching this rule and use this mark to match '.
+ 'on other NAT/filter rules. It is called <b>Policy filtering</b>.');
+
+$section->addInput(new Form_Input(
+ 'tagged',
+ 'Tagged',
+ 'text',
+ $pconfig['tagged']
+))->setHelp('You can match packet on a mark placed before on another rule.');
+
+$section->addInput(new Form_Input(
+ 'max',
+ 'Max. states',
+ 'number',
+ $pconfig['max']
+))->setHelp('Maximum state entries this rule can create.');
+
+$section->addInput(new Form_Input(
+ 'max-src-nodes',
+ 'Max. src nodes',
+ 'number',
+ $pconfig['max-src-nodes']
+))->setHelp('Maximum number of unique source hosts.');
+
+$section->addInput(new Form_Input(
+ 'max-src-conn',
+ 'Max. connections',
+ 'number',
+ $pconfig['max-src-conn']
+))->setHelp('Maximum number of established connections per host (TCP only).');
+
+$section->addInput(new Form_Input(
+ 'max-src-states',
+ 'Max. src. states',
+ 'number',
+ $pconfig['max-src-states']
+))->setHelp('Maximum state entries per host.');
+
+$section->addInput(new Form_Input(
+ 'max-src-conn-rate',
+ 'Max. src. conn. Rate',
+ 'number',
+ $pconfig['max-src-conn-rate']
+))->setHelp('Maximum state entries per host');
+
+$section->addInput(new Form_Input(
+ 'max-src-conn-rates',
+ 'Max. src. conn. Rates',
+ 'number',
+ $pconfig['max-src-conn-rates'],
+ ['min' => 1, 'max' => 255]
+))->setHelp('Maximum new connections per host / per second(s) (TCP only)');
+
+$section->addInput(new Form_Input(
+ 'statetimeout',
+ 'State timeout',
+ 'number',
+ $pconfig['statetimeout'],
+ ['min' => 1, 'max' => 3600]
+))->setHelp('State Timeout in seconds (TCP only)');
+
+//$form->add($section);
+//$section = new Form_Section('TCP Flags');
+//$section->addClass('tcpflags');
+
+$section->addInput(new Form_StaticText(
+ 'TCP Flags',
+ build_flag_table()
+))->setHelp('Use this to choose TCP flags that must be set or cleared for this rule to match.');
+
+// $form->add($section);
+// $section = new Form_Section('State Type');
+
+$section->addInput(new Form_Checkbox(
+ 'nopfsync',
+ 'No pfSync',
+ 'Prevent states created by this rule to be sync\'ed over pfsync.',
+ $pconfig['nopfsync']
+));
+
+$section->addInput(new Form_Select(
+ 'statetype',
+ 'State type',
+ $pconfig['statetype'],
+ array(
+ 'keep state' => 'Keep: works with all IP protocols',
+ 'sloppy state' => 'Sloppy: works with all IP protocols',
+ 'synproxy state' => 'Synproxy: proxies incoming TCP connections to help protect servers from spoofed TCP SYN floods. This option includes the functionality of keep state and modulate state combined',
+ 'none' => 'None: Do not use state mechanisms to keep track. This is only useful if you\'re doing advanced queueing in certain situations',
+ )
+))->setHelp('Select which type of state tracking mechanism you would like to use. If in doubt, use keep state.');
+
+$section->addInput(new Form_Checkbox(
+ 'nosync',
+ 'No XMLRPC Sync',
+ 'Prevent the rule on Master from automatically syncing to other CARP members',
+ $pconfig['nosync']
+))->setHelp('This does NOT prevent the rule from being overwritten on Slave.');
+
+$vlanprio = array("none", "be", "bk", "ee", "ca", "vi", "vo", "ic", "nc");
+$section->addInput(new Form_Select(
+ 'vlanprio',
+ 'VLAN Prio',
+ $pconfig['vlanprio'],
+ $vlanprio
+))->setHelp('Choose 802.1p priority to match on');
+
+$section->addInput(new Form_Select(
+ 'vlanprioset',
+ 'VLAN Prio Set',
+ $pconfig['vlanprioset'],
+ $vlanprio
+))->setHelp('Choose 802.1p priority to apply');
+
+$schedules = array('none'); //leave none to leave rule enabled all the time
+foreach ((array)$config['schedules']['schedule'] as $schedule)
+{
+ if ($schedule['name'] != "")
+ $schedules[] = $schedule['name'];
+}
+
+$section->addInput(new Form_Select(
+ 'sched',
+ 'Schedule',
+ $pconfig['sched'],
+ $schedules
+))->setHelp('Leave as \'none\' to leave the rule enabled all the time');
+
+$gateways = array("" => 'default');
+foreach (return_gateways_array() as $gwname => $gw)
+{
+ if (($pconfig['ipprotocol'] == "inet46"))
+ continue;
+ if (($pconfig['ipprotocol'] == "inet6") && !(($gw['ipprotocol'] == "inet6") || (is_ipaddrv6($gw['gateway']))))
+ continue;
+ if (($pconfig['ipprotocol'] == "inet") && !(($gw['ipprotocol'] == "inet") || (is_ipaddrv4($gw['gateway']))))
+ continue;
+ if ($gw == "")
+ continue;
+
+ $gateways[ $gwname ] = $gw['name'] . (empty($gw['gateway'])? '' : ' - '. $gateway_addr_str);
+}
+
+foreach ((array)$a_gatewaygroups as $gwg_name => $gwg_data)
+{
+ if ((empty($pconfig['ipprotocol'])) || ($pconfig['ipprotocol'] == $gwg_data['ipprotocol']))
+ $gateways[ $gwg_name ] = $gwg_name;
+}
+
+$section->addInput(new Form_Select(
+ 'gateway',
+ 'Gateway',
+ $pconfig['gateway'],
+ $gateways
+))->setHelp('Leave as \'default\' to use the system routing table. Or choose a '.
+ 'gateway to utilize policy based routing.');
+
+$group = new Form_Group('In / Out pipe');
+
+$group->add(new Form_Select(
+ 'dnpipe',
+ 'DNpipe',
+ $pconfig['dnpipe'],
+ array('' => 'none') + array_keys($dnqlist)
+));
+
+$group->add(new Form_Select(
+ 'pdnpipe',
+ 'PDNpipe',
+ $pconfig['pdnpipe'],
+ array('' => 'none') + array_keys($dnqlist)
+));
+
+$section->add($group)->setHelp('Choose the Out queue/Virtual interface only if '.
+ 'you have also selected In. The Out selection is applied to traffic leaving '.
+ 'the interface where the rule is created, In is applied to traffic coming '.
+ 'into the chosen interface.<br />If you are creating a floating rule, if the '.
+ 'direction is In then the same rules apply, if the direction is out the '.
+ 'selections are reverted Out is for incoming and In is for outgoing.'
+);
+
+$group = new Form_Group('Ackqueue / Queue');
+
+$qlist = array_keys($qlist);
+foreach ($qlist as $idx => $q)
+{
+ if (isset($ifdisp[$q]))
+ $qlist[$idx] = $ifdisp[$q];
+}
+
+$group->add(new Form_Select(
+ 'ackqueue',
+ 'Ackqueue',
+ $pconfig['ackqueue'],
+ $qlist
+));
+
+$group->add(new Form_Select(
+ 'defaultqueue',
+ 'Default Queue',
+ $pconfig['defaultqueue'],
+ $qlist
+));
+
+$section->add($group)->setHelp('Choose the Acknowledge Queue only if you have '.
+ 'selected Queue.'
+);
+
+$section->addInput(new Form_Select(
+ 'l7container',
+ 'Layer7',
+ $pconfig['l7container'],
+ array_keys($l7clist)
+))->setHelp('Choose a Layer7 container to apply application protocol inspection '.
+ 'rules. These are valid for TCP and UDP protocols only.');
+
+$has_created_time = (isset($a_filter[$id]['created']) && is_array($a_filter[$id]['created']));
+$has_updated_time = (isset($a_filter[$id]['updated']) && is_array($a_filter[$id]['updated']));
+
+
+if ($has_created_time || $has_updated_time)
+{
+ $form->add($section);
+ $section = new Form_Section('Rule Information');
+
+ if ($has_created_time)
+ {
+ $section->addInput(new Form_StaticText(
+ 'Created',
+ date('n/j/y H:i:s', $a_filter[$id]['created']['time']) . gettext(' by ') .'<b>'. $a_filter[$id]['created']['username'] .'</b>'
+ ));
+ }
+
+ if ($has_updated_time)
+ {
+ $section->addInput(new Form_StaticText(
+ 'Updated',
+ date('n/j/y H:i:s', $a_filter[$id]['updated']['time']) . gettext(' by ') .'<b>'. $a_filter[$id]['updated']['username'] .'</b>'
+ ));
+ }
+}
+
+$form->add($section);
+echo $form;
?>
- <select name='vlanprio'>
- <?php echo $opts; ?>
- </select>
- <p><?=gettext("Choose 802.1p priority to match on");?></p>
- <select name='vlanprioset'>
- <?php echo $optsset; ?>
- </select>
- <p><?=gettext("Choose 802.1p priority to apply");?></p>
- </div>
- </td>
- </tr>
- <?php
- //build list of schedules
- $schedules = array();
- $schedules[] = "none";//leave none to leave rule enabled all the time
- if (is_array($config['schedules']['schedule'])) {
- foreach ($config['schedules']['schedule'] as $schedule) {
- if ($schedule['name'] <> "") {
- $schedules[] = $schedule['name'];
- }
- }
+
+<script>
+//<![CDATA[
+events.push(function(){
+
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
+
+ // Hides the <div> in which the specified group input element lives so that the input,
+ // its label and help text are hidden
+ function hideGroupInput(id, hide) {
+ if(hide)
+ $('#' + id).parent('div').addClass('hidden');
+ else
+ $('#' + id).parent('div').removeClass('hidden');
+ }
+
+ // Hides the <div> in which the specified checkbox lives so that the checkbox, its label and help text are hidden
+ function hideCheckbox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
+ }
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
+ }
+
+ // Hides all elements of the specified class. This will usually be a section
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ // Hides all elements of the specified class assigned to a group. This will usually be a group
+ function hideGroupClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).parent().parent().parent().hide();
+ else
+ $('.' + s_class).parent().parent().parent().show();
+ }
+
+ var portsenabled = 1;
+ var editenabled = 1;
+ var optionsvisible = 0;
+
+ function ext_change() {
+ if (($('#srcbeginport').find(":selected").index() == 0) && portsenabled && editenabled) {
+ disableInput('srcbeginport_cust', false);
+ } else {
+ if (editenabled)
+ $('#srcbeginport_cust').val("");
+
+ disableInput('srcbeginport_cust', true);
+ }
+
+ if (($('#srcendport').find(":selected").index() == 0) && portsenabled && editenabled) {
+ disableInput('srcendport_cust', false);
+ } else {
+ if (editenabled)
+ $('#srcendport_cust').val("");
+
+ disableInput('srcendport_cust', true);
+ }
+
+ if (($('#dstbeginport').find(":selected").index() == 0) && portsenabled && editenabled) {
+ disableInput('dstbeginport_cust', false);
+ } else {
+ if (editenabled)
+ $('#dstbeginport_cust').val("");
+
+ disableInput('dstbeginport_cust', true);
+ }
+
+ if (($('#dstendport').find(":selected").index() == 0) && portsenabled && editenabled) {
+ disableInput('dstendport_cust', false);
+ } else {
+ if (editenabled)
+ $('#dstendport_cust').val("");
+
+ disableInput('dstendport_cust', true);
+ }
+
+ if (!portsenabled) {
+ disableInput('srcbeginport', true);
+ disableInput('srcendport', true);
+ disableInput('dstbeginport', true);
+ disableInput('dstendport', true);
+ } else {
+ if( editenabled ) {
+ disableInput('srcbeginport', false);
+ disableInput('srcendport', false);
+ disableInput('dstbeginport', false);
+ disableInput('dstendport', false);
}
- ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Schedule");?></td>
- <td width="78%" class="vtable">
- <div id="showadvschedulebox" <?php if (!empty($pconfig['sched'])) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_schedule()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="showscheduleadv" <?php if (empty($pconfig['sched'])) echo "style='display:none'"; ?>>
- <select name='sched'>
-<?php
- foreach ($schedules as $schedule) {
- if ($schedule == $pconfig['sched']) {
- $selected = " selected=\"selected\"";
- } else {
- $selected = "";
- }
- if ($schedule == "none") {
- echo "<option value=\"\" {$selected}>{$schedule}</option>\n";
- } else {
- echo "<option value=\"{$schedule}\" {$selected}>{$schedule}</option>\n";
- }
- }
-?>
- </select>
- <p><?=gettext("Leave as 'none' to leave the rule enabled all the time.");?></p>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Gateway");?></td>
- <td width="78%" class="vtable">
- <div id="showadvgatewaybox" <?php if (!empty($pconfig['gateway'])) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_gateway()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="showgatewayadv" <?php if (empty($pconfig['gateway'])) echo "style='display:none'"; ?>>
- <select name='gateway'>
- <option value="" ><?=gettext("default");?></option>
-<?php
- /* build a list of gateways */
- $gateways = return_gateways_array();
- // add statically configured gateways to list
- foreach ($gateways as $gwname => $gw) {
- if (($pconfig['ipprotocol'] == "inet46")) {
- continue;
- }
- if (($pconfig['ipprotocol'] == "inet6") && !(($gw['ipprotocol'] == "inet6") || (is_ipaddrv6($gw['gateway'])))) {
- continue;
- }
- if (($pconfig['ipprotocol'] == "inet") && !(($gw['ipprotocol'] == "inet") || (is_ipaddrv4($gw['gateway'])))) {
- continue;
- }
- if ($gw == "") {
- continue;
- }
- if ($gwname == $pconfig['gateway']) {
- $selected = " selected=\"selected\"";
- } else {
- $selected = "";
- }
- $gateway_addr_str = empty($gw['gateway']) ? "" : " - " . $gw[gateway];
- echo "<option value=\"{$gwname}\" {$selected}>{$gw['name']}{$gateway_addr_str}</option>\n";
- }
- /* add gateway groups to the list */
- if (is_array($a_gatewaygroups)) {
- foreach ($a_gatewaygroups as $gwg_name => $gwg_data) {
- if ((empty($pconfig['ipprotocol'])) || ($pconfig['ipprotocol'] == $gwg_data['ipprotocol'])) {
- if ($pconfig['gateway'] == $gwg_name) {
- $selected = " selected=\"selected\"";
- } else {
- $selected = "";
- }
- echo "<option value=\"{$gwg_name}\" $selected>{$gwg_name}</option>\n";
- }
- }
- }
-?>
- </select>
- <p><?=gettext("Leave as 'default' to use the system routing table. Or choose a gateway to utilize policy based routing.");?></p>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("In/Out");?></td>
- <td width="78%" class="vtable">
- <div id="showadvinoutbox" <?php if (!empty($pconfig['dnpipe'])) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_inout()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="showinoutadv" <?php if (empty($pconfig['dnpipe'])) echo "style='display:none'"; ?>>
- <select name="dnpipe">
-<?php
- if (!is_array($dnqlist)) {
- $dnqlist = array();
}
- echo "<option value=\"\"";
- if (!$dnqselected) {
- echo " selected=\"selected\"";
- }
- echo " >none</option>";
- foreach ($dnqlist as $dnq => $dnqkey) {
- if ($dnq == "") {
- continue;
+ }
+
+ function show_source_port_range() {
+ if (portsenabled) {
+ hideClass('srcprtr', false);
+ }
+ }
+
+ function typesel_change() {
+ if( editenabled ) {
+ switch ($('#srctype').find(":selected").index()) {
+ case 1: // single
+ disableInput('src', false);
+ $('#srcmask').val("");
+ disableInput('srcmask', true);
+ break;
+ case 2: // network
+ disableInput('src', false);
+ disableInput('srcmask', false);
+ break;
+ default:
+ $('#src').val("");
+ disableInput('src', true);
+ $('#srcmask').val("");
+ disableInput('srcmask', true);
+ break;
}
- echo "<option value=\"$dnq\"";
- if ($dnq == $pconfig['dnpipe']) {
- $dnqselected = 1;
- echo " selected=\"selected\"";
+ switch ($('#dsttype').find(":selected").index()) {
+ case 1: // single
+ disableInput('dst', false);
+ $('#dstmask').val("");
+ disableInput('dstmask', true);
+ break;
+ case 2: // network
+ disableInput('dst', false);
+ disableInput('dstmask', false);
+ break;
+ default:
+ $('#dst').val("");
+ disableInput('dst', true);
+ $('#dstmask').val("");
+ disableInput('dstmask', true);
+ break;
}
- echo ">{$dnq}</option>";
}
-?>
- </select> /
- <select name="pdnpipe">
-<?php
- $dnqselected = 0;
- echo "<option value=\"\"";
- if (!$dnqselected) {
- echo " selected=\"selected\"";
- }
- echo " >none</option>";
- foreach ($dnqlist as $dnq => $dnqkey) {
- if ($dnq == "") {
- continue;
- }
- echo "<option value=\"$dnq\"";
- if ($dnq == $pconfig['pdnpipe']) {
- $dnqselected = 1;
- echo " selected=\"selected\"";
- }
- echo ">{$dnq}</option>";
+ }
+
+ function proto_change() {
+ if ($('#proto').find(":selected").index() < 3) {
+ portsenabled = 1;
+ hideClass('tcpflags', false);
+ } else {
+ portsenabled = 0;
+ hideClass('tcpflags', true);
}
-?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Choose the Out queue/Virtual interface only if you have also selected In.")."<br />".gettext("The Out selection is applied to traffic leaving the interface where the rule is created, In is applied to traffic coming into the chosen interface.")."<br />".gettext("If you are creating a floating rule, if the direction is In then the same rules apply, if the direction is out the selections are reverted Out is for incoming and In is for outgoing.");?></span>
- </div>
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Ackqueue/Queue");?></td>
- <td width="78%" class="vtable">
- <div id="showadvackqueuebox" <?php if (!empty($pconfig['defaultqueue'])) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_ackqueue()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="showackqueueadv" <?php if (empty($pconfig['defaultqueue'])) echo "style='display:none'"; ?>>
- <select name="ackqueue">
-<?php
- if (!is_array($qlist)) {
- $qlist = array();
- }
- echo "<option value=\"\"";
- if (!$qselected) {
- echo " selected=\"selected\"";
- }
- echo " >none</option>";
- foreach ($qlist as $q => $qkey) {
- if ($q == "") {
- continue;
- }
- echo "<option value=\"$q\"";
- if ($q == $pconfig['ackqueue']) {
- $qselected = 1;
- echo " selected=\"selected\"";
- }
- if (isset($ifdisp[$q])) {
- echo ">{$ifdisp[$q]}</option>";
- } else {
- echo ">{$q}</option>";
- }
- }
-?>
- </select> /
- <select name="defaultqueue">
-<?php
- $qselected = 0;
- echo "<option value=\"\"";
- if (!$qselected) {
- echo " selected=\"selected\"";
- }
- echo " >none</option>";
- foreach ($qlist as $q => $qkey) {
- if ($q == "") {
- continue;
- }
- echo "<option value=\"$q\"";
- if ($q == $pconfig['defaultqueue']) {
- $qselected = 1;
- echo " selected=\"selected\"";
- }
- if (isset($ifdisp[$q])) {
- echo ">{$ifdisp[$q]}</option>";
- } else {
- echo ">{$q}</option>";
- }
+
+ // Disable OS knob if the proto is not TCP.
+ if ($('#proto').find(":selected").index() < 1) {
+ disableInput('os', false);
+ } else {
+ disableInput('os', true);
+ }
+
+ if ($('#proto').find(":selected").index() == 3) {
+ disableInput('icmptype', false);
+ disableInput('icmp6type', false);
+ } else {
+ disableInput('icmptype', true);
+ disableInput('icmp6type', true);
+ }
+
+ ext_change();
+
+ if($('#proto').find(":selected").index() == 3 || $('#proto').find(":selected").index() == 4) {
+ if($('#ipprotocol').find(":selected").index() == 0) { // IPv4
+ hideInput('icmptype', false);
+ hideInput('icmp6type', true);
+ } else if($('#ipprotocol').find(":selected").index() == 1) { // IPv6
+ hideInput('icmptype', true);
+ hideInput('icmp6type', false);
+ } else { // IPv4 + IPv6
+ hideInput('icmptype', true);
+ hideInput('icmp6type', true);
}
-?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Choose the Acknowledge Queue only if you have selected Queue.");?></span>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Layer7");?></td>
- <td width="78%" class="vtable">
- <div id="showadvlayer7box" <?php if (!empty($pconfig['l7container'])) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_layer7()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="showlayer7adv" <?php if (empty($pconfig['l7container'])) echo "style='display:none'"; ?>>
- <select name="l7container">
-<?php
- if (!is_array($l7clist)) {
- $l7clist = array();
- }
- echo "<option value=\"\"";
- echo " >none</option>";
- foreach ($l7clist as $l7ckey) {
- echo "<option value=\"{$l7ckey}\"";
- if ($l7ckey == $pconfig['l7container']) {
- echo " selected=\"selected\"";
- }
- echo ">{$l7ckey}</option>";
- }
-?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Choose a Layer7 container to apply application protocol inspection rules. " .
- "These are valid for TCP and UDP protocols only.");?>
- </span>
- </div>
- </td>
- </tr>
-<?php
- // Allow extending of the firewall edit page and include custom input validation
- pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/htmlphplate");
-?>
-<?php
-$has_created_time = (isset($a_filter[$id]['created']) && is_array($a_filter[$id]['created']));
-$has_updated_time = (isset($a_filter[$id]['updated']) && is_array($a_filter[$id]['updated']));
-?>
- <?php if ($has_created_time || $has_updated_time): ?>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Rule Information");?></td>
- </tr>
- <?php if ($has_created_time): ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Created");?></td>
- <td width="78%" class="vtable">
- <?= date(gettext("n/j/y H:i:s"), $a_filter[$id]['created']['time']) ?> <?= gettext("by") ?> <strong><?= $a_filter[$id]['created']['username'] ?></strong>
- </td>
- </tr>
- <?php endif; ?>
- <?php if ($has_updated_time): ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Updated");?></td>
- <td width="78%" class="vtable">
- <?= date(gettext("n/j/y H:i:s"), $a_filter[$id]['updated']['time']) ?> <?= gettext("by") ?> <strong><?= $a_filter[$id]['updated']['username'] ?></strong>
- </td>
- </tr>
- <?php endif; ?>
- <?php endif; ?>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- &nbsp;<br />&nbsp;
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
-<?php if (isset($id) && $a_filter[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <input name="tracker" type="hidden" value="<?=htmlspecialchars($pconfig['tracker']);?>">
-<?php endif; ?>
- <input name="after" type="hidden" value="<?=htmlspecialchars($after);?>" />
- </td>
- </tr>
- </table>
-</form>
-<script type="text/javascript">
-//<![CDATA[
+ } else {
+ hideInput('icmptype', true);
+ hideInput('icmp6type', true);
+ }
+
+ if($('#proto').find(":selected").index() >= 0 && $('#proto').find(":selected").index() <= 2) {
+ hideClass('dstprtr', false);
+ hideClass('srcprtr', false);
+ } else {
+ hideClass('srcprtr', true);
+ hideClass('dstprtr', true);
+ }
+ }
+
+ function src_rep_change() {
+ $('#srcendport').prop("selectedIndex", $('#srcbeginport').find(":selected").index());
+ }
+
+ function dst_rep_change() {
+ $('#dstendport').prop("selectedIndex", $('#dstbeginport').find(":selected").index());
+ }
+
+ // On initial page load
ext_change();
typesel_change();
proto_change();
+ hideClass('advanced-options', true);
+ hideClass('srcportrange', true);
+
<?php if ((!empty($pconfig['srcbeginport']) && $pconfig['srcbeginport'] != "any") || (!empty($pconfig['srcendport']) && $pconfig['srcendport'] != "any")): ?>
- show_source_port_range();
+ show_source_port_range();
<?php endif; ?>
- var addressarray = <?= json_encode(get_alias_list(array("host", "network", "openvpn", "urltable"))) ?>;
- var customarray = <?= json_encode(get_alias_list(array("port", "url_ports", "urltable_ports"))) ?>;
-
- var oTextbox1 = new AutoSuggestControl(document.getElementById("src"), new StateSuggestions(addressarray));
- var oTextbox2 = new AutoSuggestControl(document.getElementById("srcbeginport_cust"), new StateSuggestions(customarray));
- var oTextbox3 = new AutoSuggestControl(document.getElementById("srcendport_cust"), new StateSuggestions(customarray));
- var oTextbox4 = new AutoSuggestControl(document.getElementById("dst"), new StateSuggestions(addressarray));
- var oTextbox5 = new AutoSuggestControl(document.getElementById("dstbeginport_cust"), new StateSuggestions(customarray));
- var oTextbox6 = new AutoSuggestControl(document.getElementById("dstendport_cust"), new StateSuggestions(customarray));
-//]]>
+ // Make it a regular button, not a submit
+ $('#toggle-advanced').prop('type','button');
+ $("#btnsrcadv").prop('type','button');
+
+ // on click . .
+ $('#srcbeginport').on('change', function() {
+ src_rep_change();
+ ext_change();
+ });
+
+ $('#btnsrcadv').click(function() {
+ hideClass('srcportrange', false);
+ hideInput('btnsrcadv', true);
+ });
+
+ $('#srcendport').on('change', function() {
+ ext_change();
+ });
+
+ $('#dstbeginport').on('change', function() {
+ dst_rep_change();
+ ext_change();
+ });
+
+ $('#dstendport').on('change', function() {
+ ext_change();
+ });
+
+ $('#srctype').on('change', function() {
+ typesel_change();
+ });
+
+ $('#dsttype').on('change', function() {
+ typesel_change();
+ });
+
+ $('#proto').on('change', function() {
+ proto_change();
+ });
+
+ $('#ipprotocol').on('change', function() {
+ proto_change();
+ });
+
+
+ $('#toggle-advanced').click(function() {
+ optionsvisible = 1;
+ hideClass('advanced-options', false);
+ if($('#tcpflags_any').prop('checked'))
+ $('.table-flags').addClass('hidden');
+ });
+
+ $('#tcpflags_any').click(function () {
+ if(this.checked)
+ $('.table-flags').addClass('hidden');
+ else
+ $('.table-flags').removeClass('hidden');
+ });
+});
+//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_schedule.php b/src/usr/local/www/firewall_schedule.php
index e6b7a21..f3e2062 100644
--- a/src/usr/local/www/firewall_schedule.php
+++ b/src/usr/local/www/firewall_schedule.php
@@ -1,35 +1,60 @@
<?php
/*
firewall_schedule.php
- Copyright (C) 2004 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004 Scott Ullrich
+ * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>
+ * Originally part of pfSense (https://www.pfsense.org)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: schedules
*/
@@ -40,6 +65,7 @@
##|*MATCH=firewall_schedule.php*
##|-PRIV
+define('CLOCK', '&#x1f550;');
$dayArray = array (gettext('Mon'), gettext('Tues'), gettext('Wed'), gettext('Thur'), gettext('Fri'), gettext('Sat'), gettext('Sun'));
$monthArray = array (gettext('January'), gettext('February'), gettext('March'), gettext('April'), gettext('May'), gettext('June'), gettext('July'), gettext('August'), gettext('September'), gettext('October'), gettext('November'), gettext('December'));
@@ -56,7 +82,6 @@ if (!is_array($config['schedules']['schedule'])) {
$a_schedules = &$config['schedules']['schedule'];
-
if ($_GET['act'] == "del") {
if ($a_schedules[$_GET['id']]) {
/* make sure rule is not being referenced by any nat or filter rules */
@@ -76,7 +101,7 @@ if ($_GET['act'] == "del") {
}
if ($is_schedule_referenced == true) {
- $savemsg = sprintf(gettext("Cannot delete Schedule. Currently in use by %s"), $referenced_by);
+ $savemsg = sprintf(gettext("Cannot delete Schedule. Currently in use by %s"), $referenced_by);
} else {
unset($a_schedules[$_GET['id']]);
write_config();
@@ -87,169 +112,171 @@ if ($_GET['act'] == "del") {
}
include("head.inc");
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<form action="firewall_schedule.php" method="post">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall schedule">
- <tr>
- <td width="25%" class="listhdrr"><?=gettext("Name");?></td>
- <td width="35%" class="listhdrr"><?=gettext("Time Range(s)");?></td>
- <td width="35%" class="listhdr"><?=gettext("Description");?></td>
- <td width="5%" class="list sort_ignore">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Schedules')?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td width="17"></td>
- <td valign="middle"><a href="firewall_schedule_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new schedule");?>" alt="add" /></a></td>
+ <th><!--"Active" indicator--></th>
+ <th><?=gettext("Name")?></th>
+ <th><?=gettext("Range: Date / Times / Name")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><!--Buttons--></th>
</tr>
- </table>
- </td>
- </tr>
- <?php $i = 0; foreach ($a_schedules as $schedule): ?>
- <tr>
- <td class="listlr" ondblclick="document.location='firewall_schedule_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($schedule['name']);?>
- <?php
- $schedstatus = filter_get_time_based_rule_status($schedule);
- if ($schedstatus) { ?>
- &nbsp;<img src="./themes/<?= $g['theme']; ?>/images/icons/icon_frmfld_time.png" title="<?=gettext("Schedule is currently active");?>" width="17" height="17" border="0" alt="schedule" />
- <?php } ?>
- </td>
- <td class="listlr" ondblclick="document.location='firewall_schedule_edit.php?id=<?=$i;?>';">
- <table width="98%" border="0" cellpadding="0" cellspacing="0" summary="schedule">
- <?php
- foreach ($schedule['timerange'] as $timerange) {
- $tempFriendlyTime = "";
- $tempID = "";
- $firstprint = false;
- if ($timerange) {
- $dayFriendly = "";
- $tempFriendlyTime = "";
-
- //get hours
- $temptimerange = $timerange['hour'];
- $temptimeseparator = strrpos($temptimerange, "-");
-
- $starttime = substr ($temptimerange, 0, $temptimeseparator);
- $stoptime = substr ($temptimerange, $temptimeseparator+1);
-
- if ($timerange['month']) {
- $tempmontharray = explode(",", $timerange['month']);
- $tempdayarray = explode(",", $timerange['day']);
- $arraycounter = 0;
- $firstDayFound = false;
- $firstPrint = false;
- foreach ($tempmontharray as $monthtmp) {
- $month = $tempmontharray[$arraycounter];
- $day = $tempdayarray[$arraycounter];
-
- if (!$firstDayFound) {
- $firstDay = $day;
- $firstmonth = $month;
- $firstDayFound = true;
- }
-
- $currentDay = $day;
- $nextDay = $tempdayarray[$arraycounter+1];
- $currentDay++;
- if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])) {
- if ($firstPrint) {
- $dayFriendly .= "<br />";
- }
- $currentDay--;
- if ($currentDay != $firstDay) {
- $dayFriendly .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ;
- } else {
- $dayFriendly .= $monthArray[$month-1] . " " . $day;
- }
- $firstDayFound = false;
- $firstPrint = true;
- }
- $arraycounter++;
- }
- } else {
- $tempdayFriendly = $timerange['position'];
- $firstDayFound = false;
- $tempFriendlyDayArray = explode(",", $tempdayFriendly);
- $currentDay = "";
- $firstDay = "";
- $nextDay = "";
- $counter = 0;
- foreach ($tempFriendlyDayArray as $day) {
- if ($day != "") {
- if (!$firstDayFound) {
- $firstDay = $tempFriendlyDayArray[$counter];
- $firstDayFound = true;
- }
- $currentDay =$tempFriendlyDayArray[$counter];
- //get next day
- $nextDay = $tempFriendlyDayArray[$counter+1];
- $currentDay++;
- if ($currentDay != $nextDay) {
- if ($firstprint) {
- $dayFriendly .= "<br />";
- }
- $currentDay--;
- if ($currentDay != $firstDay) {
- $dayFriendly .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1];
- } else {
- $dayFriendly .= $dayArray[$firstDay-1];
- }
- $firstDayFound = false;
- $firstprint = true;
- }
- $counter++;
- }
- }
+ </thead>
+ <tbody>
+<?php
+$i = 0;
+foreach ($a_schedules as $schedule):
+ $schedstatus = filter_get_time_based_rule_status($schedule);
+?>
+ <tr>
+ <td>
+ <?=($schedstatus) ? '<a title="' . gettext("Schedule is currently active") . '">' . CLOCK . '</a>':''?>
+ </td>
+ <td>
+ <?=htmlspecialchars($schedule['name'])?>
+ </td>
+ <td>
+<?php
+ $first = true;
+ foreach($schedule['timerange'] as $timerange) {
+ $tempFriendlyTime = "";
+ $tempID = "";
+ $firstprint = false;
+
+ if ($timerange) {
+ $dayFriendly = "";
+ $tempFriendlyTime = "";
+
+ //get hours
+ $temptimerange = $timerange['hour'];
+ $temptimeseparator = strrpos($temptimerange, "-");
+
+ $starttime = substr ($temptimerange, 0, $temptimeseparator);
+ $stoptime = substr ($temptimerange, $temptimeseparator+1);
+
+ if ($timerange['month']) {
+ $tempmontharray = explode(",", $timerange['month']);
+ $tempdayarray = explode(",",$timerange['day']);
+ $arraycounter = 0;
+ $firstDayFound = false;
+ $firstPrint = false;
+ foreach ($tempmontharray as $monthtmp){
+ $month = $tempmontharray[$arraycounter];
+ $day = $tempdayarray[$arraycounter];
+
+ if (!$firstDayFound) {
+ $firstDay = $day;
+ $firstmonth = $month;
+ $firstDayFound = true;
+ }
+
+ $currentDay = $day;
+ $nextDay = $tempdayarray[$arraycounter+1];
+ $currentDay++;
+
+ if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])){
+ if ($firstPrint)
+ $dayFriendly .= "<br />";
+
+ $currentDay--;
+
+ if ($currentDay != $firstDay)
+ $dayFriendly .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ;
+ else
+ $dayFriendly .= $monthArray[$month-1] . " " . $day;
+
+ $firstDayFound = false;
+ $firstPrint = true;
+ }
+ $arraycounter++;
+ }
+ }
+ else {
+ $tempdayFriendly = $timerange['position'];
+ $firstDayFound = false;
+ $tempFriendlyDayArray = explode(",", $tempdayFriendly);
+ $currentDay = "";
+ $firstDay = "";
+ $nextDay = "";
+ $counter = 0;
+
+ foreach ($tempFriendlyDayArray as $day){
+ if ($day != ""){
+ if (!$firstDayFound)
+ {
+ $firstDay = $tempFriendlyDayArray[$counter];
+ $firstDayFound = true;
}
- $timeFriendly = $starttime . "-" . $stoptime;
- $description = $timerange['rangedescr'];
- ?>
- <tr>
- <td><?=$dayFriendly;?></td>
- <td><?=$timeFriendly;?></td>
- <td><?=$description;?></td>
- </tr>
- <?php
+ $currentDay =$tempFriendlyDayArray[$counter];
+ //get next day
+ $nextDay = $tempFriendlyDayArray[$counter+1];
+ $currentDay++;
+
+ if ($currentDay != $nextDay){
+ if ($firstprint)
+ $dayFriendly .= "<br />";
+
+ $currentDay--;
+
+ if ($currentDay != $firstDay)
+ $dayFriendly .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1];
+ else
+ $dayFriendly .= $dayArray[$firstDay-1];
+
+ $firstDayFound = false;
+ $firstprint = true;
+ }
+ $counter++;
}
- }//end for
- ?>
- </table>
- </td>
- <td class="listbg" ondblclick="document.location='firewall_schedule_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($schedule['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="buttons">
- <tr>
- <td valign="middle"><a href="firewall_schedule_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit alias");?>" alt="edit" /></a></td>
- <td><a href="firewall_schedule.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext('Do you really want to delete this schedule?');?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete alias");?>" alt="delete" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
-<?php $i++; endforeach; ?>
- <tr>
- <td class="list" colspan="3"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td width="17"></td>
- <td valign="middle"><a href="firewall_schedule_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new schedule");?>" alt="add" /></a></td>
+ }
+ }
+
+ $timeFriendly = $starttime . "-" . $stoptime;
+ $description = $timerange['rangedescr'];
+
+ print(($first ? '':'<br />') . $dayFriendly . ' / ' . $timeFriendly . ' / ' . $description);
+ }
+ $first = false;
+ }
+?>
+ </td>
+
+ <td>
+ <?=htmlspecialchars($schedule['descr'])?>&nbsp;
+ </td>
+
+ <td>
+ <a href="firewall_schedule_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext("Edit")?></a>
+ <a href="firewall_schedule.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext("Delete")?></a>
+
+ </td>
</tr>
- </table>
- </td>
- </tr>
- <tr>
- <td class="tabcont" colspan="3">
- <p><span class="vexpl"><span class="red"><strong><?=gettext("Note:");?><br /></strong></span><?=gettext("Schedules act as placeholders for time ranges to be used in Firewall Rules.");?></span></p>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php
+ $i++;
+endforeach;
+?>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<?=($i > 0) ? gettext(CLOCK . ' Indicates that the scedule is currently active.'):''?>
+
+<nav class="action-buttons">
+ <a href="firewall_schedule_edit.php" class="btn btn-sm btn-success"><?=gettext("Add new schedule")?></a>
+</nav>
+
+<?php
+
+print_info_box(gettext('Schedules act as placeholders for time ranges to be used in Firewall Rules.'));
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_schedule_edit.php b/src/usr/local/www/firewall_schedule_edit.php
index e7c4bca..bec4029 100644
--- a/src/usr/local/www/firewall_schedule_edit.php
+++ b/src/usr/local/www/firewall_schedule_edit.php
@@ -1,37 +1,62 @@
<?php
/*
firewall_schedule_edit.php
- Copyright (C) 2004 Scott Ullrich
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004 Scott Ullrich
+ * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>
+ * Originally part of pfSense (https://www.pfsense.org)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: schedules
+ pfSense_MODULE: schedules
*/
##|+PRIV
@@ -45,14 +70,13 @@ function schedulecmp($a, $b) {
return strcmp($a['name'], $b['name']);
}
-function schedule_sort() {
- global $g, $config;
+function schedule_sort(){
+ global $g, $config;
- if (!is_array($config['schedules']['schedule'])) {
- return;
- }
+ if (!is_array($config['schedules']['schedule']))
+ return;
- usort($config['schedules']['schedule'], "schedulecmp");
+ usort($config['schedules']['schedule'], "schedulecmp");
}
require("guiconfig.inc");
@@ -60,29 +84,23 @@ require_once("functions.inc");
require_once("filter.inc");
require_once("shaper.inc");
-$pgtitle = array(gettext("Firewall"), gettext("Schedules"), gettext("Edit"));
+$pgtitle = array(gettext("Firewall"),gettext("Schedules"),gettext("Edit"));
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_schedule.php');
-}
+$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_schedule.php');
-$dayArray = array (gettext('Mon'), gettext('Tues'), gettext('Wed'), gettext('Thur'), gettext('Fri'), gettext('Sat'), gettext('Sun'));
-$monthArray = array (gettext('January'), gettext('February'), gettext('March'), gettext('April'), gettext('May'), gettext('June'), gettext('July'), gettext('August'), gettext('September'), gettext('October'), gettext('November'), gettext('December'));
+$dayArray = array (gettext('Mon'),gettext('Tues'),gettext('Wed'),gettext('Thur'),gettext('Fri'),gettext('Sat'),gettext('Sun'));
+$monthArray = array (gettext('January'),gettext('February'),gettext('March'),gettext('April'),gettext('May'),gettext('June'),gettext('July'),gettext('August'),gettext('September'),gettext('October'),gettext('November'),gettext('December'));
-if (!is_array($config['schedules']['schedule'])) {
+if (!is_array($config['schedules']['schedule']))
$config['schedules']['schedule'] = array();
-}
$a_schedules = &$config['schedules']['schedule'];
-if (is_numericint($_GET['id'])) {
+if (is_numericint($_GET['id']))
$id = $_GET['id'];
-}
-if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+
+if (isset($_POST['id']) && is_numericint($_POST['id']))
$id = $_POST['id'];
-}
if (isset($id) && $a_schedules[$id]) {
$pconfig['name'] = $a_schedules[$id]['name'];
@@ -94,52 +112,53 @@ if (isset($id) && $a_schedules[$id]) {
if ($_POST) {
- if (strtolower($_POST['name']) == "lan") {
+ if(strtolower($_POST['name']) == "lan")
$input_errors[] = gettext("Schedule may not be named LAN.");
- }
- if (strtolower($_POST['name']) == "wan") {
+
+ if(strtolower($_POST['name']) == "wan")
$input_errors[] = gettext("Schedule may not be named WAN.");
- }
- if (strtolower($_POST['name']) == "") {
+
+ if(strtolower($_POST['name']) == "")
$input_errors[] = gettext("Schedule name cannot be blank.");
- }
$x = is_validaliasname($_POST['name']);
if (!isset($x)) {
$input_errors[] = gettext("Reserved word used for schedule name.");
} else {
- if (is_validaliasname($_POST['name']) == false) {
+ if (is_validaliasname($_POST['name']) == false)
$input_errors[] = gettext("The schedule name may only consist of the characters a-z, A-Z, 0-9");
- }
}
/* check for name conflicts */
foreach ($a_schedules as $schedule) {
- if (isset($id) && ($a_schedules[$id]) && ($a_schedules[$id] === $schedule)) {
+ if (isset($id) && ($a_schedules[$id]) && ($a_schedules[$id] === $schedule))
continue;
- }
if ($schedule['name'] == $_POST['name']) {
$input_errors[] = gettext("A Schedule with this name already exists.");
break;
}
}
+
$schedule = array();
$schedule['name'] = $_POST['name'];
$schedule['descr'] = htmlentities($_POST['descr'], ENT_QUOTES, 'UTF-8');
$timerangeFound = false;
- for ($x = 0; $x < 99; $x++) {
- if ($_POST['schedule' . $x]) {
+
+ for ($x=0; $x<99; $x++){
+ if($_POST['schedule' . $x]) {
if (!preg_match('/^[0-9]+:[0-9]+$/', $_POST['starttime' . $x])) {
$input_errors[] = sprintf(gettext("Invalid start time - '%s'"), $_POST['starttime' . $x]);
continue;
}
+
if (!preg_match('/^[0-9]+:[0-9]+$/', $_POST['stoptime' . $x])) {
$input_errors[] = sprintf(gettext("Invalid stop time - '%s'"), $_POST['stoptime' . $x]);
continue;
}
+
$timerangeFound = true;
$timeparts = array();
$firstprint = false;
@@ -149,16 +168,22 @@ if ($_POST) {
$timehourstr .= $_POST['stoptime' . $x];
$timedescrstr = htmlentities($_POST['timedescr' . $x], ENT_QUOTES, 'UTF-8');
$dashpos = strpos($timestr, '-');
- if ($dashpos === false) {
+
+ if ($dashpos === false)
+ {
$timeparts['position'] = $timestr;
- } else {
+ }
+ else
+ {
$tempindarray = array();
$monthstr = "";
$daystr = "";
$tempindarray = explode(",", $timestr);
- foreach ($tempindarray as $currentselection) {
- if ($currentselection) {
- if ($firstprint) {
+ foreach ($tempindarray as $currentselection)
+ {
+ if ($currentselection){
+ if ($firstprint)
+ {
$monthstr .= ",";
$daystr .= ",";
}
@@ -166,87 +191,557 @@ if ($_POST) {
$monthpos = strpos($currentselection, "m");
$daypos = strpos($currentselection, "d");
$monthstr .= substr($currentselection, $monthpos+1, $daypos-$monthpos-1);
- $daystr .= substr($currentselection, $daypos+1);
+ $daystr .= substr($currentselection, $daypos+1);
$firstprint = true;
}
}
+
$timeparts['month'] = $monthstr;
$timeparts['day'] = $daystr;
}
+
$timeparts['hour'] = $timehourstr;
$timeparts['rangedescr'] = $timedescrstr;
$schedule['timerange'][$x] = $timeparts;
}
}
- if (!$timerangeFound) {
+ if (!$timerangeFound)
$input_errors[] = gettext("The schedule must have at least one time range configured.");
- }
if (!$input_errors) {
- if (!empty($pconfig['schedlabel'])) {
+ if (!empty($pconfig['schedlabel']))
$schedule['schedlabel'] = $pconfig['schedlabel'];
- } else {
+ else
$schedule['schedlabel'] = uniqid();
- }
- if (isset($id) && $a_schedules[$id]) {
+ if (isset($id) && $a_schedules[$id]){
$a_schedules[$id] = $schedule;
- } else {
+ }
+ else{
$a_schedules[] = $schedule;
}
+
schedule_sort();
- if (write_config()) {
+
+ if (write_config())
filter_configure();
- }
header("Location: firewall_schedule.php");
exit;
- } else {
- //we received input errors, copy data to prevent retype
- if (!$_POST['schedule0']) {
+
+ }
+ //we received input errors, copy data to prevent retype
+ else
+ {
+ if (!$_POST['schedule0'])
$getSchedule = false;
- } else {
+ else
$getSchedule = true;
- }
+
$pconfig['name'] = $schedule['name'];
$pconfig['descr'] = $schedule['descr'];
$pconfig['timerange'] = $schedule['timerange'];
}
}
+
include("head.inc");
-/* put your custom HTML head content here */
-/* using some of the $pfSenseHead function calls */
-$jscriptstr = <<<EOD
+// Returns a string containg the HTML to display a calendar table
+function build_date_table() {
+ $tblstr = "";
+
+ $firstmonth = TRUE;
+ $monthcounter = date("n");
+ $yearcounter = date("Y");
+
+ for ($k=0; $k<12; $k++){
+ $firstdayofmonth = date("w", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));
+
+ if ($firstdayofmonth == 0)
+ $firstdayofmonth = 7;
+
+ $daycounter = 1;
+ //number of day in month
+ $numberofdays = date("t", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));
+ $firstdayprinted = FALSE;
+ $lasttr = FALSE;
+ $positioncounter = 1;//7 for Sun, 1 for Mon, 2 for Tues, etc
+
+ $mostr = '<div id="' . date("F_y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter))) ;
+ $mostr .= '" style="position:relative; display:';
+
+ if($firstmonth)
+ $mostr .= "block";
+ else
+ $mostr .= "none";
+
+ $mostr .= '" class="col-md-6">';
+
+ $mostr .=
+ '<table class="table table-condensed" border="1" cellspacing="1" cellpadding="1" id="calTable' . $monthcounter . $yearcounter . '" >
+ <thead><tr class="info"><td colspan="7" align="center" ><b>' . date("F_Y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter))) . '</b></td>
+ </tr>
+ <tr>
+ <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p1\');">' . gettext("Mon") . '</th>
+ <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p2\');">' . gettext("Tue") . '</th>
+ <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p3\');">' . gettext("Wed") . '</th>
+ <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p4\');">' . gettext("Thu") . '</th>
+ <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p5\');">' . gettext("Fri") . '</th>
+ <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p6\');">' . gettext("Sat") . '</th>
+ <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p7\');">' . gettext("Sun") . '</th>
+ </tr>
+ </thead>
+ <tbody>' . "\r\n";
+
+ $firstmonth = FALSE;
+
+ while ($daycounter<=$numberofdays) {
+ $weekcounter = date("W", mktime(0, 0, 0, date($monthcounter), date($daycounter), date($yearcounter)));
+ $weekcounter = ltrim($weekcounter, "0");
+ if ($positioncounter == 1)
+ {
+ $mostr .= "<tr>";
+ }
+
+ if ($firstdayofmonth == $positioncounter){
+
+ $mostr .= '<td class="text-center" style="cursor: pointer;" id="w' . $weekcounter . 'p' . $positioncounter . '" onclick="daytoggle(\'w' . $weekcounter . 'p' . $positioncounter . '-m' . $monthcounter . 'd' . $daycounter . '\');">' . $daycounter . "\r\n";
+
+ $daycounter++;
+ $firstdayprinted = TRUE;
+ $mostr .= "</td>";
+ }
+ elseif ($firstdayprinted == TRUE && $daycounter <= $numberofdays) {
+ $mostr .= '<td class="text-center" style="cursor: pointer;" id="w' . $weekcounter . 'p' . $positioncounter . '" onclick="daytoggle(\'w' . $weekcounter . 'p' . $positioncounter . '-m' . $monthcounter . 'd' . $daycounter . '\');">' . $daycounter . "\r\n";
+ $daycounter++;
+ $mostr .= "</td>";
+ }
+ else
+ {
+ $mostr .= '<td class="text-center"></td>';
+ }
+
+ if ($positioncounter == 7 || $daycounter > $numberofdays){
+ $positioncounter = 1;
+ $mostr .= "</tr>";
+ }
+ else{
+ $positioncounter++;
+ }
+
+ }
+
+ $mostr .= '</tbody></table>';
+ $mostr .= gettext('Click individual date to select that date only. Click the appropriate weekday Header to select all occurrences of that weekday. ');
+ $mostr .= '</div>';
+
+ if ($monthcounter == 12)
+ {
+ $monthcounter = 1;
+ $yearcounter++;
+ }
+ else
+ {
+ $monthcounter++;
+ }
+
+ $tblstr .= $mostr;
+ } //end for loop
+
+ return($tblstr);
+}
+
+function build_month_list() {
+
+ $list = array();
+
+ $monthcounter = date("n");
+ $monthlimit = $monthcounter + 12;
+ $yearcounter = date("Y");
+
+ for ($k=0; $k<12; $k++){
+ $list[$monthcounter] = date("F_y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));
+
+ if ($monthcounter == 12) {
+ $monthcounter = 1;
+ $yearcounter++;
+ }
+ else
+ {
+ $monthcounter++;
+ }
+ }
+
+ return($list);
+}
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Schedule information');
+
+$input = new Form_Input(
+ 'name',
+ 'Schedule Name',
+ 'text',
+ $pconfig['name']
+);
+
+$input->setHelp((is_schedule_inuse($pconfig['name']) != true) ? 'The name of the alias may only consist of the characters a-z, A-Z and 0-9':
+ 'This schedule is in use so the name may not be modified!');
+
+if(is_schedule_inuse($pconfig['name']) == true)
+ $input->setReadonly();
+
+$section->addInput($input);
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed). ');
+
+$section->addInput(new Form_Select(
+ 'monthsel',
+ 'Month',
+ null,
+ build_month_list()
+));
+
+$section->addInput(new Form_StaticText(
+ 'Date',
+ build_date_table()
+));
+
+$group = new Form_Group('Time');
+
+$group->add(new Form_Select(
+ 'starttimehour',
+ null,
+ null,
+ array_combine(range(0, 23, 1), range(0, 23, 1))
+))->setHelp('Start Hrs');
+
+$group->add(new Form_Select(
+ 'starttimemin',
+ null,
+ null,
+ array('00' => '00', '15' => '15', '30' => '30', '59' => '59')
+))->setHelp('Start Mins');
+
+$group->add(new Form_Select(
+ 'stoptimehour',
+ null,
+ '23',
+ array_combine(range(0, 23, 1), range(0, 23, 1))
+))->setHelp('Stop Hrs');
+
+$group->add(new Form_Select(
+ 'stoptimemin',
+ null,
+ '59',
+ array('00' => '00', '15' => '15', '30' => '30', '59' => '59')
+))->setHelp('Stop Mins');
+
+$group->setHelp('Select the time range for the day(s) selected on the Month(s) above. A full day is 0:00-23:59.');
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'timerangedescr',
+ 'Time range description',
+ 'text',
+ $pconfig['timerangedescr']
+))->setHelp('You may enter a description here for your reference (not parsed). ');
+
+$group = new Form_Group(null);
+
+$group->add(new Form_Button(
+ 'btnaddtime',
+ 'Add Time'
+))->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$group->add(new Form_Button(
+ 'btnclrsel',
+ 'Clear selection'
+))->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->add($group);
+
+if (isset($id) && $a_schedules[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+
+$section = new Form_Section('Configured ranges');
+$counter = 0;
+
+if ($getSchedule){
+ $maxrows = count($pconfig['timerange']) -1;
+
+ foreach($pconfig['timerange'] as $timerange) {
+ $tempFriendlyTime = "";
+ $tempID = "";
+ if ($timerange){
+ $dayFriendly = "";
+ $tempFriendlyTime = "";
+ $timedescr = $timerange['rangedescr'];
+
+ //get hours
+ $temptimerange = $timerange['hour'];
+ $temptimeseparator = strrpos($temptimerange, "-");
+
+ $starttime = substr ($temptimerange, 0, $temptimeseparator);
+ $stoptime = substr ($temptimerange, $temptimeseparator+1);
+ $currentDay = "";
+ $firstDay = "";
+ $nextDay = "";
+ $foundEnd = false;
+ $firstDayFound = false;
+ $firstPrint = false;
+ $firstprint2 = false;
+
+ if ($timerange['month']){
+ $tempmontharray = explode(",", $timerange['month']);
+ $tempdayarray = explode(",",$timerange['day']);
+ $arraycounter = 0;
+ foreach ($tempmontharray as $monthtmp){
+ $month = $tempmontharray[$arraycounter];
+ $day = $tempdayarray[$arraycounter];
+ $daypos = date("w", mktime(0, 0, 0, date($month), date($day), date("Y")));
+ //if sunday, set position to 7 to get correct week number. This is due to php limitations on ISO-8601. When we move to php5.1 we can change this.
+ if ($daypos == 0){
+ $daypos = 7;
+ }
+
+ $weeknumber = date("W", mktime(0, 0, 0, date($month), date($day), date("Y")));
+ $weeknumber = ltrim($weeknumber, "0");
+
+ if ($firstPrint)
+ {
+ $tempID .= ",";
+ }
+
+ $tempID .= "w" . $weeknumber . "p" . $daypos . "-m" . $month . "d" . $day;
+ $firstPrint = true;
+
+ if (!$firstDayFound)
+ {
+ $firstDay = $day;
+ $firstmonth = $month;
+ $firstDayFound = true;
+ }
+
+ $currentDay = $day;
+ $nextDay = $tempdayarray[$arraycounter+1];
+ $currentDay++;
+ if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])){
+ if ($firstprint2)
+ $tempFriendlyTime .= ", ";
+
+ $currentDay--;
+
+ if ($currentDay != $firstDay)
+ $tempFriendlyTime .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ;
+ else
+ $tempFriendlyTime .= $monthArray[$month-1] . " " . $day;
+
+ $firstDayFound = false;
+ $firstprint2 = true;
+ }
+ $arraycounter++;
+ }
+
+ }
+ else
+ {
+ $dayFriendly = $timerange['position'];
+ $tempID = $dayFriendly;
+ }
+
+ $tempTime = $tempID . "||" . $starttime . "-" . $stoptime . "||" . $timedescr;
+
+ //following code makes the days friendly appearing, IE instead of Mon, Tues, Wed it will show Mon - Wed
+ $foundEnd = false;
+ $firstDayFound = false;
+ $firstprint = false;
+ $tempFriendlyDayArray = explode(",", $dayFriendly);
+ $currentDay = "";
+ $firstDay = "";
+ $nextDay = "";
+ $i = 0;
+
+ if (!$timerange['month']){
+ foreach ($tempFriendlyDayArray as $day){
+ if ($day != ""){
+ if (!$firstDayFound)
+ {
+ $firstDay = $tempFriendlyDayArray[$i];
+ $firstDayFound = true;
+ }
+
+ $currentDay =$tempFriendlyDayArray[$i];
+ //get next day
+ $nextDay = $tempFriendlyDayArray[$i+1];
+ $currentDay++;
+
+ if ($currentDay != $nextDay){
+ if ($firstprint)
+ $tempFriendlyTime .= ", ";
+
+ $currentDay--;
+
+ if ($currentDay != $firstDay)
+ $tempFriendlyTime .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1];
+ else
+ $tempFriendlyTime .= $dayArray[$firstDay-1];
+
+ $firstDayFound = false;
+ $firstprint = true;
+ }
+ $i++;
+ }
+ }
+ }
+
+ $group = new Form_Group('');
+ $group->add(new Form_Input(
+ 'tempFriendlyTime',
+ null,
+ 'readonly',
+ $tempFriendlyTime
+ ))->setWidth(2)->setHelp($counter == $maxrows ? 'Day(s)':'');
+
+ $group->add(new Form_Input(
+ 'starttime' . $counter,
+ null,
+ 'readonly',
+ $starttime
+ ))->setWidth(2)->setHelp($counter == $maxrows ? 'Start time':'');
+
+ $group->add(new Form_Input(
+ 'stoptime' . $counter,
+ null,
+ 'readonly',
+ $stoptime
+ ))->setWidth(2)->setHelp($counter == $maxrows ? 'Stop time':'');
+
+ $group->add(new Form_Input(
+ 'timedescr' . $counter,
+ null,
+ 'readonly',
+ $timedescr
+ ))->setWidth(2)->setHelp($counter == $maxrows ? 'Description':'');
+
+ $group->add(new Form_Button(
+ 'Delete' . $counter,
+ 'Delete'
+ ))->removeClass('btn-primary')->addClass('btn-xs btn-warning');
+
+ $group->add(new Form_Input(
+ 'schedule' . $counter,
+ null,
+ 'hidden',
+ $tempID
+ ));
+
+ $group->addClass('schedulegrp' . $counter);
+
+ $counter++;
+ $section->add($group);
+ }
+ }
+}
+
+// This is just a marker that the javascript can use to insertBefore() when adding new rows
+$section->addInput(new Form_Input(
+ 'marker',
+ null,
+ 'hidden'
+))->addClass('noranges');
+
+$form->add($section);
+
+print($form);
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+events.push(function(){
+
+ //Update the calendar when a new month is selected
+ $('#monthsel').on('change', function() {
+ update_month();
+ });
+
+ // Make the ‘clear’ button a plain button, not a submit button
+ $('#btnclrsel').prop('type', 'button');
+
+ $('#btnclrsel').click(function() {
+ clearCalendar();
+ clearTime();
+ clearDescr();
+ });
+
+ // Make the ‘Add time’ button a plain button, not a submit button
+ $('#btnaddtime').prop('type', 'button');
+
+ $('#btnaddtime').click(function() {
+ processEntries();
+ });
+
+ $('[id^=Delete]').prop('type', 'button');
+
+ $('[id^=Delete]').click(function(event) {
+ delete_row(event.target.id.slice(6));
+ });
+});
+//]]>
+</script>
+
<script type="text/javascript">
//<![CDATA[
var daysSelected = "";
-var month_array = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
-var day_array = ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'];
+var month_array = ['January','February','March','April','May','June','July','August','September','October','November','December'];
+var day_array = ['Mon','Tues','Wed','Thur','Fri','Sat','Sun'];
var schCounter = 0;
function rgb2hex(rgb) {
var parts = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
- if (parts == null) {
+
+ if (parts == null)
return;
- }
+
function hex(x) {
return ("0" + parseInt(x).toString(16)).slice(-2);
}
+
return ("#" + hex(parts[1]) + hex(parts[2]) + hex(parts[3])).toUpperCase();
}
-function repeatExistingDays() {
+function repeatExistingDays(){
var tempstr, tempstrdaypos, week, daypos, dayposdone = "";
var dayarray = daysSelected.split(",");
- for (i = 0; i <= dayarray.length; i++) {
+
+ for (i=0; i<=dayarray.length; i++){
tempstr = dayarray[i];
tempstrdaypos = tempstr.search("p");
- week = tempstr.substring(1, tempstrdaypos);
+ week = tempstr.substring(1,tempstrdaypos);
week = parseInt(week);
dashpos = tempstr.search("-");
daypos = tempstr.substring(tempstrdaypos+1, dashpos);
@@ -255,39 +750,41 @@ function repeatExistingDays() {
daydone = dayposdone.search(daypos);
tempstr = 'w' + week + 'p' + daypos;
daycell = eval('document.getElementById(tempstr)');
- if (daydone == "-1") {
- if (rgb2hex(daycell.style.backgroundColor) == "#F08080") { // lightcoral
- daytogglerepeating(week, daypos, true);
- } else {
- daytogglerepeating(week, daypos, false);
- }
+ if (daydone == "-1"){
+ if (rgb2hex(daycell.style.backgroundColor) == "#F08080") // lightcoral
+ daytogglerepeating(week,daypos,true);
+ else
+ daytogglerepeating(week,daypos,false);
+
dayposdone += daypos + ",";
}
}
}
-function daytogglerepeating(week, daypos, bExists) {
+function daytogglerepeating(week,daypos,bExists){
var tempstr, daycell, dayoriginal = "";
+
for (j=1; j<=53; j++) {
tempstr = 'w' + j + 'p' + daypos;
daycell = eval('document.getElementById(tempstr)');
- dayoriginalpos = daysSelected.indexOf(tempstr);
+ dayoriginalpos = daysSelected.indexOf(tempstr);
//if bExists set to true, means cell is already select it
//unselect it and remove original day from daysSelected string
if (daycell != null) {
- if (bExists) {
- daycell.style.backgroundColor = "#FFFFFF"; // white
- } else {
- daycell.style.backgroundColor = "#F08080"; // lightcoral
+ if (bExists){
+ daycell.style.backgroundColor = "#FFFFFF"; // white
+ }
+ else
+ {
+ daycell.style.backgroundColor = "#F08080"; // lightcoral
}
if (dayoriginalpos != "-1") {
dayoriginalend = daysSelected.indexOf(',', dayoriginalpos);
tempstr = daysSelected.substring(dayoriginalpos, dayoriginalend+1);
daysSelected = daysSelected.replace(tempstr, "");
-
}
}
}
@@ -298,43 +795,55 @@ function daytoggle(id) {
var bFoundValid = false;
iddashpos = id.search("-");
+
var tempstrdaypos = id.search("p");
- var week = id.substring(1, tempstrdaypos);
+ var week = id.substring(1,tempstrdaypos);
+
week = parseInt(week);
if (iddashpos == "-1") {
idmod = id;
runrepeat = true;
var daypos = id.substr(tempstrdaypos+1);
- } else {
- idmod = id.substring(0, iddashpos);
- var daypos = id.substring(tempstrdaypos+1, iddashpos);
+ }
+ else
+ {
+ idmod = id.substring(0,iddashpos);
+ var daypos = id.substring(tempstrdaypos+1,iddashpos);
}
daypos = parseInt(daypos);
- while (!bFoundValid) {
+ while (!bFoundValid){
var daycell = document.getElementById(idmod);
- if (daycell != null) {
- if (rgb2hex(daycell.style.backgroundColor) == "#FF0000") { // red
- daycell.style.backgroundColor = "#FFFFFF"; // white
+ if (daycell != null){
+ if (rgb2hex(daycell.style.backgroundColor) == "#FF0000"){ // red
+ daycell.style.backgroundColor = "#FFFFFF"; // white
str = id + ",";
daysSelected = daysSelected.replace(str, "");
- } else if (rgb2hex(daycell.style.backgroundColor) == "#F08080") { // lightcoral
- daytogglerepeating(week, daypos, true);
- } else {
- //color is white cell
- if (!runrepeat) {
- daycell.style.backgroundColor = "#FF0000"; // red
- } else {
- daycell.style.backgroundColor = "#F08080"; // lightcoral
- daytogglerepeating(week, daypos, false);
+ }
+ else if (rgb2hex(daycell.style.backgroundColor) == "#F08080") // lightcoral
+ {
+ daytogglerepeating(week,daypos,true);
+ }
+ else //color is white cell
+ {
+ if (!runrepeat)
+ {
+ daycell.style.backgroundColor = "#FF0000"; // red
+ }
+ else
+ {
+ daycell.style.backgroundColor = "#F08080"; // lightcoral
+ daytogglerepeating(week,daypos,false);
}
daysSelected += id + ",";
}
bFoundValid = true;
- } else {
+ }
+ else
+ {
//we found an invalid cell when column was clicked, move up to the next week
week++;
tempstr = "w" + week + "p" + daypos;
@@ -343,32 +852,34 @@ function daytoggle(id) {
}
}
-function update_month() {
+function update_month(){
var indexNum = document.forms[0].monthsel.selectedIndex;
var selected = document.forms[0].monthsel.options[indexNum].text;
- for (i = 0; i <= 11; i++) {
+ for (i=0; i<=11; i++){
option = document.forms[0].monthsel.options[i].text;
document.popupMonthLayer = eval('document.getElementById (option)');
- if (selected == option) {
+ if(selected == option)
document.popupMonthLayer.style.display="block";
- } else {
+ else
document.popupMonthLayer.style.display="none";
- }
}
}
-function checkForRanges() {
- if (daysSelected != "") {
+function checkForRanges(){
+ if (daysSelected != "")
+ {
alert("You have not saved the specified time range. Please click 'Add Time' button to save the time range.");
return false;
- } else {
+ }
+ else
+ {
return true;
}
}
-function processEntries() {
+function processEntries(){
var tempstr, starttimehour, starttimemin, stoptimehour, stoptimemin, errors = "";
var passedValidiation = true;
@@ -378,29 +889,31 @@ function processEntries() {
stoptimehour = parseInt(document.getElementById("stoptimehour").value);
stoptimemin = parseInt(document.getElementById("stoptimemin").value);
-
//do time checks
- if (starttimehour > stoptimehour) {
+ if (starttimehour > stoptimehour)
+ {
errors = "Error: Start Hour cannot be greater than Stop Hour.";
passedValidiation = false;
- } else if (starttimehour == stoptimehour) {
- if (starttimemin > stoptimemin) {
+ }
+ else if (starttimehour == stoptimehour)
+ {
+ if (starttimemin > stoptimemin){
errors = "Error: Start Minute cannot be greater than Stop Minute.";
passedValidiation = false;
}
}
- if (passedValidiation) {
+ if (passedValidiation){
addTimeRange();
- } else {
- if (errors != "") {
+ }
+ else {
+ if (errors != "")
alert(errors);
- }
}
}
-function addTimeRange() {
+function addTimeRange(){
var tempdayarray = daysSelected.split(",");
var tempstr, tempFriendlyDay, starttimehour, starttimemin, stoptimehour, nrtempFriendlyTime, rtempFriendlyTime, nrtempID, rtempID = "";
var stoptimemin, timeRange, tempstrdaypos, week, daypos, day, month, dashpos, nrtempTime, rtempTime, monthstr, daystr = "";
@@ -417,25 +930,31 @@ function addTimeRange() {
//check for existing entries
var findCurrentCounter;
- for (u = 0; u < 99; u++) {
+
+ for (u=0; u<99; u++){
findCurrentCounter = document.getElementById("schedule" + u);
- if (!findCurrentCounter) {
+ if (!findCurrentCounter)
+ {
schCounter = u;
break;
}
}
- if (daysSelected != "") {
+ if (daysSelected != ""){
//get days selected
- for (i = 0; i < tempdayarray.length; i++) {
+
+ for (i=0; i<tempdayarray.length; i++)
+ {
tempstr = tempdayarray[i];
- if (tempstr != "") {
+ if (tempstr != "")
+ {
tempstrdaypos = tempstr.search("p");
- week = tempstr.substring(1, tempstrdaypos);
+ week = tempstr.substring(1,tempstrdaypos);
week = parseInt(week);
dashpos = tempstr.search("-");
- if (dashpos != "-1") {
+ if (dashpos != "-1")
+ {
var nonrepeatingfound = true;
daypos = tempstr.substring(tempstrdaypos+1, dashpos);
daypos = parseInt(daypos);
@@ -448,7 +967,9 @@ function addTimeRange() {
monthstr += month + ",";
daystr += day + ",";
nrtempID += tempstr + ",";
- } else {
+ }
+ else
+ {
var repeatingfound = true;
daypos = tempstr.substr(tempstrdaypos+1);
daypos = parseInt(daypos);
@@ -465,16 +986,19 @@ function addTimeRange() {
var tempFriendlyMonthArray = monthstr.split(",");
var tempFriendlyDayArray = daystr.split(",");
var currentDay, firstDay, nextDay, currentMonth, nextMonth, firstDay, firstMonth = "";
- for (k = 0; k < tempFriendlyMonthArray.length; k++) {
+
+ for (k=0; k<tempFriendlyMonthArray.length; k++){
tempstr = tempFriendlyMonthArray[k];
- if (tempstr != "") {
- if (!firstDayFound) {
+ if (tempstr != ""){
+ if (!firstDayFound)
+ {
firstDay = tempFriendlyDayArray[k];
firstDay = parseInt(firstDay);
firstMonth = tempFriendlyMonthArray[k];
firstMonth = parseInt(firstMonth);
firstDayFound = true;
}
+
currentDay = tempFriendlyDayArray[k];
currentDay = parseInt(currentDay);
//get next day
@@ -483,16 +1007,17 @@ function addTimeRange() {
//get next month
currentDay++;
- if ((currentDay != nextDay) || (tempFriendlyMonthArray[k] != tempFriendlyMonthArray[k+1])) {
- if (firstprint) {
+ if ((currentDay != nextDay) || (tempFriendlyMonthArray[k] != tempFriendlyMonthArray[k+1])){
+ if (firstprint)
nrtempFriendlyTime += ", ";
- }
+
currentDay--;
- if (currentDay != firstDay) {
+
+ if (currentDay != firstDay)
nrtempFriendlyTime += month_array[firstMonth-1] + " " + firstDay + "-" + currentDay;
- } else {
+ else
nrtempFriendlyTime += month_array[firstMonth-1] + " " + currentDay;
- }
+
firstDayFound = false;
firstprint = true;
}
@@ -506,30 +1031,35 @@ function addTimeRange() {
tempFriendlyDayArray = rtempFriendlyDay.split(",");
tempFriendlyDayArray.sort();
currentDay, firstDay, nextDay = "";
- for (k = 0; k < tempFriendlyDayArray.length; k++) {
+
+ for (k=0; k<tempFriendlyDayArray.length; k++){
tempstr = tempFriendlyDayArray[k];
- if (tempstr != "") {
- if (!firstDayFound) {
+ if (tempstr != ""){
+ if (!firstDayFound)
+ {
firstDay = tempFriendlyDayArray[k];
firstDay = parseInt(firstDay);
firstDayFound = true;
}
+
currentDay = tempFriendlyDayArray[k];
currentDay = parseInt(currentDay);
//get next day
nextDay = tempFriendlyDayArray[k+1];
nextDay = parseInt(nextDay);
currentDay++;
- if (currentDay != nextDay) {
- if (firstprint) {
+
+ if (currentDay != nextDay){
+ if (firstprint)
rtempFriendlyTime += ", ";
- }
+
currentDay--;
- if (currentDay != firstDay) {
+
+ if (currentDay != firstDay)
rtempFriendlyTime += day_array[firstDay-1] + " - " + day_array[currentDay-1];
- } else {
+ else
rtempFriendlyTime += day_array[firstDay-1];
- }
+
firstDayFound = false;
firstprint = true;
}
@@ -539,23 +1069,25 @@ function addTimeRange() {
//sort the tempID
var tempsortArray = rtempID.split(",");
var isFirstdone = false;
+
tempsortArray.sort();
+
//clear tempID
rtempID = "";
- for (t = 0; t < tempsortArray.length; t++) {
- if (tempsortArray[t] != "") {
- if (!isFirstdone) {
+ for (t=0; t<tempsortArray.length; t++)
+ {
+ if (tempsortArray[t] != ""){
+ if (!isFirstdone){
rtempID += tempsortArray[t];
isFirstdone = true;
- } else {
- rtempID += "," + tempsortArray[t];
}
+ else
+ rtempID += "," + tempsortArray[t];
}
}
-
//get time specified
- starttimehour = document.getElementById("starttimehour").value
+ starttimehour = document.getElementById("starttimehour").value
starttimemin = document.getElementById("starttimemin").value;
stoptimehour = document.getElementById("stoptimehour").value;
stoptimemin = document.getElementById("stoptimemin").value;
@@ -568,7 +1100,7 @@ function addTimeRange() {
//get description for time range
var tempdescr = document.getElementById("timerangedescr").value
- if (nonrepeatingfound) {
+ if (nonrepeatingfound){
nrtempTime += nrtempID;
//add time ranges
nrtempTime += timeRange;
@@ -577,7 +1109,7 @@ function addTimeRange() {
insertElements(nrtempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, tempdescr, nrtempTime, nrtempID);
}
- if (repeatingfound) {
+ if (repeatingfound){
rtempTime += rtempID;
//add time ranges
rtempTime += timeRange;
@@ -586,566 +1118,108 @@ function addTimeRange() {
insertElements(rtempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, tempdescr, rtempTime, rtempID);
}
- } else {
+ }
+ else
+ {
//no days were selected, alert user
alert ("You must select at least 1 day before adding time");
}
}
-function insertElements(tempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, tempdescr, tempTime, tempID) {
-
- //add it to the schedule list
- d = document;
- tbody = d.getElementById("scheduletable").getElementsByTagName("tbody").item(0);
- tr = d.createElement("tr");
- td = d.createElement("td");
- td.innerHTML= "<span class='vexpl'>" + tempFriendlyTime + "<\/span>";
- tr.appendChild(td);
-
- td = d.createElement("td");
- td.innerHTML="<input type='text' readonly class='vexpl' name='starttime" + schCounter + "' id='starttime" + schCounter + "' style=' word-wrap:break-word; width:100%; border:0px solid;' value='" + starttimehour + ":" + starttimemin + "' />";
- tr.appendChild(td);
-
- td = d.createElement("td");
- td.innerHTML="<input type='text' readonly class='vexpl' name='stoptime" + schCounter + "' id='stoptime" + schCounter + "' style=' word-wrap:break-word; width:100%; border:0px solid;' value='" + stoptimehour + ":" + stoptimemin + "' />";
- tr.appendChild(td);
-
- td = d.createElement("td");
- td.innerHTML="<input type='text' readonly class='vexpl' name='timedescr" + schCounter + "' id='timedescr" + schCounter + "' style=' word-wrap:break-word; width:100%; border:0px solid;' value='" + tempdescr + "' />";
- tr.appendChild(td);
-
- td = d.createElement("td");
- td.innerHTML = "<a onclick='editRow(\"" + tempTime + "\",this); return false;' href='#'><img border='0' src='/themes/" + theme + "/images/icons/icon_e.gif' alt='edit' /></\a>";
- tr.appendChild(td);
-
- td = d.createElement("td");
- td.innerHTML = "<a onclick='removeRow(this); return false;' href='#'><img border='0' src='/themes/" + theme + "/images/icons/icon_x.gif' alt='remove' /></\a>";
- tr.appendChild(td);
-
- td = d.createElement("td");
- td.innerHTML="<input type='hidden' id='schedule" + schCounter + "' name='schedule" + schCounter + "' value='" + tempID + "' />";
- tr.appendChild(td);
- tbody.appendChild(tr);
-
- schCounter++;
-
- //reset calendar and time and descr
- clearCalendar();
- clearTime();
- clearDescr();
-}
-
-
-function clearCalendar() {
+function clearCalendar(){
var tempstr, daycell = "";
//clear days selected
daysSelected = "";
//loop through all 52 weeks
- for (j=1; j<=53; j++) {
+ for (j=1; j<=53; j++)
+ {
//loop through all 7 days
- for (k=1; k<8; k++) {
+ for (k=1; k<8; k++){
tempstr = 'w' + j + 'p' + k;
daycell = eval('document.getElementById(tempstr)');
- if (daycell != null) {
- daycell.style.backgroundColor = "#FFFFFF"; // white
+ if (daycell != null){
+ daycell.style.backgroundColor = "#FFFFFF"; // white
}
}
}
}
-function clearTime() {
+function clearTime(){
document.getElementById("starttimehour").value = "0";
document.getElementById("starttimemin").value = "00";
document.getElementById("stoptimehour").value = "23";
document.getElementById("stoptimemin").value = "59";
}
-function clearDescr() {
+function clearDescr(){
document.getElementById("timerangedescr").value = "";
}
-function editRow(incTime, el) {
- var check = checkForRanges();
-
- if (check) {
-
- //reset calendar and time
- clearCalendar();
- clearTime();
+var counter = -1;
- var starttimehour, descr, days, tempstr, starttimemin, hours, stoptimehour, stoptimemin = "";
-
- tempArray = incTime.split ("||");
-
- days = tempArray[0];
- hours = tempArray[1];
- descr = tempArray[2];
-
- var tempdayArray = days.split(",");
- var temphourArray = hours.split("-");
- tempstr = temphourArray[0];
- var temphourArray2 = tempstr.split(":");
-
- document.getElementById("starttimehour").value = temphourArray2[0];
- document.getElementById("starttimemin").value = temphourArray2[1];
-
- tempstr = temphourArray[1];
- temphourArray2 = tempstr.split(":");
-
- document.getElementById("stoptimehour").value = temphourArray2[0];
- document.getElementById("stoptimemin").value = temphourArray2[1];
-
- document.getElementById("timerangedescr").value = descr;
-
- //toggle the appropriate days
- for (i = 0; i < tempdayArray.length; i++) {
- if (tempdayArray[i]) {
- var tempweekstr = tempdayArray[i];
- dashpos = tempweekstr.search("-");
-
- if (dashpos == "-1") {
- tempstr = "w2p" + tempdayArray[i];
- } else {
- tempstr = tempdayArray[i];
- }
- daytoggle(tempstr);
- }
- }
- removeRownoprompt(el);
- }
-}
+// Using an HTML template, build a time-range row and add it after the last row in the display
+function insertElements(tempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, tempdescr, tempTime, tempID) {
+ var rowhtml;
-function removeRownoprompt(el) {
- var cel;
- while (el && el.nodeName.toLowerCase() != "tr") {
- el = el.parentNode;
+ if(counter < 0) {
+ counter = <?php if(!isset($counter)) echo '0'; else echo $counter ?>;
+ rows_displayed = counter;
}
- if (el && el.parentNode) {
- cel = el.getElementsByTagName("td").item(0);
- el.parentNode.removeChild(el);
- }
-}
+ // Template for the schedule deifinition. '@' will be replaced with the row number using .replace()
+ rowhtml =
+ '<div class="form-group schedulegrp' + counter + '">' +
+ '<label for="tempFriendlyTime" class="col-sm-2 control-label"></label>' +
+ '<div class="col-sm-2">' +
+ '<input class="form-control" name="tempFriendlyTime" id="tempFriendlyTime" type="readonly" value="' + tempFriendlyTime + '"/>' +
+ '<span class="help-block">Day(s)</span>' +
+ '</div>' +
+ '<div class="col-sm-2">' +
+ '<input class="form-control" name="starttime@" id="starttime@" type="readonly" value="' + starttimehour + ':' + starttimemin + '"/>' +
+ '<span class="help-block">Start time</span>' +
+ '</div>' +
+ '<div class="col-sm-2">' +
+ '<input class="form-control" name="stoptime@" id="stoptime@" type="readonly" value="' + stoptimehour + ':' + stoptimemin + '"/>' +
+ '<span class="help-block">Stop time</span>' +
+ '</div>' +
+ '<div class="col-sm-2">' +
+ '<input class="form-control" name="timedescr@" id="timedescr@" type="readonly" value="' + tempdescr + '"/>' +
+ '<span class="help-block">Description</span>' +
+ '</div>' +
+ '<div class="col-sm-2">' +
+ '<input class="form-control" name="schedule@" id="schedule@" type="hidden" value="' + tempID + '"/>' +
+ '</div>' +
+ '<div class="col-sm-2">' +
+ '<a class="btn btn-xs btn-warning" name="delete@" id="delete@" type="button" value="@">Delete</a>' +
+ '</div>' +
+ '</div>';
+
+ $('.help-block').hide();
+
+ var node = $('.noranges').parent().parent();
+ $(rowhtml.replace(/@/g, counter)).insertBefore(node);
+
+ $('[id^=delete]').click(function(event) {
+ delete_row(event.target.id.slice(6));
+ });
+
+ counter++;
+ schCounter++;
-function removeRow(el) {
- var check = confirm ("Do you really want to delete this time range?");
- if (check) {
- var cel;
- while (el && el.nodeName.toLowerCase() != "tr") {
- el = el.parentNode;
- }
+ //reset calendar and time and descr
+ clearCalendar();
+ clearTime();
+ clearDescr();
+}
- if (el && el.parentNode) {
- cel = el.getElementsByTagName("td").item(0);
- el.parentNode.removeChild(el);
- }
- }
+// If only everything were this simple
+function delete_row(row) {
+ $('.schedulegrp' + row).remove();
}
//]]>
</script>
-EOD;
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-
-
-<?php include("fbegin.inc"); echo $jscriptstr; ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<div id="inputerrors"></div>
-
-<form action="firewall_schedule_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall schedule">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Schedule information");?></td>
- </tr>
- <tr>
- <td>
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="15%" valign="top" class="vncellreq"><?=gettext("Schedule Name");?></td>
- <td width="85%" class="vtable">
- <?php if (is_schedule_inuse($pconfig['name']) == true): ?>
- <input name="name" type="hidden" id="name" size="40" value="<?=htmlspecialchars($pconfig['name']);?>" />
- <?php echo $pconfig['name']; ?>
- <p>
- <span class="vexpl"><?=gettext("NOTE: This schedule is in use so the name may not be modified!");?></span>
- </p>
- <?php else: ?>
- <input name="name" type="text" id="name" size="40" maxlength="40" class="formfld unknown" value="<?=htmlspecialchars($pconfig['name']);?>" /><br />
- <span class="vexpl">
- <?=gettext("The name of the alias may only consist of the characters a-z, A-Z and 0-9");?>
- </span>
- <?php endif; ?>
- </td>
- </tr>
- <tr>
- <td width="15%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="85%" class="vtable"><input name="descr" type="text" id="descr" size="40" maxlength="40" class="formfld unknown" value="<?=htmlspecialchars($pconfig['descr']);?>" /><br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed).");?>
- </span>
- </td>
- </tr>
- <!-- tr>
- </tr -->
- <tr>
- <td width="15%" valign="top" class="vncellreq"><?=gettext("Month");?></td>
- <td width="85%" class="vtable">
- <select name="monthsel" class="formselect" id="monthsel" onchange="update_month();">
- <?php
- $monthcounter = date("n");
- $monthlimit = $monthcounter + 12;
- $yearcounter = date("Y");
- for ($k = 0; $k < 12; $k++) {?>
- <option value="<?php echo $monthcounter;?>"><?php echo date("F_y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?></option>
- <?php
- if ($monthcounter == 12) {
- $monthcounter = 1;
- $yearcounter++;
- } else {
- $monthcounter++;
- }
- } ?>
- </select>
- <br /><br />
- <?php
- $firstmonth = TRUE;
- $monthcounter = date("n");
- $yearcounter = date("Y");
- for ($k = 0; $k < 12; $k++) {
- $firstdayofmonth = date("w", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));
- if ($firstdayofmonth == 0) {
- $firstdayofmonth = 7;
- }
-
- $daycounter = 1;
- //number of day in month
- $numberofdays = date("t", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));
- $firstdayprinted = FALSE;
- $lasttr = FALSE;
- $positioncounter = 1;//7 for Sun, 1 for Mon, 2 for Tues, etc
- ?>
- <div id="<?php echo date("F_y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?>" style=" position:relative; display:<?php if ($firstmonth)echo "block";else echo "none";?>">
- <table border="1" cellspacing="1" cellpadding="1" id="calTable<?=$monthcounter . $yearcounter;?>" class="tabcont" summary="month">
- <tr>
- <td colspan="7" align="center" class="listbg"><b><?php echo date("F_Y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?></b></td>
- </tr>
- <tr>
- <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p1');"><u><b><?=gettext("Mon");?></b></u></td>
- <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p2');"><u><b><?=gettext("Tue");?></b></u></td>
- <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p3');"><u><b><?=gettext("Wed");?></b></u></td>
- <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p4');"><u><b><?=gettext("Thu");?></b></u></td>
- <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p5');"><u><b><?=gettext("Fri");?></b></u></td>
- <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p6');"><u><b><?=gettext("Sat");?></b></u></td>
- <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p7');"><u><b><?=gettext("Sun");?></b></u></td>
- </tr>
- <?php
- $firstmonth = FALSE;
- while ($daycounter<=$numberofdays) {
- $weekcounter = date("W", mktime(0, 0, 0, date($monthcounter), date($daycounter), date($yearcounter)));
- $weekcounter = ltrim($weekcounter, "0");
- if ($positioncounter == 1) {
- echo "<tr>";
- }
- if ($firstdayofmonth == $positioncounter) {
- ?>
- <td align="center" style="cursor: pointer;" class="listr" id="w<?=$weekcounter;?>p<?=$positioncounter;?>" onclick="daytoggle('w<?=$weekcounter;?>p<?=$positioncounter;?>-m<?=$monthcounter;?>d<?=$daycounter;?>');">
- <?php
- echo $daycounter;
- $daycounter++;
- $firstdayprinted = TRUE;
- echo "</td>";
- } elseif ($firstdayprinted == TRUE && $daycounter <= $numberofdays) {
- ?>
- <td align="center" style="cursor: pointer;" class="listr" id="w<?=$weekcounter;?>p<?=$positioncounter;?>" onclick="daytoggle('w<?=$weekcounter;?>p<?=$positioncounter;?>-m<?=$monthcounter;?>d<?=$daycounter;?>');">
- <?php
- echo $daycounter;
- $daycounter++;
- echo "</td>";
- } else {
- echo "<td align=\"center\" class=\"listr\"></td>";
- }
-
- if ($positioncounter == 7 || $daycounter > $numberofdays) {
- $positioncounter = 1;
- echo "</tr>";
- } else {
- $positioncounter++;
- }
-
- } //end while loop
- ?>
- </table>
- </div>
- <?php
- if ($monthcounter == 12) {
- $monthcounter = 1;
- $yearcounter++;
- } else {
- $monthcounter++;
- }
- } //end for loop
- ?>
- <br />
- <?=gettext("Click individual date to select that date only. Click the appropriate weekday Header to select all occurrences of that weekday.");?>
- </td>
- </tr>
- <tr>
- <td width="15%" valign="top" class="vncellreq"><?=gettext("Time");?></td>
- <td width="85%" class="vtable">
- <table cellspacing="2" class="tabcont" summary="time">
- <tr>
- <td class="listhdrr" align="center"><?=gettext("Start Time");?></td><td></td><td class="listhdrr" align="center"><?=gettext("Stop Time");?></td>
- </tr>
- <tr>
- <td>
- <select name="starttimehour" class="formselect" id="starttimehour">
- <?php
- for ($i = 0; $i < 24; $i++) {
- echo "<option value=\"$i\">";
- echo $i;
- echo "</option>";
- }
- ?>
- </select>&nbsp;<?=gettext("Hr"); ?>&nbsp;&nbsp;
- <select name="starttimemin" class="formselect" id="starttimemin">
- <option value="00">00</option>
- <option value="15">15</option>
- <option value="30">30</option>
- <option value="45">45</option>
- <option value="59">59</option>
- </select>&nbsp;<?=gettext("Min"); ?>
- </td>
- <td></td>
- <td>
- <select name="stoptimehour" class="formselect" id="stoptimehour">
- <?php
- for ($i = 0; $i < 24; $i++) {
- if ($i == 23) {
- $selected = "selected=\"selected\"";
- } else {
- $selected = "";
- }
-
- echo "<option value=\"$i\" $selected>";
- echo $i;
- echo "</option>";
- }
- ?>
- </select>&nbsp;<?=gettext("Hr");?>&nbsp;&nbsp;
- <select name="stoptimemin" class="formselect" id="stoptimemin">
- <option value="00">00</option>
- <option value="15">15</option>
- <option value="30">30</option>
- <option value="45">45</option>
- <option value="59" selected="selected">59</option>
- </select>&nbsp;<?=gettext("Min");?>
- </td>
- </tr>
- </table>
- <br />
- <?=gettext("Select the time range for the day(s) selected on the Month(s) above. A full day is 0:00-23:59.")?>
- </td>
- </tr>
- <tr>
- <td width="15%" valign="top" class="vncell"><?=gettext("Time Range Description")?></td>
- <td width="85%" class="vtable"><input name="timerangedescr" type="text" class="formfld unknown" id="timerangedescr" size="40" maxlength="40" /><br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed).")?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="button" value="<?=gettext("Add Time");?>" class="formbtn" onclick="javascript:processEntries();" />&nbsp;&nbsp;&nbsp;
- <input type="button" value="<?=gettext("Clear Selection");?>" class="formbtn" onclick="javascript:clearCalendar(); clearTime(); clearDescr();" />
- </td>
- </tr>
- <tr>
- <td width="15%" valign="top" class="vtable"></td>
- <td width="85%" class="vtable"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Schedule repeat");?></td>
- </tr>
- <tr>
- <td width="15%" valign="top" class="vncellreq"><?=gettext("Configured Ranges");?></td>
- <td width="85%">
- <table id="scheduletable" summary="range">
- <tbody>
- <tr>
- <td align="center" class="listbg" width="35%"><?=gettext("Day(s)");?></td>
- <td align="center" class="listbg" width="12%"><?=gettext("Start Time");?></td>
- <td align="center" class="listbg" width="11%"><?=gettext("Stop Time");?></td>
- <td align="center" class="listbg" width="42%"><?=gettext("Description");?></td>
- </tr>
- <?php
- if ($getSchedule) {
- $counter = 0;
-
- foreach ($pconfig['timerange'] as $timerange) {
- $tempFriendlyTime = "";
- $tempID = "";
- if ($timerange) {
- $dayFriendly = "";
- $tempFriendlyTime = "";
- $timedescr = $timerange['rangedescr'];
-
- //get hours
- $temptimerange = $timerange['hour'];
- $temptimeseparator = strrpos($temptimerange, "-");
-
- $starttime = substr ($temptimerange, 0, $temptimeseparator);
- $stoptime = substr ($temptimerange, $temptimeseparator+1);
- $currentDay = "";
- $firstDay = "";
- $nextDay = "";
- $foundEnd = false;
- $firstDayFound = false;
- $firstPrint = false;
- $firstprint2 = false;
-
- if ($timerange['month']) {
- $tempmontharray = explode(",", $timerange['month']);
- $tempdayarray = explode(",", $timerange['day']);
- $arraycounter = 0;
- foreach ($tempmontharray as $monthtmp) {
- $month = $tempmontharray[$arraycounter];
- $day = $tempdayarray[$arraycounter];
- $daypos = date("w", mktime(0, 0, 0, date($month), date($day), date("Y")));
- //if sunday, set position to 7 to get correct week number. This is due to php limitations on ISO-8601. When we move to php5.1 we can change this.
- if ($daypos == 0) {
- $daypos = 7;
- }
- $weeknumber = date("W", mktime(0, 0, 0, date($month), date($day), date("Y")));
- $weeknumber = ltrim($weeknumber, "0");
-
- if ($firstPrint) {
- $tempID .= ",";
- }
- $tempID .= "w" . $weeknumber . "p" . $daypos . "-m" . $month . "d" . $day;
- $firstPrint = true;
-
- if (!$firstDayFound) {
- $firstDay = $day;
- $firstmonth = $month;
- $firstDayFound = true;
- }
-
- $currentDay = $day;
- $nextDay = $tempdayarray[$arraycounter+1];
- $currentDay++;
- if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])) {
- if ($firstprint2) {
- $tempFriendlyTime .= ", ";
- }
- $currentDay--;
- if ($currentDay != $firstDay) {
- $tempFriendlyTime .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ;
- } else {
- $tempFriendlyTime .= $monthArray[$month-1] . " " . $day;
- }
- $firstDayFound = false;
- $firstprint2 = true;
- }
- $arraycounter++;
- }
- } else {
- $dayFriendly = $timerange['position'];
- $tempID = $dayFriendly;
- }
-
- $tempTime = $tempID . "||" . $starttime . "-" . $stoptime . "||" . $timedescr;
-
- //following code makes the days friendly appearing, IE instead of Mon, Tues, Wed it will show Mon - Wed
- $foundEnd = false;
- $firstDayFound = false;
- $firstprint = false;
- $tempFriendlyDayArray = explode(",", $dayFriendly);
- $currentDay = "";
- $firstDay = "";
- $nextDay = "";
- $i = 0;
- if (!$timerange['month']) {
- foreach ($tempFriendlyDayArray as $day) {
- if ($day != "") {
- if (!$firstDayFound) {
- $firstDay = $tempFriendlyDayArray[$i];
- $firstDayFound = true;
- }
- $currentDay =$tempFriendlyDayArray[$i];
- //get next day
- $nextDay = $tempFriendlyDayArray[$i+1];
- $currentDay++;
- if ($currentDay != $nextDay) {
- if ($firstprint) {
- $tempFriendlyTime .= ", ";
- }
- $currentDay--;
- if ($currentDay != $firstDay) {
- $tempFriendlyTime .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1];
- } else {
- $tempFriendlyTime .= $dayArray[$firstDay-1];
- }
- $firstDayFound = false;
- $firstprint = true;
- }
- $i++;
- }
- }
- }
- ?>
- <tr>
- <td>
- <span class="vexpl"><?php echo $tempFriendlyTime; ?></span>
- </td>
- <td>
- <input type='text' readonly='readonly' class='vexpl' name='starttime<?php echo $counter; ?>' id='starttime<?php echo $counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?php echo $starttime; ?>' />
- </td>
- <td>
- <input type='text' readonly='readonly' class='vexpl' name='stoptime<?php echo $counter; ?>' id='stoptime<?php echo $counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?php echo $stoptime; ?>' />
- </td>
- <td>
- <input type='text' readonly='readonly' class='vexpl' name='timedescr<?php echo $counter; ?>' id='timedescr<?php echo $counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?php echo $timedescr; ?>' />
- </td>
- <td>
- <a onclick='editRow("<?php echo $tempTime; ?>",this); return false;' href='#'><img border='0' src='/themes/<?php echo $g['theme']; ?>/images/icons/icon_e.gif' alt='edit' /></a>
- </td>
- <td>
- <a onclick='removeRow(this); return false;' href='#'><img border='0' src='/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif' alt='remove' /></a>
- </td>
- <td>
- <input type='hidden' id='schedule<?php echo $counter; ?>' name='schedule<?php echo $counter; ?>' value='<?php echo $tempID; ?>' />
- </td>
- </tr>
- <?php
- $counter++;
- }//end if
- } // end foreach
- }//end if
- ?>
- </tbody>
- </table>
- </td>
- </tr>
- <tr>
- <td width="15%" valign="top">&nbsp;</td>
- <td width="85%">
- <input id="submit" name="submit" type="submit" onclick="return checkForRanges();" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_schedules[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_shaper.php b/src/usr/local/www/firewall_shaper.php
index 7b8f489..5050f9a 100644
--- a/src/usr/local/www/firewall_shaper.php
+++ b/src/usr/local/www/firewall_shaper.php
@@ -2,35 +2,62 @@
/* $Id$ */
/*
firewall_shaper.php
- Copyright (C) 2004, 2005 Scott Ullrich
- Copyright (C) 2008 Ermal Luçi
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ * Copyright (c) 2008 Ermal Luçi
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/bin/killall
- pfSense_MODULE: shaper
+ pfSense_MODULE: shaper
*/
##|+PRIV
@@ -40,13 +67,15 @@
##|*MATCH=firewall_shaper.php*
##|-PRIV
+require('classes/Form.class.php');
+
require("guiconfig.inc");
require_once("functions.inc");
require_once("filter.inc");
require_once("shaper.inc");
require_once("rrd.inc");
-if ($_GET['reset'] <> "") {
+if($_GET['reset'] != "") {
/* XXX: Huh, why are we killing php? */
mwexec("killall -9 pfctl php");
exit;
@@ -73,6 +102,7 @@ if ($_GET) {
$action = htmlspecialchars($_GET['action']);
}
}
+
if ($_POST) {
if ($_POST['name']) {
$qname = htmlspecialchars(trim($_POST['name']));
@@ -87,6 +117,7 @@ if ($_POST) {
if ($interface) {
$altq = $altq_list_queues[$interface];
+
if ($altq) {
$queue =& $altq->find_queue($interface, $qname);
} else {
@@ -97,6 +128,7 @@ if ($interface) {
$dontshow = false;
$newqueue = false;
$output_form = "";
+$dfltmsg = false;
if ($_GET) {
switch ($action) {
@@ -107,6 +139,7 @@ if ($_GET) {
mark_subsystem_dirty('shaper');
}
}
+
header("Location: firewall_shaper.php");
exit;
break;
@@ -130,6 +163,7 @@ if ($_GET) {
unset($config['filter']['rule'][$key]);
}
}
+
if (write_config()) {
$retval = 0;
$retval |= filter_configure();
@@ -143,41 +177,43 @@ if ($_GET) {
} else {
$savemsg = gettext("Unable to write config.xml (Access Denied?)");
}
- $output_form = $default_shaper_message;
- break;
- case "add":
+ $dfltmsg = true;
+
+
+ break;
+
+ case "add":
/* XXX: Find better way because we shouldn't know about this */
- if ($altq) {
- switch ($altq->GetScheduler()) {
- case "PRIQ":
- $q = new priq_queue();
- break;
- case "FAIRQ":
- $q = new fairq_queue();
- break;
- case "HFSC":
- $q = new hfsc_queue();
- break;
- case "CBQ":
+ if ($altq) {
+
+ switch ($altq->GetScheduler()) {
+ case "PRIQ":
+ $q = new priq_queue();
+ break;
+ case "FAIRQ":
+ $q = new fairq_queue();
+ break;
+ case "HFSC":
+ $q = new hfsc_queue();
+ break;
+ case "CBQ":
$q = new cbq_queue();
- break;
- default:
- /* XXX: Happens when sched == NONE?! */
- $q = new altq_root_queue();
- break;
- }
- } else if ($addnewaltq) {
- $q = new altq_root_queue();
- } else {
+ break;
+ default:
+ /* XXX: Happens when sched==NONE?! */
+ $q = new altq_root_queue();
+ break;
+ }
+ } else if ($addnewaltq) {
+ $q = new altq_root_queue();
+ } else {
$input_errors[] = gettext("Could not create new queue/discipline!");
}
if ($q) {
$q->SetInterface($interface);
- $output_form .= $q->build_form();
- $output_form .= "<input type=\"hidden\" name=\"parentqueue\" id=\"parentqueue\"";
- $output_form .= " value=\"".htmlspecialchars($qname)."\" />";
+ $sform = $q->build_form();
$newjavascript = $q->build_javascript();
unset($q);
$newqueue = true;
@@ -185,11 +221,12 @@ if ($_GET) {
break;
case "show":
if ($queue) {
- $output_form .= $queue->build_form();
- } else {
- $input_errors[] = gettext("Queue not found!");
+ $sform = $queue->build_form();
+ //$output_form .= $queue->build_form();
}
- break;
+ else
+ $input_errors[] = gettext("Queue not found!");
+ break;
case "enable":
if ($queue) {
$queue->SetEnabled("on");
@@ -213,11 +250,13 @@ if ($_GET) {
}
break;
default:
- $output_form .= $default_shaper_msg;
+ $dfltmsg = true;
$dontshow = true;
break;
}
-} else if ($_POST) {
+}
+
+if ($_POST) {
unset($input_errors);
if ($addnewaltq) {
@@ -225,23 +264,24 @@ if ($_GET) {
$altq->SetInterface($interface);
switch ($altq->GetBwscale()) {
- case "Mb":
- $factor = 1000 * 1000;
- brak;
- case "Kb":
- $factor = 1000;
- break;
- case "b":
- $factor = 1;
- break;
- case "Gb":
- $factor = 1000 * 1000 * 1000;
- break;
- case "%": /* We don't use it for root_XXX queues. */
- default: /* XXX assume Kb by default. */
- $factor = 1000;
- break;
- }
+ case "Mb":
+ $factor = 1000 * 1000;
+ break;
+ case "Kb":
+ $factor = 1000;
+ break;
+ case "b":
+ $factor = 1;
+ break;
+ case "Gb":
+ $factor = 1000 * 1000 * 1000;
+ break;
+ case "%": /* We don't use it for root_XXX queues. */
+ default: /* XXX assume Kb by default. */
+ $factor = 1000;
+ break;
+ }
+
$altq->SetAvailableBandwidth($altq->GetBandwidth() * $factor);
$altq->ReadConfig($_POST);
$altq->validate_input($_POST, $input_errors);
@@ -256,6 +296,7 @@ if ($_GET) {
$can_enable = true;
$can_add = true;
}
+
read_altq_config();
$output_form .= $altq->build_form();
@@ -334,13 +375,15 @@ if ($_GET) {
}
read_altq_config();
$output_form .= $queue->build_form();
- } else {
- $output_form .= $default_shaper_msg;
+ } else {
+ $dfltmsg = true;
$dontshow = true;
}
mwexec("killall qstats");
-} else {
- $output_form .= $default_shaper_msg;
+}
+
+if(!$_POST && !$_GET){
+ $dfltmsg = true;
$dontshow = true;
}
@@ -361,126 +404,106 @@ if ($queue) {
}
}
-$tree = "<ul class=\"tree\" >";
+//$pgtitle = "Firewall: Shaper: By Interface View";
+$closehead = false;
+include("head.inc");
+
+$tree = '<ul class="tree" >';
if (is_array($altq_list_queues)) {
foreach ($altq_list_queues as $tmpaltq) {
$tree .= $tmpaltq->build_tree();
}
$tree .= get_interface_list_to_show();
}
+
$tree .= "</ul>";
-if (!$dontshow || $newqueue) {
+if ($queue)
+ print($queue->build_javascript());
- $output_form .= "<tr><td width=\"22%\" valign=\"middle\" class=\"vncellreq\">";
- $output_form .= "<br />" . gettext("Queue Actions") . "<br />";
- $output_form .= "</td><td valign=\"middle\" class=\"vncellreq\" width=\"78%\"><br />";
+print($newjavascript);
- $output_form .= "<input type=\"submit\" name=\"Submit\" value=\"" . gettext("Save") . "\" class=\"formbtn\" />";
- if ($can_add || $addnewaltq) {
- $output_form .= "<a href=\"firewall_shaper.php?interface=";
- $output_form .= $interface;
- if ($queue) {
- $output_form .= "&amp;queue=" . $queue->GetQname();
- }
- $output_form .= "&amp;action=add\">";
- $output_form .= "<input type=\"button\" class=\"formbtn\" name=\"add\" value=\"" . gettext("Add new queue") . "\" />";
- $output_form .= "</a>";
- }
- $output_form .= "<a href=\"firewall_shaper.php?interface=";
- $output_form .= $interface . "&amp;queue=";
- if ($queue) {
- $output_form .= "&amp;queue=" . $queue->GetQname();
- }
- $output_form .= "&amp;action=delete\">";
- $output_form .= "<input type=\"button\" class=\"formbtn\" name=\"delete\"";
- if ($queue) {
- $output_form .= " value=\"" . gettext("Delete this queue") . "\" />";
- } else {
- $output_form .= " value=\"" . gettext("Disable shaper on interface") . "\" />";
- }
- $output_form .= "</a>";
- $output_form .= "<br /></td></tr>";
- $output_form .= "</table>";
-} else {
- $output_form .= "</table>";
-}
+if ($input_errors)
+ print_input_errors($input_errors);
-$output = "<table summary=\"output form\">";
-$output .= $output_form;
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('shaper'))
+ print_info_box_np(gettext("The traffic shaper configuration has been changed. You must apply the changes in order for them to take effect."));
+
+$tab_array = array();
+$tab_array[] = array(gettext("By Interface"), true, "firewall_shaper.php");
+$tab_array[] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
+$tab_array[] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
+$tab_array[] = array(gettext("Layer7"), false, "firewall_shaper_layer7.php");
+$tab_array[] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
+display_top_tabs($tab_array);
-//$pgtitle = "Firewall: Shaper: By Interface View";
-$closehead = false;
-include("head.inc");
?>
<link rel="stylesheet" type="text/css" media="all" href="./tree/tree.css" />
<script type="text/javascript" src="./tree/tree.js"></script>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" >
+<div class="table-responsive">
+ <table class="table">
+ <tbody>
+ <tr class="tabcont">
+ <td class="col-md-1">
<?php
-if ($queue) {
- echo $queue->build_javascript();
-}
-echo $newjavascript;
+// Display the shaper tree
+print($tree);
-include("fbegin.inc");
+if (count($altq_list_queues) > 0) {
?>
-<div id="inputerrors"></div>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
+ <a href="firewall_shaper.php?action=resetall" class="btn btn-sm btn-danger"/>
+ <?=gettext('Remove Shaper')?>
+ </a>
+<?php
+}
+?>
+ </td>
+ <td>
+<?php
-<form action="firewall_shaper.php" method="post" id="iform" name="iform">
+if($dfltmsg)
+ print_info_box($default_shaper_msg);
+else {
+ // Add global buttons
+ if (!$dontshow || $newqueue) {
+ if ($can_add || $addnewaltq) {
+ if($queue)
+ $url = 'firewall_shaper.php?interface='. $interface . '&queue=' . $queue->GetQname() . '&action=add';
+ else
+ $url = 'firewall_shaper.php?interface='. $interface . '&action=add';
+
+ $sform->addGlobal(new Form_Button(
+ 'add',
+ 'Add new Queue',
+ $url
+ ))->removeClass('btn-default')->addClass('btn-success');
+ }
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('shaper')): ?><p>
-<?php print_info_box_np(gettext("The traffic shaper configuration has been changed.")."<br />".gettext("You must apply the changes in order for them to take effect."));?><br /></p>
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="traffic shaper">
- <tr><td>
-<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("By Interface"), true, "firewall_shaper.php");
- $tab_array[1] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
- $tab_array[2] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
- $tab_array[3] = array(gettext("Layer7"), false, "firewall_shaper_layer7.php");
- $tab_array[4] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
- display_top_tabs($tab_array);
+ if($queue)
+ $url = 'firewall_shaper.php?interface='. $interface . '&queue=' . $queue->GetQname() . '&action=delete';
+ else
+ $url = 'firewall_shaper.php?interface='. $interface . '&action=delete';
+
+ $sform->addGlobal(new Form_Button(
+ 'delete',
+ $queue ? 'Delete this queue':'Disable shaper on interface',
+ $url
+ ))->removeClass('btn-default')->addClass('btn-danger');
+ }
+
+ // Print the form
+ print($sform);
+}
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
-<?php if (count($altq_list_queues) > 0): ?>
- <tr class="tabcont">
- <td width="25%" align="left">
- <a href="firewall_shaper.php?action=resetall" >
- <input type="button" value="<?=gettext("Remove Shaper")?>" class="formbtn" />
- </a>
- </td>
- <td width="75%"> </td>
- </tr>
-<?php endif; ?>
- <tr>
- <td width="25%" valign="top" align="left">
- <?php
- echo $tree;
- ?>
- </td>
- <td width="75%" valign="top" align="center">
- <div id="shaperarea" style="position:relative">
- <?php
- echo $output;
- ?>
- </div>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+<?php
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_shaper_layer7.php b/src/usr/local/www/firewall_shaper_layer7.php
index 9a72233..db350bd 100644
--- a/src/usr/local/www/firewall_shaper_layer7.php
+++ b/src/usr/local/www/firewall_shaper_layer7.php
@@ -2,34 +2,61 @@
/* $Id$ */
/*
firewall_shaper_layer7.php
- Copyright (C) 2008 Helder Pereira, André Ribeiro
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2008 Helder Pereira, André Ribeiro
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/bin/killall
- pfSense_MODULE: shaper
+ pfSense_MODULE: shaper
*/
##|+PRIV
@@ -40,10 +67,13 @@
##|-PRIV
require("guiconfig.inc");
+require('classes/Form.class.php');
require_once("functions.inc");
require_once("filter.inc");
require_once("shaper.inc");
+$dfltmsg = false;
+
// Variables protocols (dynamic) and structures (static)
$avail_protos =& generate_protocols_array();
$avail_structures = array("action", "queue", "limiter");
@@ -60,16 +90,15 @@ $show_proto_form = false;
$pgtitle = array(gettext("Firewall"), gettext("Traffic Shaper"), gettext("Layer7"));
$shortcut_section = "trafficshaper";
-$output_form = "";
-
-$default_layer7shaper_msg = "<tr><td colspan=\"4\">";
-$default_layer7shaper_msg .= "<span class=\"vexpl\"><span class=\"red\"><strong>" . gettext("Note") . ":<br />";
-$default_layer7shaper_msg .= "</strong></span>" . gettext("You can add new layer7 protocol patterns by simply uploading the file") . " <a href=\"diag_patterns.php\">" . gettext("here") . ".</a></span><br />";
-$default_layer7shaper_msg .= "</td></tr>";
+$default_layer7shaper_msg = '<br />' .
+ gettext('You can add new layer7 protocol patterns by simply uploading the file') .
+ ' <a href="diag_patterns.php">' . gettext('here') . '</a>';
read_layer7_config();
-if ($_GET['reset'] <> "") {
+$sform = new Form(false);
+
+if($_GET['reset'] != "") {
// kill all ipfw-classifyd processes
mwexec("killall -9 ipfw-classifyd");
exit;
@@ -100,30 +129,34 @@ if ($_GET) {
case "add":
$show_proto_form = true;
$container = new layer7();
- $output_form .= $container->build_form(); //constructs the graphical interface on the right side
+ $sform = $container->build_form(); //constructs the graphical interface on the right side
unset($container);
- break;
+ break;
case "show":
$show_proto_form = true;
- if ($container) {
- $output_form .= $container->build_form();
- } else {
+ if($container) {
+ $sform = $container->build_form();
+ }
+ else {
$show_proto_form = false;
$input_errors[] = gettext("Layer7 Rules Container not found!");
}
- break;
+ break;
default:
echo log_error("Get default");
$show_proto_form = false;
- $output_form .= $dn_default_shaper_msg . $default_layer7shaper_msg;
- break;
+ $dfltmsg = true;
+ break;
}
-} else if ($_POST) {
- //add a new l7rules container
+}
+
+//add a new l7rules container
+if ($_POST) {
$show_proto_form = true;
unset($input_errors);
- if ($_POST['submit']) {
+ if($_POST['Submit']) {
+
if (isset($layer7_rules_list[$name])) {
$l7r = $layer7_rules_list[$name];
$_POST['divert_port'] = $l7r->GetRPort();
@@ -148,6 +181,7 @@ if ($_GET) {
$dupes[] = $_POST['protocol'][$j];
}
}
+
unset($non_dupes);
if (sizeof($dupes) == 0 && !$input_errors) {
$l7r->wconfig();
@@ -165,11 +199,12 @@ if ($_GET) {
$input_errors[] .= $dupe_error;
}
}
+
unset($dupes);
unset($dupe_error);
//Even if there are repeated protocols, we won't lose any previous values
//The user will be able to solve the situation
- $output_form .= $l7r->build_form();
+ $sform = $l7r->build_form();
//Necessary to correctly build the proto form
$container = $layer7_rules_list[$name];
if ($input_errors) {
@@ -190,11 +225,11 @@ if ($_GET) {
clear_subsystem_dirty('shaper');
- if ($container) {
- $output_form .= $container->build_form();
+ if($container) {
+ $sform = $container->build_form();
} else {
$show_proto_form = false;
- $output_form .= $dn_default_shaper_msg . $default_layer7shaper_msg;
+ $dfltmsg = true;
}
} else if ($_POST['delete']) {
$container->delete_l7c();
@@ -208,9 +243,11 @@ if ($_GET) {
} else {
$show_proto_form = false;
}
-} else {
+}
+
+if(!$_GET && !$_POST) {
$show_proto_form = false;
- $output_form .= $dn_default_shaper_msg . $default_layer7shaper_msg;
+ $dfltmsg = true;
}
// Builds the left tree
@@ -220,10 +257,12 @@ if (is_array($layer7_rules_list)) {
$tree .= $tmpl7->build_tree();
}
}
+
$tree .= "</ul>";
-$closehead = false;
+
include("head.inc");
?>
+
<link rel="stylesheet" type="text/css" media="all" href="./tree/tree.css" />
<script type="text/javascript" src="./tree/tree.js"></script>
@@ -243,14 +282,12 @@ js_behaviours_limiter = array_limiter(js_behaviours_limiter);
function array_altq(a_behav) {
var index;
- <?php
- if (!empty($avail_behaviours_altq)) {
- foreach ($avail_behaviours_altq as $key => $queue) { ?>
+ <?php if (!empty($avail_behaviours_altq)) {
+ foreach ($avail_behaviours_altq as $key => $queue) { ?>
name = "<?= $queue; ?>";
index = <?= $key; ?>;
a_behav[index] = name;
- <?php
- }
+ <?php }
} ?>
return a_behav;
}
@@ -271,7 +308,7 @@ function array_limiter(a_behav) {
/* Fill the variables with available protocols, structures and behaviours */
function fillProtocol() {
- var protocol = '<select name="protocol[]" style="font-size:8pt">';
+ var protocol = '<select class="form-control" name="protocol[]">';
var name;
<?php foreach ($avail_protos as $key => $proto) { ?>
@@ -284,22 +321,18 @@ function fillProtocol() {
}
function fillStructure() {
- var structure = '<select name="structure[]" style="font-size:8pt" onchange="changeBehaviourValues(this.parentNode.parentNode);">';
+ var structure = '<select class="form-control" name="structure[]" onchange="changeBehaviourValues(this.parentNode.parentNode);">';
var name;
<?php foreach ($avail_structures as $key => $struct) { ?>
name = "<?= $struct; ?>";
- if (name == "queue") {
- if (js_behaviours_altq != "") {
- structure += "<option value=" + name + ">" + name + "<\/option>";
- }
- } else {
- if (name == "limiter") {
- if (js_behaviours_limiter != "") {
- structure += "<option value=" + name + ">" + name + "<\/option>";
- }
- } else {
- structure += "<option value=" + name + ">" + name + "<\/option>"; //action
- }
+ if(name == "queue") {
+ if(js_behaviours_altq != "") { structure += "<option value=" + name + ">" + name + "<\/option>";}
+ }
+ else {
+ if(name == "limiter") {
+ if(js_behaviours_limiter != "") { structure += "<option value=" + name + ">" + name + "<\/option>";}
+ }
+ else structure += "<option value=" + name + ">" + name + "<\/option>"; //action
}
<?php } ?>
structure += "<\/select>";
@@ -309,7 +342,7 @@ function fillStructure() {
//Used by default to fill the values when inserting a new row.
function fillBehaviour() {
- var behaviour = '<select name="behaviour[]" style="width:80px; font-size:8pt">';
+ var behaviour = '<select class="form-control" name="behaviour[]">';
var name;
<?php foreach ($avail_behaviours_action as $key => $behav) { ?>
name = "<?= $behav; ?>";
@@ -322,11 +355,13 @@ function fillBehaviour() {
/* Change the values on behaviours select when changing the structure row */
function changeBehaviourValues(row) {
- var selectedRow = row.rowIndex - 2; //because row.rowIndex returns 2, not 0
+
+ var selectedRow = row.rowIndex - 1; // The header is counted as the first row
var structureSelected = document.getElementsByName("structure[]")[selectedRow].value;
//Select the behaviours values to array a_behav
var a_behav = new Array();
+
if (structureSelected == "action") {
a_behav = js_behaviours_action; //static
} else {
@@ -337,6 +372,7 @@ function changeBehaviourValues(row) {
}
}
+
//Build the html statement with the array values previously selected
var new_behav;
var name;
@@ -349,18 +385,19 @@ function changeBehaviourValues(row) {
/* Add row to the table */
function addRow(table_id) {
- var tbl = document.getElementById(table_id);
- // counting rows in table
- var rows_count = tbl.rows.length;
- if (initial_count[table_id] == undefined) {
- // if it is first adding in this table setting initial rows count
- initial_count[table_id] = rows_count;
- }
- // determining real count of added fields
- var tFielsNum = rows_count - initial_count[table_id];
- if (rows_limit != 0 && tFielsNum >= rows_limit) return false;
+ var tbl = document.getElementById(table_id);
+
+ // counting rows in table
+ var rows_count = tbl.rows.length;
+ if (initial_count[table_id] == undefined) {
+ // if it is first adding in this table setting initial rows count
+ initial_count[table_id] = rows_count;
+ }
+ // determining real count of added fields
+ var tFielsNum = rows_count - initial_count[table_id];
+ if (rows_limit!=0 && tFielsNum >= rows_limit) return false;
- var remove = '<a onclick="removeRow(\''+table_id+'\',this.parentNode.parentNode)" href="#"><img border="0" src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" alt="x" /><\/a>';
+ var remove = '<a class="btn btn-default" onclick="removeRow(\''+table_id+'\',this.parentNode.parentNode)">Remove<\/a>';
try {
var newRow = tbl.insertRow(rows_count);
@@ -390,195 +427,188 @@ function removeRow(tbl, row) {
}
//]]>
</script>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php
+// This function creates a table of rule selectors which are then inserted into the form
+// using a StaticText class. While not pretty this maintains compatibility with all of
+// the above javascript
+
+function build_l7table() {
+ global $container, $avail_protos, $avail_structures, $avail_behaviours_altq, $avail_behaviours_limiter,
+ $avail_behaviours_action;
+
+ $tbl = '<table id="newtbl" class="table table-hover table-condensed">'; // No stripes for this table
+ $tbl .= '<thead><tr><th>Protocol</th><th>Structure</th><th>Behavior</th></tr></thead>';
+ $tbl .= '<tbody>';
+
+ if($container) {
+ foreach($container->rsets as $l7rule) {
+
+ $tbl .= '<tr><td>';
+ $tbl .= '<select name="protocol[]" class="form-control">';
+
+ foreach($avail_protos as $proto):
+ $tbl .= '<option value="' . $proto . '"';
+
+ if ($proto == $l7rule->GetRProtocol())
+ $tbl .= ' selected="selected"';
+
+ $tbl .= '>' . $proto . '</option>';
+
+ endforeach;
+
+ $tbl .= '</select></td><td>';
+ $tbl .= '<select name="structure[]" class="form-control" onchange="changeBehaviourValues(this.parentNode.parentNode);">';
+
+ foreach($avail_structures as $struct) {
+ if($struct == "queue") {
+ if(!empty($avail_behaviours_altq)) {
+ $tbl .= '<option value="' . $struct . '"';
+ if ($struct == $l7rule->GetRStructure())
+ $tbl .= ' selected="selected"';
+
+ $tbl .= '>' . $struct . '</option>';
+ }
+ }
+ else {
+ if($struct == "limiter") {
+ if(!empty($avail_behaviours_limiter)) {
+ $tbl .= '<option value="' . $struct . '"';
+ if ($struct == $l7rule->GetRStructure())
+ $tbl .= ' selected="selected"';
+
+ $tbl .= '>' . $struct . '</option>';
+ }
+ }
+ else {
+ if($struct == "action") {
+ $tbl .= '<option value="' . $struct . '"';
+ if ($struct == $l7rule->GetRStructure())
+ $tbl .= ' selected="selected"';
+
+ $tbl .= '>' . $struct . '</option>';
+ }
+ }
+ }
+ }
+
+ $tbl .= '</select></td><td>';
+
+ $tbl .= '<select name="behaviour[]" class="form-control">';
-<?php include("fbegin.inc"); ?>
-<div id="inputerrors"></div>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
+ if($l7rule->GetRStructure() == "action"):
+ foreach($avail_behaviours_action as $behaviour):
+ $tbl .= '<option value="' . $behaviour . '"';
+ if ($behaviour == $l7rule->GetRBehaviour())
+ $tbl .= ' selected="selected"';
-<form action="firewall_shaper_layer7.php" method="post" id="iform" name="iform">
+ $tbl .= '>' . $behaviour . '</option>';
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('shaper')): ?><p>
-<?php print_info_box_np(gettext("The traffic shaper configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br /></p>
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="traffic shaper layer7">
- <tr><td>
+ endforeach;
+
+ $tbl .= '</select>';
+
+ endif;
+
+ if($l7rule->GetRStructure() == "queue"):
+ foreach($avail_behaviours_altq as $behaviour):
+
+ $tbl .= '<option value="' . $behaviour . '"';
+ if ($behaviour == $l7rule->GetRBehaviour())
+ $tbl .= ' selected="selected"';
+
+ $tbl .= '>' . $behaviour . '</option>';
+
+ endforeach;
+
+ $tbl .= '</select>';
+
+ endif;
+
+ if($l7rule->GetRStructure() == "limiter"):
+ foreach($avail_behaviours_limiter as $behaviour):
+ $tbl .= '<option value="' . $behaviour . '"';
+ if ($behaviour == $l7rule->GetRBehaviour())
+ $tbl .= ' selected="selected"';
+
+ $tbl .= '>' . $behaviour . '</option>';
+
+ endforeach;
+
+ $tbl .= '</select>';
+
+ endif;
+
+ $tbl .= '</td><td>';
+ $tbl .= '<a type="button" class="btn btn-default" onclick="removeRow(\'newtbl\',this.parentNode.parentNode); return false;" href="#">';
+ $tbl .= gettext('Remove') . '</a>';
+ $tbl .= '</td></tr>';
+
+
+ } //end foreach
+ } //end if
+
+ $tbl .= '</tbody></table>';
+
+ $tbl .= '<a id="addrow" type="button" onclick="javascript:addRow(\'newtbl\'); return false;" href="#" class="btn btn-sm btn-success">' . gettext('Add row') .
+ '</a>';
+
+ return($tbl);
+}
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('shaper'))
+ print_info_box_np(gettext("The traffic shaper configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
+
+$tab_array = array();
+$tab_array[] = array(gettext("By Interface"), false, "firewall_shaper.php");
+$tab_array[] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
+$tab_array[] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
+$tab_array[] = array(gettext("Layer7"), true, "firewall_shaper_layer7.php");
+$tab_array[] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
+display_top_tabs($tab_array);
+
+// Create a StaticText control and populate it with the rules table
+if(!$dfltmsg) {
+ $section = new Form_Section('Add one (or more) rules');
+
+ $section->addInput(new Form_StaticText(
+ 'Rule(s)',
+ build_l7table()
+ ));
+
+ $sform->add($section);
+}
+?>
+
+ <div class="panel panel-default">
+ <div class="panel-heading" align="center"><h2 class="panel-title">Layer 7</h2></div>
+ <div class="panel-body">
+ <div class="form-group">
+ <div class="col-sm-2 ">
+ <?=$tree?>
+ <br />
+ <a href="firewall_shaper_layer7.php?action=add" class="btn btn-sm btn-success">
+ <?=gettext("Create new L7<br />rule group")?>
+ </a>
+ </div>
+ <div class="col-sm-10">
<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("By Interface"), false, "firewall_shaper.php");
- $tab_array[1] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
- $tab_array[2] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
- $tab_array[3] = array(gettext("Layer7"), true, "firewall_shaper_layer7.php");
- $tab_array[4] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
- display_top_tabs($tab_array);
+if($dfltmsg)
+ print_info_box($output_form = $dn_default_shaper_msg . $default_layer7shaper_msg);
+else
+ print($sform);
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
-
- <?php if (count($layer7_rules_list) > 0): ?>
- <tr class="tabcont">
- <td width="25%" align="left"></td>
- <td width="75%"> </td>
- </tr>
- <?php endif; ?>
- <tr>
- <td width="25%" valign="top" align="left">
- <?php
- echo $tree;
- ?>
- <br /><br />
- <a href="firewall_shaper_layer7.php?action=add">
- <img src="./themes/<?=$g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("Create new l7 rules group"); ?>" width="17" height="17" border="0" alt="add" /> <?=gettext("Create new l7 rules group"); ?>
- </a>
- <br />
- </td>
- <td width="75%" valign="top" align="center">
- <div id="shaperarea" style="position:relative">
- <table summary="output form">
- <?php
- echo $output_form;
- ?>
-
- <!-- Layer 7 rules form -->
- <?php if ($show_proto_form): ?>
- <tr>
- <td width="22%" valign="top" class="vncellreq">
- <div id="addressnetworkport">
- <?=gettext("Rule(s)"); ?>
- </div>
- </td>
-
- <td width="78%" class="vtable">
- <table width="236" id="maintable" summary="main table">
- <tbody>
- <tr>
- <td colspan="4">
- <div style="font-size: 8pt; padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066;" id="itemhelp">
- <?=gettext("Add one or more rules"); ?>
- </div>
- </td>
- </tr>
- <tr>
- <td>
- <div style="font-size: 8pt; padding:5px;" id="onecolumn">
- <?=gettext("Protocol"); ?>
- </div>
- </td>
- <td>
- <div style="font-size: 8pt; padding:5px;" id="twocolumn">
- <?=gettext("Structure"); ?>
- </div>
- </td>
- <td>
- <div style="font-size: 8pt; padding:5px;" id="threecolumn">
- <?=gettext("Behaviour"); ?>
- </div>
- </td>
- </tr>
- <!-- PHP Code to generate the existing rules -->
- <?php
- if ($container) {
- foreach ($container->rsets as $l7rule) {
- ?>
- <tr>
- <td>
- <select name="protocol[]" class="formselect" style="font-size:8pt">
- <?php foreach ($avail_protos as $proto): ?>
- <option value="<?=$proto;?>" <?php if ($proto == $l7rule->GetRProtocol()) echo "selected=\"selected\""; ?>><?=$proto;?></option>
- <?php endforeach; ?>
- </select>
- </td>
- <td>
- <select name="structure[]" class="formselect" style="font-size:8pt" onchange="changeBehaviourValues(this.parentNode.parentNode);">
- <?php foreach ($avail_structures as $struct) {
- if ($struct == "queue") {
- if (!empty($avail_behaviours_altq)) { ?>
- <option value="<?=$struct ?>" <?php if ($struct == $l7rule->GetRStructure()) echo "selected=\"selected\""; ?>><?=$struct;?></option>
- <?php }
- } else {
- if ($struct == "limiter") {
- if (!empty($avail_behaviours_limiter)) { ?>
- <option value="<?=$struct ?>" <?php if ($struct == $l7rule->GetRStructure()) echo "selected=\"selected\""; ?>><?=$struct;?></option>
- <?php }
- } else {
- if ($struct == "action") { ?>
- <option value="<?=$struct ?>" <?php if ($struct == $l7rule->GetRStructure()) echo "selected=\"selected\""; ?>><?=$struct;?></option>
- <?php }
- }
- }
- } ?>
- </select>
- </td>
- <td>
- <select name="behaviour[]" class="formselect" style="width:80px; font-size:8pt">
- <?php if ($l7rule->GetRStructure() == "action"): ?>
- <?php foreach ($avail_behaviours_action as $behaviour): ?>
- <option value="<?=$behaviour ?>" <?php if ($behaviour == $l7rule->GetRBehaviour()) echo "selected=\"selected\""; ?>><?=$behaviour;?></option>
- <?php endforeach; ?>
- <?php endif; ?>
- <?php if ($l7rule->GetRStructure() == "queue"): ?>
- <?php foreach ($avail_behaviours_altq as $behaviour): ?>
- <option value="<?=$behaviour ?>" <?php if ($behaviour == $l7rule->GetRBehaviour()) echo "selected=\"selected\""; ?>><?=$behaviour;?></option>
- <?php endforeach; ?>
- <?php endif; ?>
- <?php if ($l7rule->GetRStructure() == "limiter"): ?>
- <?php foreach ($avail_behaviours_limiter as $behaviour): ?>
- <option value="<?=$behaviour ?>" <?php if ($behaviour == $l7rule->GetRBehaviour()) echo "selected=\"selected\""; ?>><?=$behaviour;?></option>
- <?php endforeach; ?>
- <?php endif; ?>
- </select>
- </td>
- <td>
- <a onclick="removeRow('maintable', this.parentNode.parentNode); return false;" href="#"><img border="0" src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" alt="x" /></a>
- </td>
- </tr>
- <?php
- } //end foreach
- } //end if
- ?>
- </tbody>
- </table>
-
- <a onclick="javascript:addRow('maintable'); return false;" href="#"> <img border="0"
- src="/themes/<?=$g['theme']; ?>/images/icons/icon_plus.gif"
- alt="" title="<?=gettext("add another entry"); ?>" /> </a>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">
- &nbsp;
- </td>
- <td width="78%">
- <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
-
- <a href="firewall_shaper_layer7.php">
- <input id="cancelbutton" name="cancelbutton" type="button" class="formbtn" value="<?=gettext("Cancel"); ?>" />
-
- <?php if ($container): ?>
- <input id="delete" type="submit" class="formbtn" name="delete" value="<?=gettext("Delete"); ?>" />
- <?php endif ?>
- </a>
- </td>
- </tr>
- <?php endif; ?>
- <!-- End of layer7 rules form -->
- </table>
- </div><!-- end of div:shape area -->
- </td>
- </tr>
- </table>
+ </div>
</div>
- </td>
- </tr>
-</table>
-</form>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </div>
+ </div>
+
+
+<?php
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_shaper_queues.php b/src/usr/local/www/firewall_shaper_queues.php
index 6aa062b..5d1bbb7 100644
--- a/src/usr/local/www/firewall_shaper_queues.php
+++ b/src/usr/local/www/firewall_shaper_queues.php
@@ -1,36 +1,63 @@
<?php
/* $Id$ */
-/*
+/* NEW
firewall_shaper_queues.php
- Copyright (C) 2004, 2005 Scott Ullrich
- Copyright (C) 2008 Ermal Luçi
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ * Copyright (c) 2008 Ermal Luçi
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/bin/killall
- pfSense_MODULE: shaper
+ pfSense_MODULE: shaper
*/
##|+PRIV
@@ -46,11 +73,13 @@ require_once("filter.inc");
require_once("shaper.inc");
require_once("rrd.inc");
-if ($_GET['reset'] <> "") {
+if($_GET['reset'] != "") {
mwexec("killall -9 pfctl");
exit;
}
+$qname = gettext("No queue configured/selected");
+
$shaperIFlist = get_configured_interface_with_descr();
read_altq_config();
$qlist =& get_unique_queue_list();
@@ -74,9 +103,11 @@ if ($_GET) {
if ($_GET['queue']) {
$qname = htmlspecialchars(trim($_GET['queue']));
}
+
if ($_GET['interface']) {
$interface = htmlspecialchars(trim($_GET['interface']));
}
+
if ($_GET['action']) {
$action = htmlspecialchars($_GET['action']);
}
@@ -101,10 +132,12 @@ if ($_GET) {
*/
foreach ($altq_list_queues as $altq) {
$qtmp =& $altq->find_queue("", $qname);
+
if ($qtmp) {
$copycfg = array();
$qtmp->copy_queue($interface, $copycfg);
$aq =& $altq_list_queues[$interface];
+
if ($qname == $qtmp->GetInterface()) {
$config['shaper']['queue'][] = $copycfg;
} else if ($aq) {
@@ -118,6 +151,7 @@ if ($_GET) {
} else {
$link =& get_reference_to_me_in_config($aq->GetLink());
}
+
$link['queue'][] = $copycfg;
} else {
$newroot = array();
@@ -128,37 +162,40 @@ if ($_GET) {
$newroot['queue'][] = $copycfg;
$config['shaper']['queue'][] = $newroot;
}
- if (write_config()) {
+
+ if (write_config())
mark_subsystem_dirty('shaper');
- }
+
break;
+ }
}
- }
header("Location: firewall_shaper_queues.php?queue=".$qname."&action=show");
exit;
- break;
+ break;
case "show":
foreach ($config['interfaces'] as $if => $ifdesc) {
$altq = $altq_list_queues[$if];
+
if ($altq) {
$qtmp =& $altq->find_queue("", $qname);
- if ($qtmp) {
+
+ if ($qtmp)
$output .= $qtmp->build_shortform();
- } else {
+ else
$output .= build_iface_without_this_queue($if, $qname);
- }
+
} else {
- if (!is_altq_capable($ifdesc['if'])) {
+ if (!is_altq_capable($ifdesc['if']))
continue;
- }
- if (!isset($ifdesc['enable']) && $if != "lan" && $if != "wan") {
+
+ if (!isset($ifdesc['enable']) && $if != "lan" && $if != "wan")
continue;
- }
+
$output .= build_iface_without_this_queue($if, $qname);
}
}
- break;
+ break;
}
}
@@ -186,59 +223,49 @@ if ($_POST['apply']) {
$pgtitle = gettext("Firewall: Shaper: By Queues View");
$shortcut_section = "trafficshaper";
$closehead = false;
+
include("head.inc");
?>
+
<link rel="stylesheet" type="text/css" media="all" href="./tree/tree.css" />
<script type="text/javascript" src="./tree/tree.js"></script>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<div id="inputerrors"></div>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="firewall_shaper_queues.php" method="post" name="iform" id="iform">
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('shaper')): ?><p>
-<?php print_info_box_np(gettext("The traffic shaper configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br /></p>
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="traffic shaper queues">
- <tr><td>
<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("By Interface"), false, "firewall_shaper.php");
- $tab_array[1] = array(gettext("By Queue"), true, "firewall_shaper_queues.php");
- $tab_array[2] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
- $tab_array[3] = array(gettext("Layer7"), false, "firewall_shaper_layer7.php");
- $tab_array[4] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
- display_top_tabs($tab_array);
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg);
+
+if (is_subsystem_dirty('shaper'))
+ print_info_box_np(gettext("The traffic shaper configuration has been changed. You must apply the changes in order for them to take effect."));
+
+$tab_array = array();
+$tab_array[] = array(gettext("By Interface"), false, "firewall_shaper.php");
+$tab_array[] = array(gettext("By Queue"), true, "firewall_shaper_queues.php");
+$tab_array[] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
+$tab_array[] = array(gettext("Layer7"), false, "firewall_shaper_layer7.php");
+$tab_array[] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
+display_top_tabs($tab_array);
+
?>
- </td></tr>
- <tr>
- <td valign="top">
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="30%" valign="top" align="left">
- <?php echo $tree; ?>
- </td>
- <td width="70%" valign="top" align="center">
- <?php
- if ($qname) {
- echo "<p class=\"pgtitle\">" . $qname . "</p><br />";
- }
- echo "<table align=\"center\" class=\"tabcont\" width=\"80%\" border=\"0\" cellpadding=\"4\" cellspacing=\"0\" summary=\"output form\">";
- echo $output;
- echo "<tr><td>&nbsp;</td></tr>";
- echo "</table>";
- ?>
- </td>
- </tr>
- </table><!-- table:main area -->
- </div><!-- div:main area -->
- </td>
- </tr>
-</table>
+
+<form action="firewall_shaper_queues.php" method="post" name="iform" id="iform">
+ <div class="panel panel-default">
+ <div class="panel-heading" align="center"><h2 class="panel-title"><?=$qname?></h2></div>
+ <div class="panel-body">
+ <div class="form-group">
+ <div class="col-sm-2 ">
+ <?=$tree?>
+ </div>
+ <div class="col-sm-10">
+ <?=$output?>
+ </div>
+ </div>
+ </div>
+ </div>
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php
+
+include("foot.inc");
diff --git a/src/usr/local/www/firewall_shaper_vinterface.php b/src/usr/local/www/firewall_shaper_vinterface.php
index ffa3f15..da5ae24 100644
--- a/src/usr/local/www/firewall_shaper_vinterface.php
+++ b/src/usr/local/www/firewall_shaper_vinterface.php
@@ -2,36 +2,62 @@
/* $Id$ */
/*
firewall_shaper_vinterface.php
- Copyright (C) 2004, 2005 Scott Ullrich
- Copyright (C) 2008 Ermal Luçi
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ * Copyright (c) 2008 Ermal Luçi
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/bin/killall
- pfSense_MODULE: shaper
+ pfSense_MODULE: shaper
*/
##|+PRIV
@@ -41,18 +67,20 @@
##|*MATCH=firewall_shaper_vinterface.php*
##|-PRIV
+require('classes/Form.class.php');
require("guiconfig.inc");
require_once("functions.inc");
require_once("filter.inc");
require_once("shaper.inc");
-if ($_GET['reset'] <> "") {
+if($_GET['reset'] != "") {
mwexec("/usr/bin/killall -9 pfctl");
exit;
}
$pgtitle = array(gettext("Firewall"), gettext("Traffic Shaper"), gettext("Limiter"));
$shortcut_section = "trafficshaper-limiters";
+$dfltmsg = false;
read_dummynet_config();
/*
@@ -71,6 +99,7 @@ if ($_GET) {
$action = htmlspecialchars($_GET['action']);
}
}
+
if ($_POST) {
if ($_POST['name']) {
$qname = htmlspecialchars(trim($_POST['name']));
@@ -151,74 +180,70 @@ if ($_GET) {
$retval = filter_configure();
$savemsg = get_std_save_message($retval);
- if (stristr($retval, "error") <> true) {
- $savemsg = get_std_save_message($retval);
- } else {
- $savemsg = $retval;
- }
- } else {
- $savemsg = gettext("Unable to write config.xml (Access Denied?)");
- }
- $output_form = $dn_default_shaper_message;
-
- break;
- case "add":
- if ($dnpipe) {
- $q = new dnqueue_class();
- $q->SetPipe($pipe);
- $output_form .= "<input type=\"hidden\" name=\"parentqueue\" id=\"parentqueue\"";
- $output_form .= " value=\"".$pipe."\" />";
- } else if ($addnewpipe) {
- $q = new dnpipe_class();
- $q->SetQname($pipe);
- } else {
- $input_errors[] = gettext("Could not create new queue/discipline!");
- }
-
- if ($q) {
- $output_form .= $q->build_form();
- $newjavascript = $q->build_javascript();
- unset($q);
- $newqueue = true;
- }
- break;
- case "show":
- if ($queue) {
- $output_form .= $queue->build_form();
- } else {
- $input_errors[] = gettext("Queue not found!");
- }
- break;
- case "enable":
- if ($queue) {
- $queue->SetEnabled("on");
- $output_form .= $queue->build_form();
- $queue->wconfig();
- if (write_config()) {
- mark_subsystem_dirty('shaper');
- }
- } else {
- $input_errors[] = gettext("Queue not found!");
- }
- break;
- case "disable":
- if ($queue) {
- $queue->SetEnabled("");
- $output_form .= $queue->build_form();
- $queue->wconfig();
- if (write_config()) {
- mark_subsystem_dirty('shaper');
- }
- } else {
- $input_errors[] = gettext("Queue not found!");
- }
- break;
- default:
- $output_form .= $dn_default_shaper_msg;
- $dontshow = true;
- break;
+ if (stristr($retval, "error") != true)
+ $savemsg = get_std_save_message($retval);
+ else
+ $savemsg = $retval;
+
+ } else
+ $savemsg = gettext("Unable to write config.xml (Access Denied?)");
+
+ $dfltmsg = true;
+
+ break;
+ case "add":
+ if ($dnpipe) {
+ $q = new dnqueue_class();
+ $q->SetPipe($pipe);
+ $output_form .= "<input type=\"hidden\" name=\"parentqueue\" id=\"parentqueue\"";
+ $output_form .= " value=\"".$pipe."\" />";
+ } else if ($addnewpipe) {
+ $q = new dnpipe_class();
+ $q->SetQname($pipe);
+ } else
+ $input_errors[] = gettext("Could not create new queue/discipline!");
+
+ if ($q) {
+ $sform = $q->build_form();
+ $newjavascript = $q->build_javascript();
+ unset($q);
+ $newqueue = true;
+ }
+ break;
+ case "show":
+ if ($queue)
+ $sform = $queue->build_form();
+ else
+ $input_errors[] = gettext("Queue not found!");
+ break;
+ case "enable":
+ if ($queue) {
+ $queue->SetEnabled("on");
+ $sform = $queue->build_form();
+ $queue->wconfig();
+ if (write_config())
+ mark_subsystem_dirty('shaper');
+ } else
+ $input_errors[] = gettext("Queue not found!");
+ break;
+ case "disable":
+ if ($queue) {
+ $queue->SetEnabled("");
+ $sform = $queue->build_form();
+ $queue->wconfig();
+ if (write_config())
+ mark_subsystem_dirty('shaper');
+ } else
+ $input_errors[] = gettext("Queue not found!");
+ break;
+ default:
+ $dfltmsg = true;
+ $dontshow = true;
+ break;
}
-} else if ($_POST) {
+}
+
+if ($_POST) {
unset($input_errors);
if ($addnewpipe) {
@@ -244,7 +269,7 @@ if ($_GET) {
}
read_dummynet_config();
- $output_form .= $dnpipe->build_form();
+ $sform = $dnpipe->build_form();
$newjavascript = $dnpipe->build_javascript();
}
} else if ($parentqueue) { /* Add a new queue */
@@ -264,67 +289,66 @@ if ($_GET) {
}
}
read_dummynet_config();
- $output_form .= $tmp->build_form();
- } else {
+ $sform = $tmp->build_form();
+ } else
$input_errors[] = gettext("Could not add new queue.");
- }
} else if ($_POST['apply']) {
- write_config();
-
- $retval = 0;
- $retval = filter_configure();
- $savemsg = get_std_save_message($retval);
+ write_config();
- if (stristr($retval, "error") <> true) {
+ $retval = 0;
+ $retval = filter_configure();
$savemsg = get_std_save_message($retval);
- } else {
- $savemsg = $retval;
- }
+
+ if (stristr($retval, "error") != true)
+ $savemsg = get_std_save_message($retval);
+ else
+ $savemsg = $retval;
/* XXX: TODO Make dummynet pretty graphs */
// enable_rrd_graphing();
- clear_subsystem_dirty('shaper');
+ clear_subsystem_dirty('shaper');
+
+ if ($queue) {
+ $sform = $queue->build_form();
+ $dontshow = false;
+ }
+ else {
+ $output_form .= $dn_default_shaper_message;
+ $dontshow = true;
+ }
- if ($queue) {
- $output_form .= $queue->build_form();
- $dontshow = false;
- } else {
- $output_form .= $dn_default_shaper_message;
- $dontshow = true;
- }
} else if ($queue) {
- $queue->validate_input($_POST, $input_errors);
- if (!$input_errors) {
+ $queue->validate_input($_POST, $input_errors);
+ if (!$input_errors) {
$queue->update_dn_data($_POST);
$queue->wconfig();
- if (write_config()) {
+ if (write_config())
mark_subsystem_dirty('shaper');
- }
$dontshow = false;
- }
+ }
read_dummynet_config();
- $output_form .= $queue->build_form();
- } else {
- $output_form .= $dn_default_shaper_msg;
+ $sform = $queue->build_form();
+ } else {
+ $dfltmsg = true;
$dontshow = true;
}
-} else {
- $output_form .= $dn_default_shaper_msg;
+}
+
+if(!$_POST && !$_GET) {
+ $dfltmsg = true;
$dontshow = true;
}
if ($queue) {
- if ($queue->GetEnabled()) {
- $can_enable = true;
- } else {
- $can_enable = false;
- }
+ if ($queue->GetEnabled())
+ $can_enable = true;
+ else
+ $can_enable = false;
if ($queue->CanHaveChildren()) {
$can_add = true;
- } else {
- $can_add = false;
- }
+ } else
+ $can_add = false;
}
$tree = "<ul class=\"tree\" >";
@@ -335,42 +359,6 @@ if (is_array($dummynet_pipe_list)) {
}
$tree .= "</ul>";
-if (!$dontshow || $newqueue) {
-
-$output_form .= "<tr><td width=\"22%\" valign=\"top\" class=\"vncellreq\">";
-$output_form .= gettext("Queue Actions");
-$output_form .= "</td><td valign=\"top\" class=\"vncellreq\" width=\"78%\">";
-
-$output_form .= "<input type=\"submit\" name=\"Submit\" value=\"" . gettext("Save") . "\" class=\"formbtn\" />";
-if ($can_add || $addnewaltq) {
- $output_form .= "<a href=\"firewall_shaper_vinterface.php?pipe=";
- $output_form .= $pipe;
- if ($queue) {
- $output_form .= "&amp;queue=" . $queue->GetQname();
- }
- $output_form .= "&amp;action=add\">";
- $output_form .= "<input type=\"button\" class=\"formbtn\" name=\"add\" value=\"" . gettext("Add new queue") ."\" />";
- $output_form .= "</a>";
-}
-$output_form .= "<a href=\"firewall_shaper_vinterface.php?pipe=";
-$output_form .= $pipe;
-if ($queue) {
- $output_form .= "&amp;queue=" . $queue->GetQname();
-}
-$output_form .= "&amp;action=delete\">";
-$output_form .= "<input type=\"button\" class=\"formbtn\" name=\"delete\"";
-if ($queue) {
- $output_form .= " value=\"" . gettext("Delete this queue") ."\" />";
-} else {
- $output_form .= " value=\"" . gettext("Delete Limiter") ."\" />";
-}
-$output_form .= "</a>";
-$output_form .= "</td></tr>";
-$output_form .= "</table>";
-} else {
- $output_form .= "</table>";
-}
-
$output = "<table summary=\"output form\">";
$output .= $output_form;
$closehead = false;
@@ -378,6 +366,7 @@ include("head.inc");
?>
<link rel="stylesheet" type="text/css" media="all" href="./tree/tree.css" />
<script type="text/javascript" src="./tree/tree.js"></script>
+
<script type="text/javascript">
//<![CDATA[
function show_source_port_range() {
@@ -390,9 +379,6 @@ function show_source_port_range() {
}
//]]>
</script>
-</head>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
<?php
if ($queue) {
@@ -401,75 +387,103 @@ if ($queue) {
echo $newjavascript;
}
-include("fbegin.inc");
-?>
-<div id="inputerrors"></div>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
+if ($input_errors)
+ print_input_errors($input_errors);
-<form action="firewall_shaper_vinterface.php" method="post" id="iform" name="iform">
+if ($savemsg)
+ print_info_box($savemsg, 'success');
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('shaper')): ?><p>
-<?php print_info_box_np(gettext("The traffic shaper configuration has been changed.")."<br />".gettext("You must apply the changes in order for them to take effect."));?><br /></p>
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="traffic shaper limiter">
- <tr><td>
-<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("By Interface"), false, "firewall_shaper.php");
- $tab_array[1] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
- $tab_array[2] = array(gettext("Limiter"), true, "firewall_shaper_vinterface.php");
- $tab_array[3] = array(gettext("Layer7"), false, "firewall_shaper_layer7.php");
- $tab_array[4] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
- display_top_tabs($tab_array);
+if (is_subsystem_dirty('shaper'))
+ print_info_box_np(gettext("The traffic shaper configuration has been changed. You must apply the changes in order for them to take effect."));
+
+$tab_array = array();
+$tab_array[] = array(gettext("By Interface"), false, "firewall_shaper.php");
+$tab_array[] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
+$tab_array[] = array(gettext("Limiter"), true, "firewall_shaper_vinterface.php");
+$tab_array[] = array(gettext("Layer7"), false, "firewall_shaper_layer7.php");
+$tab_array[] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
+display_top_tabs($tab_array);
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
-<?php if (count($dummynet_pipe_list) > 0): ?>
- <tr class="tabcont">
- <td width="25%" align="left"></td>
- <td width="75%"> </td>
- </tr>
-<?php endif; ?>
- <tr>
- <td width="25%" valign="top" align="left">
- <?php
- echo $tree;
- ?>
- <br /><br />
- <a href="firewall_shaper_vinterface.php?pipe=new&amp;action=add">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("Create new limiter");?>" width="17" height="17" border="0" alt="add" />&nbsp;<?=gettext("Create new limiter");?>
- </a>
- <br />
- </td>
- <td width="75%" valign="top" align="center">
- <div id="shaperarea" style="position:relative">
- <?php
- echo $output;
- ?>
- </div>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<script type='text/javascript'>
-//<![CDATA[
+
+<div class="table-responsive">
+ <table class="table">
+ <tbody>
+ <tr class="tabcont">
+ <td class="col-md-1">
+ <?=$tree?>
+ <a href="firewall_shaper_vinterface.php?pipe=new&amp;action=add" class="btn btn-sm btn-success"/>
+ <?=gettext('New Limiter')?>
+ </a>
+ </td>
+ <td>
<?php
- $totalrows = 0;
- if (is_array($config['dnshaper']) && is_array($config['dnshaper']['queue'])) {
- $totalrows = count($config['dnshaper']['queue']);
+
+if($dfltmsg)
+ print_info_box($dn_default_shaper_msg);
+else {
+ // Add global buttons
+ if (!$dontshow || $newqueue) {
+ if ($can_add || $addnewaltq) {
+ if($queue)
+ $url = 'href="firewall_shaper_vinterface.php?pipe=' . $pipe . '&queue=' . $queue->GetQname() . '&action=add';
+ else
+ $url = 'firewall_shaper.php?pipe='. $pipe . '&action=add';
+
+ $sform->addGlobal(new Form_Button(
+ 'add',
+ 'Add new Queue',
+ $url
+ ))->removeClass('btn-default')->addClass('btn-success');
+ }
+
+ if($queue)
+ $url = 'firewall_shaper_vinterface.php?pipe='. $pipe . '&queue=' . $queue->GetQname() . '&action=delete';
+ else
+ $url = 'firewall_shaper_vinterface.php?pipe='. $pipe . '&action=delete';
+
+ $sform->addGlobal(new Form_Button(
+ 'delete',
+ $queue ? 'Delete this queue':'Delete',
+ $url
+ ))->removeClass('btn-default')->addClass('btn-danger');
}
- echo "totalrows = {$totalrows}";
+
+ // Print the form
+ print($sform);
+
+}
?>
-//]]>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+<script>
+//<![CDATA[
+events.push(function(){
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
+ }
+
+ function change_masks() {
+ disableInput('maskbits', ($('#scheduler').val() == 'none'));
+ disableInput('maskbitsv6', ($('#scheduler').val() == 'none'));
+ }
+
+ // On page load . .
+ change_masks();
+
+ // On click . .
+ $('#scheduler').on('change', function() {
+ change_masks();
+ });
+});
+//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+
+<?php
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_shaper_wizards.php b/src/usr/local/www/firewall_shaper_wizards.php
index 583fdef..18cc97e 100644
--- a/src/usr/local/www/firewall_shaper_wizards.php
+++ b/src/usr/local/www/firewall_shaper_wizards.php
@@ -2,35 +2,62 @@
/* $Id$ */
/*
firewall_shaper_wizards.php
- Copyright (C) 2004, 2005 Scott Ullrich
- Copyright (C) 2008 Ermal Luçi
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ * Copyright (c) 2008 Ermal Luçi
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/bin/killall
- pfSense_MODULE: shaper
+ pfSense_MODULE: shaper
*/
##|+PRIV
@@ -46,7 +73,7 @@ require_once("filter.inc");
require_once("shaper.inc");
require_once("util.inc");
-if ($_GET['reset'] <> "") {
+if($_GET['reset'] != "") {
sigkillbyname('pfctl', SIGKILL);
exit;
}
@@ -82,65 +109,43 @@ $wizards = array(
$closehead = false;
include("head.inc");
-?>
-<link rel="stylesheet" type="text/css" media="all" href="./tree/tree.css" />
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" >
+if ($input_errors)
+ print_input_errors($input_errors);
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
+$tab_array = array();
+$tab_array[] = array(gettext("By Interface"), false, "firewall_shaper.php");
+$tab_array[] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
+$tab_array[] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
+$tab_array[] = array(gettext("Layer7"), false, "firewall_shaper_layer7.php");
+$tab_array[] = array(gettext("Wizards"), true, "firewall_shaper_wizards.php");
+display_top_tabs($tab_array);
-<form action="firewall_shaper_wizards.php" method="post" id="iform" name="iform">
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('shaper'))
+ print_info_box_np(gettext("The traffic shaper configuration has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."));
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('shaper')): ?><p>
-<?php print_info_box_np(gettext("The traffic shaper configuration has been changed.")."<br />".gettext("You must apply the changes in order for them to take effect."));?><br /></p>
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="traffic shaper wizard">
- <tr><td>
-<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("By Interface"), false, "firewall_shaper.php");
- $tab_array[1] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
- $tab_array[2] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
- $tab_array[3] = array(gettext("Layer7"), false, "firewall_shaper_layer7.php");
- $tab_array[4] = array(gettext("Wizards"), true, "firewall_shaper_wizards.php");
- display_top_tabs($tab_array);
-?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td class="listhdrr" width="25%" align="center" ><?=gettext("Wizard function");?></td>
- <td class="listhdrr" width="75%" align="center"><?=gettext("Wizard Link");?></td>
- </tr>
-<?php
- foreach ($wizards as $key => $wizard):
?>
- <tr class="tabcont">
- <td class="listlr" style="background-color: #e0e0e0" width="25%" align="center">
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Traffic Shaper Wizards')?></h2></div>
+ <div class="panel-body">
+ <dl class="dl-horizontal responsive">
<?php
- echo $key;
+foreach ($wizards as $key => $wizard):
?>
- </td>
- <td class="listr" style="background-color: #e0e0e0" width="75%" align="center">
+ <dt>
+ <?=$key?>
+ </dt>
+ <dd>
+ <?='<a href="wizard.php?xml=' . $wizard . '">' . $wizard . '</a>'?>
+ </dd>
<?php
- echo "<a href=\"wizard.php?xml=" . $wizard ."\" >" .$wizard . "</a>";
+endforeach;
?>
- </td>
- </tr>
+ </dl>
+ </div>
+</div>
<?php
- endforeach;
-?>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_virtual_ip.php b/src/usr/local/www/firewall_virtual_ip.php
index 148477f..e321603 100644
--- a/src/usr/local/www/firewall_virtual_ip.php
+++ b/src/usr/local/www/firewall_virtual_ip.php
@@ -2,44 +2,63 @@
/* $Id$ */
/*
firewall_virtual_ip.php
- part of pfSense (https://www.pfsense.org/)
-
- Copyright (C) 2005 Bill Marquette <bill.marquette@gmail.com>.
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Includes code from m0n0wall which is:
- Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Includes code from pfSense which is:
- Copyright (C) 2004-2005 Scott Ullrich <geekgod@pfsense.com>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ * Copyright (c) 22003-2005 Manuel Kasper <mk@neon1.net>
+ * part of pfSense (https://www.pfsense.org/)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/ifconfig
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -57,6 +76,7 @@ require_once("shaper.inc");
if (!is_array($config['virtualip']['vip'])) {
$config['virtualip']['vip'] = array();
}
+
$a_vip = &$config['virtualip']['vip'];
if ($_POST) {
@@ -107,7 +127,7 @@ if ($_GET['act'] == "del") {
/* make sure no inbound NAT mappings reference this entry */
if (is_array($config['nat']['rule'])) {
foreach ($config['nat']['rule'] as $rule) {
- if ($rule['destination']['address'] <> "") {
+ if($rule['destination']['address'] != "") {
if ($rule['destination']['address'] == $a_vip[$_GET['id']]['subnet']) {
$input_errors[] = gettext("This entry cannot be deleted because it is still referenced by at least one NAT mapping.");
break;
@@ -166,6 +186,7 @@ if ($_GET['act'] == "del") {
continue;
}
+
if (ip_in_subnet($gateway['gateway'], $subnet)) {
$input_errors[] = gettext("This entry cannot be deleted because it is still referenced by at least one Gateway.");
break;
@@ -184,6 +205,7 @@ if ($_GET['act'] == "del") {
}
$vipiface = $a_vip[$_GET['id']]['interface'];
+
foreach ($a_vip as $vip_id => $vip) {
if ($vip_id == $_GET['id']) {
continue;
@@ -215,10 +237,12 @@ if ($_GET['act'] == "del") {
session_start();
}
$user = getUserEntry($_SESSION['Username']);
+
if (is_array($user) && userHasPrivilege($user, "user-config-readonly")) {
header("Location: firewall_virtual_ip.php");
exit;
}
+
session_commit();
// Special case since every proxyarp vip is handled by the same daemon.
@@ -242,132 +266,102 @@ if ($_GET['act'] == "del") {
$id = $_GET['id'];
}
-$pgtitle = array(gettext("Firewall"), gettext("Virtual IP Addresses"));
+$types = array('proxyarp' => 'Proxy ARP',
+ 'carp' => 'CARP',
+ 'other' => 'Other',
+ 'ipalias' => 'IP Alias'
+ );
+
+$pgtitle = array(gettext("Firewall"),gettext("Virtual IP Addresses"));
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+else if ($savemsg)
+ print_info_box($savemsg, 'success');
+else if (is_subsystem_dirty('vip'))
+ print_info_box_np(gettext("The VIP configuration has been changed.")."<br />".gettext("You must apply the changes in order for them to take effect."));
+
+/* active tabs */
+$tab_array = array();
+$tab_array[] = array(gettext("Virtual IPs"), true, "firewall_virtual_ip.php");
+$tab_array[] = array(gettext("CARP Settings"), false, "system_hasync.php");
+display_top_tabs($tab_array);
+
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="firewall_virtual_ip.php" method="post">
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Virtual IP Address')?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Virtual IP address")?></th>
+ <th><?=gettext("Interface")?></th>
+ <th><?=gettext("Type")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><!--Buttons--></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- } else if ($savemsg) {
- print_info_box($savemsg);
- } else if (is_subsystem_dirty('vip')) {
- print_info_box_np(gettext("The VIP configuration has been changed.")."<br />".gettext("You must apply the changes in order for them to take effect."));
- }
+$interfaces = get_configured_interface_with_descr(false, true);
+$carplist = get_configured_carp_interface_list();
+
+foreach ($carplist as $cif => $carpip)
+ $interfaces[$cif] = $carpip." (".get_vip_descr($carpip).")";
+
+$interfaces['lo0'] = "Localhost";
+
+$i = 0;
+foreach ($a_vip as $vipent):
+ if( $vipent['subnet'] != "" or $vipent['range'] != "" or
+ $vipent['subnet_bits'] != "" or (isset($vipent['range']['from']) && $vipent['range']['from'] != "")):
?>
-<br />
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="virtual ip">
- <tr><td class="tabnavtbl">
- <?php
- /* active tabs */
- $tab_array = array();
- $tab_array[] = array(gettext("Virtual IPs"), true, "firewall_virtual_ip.php");
- $tab_array[] = array(gettext("CARP Settings"), false, "system_hasync.php");
- display_top_tabs($tab_array);
- ?>
- </td></tr>
- <tr>
- <td><input type="hidden" id="id" name="id" value="<?php echo htmlspecialchars($id); ?>" /></td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="30%" class="listhdrr"><?=gettext("Virtual IP address");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Interface");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Type");?></td>
- <td width="40%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tr>
- <td width="17"></td>
- <td valign="middle"><a href="firewall_virtual_ip_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="edit" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <?php
- $interfaces = get_configured_interface_with_descr(false, true);
- $carplist = get_configured_carp_interface_list();
- foreach ($carplist as $cif => $carpip) {
- $interfaces[$cif] = $carpip." (".get_vip_descr($carpip).")";
- }
- $interfaces['lo0'] = "Localhost";
- $i = 0;
- foreach ($a_vip as $vipent):
- if ($vipent['subnet'] <> "" or $vipent['range'] <> "" or $vipent['subnet_bits'] <> "" or (isset($vipent['range']['from']) && $vipent['range']['from'] <> "")):
- ?>
- <tr>
- <td class="listlr" ondblclick="document.location='firewall_virtual_ip_edit.php?id=<?=$i;?>';">
- <?php
- if (($vipent['type'] == "single") || ($vipent['type'] == "network")) {
- if ($vipent['subnet_bits']) {
- echo "{$vipent['subnet']}/{$vipent['subnet_bits']}";
- }
- }
- if ($vipent['type'] == "range") {
- echo "{$vipent['range']['from']}-{$vipent['range']['to']}";
- }
- if ($vipent['mode'] == "carp") {
- echo " (vhid {$vipent['vhid']})";
- }
- ?>
- </td>
- <td class="listr" ondblclick="document.location='firewall_virtual_ip_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($interfaces[$vipent['interface']]);?>&nbsp;
- </td>
- <td class="listr" align="center" ondblclick="document.location='firewall_virtual_ip_edit.php?id=<?=$i;?>';">
- <?php if ($vipent['mode'] == "proxyarp") echo "<img src='./themes/".$g['theme']."/images/icons/icon_parp.gif' title='Proxy ARP' alt='proxy arp' />"; elseif ($vipent['mode'] == "carp") echo "<img src='./themes/".$g['theme']."/images/icons/icon_carp.gif' title='CARP' alt='carp' />"; elseif ($vipent['mode'] == "other") echo "<img src='./themes/".$g['theme']."/images/icons/icon_other.gif' title='Other' alt='other' />"; elseif ($vipent['mode'] == "ipalias") echo "<img src='./themes/".$g['theme']."/images/icons/icon_ifalias.gif' title='IP Alias' alt='ip alias' />";?>
- </td>
- <td class="listbg" ondblclick="document.location='firewall_virtual_ip_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($vipent['descr']);?>&nbsp;
- </td>
- <td class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
- <tr>
- <td valign="middle"><a href="firewall_virtual_ip_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a></td>
- <td valign="middle"><a href="firewall_virtual_ip.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext('Do you really want to delete this entry?');?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <?php
- endif;
- $i++;
- endforeach;
- ?>
- <tfoot>
- <tr>
- <td class="list" colspan="4"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tr>
- <td width="17"></td>
- <td valign="middle"><a href="firewall_virtual_ip_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="edit" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td colspan="5">
- <p>
- <span class="vexpl"><span class="red"><strong><?=gettext("Note:");?><br /></strong></span>
- <?=gettext("The virtual IP addresses defined on this page may be used in");?><a href="firewall_nat.php"> <?=gettext("NAT"); ?> </a><?=gettext("mappings.");?><br />
- <?=gettext("You can check the status of your CARP Virtual IPs and interfaces ");?><a href="carp_status.php"><?=gettext("here");?></a>.</span>
- </p>
- </td>
- </tr>
- </tfoot>
- </table>
- </div><!-- div:mainarea -->
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ <tr>
+ <td>
+<?php
+ if (($vipent['type'] == "single") || ($vipent['type'] == "network"))
+ if($vipent['subnet_bits'])
+ print("{$vipent['subnet']}/{$vipent['subnet_bits']}");
+
+ if ($vipent['type'] == "range")
+ print("{$vipent['range']['from']}-{$vipent['range']['to']}");
+
+ if($vipent['mode'] == "carp")
+ print(" (vhid: {$vipent['vhid']})");
+?>
+ </td>
+ <td>
+ <?=htmlspecialchars($interfaces[$vipent['interface']])?>&nbsp;
+ </td>
+ <td>
+ <?=$types[$vipent['mode']]?>
+ </td>
+ <td>
+ <?=htmlspecialchars($vipent['descr'])?>
+ </td>
+ <td>
+ <a href="firewall_virtual_ip_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext('Edit')?></a>
+ <a href="firewall_virtual_ip.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext('Delete')?></a>
+ </td>
+ </tr>
+<?php
+ endif;
+ $i++;
+endforeach;
+?>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<nav class="action-buttons">
+ <a href="firewall_virtual_ip_edit.php" class="btn btn-sm btn-success"><?=gettext('Add Virtual IP')?></a>
+</nav>
+
+<?php
+
+print_info_box(gettext('The virtual IP addresses defined on this page may be used in ') . '<a href="firewall_nat.php">' . gettext('NAT') . '</a>' . gettext(' mappings.') . '<br />' .
+ gettext('You can check the status of your CARP Virtual IPs and interfaces ') . '<a href="carp_status.php">' . gettext('here') . '</a>');
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/firewall_virtual_ip_edit.php b/src/usr/local/www/firewall_virtual_ip_edit.php
index 6021115..caac6d3 100644
--- a/src/usr/local/www/firewall_virtual_ip_edit.php
+++ b/src/usr/local/www/firewall_virtual_ip_edit.php
@@ -3,45 +3,63 @@
/*
firewall_virtual_ip_edit.php
- part of pfSense (https://www.pfsense.org/)
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- Copyright (C) 2005 Bill Marquette <bill.marquette@gmail.com>.
- All rights reserved.
-
- Includes code from m0n0wall which is:
- Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Includes code from pfSense which is:
- Copyright (C) 2004-2005 Scott Ullrich <geekgod@pfsense.com>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004 Scott Ullrich
+ * Copyright (c) 2005 Bill Marquette <bill.marquette@gmail.com>
+ * Originally part of pfSense (https://www.pfsense.org)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/ifconfig
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -55,15 +73,10 @@ require("guiconfig.inc");
require_once("filter.inc");
require("shaper.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_virtual_ip.php');
-}
-
if (!is_array($config['virtualip']['vip'])) {
$config['virtualip']['vip'] = array();
}
+
$a_vip = &$config['virtualip']['vip'];
if (is_numericint($_GET['id'])) {
@@ -80,12 +93,14 @@ function return_first_two_octets($ip) {
function find_last_used_vhid() {
global $config, $g;
+
$vhid = 0;
foreach ($config['virtualip']['vip'] as $vip) {
if ($vip['vhid'] > $vhid) {
$vhid = $vip['vhid'];
}
}
+
return $vhid;
}
@@ -188,21 +203,20 @@ if ($_POST) {
case 'carp':
/* verify against reusage of vhids */
$idtracker = 0;
- foreach ($config['virtualip']['vip'] as $vip) {
- if ($vip['vhid'] == $_POST['vhid'] && $vip['interface'] == $_POST['interface'] && $idtracker <> $id) {
- $input_errors[] = sprintf(gettext("VHID %s is already in use on interface %s. Pick a unique number on this interface."), $_POST['vhid'], convert_friendly_interface_to_friendly_descr($_POST['interface']));
- }
+ foreach($config['virtualip']['vip'] as $vip) {
+ if($vip['vhid'] == $_POST['vhid'] && $vip['interface'] == $_POST['interface'] && $idtracker != $id)
+ $input_errors[] = sprintf(gettext("VHID %s is already in use on interface %s. Pick a unique number on this interface."),$_POST['vhid'], convert_friendly_interface_to_friendly_descr($_POST['interface']));
$idtracker++;
}
- if (empty($_POST['password'])) {
+
+ if (empty($_POST['password']))
$input_errors[] = gettext("You must specify a CARP password that is shared between the two VHID members.");
- }
- if ($_POST['interface'] == 'lo0') {
+ if ($_POST['interface'] == 'lo0')
$input_errors[] = gettext("For this type of vip localhost is not allowed.");
- } else if (strpos($_POST['interface'], '_vip')) {
+ else if (strpos($_POST['interface'], '_vip'))
$input_errors[] = gettext("A CARP parent interface can only be used with IP Alias type Virtual IPs.");
- }
+
break;
case 'ipalias':
if (strstr($_POST['interface'], "_vip")) {
@@ -215,20 +229,23 @@ if ($_POST) {
$parent_sn = get_interface_subnetv6($_POST['interface']);
$subnet = gen_subnetv6($parent_ip, $parent_sn);
}
+
if (isset($parent_ip) && !ip_in_subnet($_POST['subnet'], "{$subnet}/{$parent_sn}") &&
- !ip_in_interface_alias_subnet(link_carp_interface_to_parent($_POST['interface']), $_POST['subnet'])) {
+ !ip_in_interface_alias_subnet(link_carp_interface_to_parent($_POST['interface']), $_POST['subnet'])) {
$cannot_find = $_POST['subnet'] . "/" . $_POST['subnet_bits'] ;
- $input_errors[] = sprintf(gettext("Sorry, we could not locate an interface with a matching subnet for %s. Please add an IP alias in this subnet on this interface."), $cannot_find);
+ $input_errors[] = sprintf(gettext("Sorry, we could not locate an interface with a matching subnet for %s. Please add an IP alias in this subnet on this interface."),$cannot_find);
}
+
unset($parent_ip, $parent_sn, $subnet);
}
+
break;
default:
- if ($_POST['interface'] == 'lo0') {
+ if ($_POST['interface'] == 'lo0')
$input_errors[] = gettext("For this type of vip localhost is not allowed.");
- } else if (strpos($_POST['interface'], '_vip')) {
+ else if (strpos($_POST['interface'], '_vip'))
$input_errors[] = gettext("A CARP parent interface can only be used with IP Alias type Virtual IPs.");
- }
+
break;
}
@@ -245,6 +262,7 @@ if ($_POST) {
$vipent['range']['to'] = $_POST['range_to'];
}
+
$vipent['noexpand'] = isset($_POST['noexpand']);
}
@@ -271,6 +289,7 @@ if ($_POST) {
} else {
$vipent['subnet_bits'] = $_POST['subnet_bits'];
}
+
$vipent['subnet'] = $_POST['subnet'];
}
@@ -284,6 +303,7 @@ if ($_POST) {
}
$toapplylist[$id] = $a_vip[$id];
+
if (!empty($a_vip[$id])) {
/* modify all virtual IP rules with this address */
for ($i = 0; isset($config['nat']['rule'][$i]); $i++) {
@@ -292,281 +312,250 @@ if ($_POST) {
}
}
}
+
$a_vip[$id] = $vipent;
if (write_config()) {
mark_subsystem_dirty('vip');
file_put_contents("{$g['tmp_path']}/.firewall_virtual_ip.apply", serialize($toapplylist));
}
+
header("Location: firewall_virtual_ip.php");
exit;
}
}
-$pgtitle = array(gettext("Firewall"), gettext("Virtual IP Address"), gettext("Edit"));
+$ipaliashelp = gettext('The mask must be the network\'s subnet mask. It does not specify a CIDR range.');
+$proxyarphelp = gettext('Enter a CIDR block of proxy ARP addresses.');
+
+$pgtitle = array(gettext("Firewall"),gettext("Virtual IP Address"),gettext("Edit"));
include("head.inc");
-?>
+function build_if_list() {
+ $list = array();
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
-function get_radio_value(obj) {
- for (i = 0; i < obj.length; i++) {
- if (obj[i].checked) {
- return obj[i].value;
- }
- }
- return null;
+ $interfaces = get_configured_interface_with_descr(false, true);
+ $carplist = get_configured_carp_interface_list();
+
+ foreach ($carplist as $cif => $carpip)
+ $interfaces[$cif] = $carpip . ' (' . get_vip_descr($carpip) . ')';
+
+ $interfaces['lo0'] = 'Localhost';
+
+ return($interfaces);
}
-function set_note(noteMessage) {
- var note = document.getElementById("typenote");
- if (note.firstChild != null) {
- note.removeChild(note.firstChild);
- }
- if (noteMessage) {
- note.appendChild(noteMessage);
- }
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Edit Virtual IP');
+
+$group = new Form_Group('Type');
+
+$group->add(new Form_Checkbox(
+ 'mode',
+ null,
+ 'IP Alias',
+ ($pconfig['mode'] == "ipalias"),
+ 'ipalias'
+))->displayAsRadio();
+
+$group->add(new Form_Checkbox(
+ 'mode',
+ null,
+ 'CARP',
+ ($pconfig['mode'] == "carp"),
+ 'carp'
+))->displayAsRadio();
+
+$group->add(new Form_Checkbox(
+ 'mode',
+ null,
+ 'Proxy ARP',
+ ($pconfig['mode'] == "proxyarp"),
+ 'proxyarp'
+))->displayAsRadio();
+
+$group->add(new Form_Checkbox(
+ 'mode',
+ null,
+ 'Other',
+ ($pconfig['mode'] == "other"),
+ 'other'
+))->displayAsRadio();
+
+$section->add($group);
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ $pconfig['interface'],
+ build_if_list()
+));
+
+$section->addInput(new Form_Select(
+ 'type',
+ 'Address type',
+ ((!$pconfig['range'] && $pconfig['subnet_bits'] == 32) || (!isset($pconfig['subnet']))) ? 'single':'network',
+ array(
+ 'single' => 'Single address',
+ 'network' => 'Network'
+ )
+))->addClass('typesel');
+
+$section->addInput(new Form_IpAddress(
+ 'subnet',
+ 'Address(es)',
+ $pconfig['subnet']
+))->addMask('subnet_bits', $pconfig['subnet_bits'])->setHelp('<span id="address_note"></span>');
+
+$section->addInput(new Form_Checkbox(
+ 'noexpand',
+ 'Expansion',
+ 'Disable expansion of this entry into IPs on NAT lists (e.g. 192.168.1.0/24 expands to 256 entries.) ',
+ isset($pconfig['noexpand'])
+));
+
+$section->addInput(new Form_Input(
+ 'password',
+ 'Virtual IP Password',
+ 'password',
+ $pconfig['password']
+))->setHelp('Enter the VHID group password.');
+
+$section->addInput(new Form_Select(
+ 'vhid',
+ 'VHID Group',
+ $pconfig['vhid'],
+ array_combine(range(1, 255, 1), range(1, 255, 1))
+))->setHelp('Enter the VHID group that the machines will share');
+
+$group = new Form_Group('Advertising frequency');
+$group->add(new Form_Select(
+ 'advbase',
+ 'Base',
+ $pconfig['advbase'],
+ array_combine(range(1, 254, 1), range(1, 254, 1))
+))->setHelp('Base');
+
+$group->add(new Form_Select(
+ 'advskew',
+ 'Skew',
+ $pconfig['advskew'],
+ array_combine(range(0, 254, 1), range(0, 254, 1))
+))->setHelp('Skew');
+
+$group->setHelp('The frequency that this machine will advertise. 0 means usually master. Otherwise the lowest combination of both values in the cluster determines the master.');
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+if (isset($id) && $a_vip[$id]){
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
}
-function enable_change() {
- var carpnote = document.createTextNode("<?=gettext("This must be the network's subnet mask. It does not specify a CIDR range.");?>");
- var proxyarpnote = document.createTextNode("<?=gettext("This is a CIDR block of proxy ARP addresses.");?>");
- var ipaliasnote = document.createTextNode("<?=gettext("This must be the network's subnet mask. It does not specify a CIDR range.");?>");
- $mode = get_radio_value(document.iform.mode);
+$section->addInput(new Form_Input(
+ 'uniqid',
+ null,
+ 'hidden',
+ $pconfig['uniqid']
+));
+
+$form->add($section);
- document.iform.password.disabled = $mode != "carp";
- document.iform.vhid.disabled = $mode != "carp";
- document.iform.advskew.disabled = $mode != "carp";
- document.iform.advbase.disabled = $mode != "carp";
- document.iform.type.disabled = $mode in {"carp":1, "ipalias":1};
+print($form);
+
+print_info_box(gettext("Proxy ARP and Other type Virtual IPs cannot be bound to by anything running on the firewall, such as IPsec, OpenVPN, etc. Use a CARP or IP Alias type address for these types.") . '<br />' .
+ sprintf(gettext("For more information on CARP and the above values, visit the OpenBSD %s"), '<a href="http://www.openbsd.org/faq/pf/carp.html">CARP FAQ"</a>'));
+?>
- if ($mode in {"carp":1, "ipalias":1}) {
- document.iform.type.selectedIndex = 0;// single-adress
+<script>
+//<![CDATA[
+events.push(function(){
+
+ // Hides the <div> in which the specified checkbox lives so that the checkbox, its label and help text are hidden
+ function hideCheckbox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
}
- switch ($mode) {
- case "carp" : set_note(carpnote); break;
- case "ipalias" : set_note(ipaliasnote); break;
- case "proxyarp": set_note(proxyarpnote); break;
- default: set_note(undefined);
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
}
- typesel_change();
-}
-function typesel_change() {
- switch (document.iform.type.selectedIndex) {
- case 0: // single
- document.iform.subnet.disabled = 0;
- document.iform.subnet_bits.disabled = (get_radio_value(document.iform.mode) == "proxyarp") || (get_radio_value(document.iform.mode) == "other");
- document.iform.noexpand.disabled = 1;
- jQuery('#noexpandrow').css('display', 'none');
- break;
- case 1: // network
- document.iform.subnet.disabled = 0;
- document.iform.subnet_bits.disabled = 0;
- document.iform.noexpand.disabled = 0;
- jQuery('#noexpandrow').css('display', '');
- //document.iform.range_from.disabled = 1;
- //document.iform.range_to.disabled = 1;
- break;
- case 2: // range
- document.iform.subnet.disabled = 1;
- document.iform.subnet_bits.disabled = 1;
- document.iform.noexpand.disabled = 1;
- jQuery('#noexpandrow').css('display', 'none');
- //document.iform.range_from.disabled = 0;
- //document.iform.range_to.disabled = 0;
- break;
- case 3: // IP alias
- document.iform.subnet.disabled = 1;
- document.iform.subnet_bits.disabled = 0;
- document.iform.noexpand.disabled = 1;
- jQuery('#noexpandrow').css('display', 'none');
- //document.iform.range_from.disabled = 0;
- //document.iform.range_to.disabled = 0;
- break;
+ // Hide/show input elements depending on the 'mode' radio button setting
+ function check_mode() {
+ var mode = $("input[name=mode]:checked").val();
+
+ disableInput('vhid', true);
+ disableInput('advbase', true);
+ disableInput('advskew', true);
+ disableInput('subnet_bits', true);
+ disableInput('type', true);
+ disableInput('password', true);
+ hideCheckbox('noexpand', true);
+
+ if(mode == 'ipalias') {
+ $('#address_note').html("<?=$ipaliashelp?>");
+ disableInput('subnet_bits', false);
+ $('#type').val('single');
+
+ }
+ else if(mode == 'carp') {
+ $('#address_note').html("<?=$ipaliashelp?>");
+ disableInput('vhid', false);
+ disableInput('advbase', false);
+ disableInput('advskew', false);
+ disableInput('subnet_bits', false);
+ disableInput('password', false);
+ $('#type').val('single');
+ }
+ else if(mode == 'proxyarp') {
+ $('#address_note').html("<?=$proxyarphelp?>");
+ disableInput('type', false);
+ disableInput('subnet_bits', $('#type').val() == 'single');
+ }
+ else {
+ $('#address_note').html('');
+ disableInput('type', false);
+ }
}
-}
-//]]>
-</script>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="firewall_virtual_ip_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="virtual IP edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Virtual IP");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Type");?></td>
- <td width="78%" class="vtable">
- <input name="mode" type="radio" onclick="enable_change()" value="ipalias"
- <?php if ($pconfig['mode'] == "ipalias") echo "checked=\"checked\"";?> /> <?=gettext("IP Alias");?>
- <input name="mode" type="radio" onclick="enable_change()" value="carp"
- <?php if ($pconfig['mode'] == "carp") echo "checked=\"checked\"";?> /> <?=gettext("CARP"); ?>
- <input name="mode" type="radio" onclick="enable_change()" value="proxyarp"
- <?php if ($pconfig['mode'] == "proxyarp") echo "checked=\"checked\"";?> /> <?=gettext("Proxy ARP"); ?>
- <input name="mode" type="radio" onclick="enable_change()" value="other"
- <?php if ($pconfig['mode'] == "other") echo "checked=\"checked\"";?> /> <?=gettext("Other");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
- <td width="78%" class="vtable">
- <select name="interface" class="formselect">
- <?php
- $interfaces = get_configured_interface_with_descr(false, true);
- $carplist = get_configured_carp_interface_list();
- foreach ($carplist as $cif => $carpip) {
- $interfaces[$cif] = $carpip . ' (' . get_vip_descr($carpip) . ')';
- }
- $interfaces['lo0'] = 'Localhost';
- foreach ($interfaces as $iface => $ifacename): ?>
- <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
- <?php
- endforeach;
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("IP Address(es)");?></td>
- <td class="vtable">
- <table border="0" cellspacing="0" cellpadding="0" summary="ip addresses">
- <tr>
- <td><?=gettext("Type:");?>&nbsp;&nbsp;</td>
- <td>
- <select name="type" class="formselect" onchange="typesel_change()">
- <option value="single" <?php if ((!$pconfig['range'] && $pconfig['subnet_bits'] == 32) || (!isset($pconfig['subnet']))) echo "selected=\"selected\""; ?>>
- <?=gettext("Single address");?>
- </option>
- <option value="network" <?php if (!$pconfig['range'] && $pconfig['subnet_bits'] != 32 && isset($pconfig['subnet'])) echo "selected=\"selected\""; ?>>
- <?=gettext("Network");?>
- </option>
- <!-- XXX: Billm, don't let anyone choose this until NAT configuration screens are ready for it <option value="range" <?php if ($pconfig['range']) echo "selected=\"selected\""; ?>>
- Range</option> -->
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
- <td>
- <input name="subnet" type="text" class="formfld unknown ipv4v6" id="subnet" size="28" value="<?=htmlspecialchars($pconfig['subnet']);?>" />
- /
- <select name="subnet_bits" class="formselect ipv4v6" id="select">
- <?php for ($i = 128; $i >= 1; $i--): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['subnet_bits']) echo "selected=\"selected\""; ?>>
- <?=$i;?>
- </option>
- <?php endfor; ?>
- </select>
- <i id="typenote"></i>
- </td>
- </tr>
- <tr id="noexpandrow">
- <td><?=gettext("Expansion:");?>&nbsp;&nbsp;</td>
- <td>
- <input name="noexpand" type="checkbox" class="formfld unknown" id="noexpand" <?php echo (isset($pconfig['noexpand'])) ? "checked=\"checked\"" : "" ; ?> />
- Disable expansion of this entry into IPs on NAT lists (e.g. 192.168.1.0/24 expands to 256 entries.)
- </td>
- </tr>
- <?php
- /*
- <tr>
- <td>Range:&nbsp;&nbsp;</td>
- <td><input name="range_from" type="text" class="formfld unknown" id="range_from" size="28" value="<?=htmlspecialchars($pconfig['range']['from']);?>" />
--
- <input name="range_to" type="text" class="formfld unknown" id="range_to" size="28" value="<?=htmlspecialchars($pconfig['range']['to']);?>" />
- </td>
- </tr>
- */
-?>
- </table>
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncellreq"><?=gettext("Virtual IP Password");?></td>
- <td class="vtable"><input type='password' name='password' value="<?=htmlspecialchars($pconfig['password']);?>" />
- <br /><?=gettext("Enter the VHID group password.");?>
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncellreq"><?=gettext("VHID Group");?></td>
- <td class="vtable">
- <select id='vhid' name='vhid'>
- <?php for ($i = 1; $i <= 255; $i++): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['vhid']) echo "selected=\"selected\""; ?>>
- <?=$i;?>
- </option>
- <?php endfor; ?>
- </select>
- <br /><?=gettext("Enter the VHID group that the machines will share");?>
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncellreq"><?=gettext("Advertising Frequency");?></td>
- <td class="vtable">
- Base:
- <select id='advbase' name='advbase'>
- <?php for ($i = 1; $i <= 254; $i++): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['advbase']) echo "selected=\"selected\""; ?>>
- <?=$i;?>
- </option>
- <?php endfor; ?>
- </select>
- Skew:
- <select id='advskew' name='advskew'>
- <?php for ($i = 0; $i <= 254; $i++): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['advskew']) echo "selected=\"selected\""; ?>>
- <?=$i;?>
- </option>
- <?php endfor; ?>
- </select>
- <br /><br />
- <?=gettext("The frequency that this machine will advertise. 0 means usually master. Otherwise the lowest combination of both values in the cluster determines the master.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_vip[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- <input name="uniqid" type="hidden" value="<?=$pconfig['uniqid'];?>" />
- </td>
- </tr>
- <tr>
- <td colspan="4">
- <span class="vexpl">
- <span class="red">
- <b><?=gettext("Note:");?><br /></b>
- </span>&nbsp;&nbsp;
- <?=gettext("Proxy ARP and Other type Virtual IPs cannot be bound to by anything running on the firewall, such as IPsec, OpenVPN, etc. Use a CARP or IP Alias type address for these cases.");?>
- <br /><br />&nbsp;&nbsp;&nbsp;<?=gettext("For more information on CARP and the above values, visit the OpenBSD ");?><a href='http://www.openbsd.org/faq/pf/carp.html'> <?=gettext("CARP FAQ"); ?></a>.
- </span>
- </td>
- </tr>
- </table>
-</form>
-<script type="text/javascript">
-//<![CDATA[
-enable_change();
+ // When radio buttons are clicked . .
+ $('input:radio[name=mode]').click(function() {
+ check_mode();
+ });
+
+ // On clicking the address type selector
+ $('#type').on('change', function() {
+ check_mode();
+ hideCheckbox('noexpand', (this.value == 'single'));
+ });
+
+ // On initial page load
+ check_mode();
+});
//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/foot.inc b/src/usr/local/www/foot.inc
new file mode 100755
index 0000000..f5108dd
--- /dev/null
+++ b/src/usr/local/www/foot.inc
@@ -0,0 +1,27 @@
+ <!--
+ pfSense_MODULE: footer
+ -->
+<?php
+/*
+ * We put jquery in the footer; it is the preferred position for speed
+ * and helps developers to use events[] instead of executing scripts directly.
+ */
+?>
+ </div>
+
+ <footer class="footer">
+ <div class="container">
+ <p class="text-muted">
+ <a target="_blank" href="<?=$g['product_website_footer']?>"><?=$g['product_name']?></a> is &copy;
+ <?=$g['product_copyright_years']?> by <a href="<?=$g['product_copyright_url']?>" class="tblnk"><?=$g['product_copyright']?></a>. All Rights Reserved.
+ [<a href="/license.php" class="tblnk">view license</a>]
+ </p>
+ </div>
+ </footer>
+
+ <script src="/jquery/jquery-1.11.2.min.js"></script>
+ <script src="/jquery/jquery-ui-1.11.2.min.js"></script>
+ <script src="/bootstrap/js/bootstrap.min.js"></script>
+ <script src="/jquery/pfSense.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/usr/local/www/getserviceproviders.php b/src/usr/local/www/getserviceproviders.php
index cb456aa..c38d356 100644
--- a/src/usr/local/www/getserviceproviders.php
+++ b/src/usr/local/www/getserviceproviders.php
@@ -1,31 +1,59 @@
<?php
/*
getserviceproviders.php
- Copyright (C) 2010 Vinicius Coque <vinicius.coque@bluepex.com>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2010 Vinicius Coque <vinicius.coque@bluepex.com>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: ajax
*/
diff --git a/src/usr/local/www/getstats.php b/src/usr/local/www/getstats.php
index 886114b..42f61bf 100644
--- a/src/usr/local/www/getstats.php
+++ b/src/usr/local/www/getstats.php
@@ -1,31 +1,58 @@
<?php
/*
getstats.php
- Copyright (C) 2009 Bill Marquette
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2009 Bill Marquette
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: ajax
*/
diff --git a/src/usr/local/www/graph.php b/src/usr/local/www/graph.php
index d637836..f9ccb98 100755
--- a/src/usr/local/www/graph.php
+++ b/src/usr/local/www/graph.php
@@ -1,34 +1,59 @@
<?php
/*
graph.php
- part of m0n0wall (http://m0n0.ch/wall)
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2004-2006 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
- and Jonathan Watt <jwatt@jwatt.org>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004-2006 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ * and Jonathan Watt <jwatt@jwatt.org>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: graph
*/
diff --git a/src/usr/local/www/graph_cpu.php b/src/usr/local/www/graph_cpu.php
index 80d97f1..75b8ad7 100644
--- a/src/usr/local/www/graph_cpu.php
+++ b/src/usr/local/www/graph_cpu.php
@@ -1,35 +1,63 @@
<?php
/*
$Id$
- part of m0n0wall (http://m0n0.ch/wall)
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
- and Jonathan Watt <jwatt@jwatt.org>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
/*
+ graph_cpu.php
+*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004-2006 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ * and Jonathan Watt <jwatt@jwatt.org>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
+/*
pfSense_MODULE: graph
*/
diff --git a/src/usr/local/www/green_dot.jpg b/src/usr/local/www/green_dot.jpg
deleted file mode 100755
index 9df0abf..0000000
--- a/src/usr/local/www/green_dot.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/gui.css b/src/usr/local/www/gui.css
deleted file mode 100755
index d93c4d9..0000000
--- a/src/usr/local/www/gui.css
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- pfSense_MODULE: base
-*/
-
-html,body {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 11px;
-}
-td,th,input,select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 11px;
-}
-form {
- margin: 0px;
-}
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
-
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-a {
- text-decoration: none;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 0.9em;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #FFFFFF;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listrborder {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
diff --git a/src/usr/local/www/guiconfig.inc b/src/usr/local/www/guiconfig.inc
index 3b36f5f..b214c0d 100644
--- a/src/usr/local/www/guiconfig.inc
+++ b/src/usr/local/www/guiconfig.inc
@@ -1,35 +1,60 @@
<?php
/*
guiconfig.inc
- by Scott Ullrich, Copyright 2004, All rights reserved.
- originally based on of m0n0wall (http://m0n0.ch/wall)
-
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: base
+ pfSense_MODULE: base
*/
/* Include authentication routines */
@@ -268,31 +293,16 @@ function do_input_validation($postdata, $reqdfields, $reqdfieldsn, &$input_error
}
function print_input_errors($input_errors) {
- global $g;
+ echo '<div class="alert alert-danger input-errors">';
+ echo '<p>' . gettext('The following input errors were detected:') . '</p>';
+ echo '<ul>';
- print <<<EOF
- <div id="inputerrorsdiv">
- <table border="0" cellspacing="0" cellpadding="4" width="100%" summary="input errors">
- <tr>
- <td class="inputerrorsleft">
- <img src="/themes/{$g['theme']}/images/icons/icon_error.gif" alt="errors" />
- </td>
- <td class="inputerrorsright errmsg">
-EOF;
- echo "<p>" . gettext("The following input errors were detected:") . "</p>\n<ul>";
foreach ($input_errors as $ierr) {
- echo "<li>" . htmlspecialchars($ierr) . "</li>";
+ echo '<li>' . htmlspecialchars($ierr) . '</li>';
}
- print <<<EOF2
- </ul>
- </td>
- </tr>
- </table>
- </div>
- &nbsp;<br />
-EOF2;
-
+ echo '</ul>';
+ echo '</div>';
}
function verify_gzip_file($fname) {
@@ -304,77 +314,29 @@ function verify_gzip_file($fname) {
}
}
-function print_info_box_np($msg, $name = "apply", $value = "", $showapply = false) {
- global $g, $nifty_redbox, $nifty_blackbox, $nifty_background;
+function print_info_box_np($msg, $name="apply",$value="", $showapply=false, $class="alert-warning") {
+ global $g;
+
+ if(strpos($class, "alert-") !== 0)
+ $class = 'alert-' . $class;
- if (empty($value)) {
+ if(empty($value)) {
$value = gettext("Apply changes");
}
- // Set the Nifty background color if one is not set already (defaults to white)
- if ($nifty_background == "") {
- $nifty_background = "#FFF";
- }
+ $msg = '<div class="pull-left">' . $msg . '</div>';
if (stristr($msg, gettext("apply")) != false || stristr($msg, gettext("save")) != false || stristr($msg, gettext("create")) != false || $showapply) {
- $savebutton = "<td class=\"infoboxsave\">";
- $savebutton .= "<input name=\"{$name}\" type=\"submit\" class=\"formbtn\" id=\"${name}\" value=\"{$value}\" />";
- if ($_POST['if']) {
- $savebutton .= "<input type=\"hidden\" name=\"if\" value=\"" . htmlspecialchars($_POST['if']) . "\" />";
- }
- $savebutton .= "</td>";
- }
- $nifty_redbox = "#990000";
- $nifty_blackbox = "#000000";
-
- $themename = $g['theme'];
+ $msg .= '<form method="post" class="pull-right"><button type="submit" class="btn btn-default" name="'. $name .'" value="'.$value.'">'.$name.'</button>';
- if (file_exists("/usr/local/www/themes/{$themename}/tabcontrols.php")) {
- $toeval = file_get_contents("/usr/local/www/themes/{$themename}/tabcontrols.php");
- eval($toeval);
- }
-
- if (file_exists("/usr/local/www/themes/{$themename}/infobox.php")) {
- $toeval = file_get_contents("/usr/local/www/themes/{$themename}/infobox.php");
- eval($toeval);
- }
+ if ($_POST['if'])
+ $msg .= "<input type=\"hidden\" name=\"if\" value=\"" . htmlspecialchars($_POST['if']) . "\" />";
- if (!$savebutton) {
- $savebutton = "<td class=\"infoboxsave\"><input value=\"" . gettext("Close") . "\" type=\"button\" onclick=\"jQuery(this).parents('table[id=redboxtable]').hide();\" /></td>";
- }
-
- echo <<<EOFnp
- <table class="infobox" id="redboxtable" summary="red box table">
- <tr>
- <td>
- <div class="infoboxnp" id="redbox">
- <table class="infoboxnptable2" summary="message">
- <tr>
- <td class="infoboxnptd">
- &nbsp;&nbsp;&nbsp;<img class="infoboxnpimg" src="/themes/{$g['theme']}/images/icons/icon_exclam.gif" alt="exclamation" />
- </td>
- <td class="infoboxnptd2">
- <b>{$msg}</b>
- </td>
- {$savebutton}
- </tr>
- </table>
- </div>
- <div>
- <p>&nbsp;</p>
- </div>
- </td>
- </tr>
- </table>
- <script type="text/javascript">
- //<![CDATA[
- NiftyCheck();
- Rounded("div#redbox","all","{$nifty_background}","{$nifty_redbox}","smooth");
- Rounded("td#blackbox","all","{$nifty_background}","{$nifty_blackbox}","smooth");
- //]]>
- </script>
-EOFnp;
+ $msg .= '</form>';
+ } else
+ $msg = '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>'. $msg;
+ echo '<div class="alert ' . $class . ' clearfix" role="alert">'.$msg.'</div>';
}
function print_info_box_np_undo($msg, $name = "apply", $value = "Apply changes", $undo) {
@@ -444,8 +406,9 @@ EOFnp;
}
-function print_info_box($msg) {
- print_info_box_np($msg);
+function print_info_box($msg, $class="alert-warning") {
+ print_info_box_np($msg, null, null, false, $class);
+
}
function get_std_save_message($ok) {
@@ -595,8 +558,19 @@ function gentitle($title) {
}
function genhtmltitle($title) {
- global $config;
- return gentitle($title);
+ if(!is_array($title))
+ return '<h1 class="page-header">' . $title . '</h1>';
+
+ $heading = '<h1 class="page-header">' . end($title) . '</h1>';
+
+ $bc = '<ol class="breadcrumb">';
+
+ foreach ($title as $el)
+ $bc .= '<li>'.$el.'</li>';
+
+ $bc .= '</ol>';
+
+ return $heading . $bc;
}
/* update the changedesc and changecount(er) variables */
@@ -644,6 +618,57 @@ function clear_all_log_files() {
return;
}
+// This version of dump_clog() does not output <td></td> or any other table elements. It can be renamed
+// and the dump_clog() removed once all of the diag_log*.php files have been converted to Bootstrap
+function dump_clog_no_table($logfile, $tail, $withorig = true, $grepfor = "", $grepinvert = "") {
+ global $g, $config;
+ $sor = isset($config['syslog']['reverse']) ? "-r" : "";
+ $logarr = "";
+ $grepline = " ";
+ if(is_array($grepfor))
+ $grepline .= " | /usr/bin/egrep " . escapeshellarg(implode("|", $grepfor));
+ if(is_array($grepinvert))
+ $grepline .= " | /usr/bin/egrep -v " . escapeshellarg(implode("|", $grepinvert));
+ if (is_dir($logfile)) {
+ $logarr = array("File $logfile is a directory.");
+ } elseif (file_exists($logfile) && filesize($logfile) == 0) {
+ $logarr = array("Log file started.");
+ } else {
+ if($config['system']['disablesyslogclog']) {
+ exec("cat " . escapeshellarg($logfile) . "{$grepline} | /usr/bin/tail {$sor} -n " . escapeshellarg($tail), $logarr);
+ } else {
+ if(isset($config['system']['usefifolog']))
+ exec("/usr/sbin/fifolog_reader " . escapeshellarg($logfile) . "{$grepline} | /usr/bin/tail {$sor} -n " . escapeshellarg($tail), $logarr);
+ else
+ exec("/usr/local/sbin/clog " . escapeshellarg($logfile) . "{$grepline}| grep -v \"CLOG\" | grep -v \"\033\" | /usr/bin/tail {$sor} -n " . escapeshellarg($tail), $logarr);
+ }
+ }
+ echo "\n";
+
+ $rows = 0;
+ foreach ($logarr as $logent) {
+ $rows++;
+ $logent = preg_split("/\s+/", $logent, 6);
+
+ if ($withorig) {
+ if(isset($config['system']['usefifolog'])) {
+ $entry_date_time = htmlspecialchars(date("F j, Y, g:i a","" . $logent[1] . ""));
+ $entry_text = htmlspecialchars($logent[5]);
+ } else {
+ $entry_date_time = htmlspecialchars(join(" ", array_slice($logent, 0, 3)));
+ $entry_text = ($logent[3] == $config['system']['hostname']) ? "" : $logent[3] . " ";
+ $entry_text .= htmlspecialchars($logent[4] . " " . $logent[5]);
+ }
+ echo "{$entry_date_time}";
+ echo " " . "{$entry_text}" . "\n";
+ } else {
+ echo htmlspecialchars($logent[5]) . "\n";
+ }
+
+ }
+ return($rows);
+}
+
function dump_clog($logfile, $tail, $withorig = true, $grepfor = "", $grepinvert = "") {
global $g, $config;
$sor = isset($config['syslog']['reverse']) ? "-r" : "";
@@ -1003,23 +1028,23 @@ function echo_array($array, $return_me = false) {
/****f* pfsense-utils/display_top_tabs
* NAME
- * display_top_tabs - display tabs with rounded edges
+ * display_top_tabs - display tabs with rounded edges
* INPUTS
- * $text - array of tabs
+ * $text - array of tabs
* RESULT
- * null
+ * null
******/
-function display_top_tabs(& $tab_array, $no_drop_down = false) {
+function display_top_tabs(& $tab_array, $no_drop_down = false, $type = 'pills') {
global $config;
global $g;
global $tab_array_indent;
global $tab_array_space;
global $tab_array_char_limit;
- /* does the user have access to this tab?
- * master user has access to everything.
- * if the user does not have access, simply
- * unset the tab item.
+ /* does the user have access to this tab?
+ * master user has access to everything.
+ * if the user does not have access, simply
+ * unset the tab item.
*/
/* empty string code */
@@ -1041,40 +1066,30 @@ function display_top_tabs(& $tab_array, $no_drop_down = false) {
}
}
- $tab_active_bg = "#EEEEEE";
+ $tab_active_bg = "#EEEEEE";
$tab_inactive_bg = "#777777";
$nifty_tabs_corners = "#FFF";
$font_color = "white";
- /* if tabcontrols.php exist for a theme, allow it to be overridden */
- $themename = $config['theme'];
- $filename = "/usr/local/www/themes/{$themename}/tabcontrols.php";
- if (file_exists($filename)) {
- $eval_code = file_get_contents($filename);
- eval($eval_code);
- }
-
$tabcharcount = 0;
- foreach ($tab_array as $ta) {
+ foreach ($tab_array as $ta)
$tabcharcount = $tabcharcount + strlen($ta[0]);
- }
- if ($no_drop_down == true) {
+ if($no_drop_down == true) {
$tabcharcount = 0;
unset($tab_array_char_limit);
}
// If the character count of the tab names is > 670
// then show a select item dropdown menubox.
- if ($tabcharcount > $tab_array_char_limit) {
+ if($tabcharcount > $tab_array_char_limit): ?>
echo gettext("Currently viewing: ");
echo "<select name=\"TabSelect\" onchange=\"tabs_will_go(this)\">\n";
foreach ($tab_array as $ta) {
- if ($ta[1] == "true") {
+ if($ta[1]=="true")
$selected = " selected=\"selected\"";
- } else {
+ else
$selected = "";
- }
// Onclick in option will not work in some browser
// echo "<option onclick=\"document.location='{$ta[2]}';\"{$selected}>{$ta['0']}</option>\n";
echo "<option value=\"{$ta[2]}\"{$selected}>{$ta['0']}</option>\n";
@@ -1082,30 +1097,22 @@ function display_top_tabs(& $tab_array, $no_drop_down = false) {
echo "</select>\n<p>&nbsp;</p>";
echo "<script type=\"text/javascript\">";
echo "\n//<![CDATA[\n";
- echo " function tabs_will_go(obj) { document.location = obj.value; }\n";
+ echo " function tabs_will_go(obj){ document.location = obj.value; }\n";
echo "//]]>\n";
echo "</script>";
- } else {
- echo "<div class=\"newtabmenu\" style=\"margin:{$tab_array_space}px {$tab_array_indent}px; width:775px;\">\n";
- echo "<!-- Tabbed bar code-->\n";
- echo "<ul class=\"newtabmenu\">\n";
- $tabscounter = 0;
- foreach ($tab_array as $ta) {
- if ($ta[1] == true) {
- echo " <li class=\"newtabmenu_active\"><a href=\"{$ta[2]}\"><span>{$ta[0]}</span></a></li>\n";
- } else {
- echo " <li><a href=\"{$ta[2]}\"><span>{$ta[0]}</span></a></li>\n";
- }
- $tabscounter++;
- }
- echo "</ul>\n</div>\n";
- }
+<? else: ?>
+ <ul class="nav nav-<?= $type ?>">
+ <?php foreach ($tab_array as $ta): ?>
+ <li role="presentation"<?=($ta[1] ? ' class="active"' : '')?>><a href="<?=$ta[2]?>"><?=$ta[0]?></a></li>
+ <?php endforeach; ?>
+ </ul>
+<?php endif;
}
function add_package_tabs($pkgname, &$tab_array) {
global $config, $g;
- $pkg = get_pkg_data($pkgname);
+// $pkg = get_pkg_data($pkgname);
if (!isset($pkg['configurationfile']) || !file_exists('/usr/local/pkg/' . $pkg['configurationfile'])) {
return;
@@ -1130,118 +1137,79 @@ function add_package_tabs($pkgname, &$tab_array) {
function alias_info_popup($alias_id) {
global $config;
+
+ if (!is_array($config['aliases']['alias'][$alias_id]))
+ return;
+
$maxlength = 60;
- $close_title="title='".gettext('move mouse out of this alias to hide')."'";
- if (is_array($config['aliases']['alias'][$alias_id])) {
- $alias_name = $config['aliases']['alias'][$alias_id];
- $alias_objects_with_details = "<table width=\"100%\" border=\"0\" cellpadding=\"2\" cellspacing=\"0\" summary=\"alias info popup\">";
- if ($alias_name['url']) {
- // TODO: Change it when pf supports tables with ports
- if ($alias_name['type'] == "urltable") {
- exec("/sbin/pfctl -t {$alias_name['name']} -T show | wc -l", $total_entries);
- $counter = preg_replace("/\D/", "", $total_entries[0]);
- exec("/sbin/pfctl -t {$alias_name['name']} -T show | head -10002", $alias_addresses);
- } else {
- $urlfn = alias_expand_urltable($alias_name['name']);
- $alias_addresses = explode("\n", file_get_contents($urlfn));
- $counter = count($alias_addresses);
- }
- $alias_objects_with_details .= "<tr><td colspan=\"3\" $close_title class=\"vncell\">{$alias_name['url']}</td></tr>";
- $x = 0;
- foreach ($alias_addresses as $alias_ports_address) {
- switch ($x) {
- case 0:
- $x++;
- $alias_objects_with_details .= "<tr><td $close_title class=\"vncell\" width=\"33%\" style=\"background: #FFFFFF;color: #000000;\">{$alias_ports_address}</td>";
- break;
- case 1:
- $x++;
- $alias_objects_with_details .= "<td $close_title class=\"vncell\" width=\"33%\" style=\"background: #FFFFFF;color: #000000;\">{$alias_ports_address}</td>";
- break;
- default:
- $x = 0;
- $alias_objects_with_details .= "<td $close_title class=\"vncell\" width=\"33%\" style=\"background: #FFFFFF;color: #000000;\">{$alias_ports_address}</td><tr>";
- break;
- }
- }
- for ($y = $x; $y <= $x; $y++) {
- $alias_objects_with_details .= "<td $close_title class=\"vncell\" width=\"33%\">&nbsp;</td>";
- }
- if ($x > 0) {
- $alias_objects_with_details .= "</tr>";
- }
- if ($counter > 10002) {
- $alias_objects_with_details .= "<tr><td colspan=\"3\"> ". gettext("listing only first 10k items") . "</td><tr>";
- }
+ $alias = $config['aliases']['alias'][$alias_id];
+ $content = "";
+
+ if ($alias['url'])
+ {
+ // TODO: Change it when pf supports tables with ports
+ if ($alias['type'] == "urltable") {
+ exec("/sbin/pfctl -t {$alias['name']} -T show | wc -l", $total_entries);
+ $counter=preg_replace("/\D/","",$total_entries[0]);
+ exec("/sbin/pfctl -t {$alias['name']} -T show | head -10002", $alias_addresses);
} else {
- $alias_addresses = explode (" ", $alias_name['address']);
- $alias_details = explode ("||", $alias_name['detail']);
- $counter = 0;
- foreach ($alias_addresses as $alias_ports_address) {
- $alias_objects_with_details .= "<tr><td $close_title width=\"5%\" class=\"vncell\" style=\"background: #FFFFFF;color: #000000;\">{$alias_addresses[$counter]}</td>";
- $alias_detail_default = strpos ($alias_details[$counter], "Entry added");
- if ($alias_details[$counter] != "" && $alias_detail_default === False) {
- $alias_objects_with_details .="<td $close_title width=\"95%\" class=\"vncell\" style=\"background: #FFFFFF;color: #000000;\">{$alias_details[$counter]}</td>";
- } else {
- $alias_objects_with_details .="<td $close_title width=\"95%\" class=\"vncell\" style=\"background: #FFFFFF;color: #000000;\">&nbsp;</td>";
- }
- $alias_objects_with_details .= "</tr>";
- $counter++;
- }
+ $urlfn = alias_expand_urltable($alias['name']);
+ $alias_addresses = explode("\n", file_get_contents($urlfn));
+ $counter = count($alias_addresses);
}
- $alias_objects_with_details .= "</table>";
+
+ $content .= '<h5>'. $alias['url'] .'</h5><ul><li>'. implode('</li><li>', $alias_ports_address) .'</li></ul>';
+
+ if ($counter > 10002)
+ $content .= '<i>'. gettext("listing only first 10k items") .'</i>';
}
- $alias_descr_substr = $alias_name['descr'];
- if ($strlength >= $maxlength) {
- $alias_descr_substr = substr($alias_descr_substr, 0, $maxlength) . "...";
+ else
+ {
+ $alias_addresses = explode (" ", $alias['address']);
+ $alias_details = explode ("||", $alias['detail']);
+
+ $content .= '<ul><li>'. implode('</li><li>', $alias_addresses) .'</li></ul>';
}
- $item_text = ($counter > 1 ? "items" : "item");
- $alias_caption = "{$alias_descr_substr} - {$counter} {$item_text}<a href=\"/firewall_aliases_edit.php?id={$alias_id}\" title=\"".gettext('edit this alias')."\">&nbsp;&nbsp;edit </a>";
- $strlength = strlen ($alias_caption);
- print "<h1>{$alias_caption}</h1>" . $alias_objects_with_details;
+
+ if (strlen($alias['descr']) >= $maxlength)
+ $alias['descr'] = substr($alias['descr'], 0, $maxlength) . '&hellip;';
+
+ return $content;
}
-function rule_popup($src, $srcport, $dst, $dstport) {
- global $config, $g;
- $aliases_array = array();
- if ($config['aliases']['alias'] <> "" and is_array($config['aliases']['alias'])) {
- $descriptions = array ();
- foreach ($config['aliases']['alias'] as $alias_id=>$alias_name) {
- $loading_image="<a><img src=\'/themes/{$g['theme']}/images/misc/loader.gif\' alt=\'loader\' /> " .gettext("loading...")."</a>";
- switch ($alias_name['type']) {
- case "port":
- $width="250";
- break;
- case "urltable":
- $width="500";
- break;
- default:
- $width="350";
- break;
- }
- $span_begin = "<span style=\"cursor: help;\" onmouseover=\"var response_html=domTT_activate(this, event, 'id','ttalias_{$alias_id}','content','{$loading_image}', 'trail', true, 'delay', 300, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle','type','velcro','width',{$width});alias_popup('{$alias_id}','{$g['theme']}','".gettext('loading...')."');\" onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\"><u>";
- $span_end = "</u></span>";
- if ($alias_name['name'] == $src) {
- $descriptions['src'] = $span_begin;
- $descriptions['src_end'] = $span_end;
- }
- if ($alias_name['name'] == $srcport) {
- $descriptions['srcport'] = $span_begin;
- $descriptions['srcport_end'] = $span_end;
- }
- if ($alias_name['name'] == $dst) {
- $descriptions['dst'] = $span_begin;
- $descriptions['dst_end'] = $span_end;
- }
- if ($alias_name['name'] == $dstport) {
- $descriptions['dstport'] = $span_begin;
- $descriptions['dstport_end'] = $span_end;
- }
- }
- return $descriptions;
+function rule_columns_with_alias($src, $srcport, $dst, $dstport){
+ global $config;
+
+ if ($config['aliases']['alias'] == "" || !is_array($config['aliases']['alias']))
+ return;
+
+ $columns = array();
+ foreach ($config['aliases']['alias'] as $alias_id => $alias_name){
+ if ($alias_name['name'] == $src)
+ $columns['src'] = $alias_id;
+ elseif ($alias_name['name'] == $srcport)
+ $columns['srcport'] = $alias_id;
+ elseif ($alias_name['name'] == $dst )
+ $columns['dst'] = $alias_id;
+ elseif ($alias_name['name'] == $dstport)
+ $columns['dstport'] = $alias_id;
+
+ return $columns;
}
}
+function form_output_row($name, $label, $content){
+var_dump($content);die;
+?>
+<div class="form-group">
+ <label for="<?=$name?>" class="col-sm-2 control-label"><?=gettext($label); ?></label>
+ <div class="col-sm-10">
+ <?=$content?>
+ </div>
+</div>
+<?php
+}
+
$timezone = $config['system']['timezone'];
if (!$timezone) {
$timezone = "Etc/UTC";
diff --git a/src/usr/local/www/halt.php b/src/usr/local/www/halt.php
index ab4fe99..efa6dce 100755
--- a/src/usr/local/www/halt.php
+++ b/src/usr/local/www/halt.php
@@ -2,38 +2,61 @@
/* $Id$ */
/*
halt.php
- part of pfSense
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2004 Scott Ullrich
- All rights reserved.
-
- part of m0n0wall as reboot.php (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>
+ * Originally part of m0n0wall as reboot.php (http://m0n0.ch/wall)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: header
+ pfSense_MODULE: header
*/
##|+PRIV
@@ -43,35 +66,50 @@
##|*MATCH=halt.php*
##|-PRIV
+// Set DEBUG to true to prevent the system_halt() function from being called
+define("DEBUG", false);
+
require("guiconfig.inc");
require("functions.inc");
require("captiveportal.inc");
-if ($_POST['Submit'] == " " . gettext("No") . " ") {
+if ($_POST['save'] == 'No') {
header("Location: index.php");
exit;
}
$pgtitle = array(gettext("Diagnostics"), gettext("Halt system"));
include('head.inc');
+
+if ($_SERVER['REQUEST_METHOD'] == 'POST') {
?>
+ <meta http-equiv="refresh" content="70;url=/">
+ <div class="alert alert-success" role="alert">
+ <?=gettext("The system is halting now. This may take one minute or so.")?>
+ </div>
+
+<?php
+ if(DEBUG)
+ print("Not actually halting (DEBUG is set true)<br>");
+ else
+ system_halt();
+} else {
+?>
+
+<div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title">Are you sure you want to halt the system?</h2>
+ </div>
+ <div class="panel-body">
+ <p>Click "Yes" to halt the system immediately, or "No" to go to the system dashboard. (There will be a brief delay before the dashboard appears.)</p>
+ <form action="halt.php" method="post">
+ <input type="submit" class="btn btn-danger pull-center" name="save" value="Yes">
+ <a href="/" class="btn btn-default">No</a>
+ </form>
+ </div>
+</div>
+
+<?php
+}
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($_POST['Submit'] == " " . gettext("Yes") . " "):
- print_info_box(gettext("The system is halting now. This may take one minute.")); ?>
-<pre>
-<?php system_halt(); ?>
-</pre>
-<?php else: ?>
-<form action="halt.php" method="post">
- <p><strong><?=gettext("Are you sure you want to halt the system?");?></strong></p>
- <p>
- <input name="Submit" type="submit" class="formbtn" value=" <?=gettext("Yes"); ?> " />
- <input name="Submit" type="submit" class="formbtn" value=" <?=gettext("No"); ?> " />
- </p>
-</form>
-<?php endif; ?>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc");
diff --git a/src/usr/local/www/head.inc b/src/usr/local/www/head.inc
index d8b8867..5316ee2 100755
--- a/src/usr/local/www/head.inc
+++ b/src/usr/local/www/head.inc
@@ -3,9 +3,16 @@
pfSense_MODULE: header
*/
-$g['theme'] = get_current_theme();
+require_once("globals.inc");
+require_once("functions.inc");
+require_once("shortcuts.inc");
+require_once("service-utils.inc");
-$pagetitle = gentitle($pgtitle);
+/* $Id$ */
+
+header('Content-Type: text/html; charset=utf-8');
+
+$pagetitle = gentitle( $pgtitle );
if (isset($config['system']['webgui']['pagenamefirst'])) {
$tabtitle = $pagetitle . " - " . $config['system']['hostname'] . "." . $config['system']['domain'];
@@ -13,108 +20,476 @@ if (isset($config['system']['webgui']['pagenamefirst'])) {
$tabtitle = $config['system']['hostname'] . "." . $config['system']['domain'] . " - " . $pagetitle;
}
?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="<?=system_get_language_code();?>" xml:lang="<?=system_get_language_code();?>">
+<!DOCTYPE html>
+<html lang="en">
<head>
- <title><?php echo($tabtitle); ?></title>
- <meta http-equiv="Content-Type" content="text/html; charset=<?=system_get_language_codeset();?>" />
- <link rel="apple-touch-icon" href="/themes/<?php echo $g['theme']; ?>/apple-touch-icon.png"/>
- <link rel="shortcut icon" href="/themes/<?php echo $g['theme']; ?>/images/icons/favicon.ico"/>
- <?php
- if (file_exists("{$g['www_path']}/themes/{$g['theme']}/table.css")):
- echo "<link type=\"text/css\" rel=\"stylesheet\" href=\"/themes/{$g['theme']}/table.css\" />";
- else:
- echo "<link type=\"text/css\" rel=\"stylesheet\" href=\"/css/table.css\" media=\"all\" />";
- endif;
- ?>
-
- <?php if (strpos($_SERVER["SCRIPT_FILENAME"], "wizard.php") !== false &&
- file_exists("{$g['www_path']}/themes/{$g['theme']}/wizard.css")): ?>
- <?php echo "<link type=\"text/css\" rel=\"stylesheet\" href=\"/themes/{$g['theme']}/wizard.css\" />"; ?>
- <?php else: ?>
- <link type="text/css" rel="stylesheet" href="/themes/<?php echo $g['theme']; ?>/all.css" media="all" />
- <?php endif; ?>
- <link rel="stylesheet" type="text/css" href="/niftycssCode.css" />
- <link rel="stylesheet" type="text/css" href="/niftycssprintCode.css" media="print" />
- <link rel="stylesheet" type="text/css" href="/themes/<?=$g['theme']?>/new_tab_menu.css" media="all" />
- <link rel="stylesheet" type="text/css" href="/themes/<?=$g['theme']?>/styles/jquery-ui-1.11.1.css" />
- <script type="text/javascript" src="/javascript/niftyjsCode.js"></script>
- <script type="text/javascript" src="/javascript/jquery-1.11.1.min.js"></script>
- <script type="text/javascript" src="/javascript/jquery-migrate-1.2.1.min.js"></script>
- <script type="text/javascript" src="/javascript/jquery/jquery-ui-1.11.1.min.js"></script>
- <script type="text/javascript">
- //<![CDATA[
- var theme = "<?php echo $g['theme']; ?>";
-
- jQuery.noConflict();
- //]]>
- </script>
-
- <script type="text/javascript" src="/javascript/sorttable.js"></script>
- <script type="text/javascript" src="/javascript/ticker.js"></script>
- <style type="text/css" id="antiClickjack">
- /*<![CDATA[*/
- body{display:none}
- /*]]>*/
- </style>
- <script type="text/javascript">
- //<![CDATA[
- if (self === top) {
- var antiClickjack = document.getElementById("antiClickjack"); antiClickjack.parentNode.removeChild(antiClickjack);
- } else {
- top.location = self.location;
- }
- //]]>
- </script>
-
+ <link rel="stylesheet" href="/bootstrap/css/pfSense.css" />
+ <title><?=$tabtitle?></title>
+ <script>var events = events || [];</script>
+</head>
+<body id="<?=basename($_SERVER['SCRIPT_NAME'], '.php')?>">
<?php
-echo "\t<script type=\"text/javascript\" src=\"/themes/{$g['theme']}/loader.js\"></script>\n";
-if ($_GET['enablefirebuglite']) {
- echo "\t<script type=\"text/javascript\" src=\"/javascript/pi.js\"></script>\n";
- echo "\t<script type=\"text/javascript\" src=\"/javascript/firebug-lite.js\"></script>\n";
-}
-echo "\t<script type=\"text/javascript\" src=\"/javascript/scriptaculous/prototype.js\"></script>\n";
-echo "\t<script type=\"text/javascript\" src=\"/javascript/scriptaculous/scriptaculous.js\"></script>\n";
-echo "\t<script type=\"text/javascript\" src=\"/javascript/scriptaculous/effects.js\"></script>\n";
-echo "\t<script type=\"text/javascript\" src=\"/javascript/scriptaculous/dragdrop.js\"></script>\n";
-if (file_exists("{$g['www_path']}/javascript/global.js")) {
- echo "\t<script type=\"text/javascript\" src=\"/javascript/global.js\"></script>\n";
+
+/* Determine automated help URL. Should output the page name and parameters
+ separately */
+$uri_split = "";
+preg_match("/\/(.*)\?(.*)/", $_SERVER["REQUEST_URI"], $uri_split);
+
+/* If there was no match, there were no parameters, just grab the filename
+ Otherwise, use the matched filename from above. */
+if (empty($uri_split[0])) {
+ $pagename = ltrim($_SERVER["REQUEST_URI"], '/');
+} else {
+ $pagename = $uri_split[1];
}
-/*
- * Find all javascript files that need to be included
- * for this page ... from the arrays ... :)
- * Coded by: Erik Kristensen
- */
-
-$dir = trim(basename($_SERVER["SCRIPT_FILENAME"], '.php'));
-$path = "{$g['www_path']}/javascript/" . $dir . "/";
-if (is_dir($path)) {
- if ($dh = opendir($path)) {
- while (($file = readdir($dh)) !== false) {
- if (is_dir($file)) {
+/* If the page name is still empty, the user must have requested / (index.php) */
+if (empty($pagename)) {
+ $pagename = "index.php";
+}
+
+/* If the filename is pkg_edit.php or wizard.php, reparse looking
+ for the .xml filename */
+if (($pagename == "pkg.php") || ($pagename == "pkg_edit.php") || ($pagename == "wizard.php")) {
+ $param_split = explode('&', $uri_split[2]);
+ foreach ($param_split as $param) {
+ if (substr($param, 0, 4) == "xml=") {
+ $xmlfile = explode('=', $param);
+ $pagename = $xmlfile[1];
+ }
+ }
+}
+
+/* Build the full help URL. */
+$helpurl .= "{$g['help_base_url']}?page={$pagename}";
+
+function return_ext_menu($section) {
+ global $config;
+ $htmltext = "";
+ $extarray = array();
+ if($config['installedpackages']['menu'] != "") {
+ foreach($config['installedpackages']['menu'] as $menuitem) {
+ if($menuitem['section'] != $section) {
continue;
}
- echo "\t<script type=\"text/javascript\" src=\"/javascript/{$dir}/{$file}?rev=1\"></script>\n";
+ if($menuitem['url'] != "") {
+ $test_url=$menuitem['url'];
+ $addresswithport = getenv("HTTP_HOST");
+ $colonpos = strpos($addresswithport, ":");
+ if ($colonpos !== False) {
+ //my url is actually just the IP address of the pfsense box
+ $myurl = substr($addresswithport, 0, $colonpos);
+ } else {
+ $myurl = $addresswithport;
+ }
+ $description = str_replace('$myurl', $myurl, $menuitem['url']);
+ } else {
+ $description = '/pkg.php?xml=' . $menuitem['configfile'];
+ $test_url=$description;
+ }
+ if (isAllowedPage($test_url)) {
+ $extarray[] = array($menuitem['name'], $description);
+ }
}
- closedir($dh);
}
+ return $extarray;
+}
+
+function output_menu($arrayitem, $target = null) {
+ foreach ($arrayitem as $item) {
+ if (isAllowedPage($item[1]) || $item[1]=="/index.php?logout") {
+ $attr = sprintf("href=\"%s\"", htmlentities($item[1]));
+ if ($target) {
+ $attr .= sprintf(" target=\"%s\"", htmlentities($target));
+ }
+ $class = "navlnk";
+ if ($item['class']) {
+ $class .= " {$item['class']}";
+ }
+ $attr .= sprintf(" class=\"%s\"", htmlentities($class));
+ if ($item['style']) {
+ $attr .= sprintf(" style=\"%s\"", htmlentities($item['style']));
+ }
+ echo "<li>". sprintf("<a %s>%s</a>", $attr, $item[0]). "</li>\n";
+ }
+ }
+}
+
+// System
+$system_menu = array();
+$system_menu[] = array(gettext("Logout"), "/index.php?logout");
+$system_menu[] = array(gettext("Advanced"), "/system_advanced_admin.php");
+$system_menu[] = array(gettext("Firmware"), "/system_firmware.php");
+$system_menu[] = array(gettext("General Setup"), "/system.php");
+$system_menu[] = array(gettext("High Avail. Sync"), "/system_hasync.php");
+if ($g['platform'] == "pfSense" or $g['platform'] == "nanobsd") {
+ $system_menu[] = array(gettext("Packages"), "/pkg_mgr_installed.php");
+}
+$system_menu[] = array(gettext("Setup Wizard"), "/wizard.php?xml=setup_wizard.xml");
+$system_menu[] = array(gettext("Routing"), "/system_gateways.php");
+$system_menu[] = array(gettext("Cert Manager"), "/system_camanager.php");
+if (!isAllowedPage("system_usermanager.php*")) {
+ $system_menu[] = array(gettext("User Manager"), "/system_usermanager_passwordmg.php");
+} else {
+ $system_menu[] = array(gettext("User Manager"), "/system_usermanager.php");
+}
+$system_menu = msort(array_merge($system_menu, return_ext_menu("System")),0);
+
+// Interfaces
+$interfaces_menu = array();
+if (!isset($config['system']['webgui']['noassigninterfaces'])) {
+ $interfaces_menu[] = array(gettext("(assign)"), "/interfaces_assign.php");
+}
+$opts = get_configured_interface_with_descr(false, true);
+foreach ($opts as $oif => $odescr) {
+ if (!isset($config['interfaces'][$oif]['ovpn'])) {
+ $interfaces_menu[] = array(htmlspecialchars($odescr), "/interfaces.php?if={$oif}");
+ }
+}
+$interfaces_menu = msort(array_merge($interfaces_menu, return_ext_menu("Interfaces")),0);
+
+// Firewall
+$firewall_menu = array();
+$firewall_menu[] = array(gettext("Aliases"), "/firewall_aliases.php");
+$firewall_menu[] = array(gettext("NAT"), "/firewall_nat.php");
+$firewall_menu[] = array(gettext("Rules"), "/firewall_rules.php");
+$firewall_menu[] = array(gettext("Schedules"), "/firewall_schedule.php");
+$firewall_menu[] = array(gettext("Traffic Shaper"), "/firewall_shaper.php");
+$firewall_menu[] = array(gettext("Virtual IPs"), "/firewall_virtual_ip.php");
+$firewall_menu = msort(array_merge($firewall_menu, return_ext_menu("Firewall")),0);
+
+// Services
+$services_menu = array();
+$services_menu[] = array(gettext("Captive Portal"), "/services_captiveportal.php");
+$services_menu[] = array(gettext("DNS Forwarder"), "/services_dnsmasq.php");
+$services_menu[] = array(gettext("DNS Resolver"), "/services_unbound.php");
+$services_menu[] = array(gettext("DHCP Relay"), "/services_dhcp_relay.php");
+$services_menu[] = array(gettext("DHCPv6 Relay"), "/services_dhcpv6_relay.php");
+if($g['services_dhcp_server_enable']) {
+ $services_menu[] = array(gettext("DHCP Server"), "/services_dhcp.php");
+ $services_menu[] = array(gettext("DHCPv6 Server/RA"), "/services_dhcpv6.php");
+}
+$services_menu[] = array(gettext("Dynamic DNS"), "/services_dyndns.php");
+$services_menu[] = array(gettext("IGMP proxy"), "/services_igmpproxy.php");
+$services_menu[] = array(gettext("Load Balancer"), "/load_balancer_pool.php");
+$services_menu[] = array(gettext("NTP"), "/services_ntpd.php");
+$services_menu[] = array(gettext("PPPoE Server"), "/vpn_pppoe.php");
+$services_menu[] = array(gettext("SNMP"), "/services_snmp.php");
+if(count($config['interfaces']) > 1) {
+ /* no use for UPnP in single-interface deployments
+ remove to reduce user confusion
+ */
+ $services_menu[] = array(gettext("UPnP &amp; NAT-PMP"), "/pkg_edit.php?xml=miniupnpd.xml");
+}
+$services_menu[] = array(gettext("Wake on LAN"), "/services_wol.php");
+$services_menu = msort(array_merge($services_menu, return_ext_menu("Services")),0);
+
+// VPN
+$vpn_menu = array();
+$vpn_menu[] = array(gettext("IPsec"), "/vpn_ipsec.php");
+$vpn_menu[] = array(gettext("OpenVPN"), "/vpn_openvpn_server.php");
+//$vpn_menu[] = array(gettext("PPTP"), "/vpn_pptp.php");
+$vpn_menu[] = array(gettext("L2TP"), "/vpn_l2tp.php");
+$vpn_menu = msort(array_merge($vpn_menu, return_ext_menu("VPN")),0);
+
+// Status
+$status_menu = array();
+if (count($config['captiveportal']) > 0) {
+ $status_menu[] = array(gettext("Captive Portal"), "/status_captiveportal.php");
+}
+$status_menu[] = array(gettext("CARP (failover)"), "/carp_status.php");
+$status_menu[] = array(gettext("Dashboard"), "/index.php");
+$status_menu[] = array(gettext("Gateways"), "/status_gateways.php");
+$status_menu[] = array(gettext("DHCP Leases"), "/status_dhcp_leases.php");
+$status_menu[] = array(gettext("DHCPv6 Leases"), "/status_dhcpv6_leases.php");
+$status_menu[] = array(gettext("Filter Reload"), "/status_filter_reload.php");
+$status_menu[] = array(gettext("Interfaces"), "/status_interfaces.php");
+$status_menu[] = array(gettext("IPsec"), "/diag_ipsec.php");
+$status_menu[] = array(gettext("Load Balancer"), "/status_lb_pool.php");
+$status_menu[] = array(gettext("NTP"), "/status_ntpd.php");
+$status_menu[] = array(gettext("OpenVPN"), "/status_openvpn.php");
+if ($g['platform'] == "pfSense") {
+ $status_menu[] = array(gettext("Package Logs"), "/diag_pkglogs.php");
+}
+$status_menu[] = array(gettext("Queues"), "/status_queues.php");
+$status_menu[] = array(gettext("RRD Graphs"), "/status_rrd_graph.php");
+$status_menu[] = array(gettext("Services"), "/status_services.php");
+$status_menu[] = array(gettext("System Logs"), "/diag_logs.php");
+$status_menu[] = array(gettext("Traffic Graph"), "/status_graph.php?if=wan");
+if(count($config['interfaces']) > 1) {
+ $status_menu[] = array(gettext("UPnP &amp; NAT-PMP"), "/status_upnp.php");
+}
+$ifentries = get_configured_interface_with_descr();
+foreach ($ifentries as $ent => $entdesc) {
+ if (is_array($config['interfaces'][$ent]['wireless']) &&
+ preg_match($g['wireless_regex'], $config['interfaces'][$ent]['if'])) {
+ $wifdescrs[$ent] = $entdesc;
+ }
+}
+if (count($wifdescrs) > 0) {
+ $status_menu[] = array(gettext("Wireless"), "/status_wireless.php");
}
+$status_menu = msort(array_merge($status_menu, return_ext_menu("Status")),0);
-if (!isset($closehead)) {
- echo "</head>";
+// Diagnostics
+$diagnostics_menu = array();
+$diagnostics_menu[] = array(gettext("ARP Table"), "/diag_arp.php");
+$diagnostics_menu[] = array(gettext("Authentication"), "/diag_authentication.php");
+$diagnostics_menu[] = array(gettext("Backup/Restore"), "/diag_backup.php");
+$diagnostics_menu[] = array(gettext("Command Prompt"), "/exec.php");
+$diagnostics_menu[] = array(gettext("DNS Lookup"), "/diag_dns.php");
+$diagnostics_menu[] = array(gettext("Edit File"), "/edit.php");
+$diagnostics_menu[] = array(gettext("Factory Defaults"), "/diag_defaults.php");
+if(file_exists("/var/run/gmirror_active")) {
+ $diagnostics_menu[] = array(gettext("GEOM Mirrors"), "/diag_gmirror.php" );
}
+$diagnostics_menu[] = array(gettext("Halt System"), "/halt.php" );
+$diagnostics_menu[] = array(gettext("Limiter Info"), "/diag_limiter_info.php" );
+$diagnostics_menu[] = array(gettext("NDP Table"), "/diag_ndp.php" );
+$diagnostics_menu[] = array(gettext("Tables"), "/diag_tables.php");
+$diagnostics_menu[] = array(gettext("Ping"), "/diag_ping.php");
+$diagnostics_menu[] = array(gettext("Test Port"), "/diag_testport.php");
+$diagnostics_menu[] = array(gettext("pfInfo"), "/diag_pf_info.php");
+$diagnostics_menu[] = array(gettext("pfTop"), "/diag_system_pftop.php");
+$diagnostics_menu[] = array(gettext("Reboot"), "/reboot.php");
+$diagnostics_menu[] = array(gettext("Routes"), "/diag_routes.php");
+$diagnostics_menu[] = array(gettext("SMART Status"), "/diag_smart.php");
+$diagnostics_menu[] = array(gettext("Sockets"), "/diag_sockets.php" );
+$diagnostics_menu[] = array(gettext("States"), "/diag_dump_states.php");
+$diagnostics_menu[] = array(gettext("States Summary"), "/diag_states_summary.php");
+$diagnostics_menu[] = array(gettext("System Activity"), "/diag_system_activity.php");
+$diagnostics_menu[] = array(gettext("Traceroute"), "/diag_traceroute.php");
+$diagnostics_menu[] = array(gettext("Packet Capture"), "/diag_packet_capture.php");
+if($g['platform'] == "nanobsd") {
+ $diagnostics_menu[] = array(gettext("NanoBSD"), "/diag_nanobsd.php");
+}
+if (isset($config['system']['developer'])) {
+ $diagnostics_menu[] = array(gettext("Restart HTTPD"), "/restart_httpd.php", "style" => "font-weight: bold; color: yellow;");
+}
+$diagnostics_menu = msort(array_merge($diagnostics_menu, return_ext_menu("Diagnostics")),0);
+
+$gold_menu = array();
+$gold_menu[] = array(gettext("pfSense Gold"), "https://www.pfsense.org/gold");
+$gold_menu = msort(array_merge($gold_menu, return_ext_menu("Gold")),0);
+
+if(! $g['disablehelpmenu']) {
+ $help_menu = array();
+ $help_menu[] = array(gettext("About this Page"), $helpurl);
+ if($g['product_name'] == "pfSense") {
+ $help_menu[] = array(gettext("Bug Database"), "https://www.pfsense.org/j.php?jumpto=redmine");
+ }
+ $help_menu[] = array(gettext("User Forum"), "https://www.pfsense.org/j.php?jumpto=forum");
+ $help_menu[] = array(gettext("Documentation"), "https://www.pfsense.org/j.php?jumpto=doc");
+ $help_menu[] = array(gettext("Developers Wiki"), "https://www.pfsense.org/j.php?jumpto=devwiki");
+ $help_menu[] = array(gettext("Paid Support"), "https://www.pfsense.org/j.php?jumpto=portal");
+ $help_menu[] = array(gettext("pfSense Book"), "https://www.pfsense.org/j.php?jumpto=book");
+ $help_menu[] = array(gettext("Search portal"), "https://www.pfsense.org/j.php?jumpto=searchportal");
+ $help_menu[] = array(gettext("FreeBSD Handbook"), "https://www.pfsense.org/j.php?jumpto=fbsdhandbook");
+ $help_menu = msort(array_merge($help_menu, return_ext_menu("Help")),0);
+}
+
+?>
+<nav class="navbar navbar-static-top navbar-inverse">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#pf-navbar">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="/"><img src="/logo.png" alt="pfSense" /></a>
+ </div>
+ <div class="collapse navbar-collapse" id="pf-navbar">
+ <ul class="nav navbar-nav">
+ <?php foreach ([
+ ['name' => 'System', 'menu' => $system_menu, 'href' => null],
+ ['name' => 'Interfaces', 'menu' => $interfaces_menu, 'href' => null],
+ ['name' => 'Firewall', 'menu' => $firewall_menu, 'href' => null],
+ ['name' => 'Services', 'menu' => $services_menu, 'href' => null],
+ ['name' => 'VPN', 'menu' => $vpn_menu, 'href' => null],
+ ['name' => 'Status', 'menu' => $status_menu, 'href' => null],
+ ['name' => 'Diagnostics', 'menu' => $diagnostics_menu, 'href' => null],
+ ['name' => 'Gold', 'menu' => $gold_menu, 'href' => '_blank'],
+ ['name' => 'Help', 'menu' => $help_menu, 'href' => '_blank']
+ ] as $item):
+ if ($item['name'] == 'Help' && $g['disablehelpmenu']) {
+ continue;
+ } ?>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
+ <?=gettext($item['name'])?>
+ <span class="caret"></span>
+ </a>
+ <ul class="dropdown-menu" role="menu"><?=output_menu($item['menu'], $item['href'])?></ul>
+ </li>
+ <?php endforeach?>
+ <?php if(are_notices_pending()):?>
+ <?php $notices = get_notices()?>
+ <li class="dropdown">
+ <a href="#" data-toggle="modal" data-target="#notices" role="button" aria-expanded="false"><?=gettext("Notices")?>
+ <span class="badge"><?=count($notices)?></span>
+ </a>
+ </li>
+ <?php
+ require_once('classes/Modal.class.php');
+
+ $modal_notices = new Modal('Notices', 'notices', 'large');
+
+ $modal_notices->addFooter(new Form_Button(
+ 'close',
+ 'Close',
+ ''
+ ))->setAttribute('data-dismiss', 'modal');
+
+ $modal_notices->addFooter(new Form_Button(
+ 'mark_all_as_read',
+ 'Mark all as read',
+ '/?closenotice=all'
+ ))->addClass('btn-primary')->removeClass('btn-default');
+
+ $noticeCategories = $notice['category'];
+ foreach($notices as $time => $notice) {
+ if (!isset($noticeCategories[$notice['category']])) {
+ $noticeCategories[ $notice['category'] ] = array();
+ }
+ $notice['time'] = $time;
+ array_push($noticeCategories[$notice['category']], $notice);
+ }
+
+ foreach($noticeCategories as $category => $catNotices) {
+ $html .= "<h4>{$category}</h4>";
+ $html .= '<ul>';
+ foreach($catNotices as $notice) {
+ $html .= '<li>';
+ if (!empty($notice['url'])) {
+ $html .= "<a href=\"{$notice['url']}\">{$notice['id']}</a> - ";
+ }
+ $html .= "{$notice['notice']}<i> @ " . date('Y-m-d H:i:s', $notice['time']) . '</i>';
+ $html .= '</li>';
+ }
+ $html .= '</ul>';
+ }
+ $modal_notices->addHtml($html);
+ print $modal_notices;
+
+ endif;
+ ?>
+ </ul>
+ </div>
+ </div>
+
+<?php if(are_notices_pending()):?>
+ <div class="modal fade" id="notices" role="dialog" aria-labelledby="noticesTitle" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+
+ <h3 class="modal-title" id="myModalLabel">Notices</h3>
+ </div>
+
+ <div class="modal-body">
+<?php
+$noticeCategories = array();
+foreach($notices as $time => $notice)
+{
+ if (!isset($noticeCategories[ $notice['category'] ]))
+ $noticeCategories[ $notice['category'] ] = array();
+
+ $notice['time'] = $time;
+ array_push($noticeCategories[ $notice['category'] ], $notice);
+}
+
+foreach($noticeCategories as $category => $catNotices):?>
+ <h4><?=$category?></h4>
+ <ul>
+<?php
+ foreach($catNotices as $notice):
+?>
+ <li>
+ <b>
+<?php if (!empty($notice['url'])):?>
+ <a href="<?=$notice['url']?>"><?=$notice['id']?></a> -
+<?php endif;?>
+ </b>
+ <?=$notice['notice']?>
+ <i>@ <?=date('Y-m-d H:i:s', $notice['time'])?></i>
+ </li>
+<?php endforeach;?>
+</ul>
+<?php endforeach;?>
+ </div>
+
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+ <a type="button" class="btn btn-primary" href="/?closenotice=all">Mark all as read</a>
+ </div>
+ </div>
+ </div>
+ </div>
+<?php endif; ?>
+
+</nav>
+<div class="container">
+ <header class="header">
+ <?=genhtmltitle($pgtitle)?>
+ <ul class="context-links">
+<?php
+if (!$hide_service_status && !empty($shortcuts[$shortcut_section]['service'])) {
+ $ssvc = array();
+ switch ($shortcut_section) {
+ case "openvpn":
+ $ssvc = find_service_by_openvpn_vpnid($vpnid);
+ break;
+ case "captiveportal":
+ $ssvc = find_service_by_cp_zone($cpzone);
+ break;
+ default:
+ $ssvc = find_service_by_name($shortcuts[$shortcut_section]['service']);
+ }
+ if (!empty($ssvc)) {
+ // echo '<li>'. get_service_status_icon($ssvc, false). '</li>'; TODO: Add missing function
+ echo '<li>'. get_service_control_links($ssvc, false). '</li>';
+ }
+}
+
+echo '<li>'. get_shortcut_main_link($shortcut_section, false). '</li>';
+echo '<li>'. get_shortcut_status_link($shortcut_section, false). '</li>';
+echo '<li>'. get_shortcut_log_link($shortcut_section, false). '</li>';
+
+?>
+ <?php if(! $g['disablehelpicon']): ?>
+ <li>
+ <a href="<?=$helpurl?>" title="<?=gettext("Help for items on this page")?>" class="help-icon">
+ <i class="icon-large icon-question-sign"></i>
+ </a>
+ </li>
+ <?php endif?>
+ </ul>
+ </header>
+<?php
+/* if upgrade in progress, alert user */
+if (is_subsystem_dirty('packagelock') || file_exists('/conf/needs_package_sync' && platform_booting())) {
+ if (file_exists('/conf/needs_package_sync') && platform_booting()) {
+ $info_text = sprintf(gettext("%s is booting then packages will be reinstalled in the background.<p>Do not make changes in the GUI until this is complete."), $g['product_name']);
+ } else {
+ $pgtitle = array(gettext("System"),gettext("Package Manager"));
+ $info_text = gettext("Packages are currently being reinstalled in the background.<p>Do not make changes in the GUI until this is complete.");
+ }
+ print_info_box("{$info_text}<p><img src='/themes/{$g['theme']}/images/icons/icon_fw-update.gif' alt='firmware update' />");
+}
+
+$pgtitle_output = true;
/* If this page is being remotely managed then do not allow the loading of the contents. */
if ($config['remote_managed_pages']['item']) {
- foreach ($config['remote_managed_pages']['item'] as $rmp) {
+ foreach($config['remote_managed_pages']['item'] as $rmp) {
if ($rmp == $_SERVER['SCRIPT_NAME']) {
- include("fbegin.inc");
print_info_box_np("This page is currently being managed by a remote machine.");
- include("fend.inc");
+ include("foot.inc");
exit;
}
}
}
-
-?>
diff --git a/src/usr/local/www/headjs.php b/src/usr/local/www/headjs.php
deleted file mode 100644
index 5e4148f..0000000
--- a/src/usr/local/www/headjs.php
+++ /dev/null
@@ -1,186 +0,0 @@
-<?php
-/*
- headjs.php
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-/*
- pfSense_MODULE: header
-*/
-
-##|+PRIV
-##|*IDENT=page-requiredforjavascript
-##|*NAME=Required for javascript page
-##|*DESCR=Allow access to the 'Required for javascript' page.
-##|*MATCH=headjs.php*
-##|-PRIV
-
-require_once("guiconfig.inc");
-
-function getHeadJS() {
- global $g, $use_loader_tab_gif;
-
- if (!$use_loader_tab_gif) {
- $loader_gif = "/themes/{$g['theme']}/images/misc/loader.gif";
- } else {
- $loader_gif = "/themes/{$g['theme']}/images/misc/loader_tab.gif";
- }
-
- $headjs = "
- var input_errors = '';
- jQuery(document).ready(init);
- ";
- if (!session_id()) {
- session_start();
- }
- $_SESSION['NO_AJAX'] == "True" ? $noajax = "var noAjaxOnSubmit = true;" : $noajax = "var noAjaxOnSubmit = false;";
- session_commit();
-
- $headjs .= "
- {$noajax}
-
- function init() {
- if (jQuery('#submit') && ! noAjaxOnSubmit) {
- // debugging helper
- //alert('adding observe event for submit button');
-
- jQuery(\"#submit\").click(submit_form);
- jQuery('#submit').click(function() {return false;});
- var to_insert = \"<div style='visibility:hidden' id='loading' name='loading'><img src='{$loader_gif}' alt='loader' \/><\/div>\";
- jQuery('#submit').before(to_insert);
- }
- }
-
- function submit_form(e) {
- // debugging helper
- //alert(Form.serialize($('iform')));
-
- if (jQuery('#inputerrors')) {
- jQuery('#inputerrors').html('<center><b><i>Loading...<\/i><\/b><\/center>');
- }
-
- /* dsh: Introduced because pkg_edit tries to set some hidden fields
- * if executing submit's onclick event. The click gets deleted
- * by Ajax. Hence using onkeydown instead.
- */
- if (jQuery('#submit').prop('keydown')) {
- jQuery('#submit').keydown();
- jQuery('#submit').css('visibility','hidden');
- }
- if (jQuery('#cancelbutton')) {
- jQuery('#cancelbutton').css('visibility','hidden');
- }
- jQuery('#loading').css('visibility','visible');
- // submit the form using Ajax
- }
-
- function formSubmitted(resp) {
- var responseText = resp.responseText;
-
- // debugging helper
- // alert(responseText);
-
- if (responseText.indexOf('html') > 0) {
- /* somehow we have been fed an html page! */
- //alert('Somehow we have been fed an html page! Forwarding to /.');
- document.location.href = '/';
- }
-
- eval(responseText);
- }
-
- /* this function will be called if an HTTP error will be triggered */
- function formFailure(resp) {
- showajaxmessage(resp.responseText);
- if (jQuery('#submit')) {
- jQuery('#submit').css('visibility','visible');
- }
- if (jQuery('#cancelbutton')) {
- jQuery('#cancelbutton').css('visibility','visible');
- }
- if (jQuery('#loading')) {
- jQuery('#loading').css('visibility','hidden');
- }
- }
-
- function showajaxmessage(message) {
- var message_html;
-
- if (message == '') {
- NiftyCheck();
- Rounded(\"div#redbox\",\"all\",\"#FFF\",\"#990000\",\"smooth\");
- Rounded(\"td#blackbox\",\"all\",\"#FFF\",\"#000000\",\"smooth\");
-
- if (jQuery('#submit')) {
- jQuery('#submit').css('visibility','visible');
- }
- if (jQuery('#cancelbutton')) {
- jQuery('#cancelbutton').css('visibility','visible');
- }
- if (jQuery('#loading')) {
- jQuery('#loading').css('visibility','hidden');
- }
-
- return;
- }
-
- message_html = '<table height=\"32\" width=\"100%\" summary=\"redbox\"><tr><td>';
- message_html += '<div style=\"background-color:#990000\" id=\"redbox\">';
- message_html += '<table width=\"100%\" summary=\"message\"><tr><td width=\"8%\">';
- message_html += '<img style=\"vertical-align:center\" src=\"/themes/{$g['theme']}/images/icons/icon_exclam.gif\" width=\"28\" height=\"32\" alt=\"exclamation\" \/>';
- message_html += '<\/td><td width=\"70%\"><font color=\"white\">';
- message_html += '<b>' + message + '<\/b><\/font><\/td>';
-
- if (message.indexOf('apply') > 0) {
- message_html += '<td>';
- message_html += '<input name=\"apply\" type=\"submit\" class=\"formbtn\" id=\"apply\" value=\"" . gettext("Apply changes") . "\" \/>';
- message_html += '<\/td>';
- }
-
- message_html += '<\/tr><\/table><\/div><\/td><\/table><br \/>';
- jQuery('#inputerrors').html(message_html);
-
- NiftyCheck();
- Rounded(\"div#redbox\",\"all\",\"#FFF\",\"#990000\",\"smooth\");
- Rounded(\"td#blackbox\",\"all\",\"#FFF\",\"#000000\",\"smooth\");
-
- if (jQuery('#submit')) {
- jQuery('#submit').css('visibility','visible');
- }
- if (jQuery('#cancelbutton')) {
- jQuery('#cancelbutton').css('visibility','visible');
- }
- if (jQuery('#loading')) {
- jQuery('#loading').css('visibility','hidden');
- }
- if (jQuery('#inputerrors')) {
- window.scrollTo(0, 0);
- }
- }
- ";
-
- return $headjs;
-}
-
-?>
diff --git a/src/usr/local/www/help.php b/src/usr/local/www/help.php
index 8cee1ab..a59c521 100644
--- a/src/usr/local/www/help.php
+++ b/src/usr/local/www/help.php
@@ -1,10 +1,59 @@
<?php
-/* Redirector for Contextual Help System
- * Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- * (c) 2009 Jim Pingle <jimp@pfsense.org>
+/*
+ Redirector for Contextual Help System
+ */
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * c) 2009 Jim Pingle <jimp@pfsense.org>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
*
*/
-
+
require_once("guiconfig.inc");
/* Define hash of jumpto url maps */
@@ -238,7 +287,7 @@ $helppages = array(
'services_unbound_host_edit.php' => 'https://doc.pfsense.org/index.php/Unbound_DNS_Resolver',
'diag_gmirror.php' => 'https://doc.pfsense.org/index.php/Create_a_Software_RAID1_%28gmirror%29',
- /* From here down are packages. Not checking these as strictly,
+ /* From here down are packages. Not checking these as strictly,
any information is better than nothing. */
'olsrd.xml' => 'https://doc.pfsense.org/index.php/OLSR_Daemon',
'routed.xml' => 'https://doc.pfsense.org/index.php/Routing_Information_Protocol_(RIP)', # RIP
@@ -309,7 +358,6 @@ $helppages = array(
'iperfserver.xml' => 'https://doc.pfsense.org/index.php/Iperf_package',
'jail_template.xml' => 'https://doc.pfsense.org/index.php/PfJailctl_package',
'jailctl.xml' => 'https://doc.pfsense.org/index.php/PfJailctl_package',
- 'jailctl.xml' => 'https://doc.pfsense.org/index.php/PfJailctl_package',
'jailctl_defaults.xml' => 'https://doc.pfsense.org/index.php/PfJailctl_package',
'jailctl_settings.xml' => 'https://doc.pfsense.org/index.php/PfJailctl_package',
'siproxd.xml' => 'https://doc.pfsense.org/index.php/Siproxd_package',
diff --git a/src/usr/local/www/ifstats.php b/src/usr/local/www/ifstats.php
index 68cc6d8..fe6ce70 100644
--- a/src/usr/local/www/ifstats.php
+++ b/src/usr/local/www/ifstats.php
@@ -2,33 +2,58 @@
/* $Id$ */
/*
ifstats.php
- part of pfSense (https://www.pfsense.org)
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2005-2006 Scott Ullrich (sullrich@gmail.com)
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/bin/netstat
pfSense_MODULE: interfaces
diff --git a/src/usr/local/www/index.php b/src/usr/local/www/index.php
index ba39623..9f3b625 100644
--- a/src/usr/local/www/index.php
+++ b/src/usr/local/www/index.php
@@ -2,35 +2,58 @@
/* $Id$ */
/*
index.php
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2004-2012 Scott Ullrich
- All rights reserved.
-
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004-2012 Scott Ullrich
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /sbin/ifconfig
pfSense_MODULE: interfaces
@@ -61,10 +84,6 @@ if (isset($_REQUEST['closenotice'])) {
echo get_menu_messages();
exit;
}
-if ($_REQUEST['act'] == 'alias_info_popup' && !preg_match("/\D/", $_REQUEST['aliasid'])) {
- alias_info_popup($_REQUEST['aliasid']);
- exit;
-}
if ($g['disablecrashreporter'] != true) {
// Check to see if we have a crash report
@@ -90,48 +109,32 @@ if ($g['disablecrashreporter'] != true) {
}
##build list of widgets
-$directory = "/usr/local/www/widgets/widgets/";
-$dirhandle = opendir($directory);
-$filename = "";
-$widgetnames = array();
-$widgetfiles = array();
-$widgetlist = array();
-
-while (false !== ($filename = readdir($dirhandle))) {
- $periodpos = strpos($filename, ".");
- /* Ignore files not ending in .php */
- if (substr($filename, -4, 4) != ".php") {
- continue;
- }
- $widgetname = substr($filename, 0, $periodpos);
- $widgetnames[] = $widgetname;
- if ($widgetname != "system_information") {
- $widgetfiles[] = $filename;
- }
+foreach (glob("/usr/local/www/widgets/widgets/*.widget.php") as $file)
+{
+ $name = basename($file, '.widget.php');
+ $widgets[ $name ] = array('name' => ucwords(str_replace('_', ' ', $name)), 'display' => 'none');
}
-##sort widgets alphabetically
-sort($widgetfiles);
-
##insert the system information widget as first, so as to be displayed first
-array_unshift($widgetfiles, "system_information.widget.php");
+unset($widgets['system_information']);
+$widgets = array_merge(array('system_information' => array('name' => 'System Information')), $widgets);
##if no config entry found, initialize config entry
if (!is_array($config['widgets'])) {
$config['widgets'] = array();
}
-if ($_POST && $_POST['submit']) {
- $config['widgets']['sequence'] = $_POST['sequence'];
+if ($_POST && $_POST['sequence']) {
+ $config['widgets']['sequence'] = rtrim($_POST['sequence'], ',');
- foreach ($widgetnames as $widget) {
- if ($_POST[$widget . '-config']) {
- $config['widgets'][$widget . '-config'] = $_POST[$widget . '-config'];
+ foreach($widgets as $widgetname => $widgetconfig){
+ if ($_POST[$widgetname . '-config']){
+ $config['widgets'][$widgetname . '-config'] = $_POST[$name . '-config'];
}
}
write_config(gettext("Widget configuration has been changed."));
- header("Location: index.php");
+ header("Location: /");
exit;
}
@@ -140,21 +143,19 @@ require_once('includes/functions.inc.php');
## Check to see if we have a swap space,
## if true, display, if false, hide it ...
-if (file_exists("/usr/sbin/swapinfo")) {
+if(file_exists("/usr/sbin/swapinfo")) {
$swapinfo = `/usr/sbin/swapinfo`;
- if (stristr($swapinfo, '%') == true) {
- $showswap=true;
- }
+ if(stristr($swapinfo,'%') == true) $showswap=true;
}
## User recently restored his config.
## If packages are installed lets resync
-if (file_exists('/conf/needs_package_sync')) {
- if ($config['installedpackages'] <> '' && is_array($config['installedpackages']['package'])) {
- if ($g['platform'] == "pfSense" || $g['platform'] == "nanobsd") {
+if(file_exists('/conf/needs_package_sync')) {
+ if($config['installedpackages'] <> '' && is_array($config['installedpackages']['package'])) {
+ if($g['platform'] == "pfSense" || $g['platform'] == "nanobsd") {
## If the user has logged into webGUI quickly while the system is booting then do not redirect them to
## the package reinstall page. That is about to be done by the boot script anyway.
- ## The code in fbegin.inc will put up a notice to the user.
+ ## The code in head.inc will put up a notice to the user.
if (!platform_booting()) {
header('Location: pkg_mgr_install.php?mode=reinstallall');
exit;
@@ -169,63 +170,45 @@ if (file_exists('/conf/needs_package_sync')) {
## If it is the first time webConfigurator has been
## accessed since initial install show this stuff.
-if (file_exists('/conf/trigger_initial_wizard')) {
- $lang_code = system_get_language_code();
- $lang_codeset = system_get_language_codeset();
- echo <<<EOF
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="$lang_code" xml:lang="$lang_code">
+if(file_exists('/conf/trigger_initial_wizard')) {
+?>
+<!DOCTYPE html>
+<html lang="en">
<head>
+ <link rel="stylesheet" href="/bootstrap/css/pfSense.css" />
<title>{$g['product_name']}.localdomain - {$g['product_name']} first time setup</title>
- <meta http-equiv="Content-Type" content="text/html; charset=$lang_codeset" />
- <link rel="stylesheet" type="text/css" href="/niftycssprintCode.css" media="print" />
- <script type="text/javascript">var theme = "{$g['theme']}"</script>
- <script type="text/javascript" src="/themes/{$g['theme']}/loader.js"></script>
-
-EOF;
-
- echo "<body link=\"#0000CC\" vlink=\"#0000CC\" alink=\"#0000CC\">\n";
-
- if (file_exists("/usr/local/www/themes/{$g['theme']}/wizard.css")) {
- echo "<link type=\"text/css\" rel=\"stylesheet\" href=\"/themes/{$g['theme']}/wizard.css\" media=\"all\" />\n";
- } else {
- echo "<link type=\"text/css\" rel=\"stylesheet\" href=\"/themes/{$g['theme']}/all.css\" media=\"all\" />";
- }
-
- echo "<form>\n";
- echo "<center>\n";
- echo "<img src=\"/themes/{$g['theme']}/images/logo.gif\" border=\"0\" alt=\"logo\" /><p>\n";
- echo "<div \" style=\"width:700px;background-color:#ffffff\" id=\"nifty\">\n";
- echo sprintf(gettext("Welcome to %s!\n"), $g['product_name']) . "<p>";
- echo gettext("One moment while we start the initial setup wizard.") . "<p>\n";
- echo gettext("Embedded platform users: Please be patient, the wizard takes a little longer to run than the normal GUI.") . "<p>\n";
- echo sprintf(gettext("To bypass the wizard, click on the %s logo on the initial page."), $g['product_name']) . "\n";
- echo "</div>\n";
- echo "<meta http-equiv=\"refresh\" content=\"1;url=wizard.php?xml=setup_wizard.xml\">\n";
- echo "<script type=\"text/javascript\">\n";
- echo "//<![CDATA[\n";
- echo "NiftyCheck();\n";
- echo "Rounded(\"div#nifty\",\"all\",\"#AAA\",\"#FFFFFF\",\"smooth\");\n";
- echo "//]]>\n";
- echo "</script>\n";
+ <meta http-equiv="refresh" content="1;url=wizard.php?xml=setup_wizard.xml" />
+</head>
+<body id="loading-wizard" class="no-menu">
+ <div id="jumbotron">
+ <div class="container">
+ <div class="col-sm-offset-3 col-sm-6 col-xs-12">
+ <p><?=sprintf(gettext("Welcome to %s!\n"),$g['product_name'])?></p>
+ <p><?=gettext("One moment while we start the initial setup wizard.")?></p>
+ <p><?=gettext("Embedded platform users: Please be patient, the wizard takes a little longer to run than the normal GUI.")?></p>
+ <p><?=sprintf(gettext("To bypass the wizard, click on the %s logo on the initial page."),$g['product_name'])?></p>
+ </div>
+ </div>
+ </div>
+</body>
+</html>
+<?php
exit;
}
-
## Find out whether there's hardware encryption or not
unset($hwcrypto);
$fd = @fopen("{$g['varlog_path']}/dmesg.boot", "r");
if ($fd) {
while (!feof($fd)) {
$dmesgl = fgets($fd);
- if (preg_match("/^hifn.: (.*?),/", $dmesgl, $matches) or
- preg_match("/.*(VIA Padlock)/", $dmesgl, $matches) or
- preg_match("/^safe.: (\w.*)/", $dmesgl, $matches) or
- preg_match("/^ubsec.: (.*?),/", $dmesgl, $matches) or
- preg_match("/^padlock.: <(.*?)>,/", $dmesgl, $matches) or
- preg_match("/^glxsb.: (.*?),/", $dmesgl, $matches) or
- preg_match("/^aesni.: <(.*?)>/", $dmesgl, $matches)) {
+ if (preg_match("/^hifn.: (.*?),/", $dmesgl, $matches)
+ or preg_match("/.*(VIA Padlock)/", $dmesgl, $matches)
+ or preg_match("/^safe.: (\w.*)/", $dmesgl, $matches)
+ or preg_match("/^ubsec.: (.*?),/", $dmesgl, $matches)
+ or preg_match("/^padlock.: <(.*?)>,/", $dmesgl, $matches)
+ or preg_match("/^glxsb.: (.*?),/", $dmesgl, $matches)
+ or preg_match("/^aesni.: (.*?),/", $dmesgl, $matches)) {
$hwcrypto = $matches[1];
break;
}
@@ -236,42 +219,33 @@ if ($fd) {
##build widget saved list information
if ($config['widgets'] && $config['widgets']['sequence'] != "") {
$pconfig['sequence'] = $config['widgets']['sequence'];
+ $widgetsfromconfig = array();
- $widgetlist = $pconfig['sequence'];
- $colpos = array();
- $savedwidgetfiles = array();
- $widgetname = "";
- $widgetlist = explode(",", $widgetlist);
-
- ##read the widget position and display information
- foreach ($widgetlist as $widget) {
- $dashpos = strpos($widget, "-");
- $widgetname = substr($widget, 0, $dashpos);
- $colposition = strpos($widget, ":");
- $displayposition = strrpos($widget, ":");
- $colpos[] = substr($widget, $colposition + 1, $displayposition - $colposition - 1);
- $displayarray[] = substr($widget, $displayposition + 1);
- $savedwidgetfiles[] = $widgetname . ".widget.php";
+ foreach (explode(',', $pconfig['sequence']) as $line)
+ {
+ list($file, $col, $display) = explode(':', $line);
+
+ // be backwards compatible
+ $offset = strpos($file, '-container');
+ if (false !== $offset)
+ $file = substr($file, 0, $offset);
+
+ $widgetsfromconfig[ $file ] = array(
+ 'name' => ucwords(str_replace('_', ' ', $file)),
+ 'col' => $col,
+ 'display' => $display,
+ );
}
##add widgets that may not be in the saved configuration, in case they are to be displayed later
- foreach ($widgetfiles as $defaultwidgets) {
- if (!in_array($defaultwidgets, $savedwidgetfiles)) {
- $savedwidgetfiles[] = $defaultwidgets;
- }
- }
+ $widgets = $widgetsfromconfig + $widgets;
##find custom configurations of a particular widget and load its info to $pconfig
- foreach ($widgetnames as $widget) {
- if ($config['widgets'][$widget . '-config']) {
- $pconfig[$widget . '-config'] = $config['widgets'][$widget . '-config'];
+ foreach($widgets as $widgetname => $widgetconfig){
+ if ($config['widgets'][$name . '-config']){
+ $pconfig[$name . '-config'] = $config['widgets'][$name . '-config'];
}
}
-
- $widgetlist = $savedwidgetfiles;
-} else {
- // no saved widget sequence found, build default list.
- $widgetlist = $widgetfiles;
}
##build list of php include files
@@ -289,219 +263,10 @@ foreach ($phpincludefiles as $includename) {
include($directory . $includename);
}
-##begin AJAX
-$jscriptstr = <<<EOD
-<script type="text/javascript">
-//<![CDATA[
-
-function widgetAjax(widget) {
- uri = "widgets/widgets/" + widget + ".widget.php";
- var opt = {
- // Use GET
- type: 'get',
- async: true,
- // Handle 404
- statusCode: {
- 404: function(t) {
- alert('Error 404: location "' + t.statusText + '" was not found.');
- }
- },
- // Handle other errors
- error: function(t) {
- alert('Error ' + t.status + ' -- ' + t.statusText);
- },
- success: function(data) {
- widget2 = '#' + widget + "-loader";
- jQuery(widget2).fadeOut(1000,function() {
- jQuery('#' + widget).show();
- });
- jQuery('#' + widget).html(data);
- }
- }
- jQuery.ajax(uri, opt);
-}
-
-
-function addWidget(selectedDiv) {
- selectedDiv2 = '#' + selectedDiv + "-container";
- if (jQuery(selectedDiv2).css('display') != "none")
- {
- jQuery(selectedDiv2).effect('shake',{times: 2}, 100);
- }
- else
- {
- jQuery(selectedDiv2).show('blind');
- widgetAjax(selectedDiv);
- selectIntLink = selectedDiv2 + "-input";
- jQuery(selectIntLink).val("show");
- showSave();
- }
-}
-
-function configureWidget(selectedDiv) {
- selectIntLink = '#' + selectedDiv + "-settings";
- if (jQuery(selectIntLink).css('display') == "none") {
- jQuery(selectIntLink).show();
- } else {
- jQuery(selectIntLink).hide();
- }
-}
-
-function showWidget(selectedDiv, swapButtons) {
- //appear element
- jQuery('#' + selectedDiv).show('blind');
- showSave();
- d = document;
- if (swapButtons) {
- selectIntLink = selectedDiv + "-min";
- textlink = d.getElementById(selectIntLink);
- textlink.style.display = "inline";
-
-
- selectIntLink = selectedDiv + "-open";
- textlink = d.getElementById(selectIntLink);
- textlink.style.display = "none";
-
- }
- selectIntLink = selectedDiv + "-container-input";
- textlink = d.getElementById(selectIntLink);
- textlink.value = "show";
-
-}
-
-function minimizeWidget(selectedDiv, swapButtons) {
- //fade element
- jQuery('#' + selectedDiv).hide('blind');
- showSave();
- d = document;
- if (swapButtons) {
- selectIntLink = selectedDiv + "-open";
- textlink = d.getElementById(selectIntLink);
- textlink.style.display = "inline";
-
- selectIntLink = selectedDiv + "-min";
- textlink = d.getElementById(selectIntLink);
- textlink.style.display = "none";
- }
- selectIntLink = selectedDiv + "-container-input";
- textlink = d.getElementById(selectIntLink);
- textlink.value = "hide";
-
-}
-
-function closeWidget(selectedDiv) {
- showSave();
- selectedDiv2 = "#" + selectedDiv + "-container";
- jQuery(selectedDiv2).hide('blind');
- selectIntLink = "#" + selectedDiv + "-container-input";
- jQuery(selectIntLink).val("close");
-}
-
-function showSave() {
- d = document;
- selectIntLink = "submit";
- textlink = d.getElementById(selectIntLink);
- textlink.style.display = "inline";
-}
-
-function updatePref() {
- var widgets = document.getElementsByClassName('widgetdiv');
- var widgetSequence = "";
- var firstprint = false;
- d = document;
- for (i = 0; i < widgets.length; i++) {
- if (firstprint) {
- widgetSequence += ",";
- }
- var widget = widgets[i].id;
- widgetSequence += widget + ":" + widgets[i].parentNode.id + ":";
- widget = widget + "-input";
- textlink = d.getElementById(widget).value;
- widgetSequence += textlink;
- firstprint = true;
- }
- selectLink = "sequence";
- textlink = d.getElementById(selectLink);
- textlink.value = widgetSequence;
- return true;
-}
-
-function hideAllWidgets() {
- jQuery('#niftyOutter').fadeTo('slow', 0.2);
-}
-
-function showAllWidgets() {
- jQuery('#niftyOutter').fadeTo('slow', 1.0);
-}
-
-
-function changeTabDIV(selectedDiv) {
- var dashpos = selectedDiv.indexOf("-");
- var tabclass = selectedDiv.substring(0, dashpos);
- d = document;
-
- //get deactive tabs first
- tabclass = tabclass + "-class-tabdeactive";
- var tabs = document.getElementsByClassName(tabclass);
- var incTabSelected = selectedDiv + "-deactive";
- for (i = 0; i < tabs.length; i++) {
- var tab = tabs[i].id;
- dashpos = tab.lastIndexOf("-");
- var tab2 = tab.substring(0, dashpos) + "-deactive";
- if (tab2 == incTabSelected) {
- tablink = d.getElementById(tab2);
- tablink.style.display = "none";
- tab2 = tab.substring(0, dashpos) + "-active";
- tablink = d.getElementById(tab2);
- tablink.style.display = "table-cell";
-
- //now show main div associated with link clicked
- tabmain = d.getElementById(selectedDiv);
- tabmain.style.display = "block";
- }
- else
- {
- tab2 = tab.substring(0, dashpos) + "-deactive";
- tablink = d.getElementById(tab2);
- tablink.style.display = "table-cell";
- tab2 = tab.substring(0, dashpos) + "-active";
- tablink = d.getElementById(tab2);
- tablink.style.display = "none";
-
- //hide sections we don't want to see
- tab2 = tab.substring(0, dashpos);
- tabmain = d.getElementById(tab2);
- tabmain.style.display = "none";
-
- }
- }
-}
-//]]>
-</script>
-EOD;
-
-
## Set Page Title and Include Header
$pgtitle = array(gettext("Status: Dashboard"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-
-<script type="text/javascript">
-//<![CDATA[
-columns = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8', 'col9', 'col10'];
-//]]>
-</script>
-
-<?php
-include("fbegin.inc");
-echo $jscriptstr;
-if (!file_exists("/usr/local/www/themes/{$g['theme']}/no_big_logo")) {
- echo "<center><img src=\"./themes/".$g['theme']."/images/logobig.jpg\" alt=\"big logo\" /></center><br />";
-}
-
/* Print package server mismatch warning. See https://redmine.pfsense.org/issues/484 */
if (!verify_all_package_servers()) {
print_info_box(package_server_mismatch_message());
@@ -514,286 +279,157 @@ if ($savemsg) {
pfSense_handle_custom_code("/usr/local/pkg/dashboard/pre_dashboard");
?>
-<div id="widgetcontainer" style="display:none">
- <div id="content1"><h1><?=gettext("Available Widgets"); ?></h1><p><?php
- $widgetfiles_add = $widgetfiles;
- sort($widgetfiles_add);
- foreach ($widgetfiles_add as $widget) {
- if (!stristr($widget, "widget.php")) {
- continue;
- }
- $periodpos = strpos($widget, ".");
- $widgetname = substr($widget, 0, $periodpos);
- $nicename = $widgetname;
- $nicename = str_replace("_", " ", $nicename);
- //make the title look nice
- $nicename = ucwords($nicename);
-
- $widgettitle = $widgetname . "_title";
- $widgettitlelink = $widgetname . "_title_link";
- if ($$widgettitle != "") {
- //echo widget title
- ?>
- <span style="cursor: pointer;" onclick='return addWidget("<?php echo $widgetname; ?>")'>
- <u><?php echo $$widgettitle; ?></u></span><br />
- <?php
- } else {
- ?>
- <span style="cursor: pointer;" onclick='return addWidget("<?php echo $widgetname; ?>")'>
- <u><?php echo $nicename; ?></u></span><br /><?php
- }
- }
- ?>
- </p>
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Available Widgets"); ?></h2></div>
+ <div class="panel-body">
+<?php foreach($widgets as $widgetname => $widgetconfig): ?>
+ <?php if ($widgetconfig['display'] == 'none'): ?>
+ <div class="col-sm-3"><a href="#"><i class="icon icon-plus"></i> <?=$widgetconfig['name']?></a></div>
+ <?php endif; ?>
+<?php endforeach; ?>
</div>
</div>
-<div id="welcomecontainer" style="display:none">
- <div id="welcome-container">
- <div style="float:left;width:100%;padding: 2px">
- <h1><?=gettext("Welcome to the Dashboard page"); ?>!</h1>
- </div>
- <div onclick="domTT_close(this);showAllWidgets();" style="width:87%; position: absolute; cursor:pointer; padding: 10px;" >
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_close.gif" alt="close" style="float:right" />
- </div>
- <div style="clear:both;">
+<div class="modal fade">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+ <h4 class="modal-title"><?=gettext("Welcome to the Dashboard page"); ?>!</h4>
+ </div>
+ <div class="modal-body">
+ <p>
+ <?=gettext("This page allows you to customize the information you want to be displayed!");?>
+ <?=gettext("To get started click the");?> FIXME <?=gettext("icon to add widgets.");?><br />
+ <br />
+ <?=gettext("You can move any widget around by clicking and dragging the title.");?>
+ </p>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default btn-primary" data-dismiss="modal">Close</button>
+ </div>
</div>
- <p>
- <?=gettext("This page allows you to customize the information you want to be displayed!");?><br />
- <?=gettext("To get started click the");?> <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="plus" /> <?=gettext("icon to add widgets.");?><br />
- <br />
- <?=gettext("You can move any widget around by clicking and dragging the title.");?>
- </p>
</div>
</div>
-<form action="index.php" method="post">
- <input type="hidden" value="" name="sequence" id="sequence" />
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="<?=gettext("Click here to add widgets"); ?>" style="cursor: pointer;" onmouseup="domTT_activate(this, event, 'content', document.getElementById('content1'), 'type', 'velcro', 'delay', 0, 'fade', 'both', 'fadeMax', 100, 'styleClass', 'niceTitle');" />
-
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_info_pkg.gif" alt="<?=gettext("Click here for help"); ?>" style="cursor: help;" onmouseup="hideAllWidgets();domTT_activate(this, event, 'content', document.getElementById('welcome-container'), 'type', 'sticky', 'closeLink', '', 'delay', 0, 'fade', 'both', 'fadeMax', 100, 'styleClass', 'niceTitle');" />
-
-&nbsp;&nbsp;&nbsp;
- <input id="submit" name="submit" type="submit" style="display:none" onclick="return updatePref();" class="formbtn" value="<?=gettext("Save Settings");?>" />
-</form>
-<!-- fakeClass contains no CSS but is used as an identifier in theme pfsense_ng_fs - loader.js -->
-<div id="niftyOutter" class="fakeClass">
- <?php
- $totalwidgets = count($widgetfiles);
- $halftotal = $totalwidgets / 2 - 2;
- $widgetcounter = 0;
- $directory = "/usr/local/www/widgets/widgets/";
- $printed = false;
- $firstprint = false;
- ?>
- <div id="col1" style="float:left;width:49%;padding-bottom:40px" class="ui-sortable">
- <?php
-
- foreach ($widgetlist as $widget) {
-
- if (!stristr($widget, "widget.php")) {
- continue;
- }
- $periodpos = strpos($widget, ".");
- $widgetname = substr($widget, 0, $periodpos);
- if ($widgetname != "") {
- $nicename = $widgetname;
- $nicename = str_replace("_", " ", $nicename);
-
- //make the title look nice
- $nicename = ucwords($nicename);
- }
+<div class="hidden" id="widgetSequence">
+ <form action="/" method="post" id="widgetSequence">
+ <input type="hidden" name="sequence" value="" />
- if ($config['widgets'] && $pconfig['sequence'] != "") {
- switch ($displayarray[$widgetcounter]) {
- case "show":
- $divdisplay = "block";
- $display = "block";
- $inputdisplay = "show";
- $showWidget = "none";
- $mindiv = "inline";
- break;
- case "hide":
- $divdisplay = "block";
- $display = "none";
- $inputdisplay = "hide";
- $showWidget = "inline";
- $mindiv = "none";
- break;
- case "close":
- $divdisplay = "none";
- $display = "block";
- $inputdisplay = "close";
- $showWidget = "none";
- $mindiv = "inline";
- break;
- default:
- $divdisplay = "none";
- $display = "block";
- $inputdisplay = "none";
- $showWidget = "none";
- $mindiv = "inline";
- break;
- }
- } else {
- if ($firstprint == false) {
- $divdisplay = "block";
- $display = "block";
- $inputdisplay = "show";
- $showWidget = "none";
- $mindiv = "inline";
- $firstprint = true;
- } else {
- switch ($widget) {
- case "interfaces.widget.php":
- case "traffic_graphs.widget.php":
- $divdisplay = "block";
- $display = "block";
- $inputdisplay = "show";
- $showWidget = "none";
- $mindiv = "inline";
- break;
- default:
- $divdisplay = "none";
- $display = "block";
- $inputdisplay = "close";
- $showWidget = "none";
- $mindiv = "inline";
- break;
- }
- }
- }
+ <button type="submit" class="btn btn-primary">Store widget configuration</button>
+ </form>
+</div>
- if (substr($g['theme'], -3) != "_fs") {
- if ($config['widgets'] && $pconfig['sequence'] != "") {
- if ($colpos[$widgetcounter] == "col2" && $printed == false) {
- $printed = true;
- ?>
- </div>
- <div id="col2" style="float:right;width:49%;padding-bottom:40px" class="ui-sortable">
- <?php
- }
- } else if ($widgetcounter >= $halftotal && $printed == false) {
- $printed = true;
- ?>
- </div>
- <div id="col2" style="float:right;width:49%;padding-bottom:40px" class="ui-sortable">
- <?php
- }
- } else {
- if ($config['widgets'] && $pconfig['sequence'] != "") {
- if ($colpos[$widgetcounter] == "col2" && $printed == false) {
- $printed = true;
- ?>
- </div>
- <div id="col2" style="float:right;width:49%;padding-bottom:40px" class="ui-sortable">
- <?php
- } else { ?>
- <script type="text/javascript">
- //<![CDATA[
- var colpos = "<?=$colpos[$widgetcounter]?>";
- createColumn(colpos);
- //]]>
- </script>
- <?php }
- }
- }
+<?php
+$widgetColumns = array();
+foreach ($widgets as $widgetname => $widgetconfig)
+{
+ if ($widgetconfig['display'] == 'none')
+ continue;
+
+ if (!isset($widgetColumns[ $widgetconfig['col'] ]))
+ $widgetColumns[ $widgetconfig['col'] ] = array();
+
+ $widgetColumns[ $widgetconfig['col'] ][ $widgetname ] = $widgetconfig;
+}
+?>
- ?>
- <div style="clear:both;"></div>
- <div id="<?php echo $widgetname;?>-container" class="widgetdiv" style="display:<?php echo $divdisplay; ?>;">
- <input type="hidden" value="<?php echo $inputdisplay;?>" id="<?php echo $widgetname;?>-container-input" name="<?php echo $widgetname;?>-container-input" />
- <div id="<?php echo $widgetname;?>-topic" class="widgetheader" style="cursor:move">
- <div style="float:left;">
- <?php
-
- $widgettitle = $widgetname . "_title";
- $widgettitlelink = $widgetname . "_title_link";
- if ($$widgettitle != "") {
- //only show link if defined
- if ($$widgettitlelink != "") {?>
- <u><span onclick="location.href='/<?php echo $$widgettitlelink;?>'" style="cursor:pointer">
- <?php }
- //echo widget title
- echo $$widgettitle;
- if ($$widgettitlelink != "") { ?>
- </span></u>
- <?php }
- } else {
- if ($$widgettitlelink != "") {?>
- <u><span onclick="location.href='/<?php echo $$widgettitlelink;?>'" style="cursor:pointer">
- <?php }
- echo $nicename;
- if ($$widgettitlelink != "") { ?>
- </span></u>
- <?php }
- }
- ?>
- </div>
- <div align="right" style="float:right;">
- <div id="<?php echo $widgetname;?>-configure" onclick='return configureWidget("<?php echo $widgetname;?>")' style="display:none; cursor:pointer" ><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_configure.gif" alt="configure" /></div>
- <div id="<?php echo $widgetname;?>-open" onclick='return showWidget("<?php echo $widgetname;?>", true)' style="display:<?php echo $showWidget;?>; cursor:pointer" ><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_open.gif" alt="open" /></div>
- <div id="<?php echo $widgetname;?>-min" onclick='return minimizeWidget("<?php echo $widgetname;?>", true)' style="display:<?php echo $mindiv;?>; cursor:pointer" ><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_minus.gif" alt="minimize" /></div>
- <div id="<?php echo $widgetname;?>-close" onclick='return closeWidget("<?php echo $widgetname;?>", true)' style="display:inline; cursor:pointer" ><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_close.gif" alt="close" /></div>
- </div>
- <div style="clear:both;"></div>
+<div class="row">
+<?php foreach ($widgetColumns as $column => $columnWidgets):?>
+ <div class="col-md-6" id="widgets-<?=$column?>">
+<?php foreach ($columnWidgets as $widgetname => $widgetconfig):?>
+ <div class="panel panel-default" id="widget-<?=$widgetname?>">
+ <div class="panel-heading">
+ <?=$widgetconfig['name']?>
+ <span class="icons">
+ <a data-toggle="collapse" href="#widget-<?=$widgetname?> .panel-footer" class="config hidden">
+ <i class="icon icon-wrench"></i>
+ </a>
+ <a data-toggle="collapse" href="#widget-<?=$widgetname?> .panel-body">
+ <!-- actual icon is determined in css based on state of body -->
+ <i class="icon icon-plus-sign"></i>
+ </a>
+ <a data-toggle="close" href="#widget-<?=$widgetname?>">
+ <i class="icon icon-remove-sign"></i>
+ </a>
+ </span>
</div>
- <?php if ($divdisplay != "block") { ?>
- <div id="<?php echo $widgetname;?>-loader" style="display:<?php echo $display; ?>;" align="center">
- <br />
- <img src="./themes/<?= $g['theme']; ?>/images/misc/widget_loader.gif" width="25" height="25" alt="<?=gettext("Loading selected widget"); ?>..." />
- <br />
- </div> <?php $display = "none"; } ?>
- <div id="<?php echo $widgetname;?>" style="display:<?php echo $display; ?>;">
- <?php
- if ($divdisplay == "block") {
- include($directory . $widget);
- }
- ?>
+ <div class="panel-body collapse<?=($widgetconfig['display']=='close' ? '' : ' in')?>">
+ <?php include('/usr/local/www/widgets/widgets/'. $widgetname.'.widget.php'); ?>
</div>
- <div style="clear:both;"></div>
</div>
- <?php
- $widgetcounter++;
-
- }//end foreach
- ?>
- </div>
- <div style="clear:both;"></div>
+<?php endforeach; ?>
+ </div>
+<?php endforeach; ?>
</div>
-<?php include("fend.inc"); ?>
+<script>
+function updateWidgets()
+{
+ var sequence = '';
-<script type="text/javascript">
-//<![CDATA[
- jQuery(document).ready(function(in_event)
- {
- jQuery('.ui-sortable').sortable({connectWith: '.ui-sortable', dropOnEmpty: true, handle: '.widgetheader', change: showSave});
+ $('.container .col-md-6').each(function(idx, col){
+ $('.panel', col).each(function(idx, widget){
+ var isOpen = $('.panel-body', widget).hasClass('in');
+
+ sequence += widget.id.split('-')[1] +':'+ col.id.split('-')[1] +':'+ (isOpen ? 'open' : 'close') +',';
+ });
+ });
+
+ $('#widgetSequence').removeClass('hidden');
+ $('input[name=sequence]', $('#widgetSequence')).val(sequence);
+}
- <?php if (!$config['widgets'] && $pconfig['sequence'] != "") { ?>
- hideAllWidgets();
- domTT_activate('welcome1', null, 'x', 287, 'y', 107, 'content', document.getElementById('welcome-container'), 'type', 'sticky', 'closeLink', '', 'delay', 1000, 'fade', 'both', 'fadeMax', 100, 'styleClass', 'niceTitle');
- <?php } ?>
+events.push(function() {
+ // Hide configuration button for panels without configuration
+ $('.container .panel-heading a.config').each(function (idx, el){
+ var config = $(el).parents('.panel').children('.panel-footer');
+ if (config.length == 1)
+ $(el).removeClass('hidden');
});
-//]]>
+
+ // Initial state & toggle icons of collapsed panel
+ $('.container .panel-heading a[data-toggle="collapse"]').each(function (idx, el){
+ var body = $(el).parents('.panel').children('.panel-body'), isOpen = body.hasClass('in');
+ $(el).toggleClass('icon-plus-sign', !isOpen);
+ $(el).toggleClass('icon-minus-sign', isOpen);
+
+ body.on('shown.bs.collapse', function(){
+ $(el).toggleClass('icon-minus-sign', true);
+ $(el).toggleClass('icon-plus-sign', false);
+
+ updateWidgets();
+ });
+
+ body.on('hidden.bs.collapse', function(){
+ $(el).toggleClass('icon-minus-sign', false);
+ $(el).toggleClass('icon-plus-sign', true);
+
+ updateWidgets();
+ });
+ });
+
+ // Make panels destroyable
+ $('.container .panel-heading a[data-toggle="close"]').each(function (idx, el){
+ $(el).on('click', function(e){
+ $(el).parents('.panel').remove();
+ updateWidgets();
+ })
+ });
+
+ // Make panels sortable
+ $('.container .col-md-6').sortable({
+ handle: '.panel-heading',
+ cursor: 'grabbing',
+ connectWith: '.container .col-md-6',
+ update: updateWidgets
+ });
+});
</script>
<?php
- //build list of javascript include files
- $jsincludefiles = array();
- $directory = "widgets/javascript/";
- $dirhandle = opendir($directory);
- $filename = "";
- while (false !== ($filename = readdir($dirhandle))) {
- $jsincludefiles[] = $filename;
- }
- foreach ($jsincludefiles as $jsincludename) {
- if (!preg_match('/\.js$/', $jsincludename)) {
- continue;
- }
- echo "<script src='{$directory}{$jsincludename}' type='text/javascript'></script>\n";
- }
-?>
+//build list of javascript include files
+foreach (glob('widgets/javascript/*.js') as $file)
+ echo '<script src="'.$file.'"></script>';
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/interfaces.php b/src/usr/local/www/interfaces.php
index 760d386..9533b8b 100644
--- a/src/usr/local/www/interfaces.php
+++ b/src/usr/local/www/interfaces.php
@@ -2,37 +2,60 @@
/* $Id$ */
/*
interfaces.php
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- Copyright (C) 2004-2008 Scott Ullrich
- Copyright (C) 2006 Daniel S. Haischt.
- Copyright (C) 2008-2010 Ermal Luçi
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004-2008 Scott Ullrich
+ * Copyright (c) 2006 Daniel S. Haischt
+ * Copyright (c) 2008-2010 Ermal Luçi
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /usr/sbin/arp
pfSense_MODULE: interfaces
@@ -55,6 +78,7 @@ require_once("rrd.inc");
require_once("vpn.inc");
require_once("xmlparse_attr.inc");
+
if (isset($_POST['referer'])) {
$referer = $_POST['referer'];
} else {
@@ -158,7 +182,7 @@ if ($wancfg['if'] == $a_ppps[$pppid]['if']) {
$pconfig['pppoe_pr_custom'] = true;
$pconfig['pppoe_resetminute'] = $cronitem['minute'];
$pconfig['pppoe_resethour'] = $cronitem['hour'];
- if ($cronitem['mday'] <> "*" && $cronitem['month'] <> "*") {
+ if ($cronitem['mday'] != "*" && $cronitem['month'] != "*") {
$pconfig['pppoe_resetdate'] = "{$cronitem['month']}/{$cronitem['mday']}/" . date("Y");
}
}
@@ -453,7 +477,7 @@ if ($_POST['apply']) {
} else {
interface_bring_down($ifapply, true, $ifcfgo);
if (isset($config['dhcpd'][$ifapply]['enable']) ||
- isset($config['dhcpdv6'][$ifapply]['enable'])) {
+ isset($config['dhcpdv6'][$ifapply]['enable'])) {
services_dhcpd_configure();
}
}
@@ -659,8 +683,8 @@ if ($_POST['apply']) {
continue;
}
if ($config['interfaces'][$ifent]['ipaddrv6'] == 'track6' &&
- $config['interfaces'][$ifent]['track6-interface'] == $_POST['track6-interface'] &&
- $config['interfaces'][$ifent]['track6-prefix-id'] == $track6_prefix_id) {
+ $config['interfaces'][$ifent]['track6-interface'] == $_POST['track6-interface'] &&
+ $config['interfaces'][$ifent]['track6-prefix-id'] == $track6_prefix_id) {
$input_errors[] = sprintf(gettext("This track6 prefix ID is already being used in %s."), $ifdescr);
}
}
@@ -764,15 +788,15 @@ if ($_POST['apply']) {
if (($_POST['pppoe_idletimeout'] != "") && !is_numericint($_POST['pppoe_idletimeout'])) {
$input_errors[] = gettext("The idle timeout value must be an integer.");
}
- if ($_POST['pppoe_resethour'] <> "" && !is_numericint($_POST['pppoe_resethour']) &&
- $_POST['pppoe_resethour'] >= 0 && $_POST['pppoe_resethour'] <=23) {
+ if ($_POST['pppoe_resethour'] != "" && !is_numericint($_POST['pppoe_resethour']) &&
+ $_POST['pppoe_resethour'] >= 0 && $_POST['pppoe_resethour'] <=23) {
$input_errors[] = gettext("A valid PPPoE reset hour must be specified (0-23).");
}
- if ($_POST['pppoe_resetminute'] <> "" && !is_numericint($_POST['pppoe_resetminute']) &&
- $_POST['pppoe_resetminute'] >= 0 && $_POST['pppoe_resetminute'] <=59) {
+ if ($_POST['pppoe_resetminute'] != "" && !is_numericint($_POST['pppoe_resetminute']) &&
+ $_POST['pppoe_resetminute'] >= 0 && $_POST['pppoe_resetminute'] <=59) {
$input_errors[] = gettext("A valid PPPoE reset minute must be specified (0-59).");
}
- if ($_POST['pppoe_resetdate'] <> "" && !is_numeric(str_replace("/", "", $_POST['pppoe_resetdate']))) {
+ if ($_POST['pppoe_resetdate'] != "" && !is_numeric(str_replace("/", "", $_POST['pppoe_resetdate']))) {
$input_errors[] = gettext("A valid PPPoE reset date must be specified (mm/dd/yyyy).");
}
if (($_POST['pptp_local'] && !is_ipaddrv4($_POST['pptp_local']))) {
@@ -838,7 +862,7 @@ if ($_POST['apply']) {
}
}
}
- if ($_POST['mss'] <> '') {
+ if ($_POST['mss'] != '') {
if (!is_numericint($_POST['mss']) || ($_POST['mss'] < 576 || $_POST['mss'] > 65535)) {
$input_errors[] = gettext("The MSS must be an integer between 576 and 65535 bytes.");
}
@@ -1606,6 +1630,7 @@ function check_wireless_mode() {
} else {
$clone_count = 0;
}
+
if (isset($config['wireless']['clone']) && is_array($config['wireless']['clone'])) {
foreach ($config['wireless']['clone'] as $clone) {
if ($clone['if'] == $wlanbaseif) {
@@ -1613,6 +1638,7 @@ function check_wireless_mode() {
}
}
}
+
if ($clone_count > 1) {
$old_wireless_mode = $wancfg['wireless']['mode'];
$wancfg['wireless']['mode'] = $_POST['mode'];
@@ -1643,1540 +1669,1072 @@ foreach ($mediaopts as $mediaopt) {
$pgtitle = array(gettext("Interfaces"), $pconfig['descr']);
$shortcut_section = "interfaces";
-$closehead = false;
-include("head.inc");
$types4 = array("none" => gettext("None"), "staticv4" => gettext("Static IPv4"), "dhcp" => gettext("DHCP"), "ppp" => gettext("PPP"), "pppoe" => gettext("PPPoE"), "pptp" => gettext("PPTP"), "l2tp" => gettext("L2TP"));
$types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"), "dhcp6" => gettext("DHCP6"), "slaac" => gettext("SLAAC"), "6rd" => gettext("6rd Tunnel"), "6to4" => gettext("6to4 Tunnel"), "track6" => gettext("Track Interface"));
-?>
-
-<script type="text/javascript" src="/javascript/numericupdown/js/numericupdown.js"></script>
-<link href="/javascript/numericupdown/css/numericupdown.css" rel="stylesheet" type="text/css" />
-<script type="text/javascript" src="/javascript/datepicker/js/datepicker.js"></script>
-<link href="/javascript/datepicker/css/datepicker.css" rel="stylesheet" type="text/css"/>
-
-<script type="text/javascript">
-//<![CDATA[
- function updateType(t) {
- switch (t) {
- case "none": {
- jQuery('#staticv4, #dhcp, #pppoe, #pptp, #ppp').hide();
- break;
- }
- case "staticv4": {
- jQuery('#none, #dhcp, #pppoe, #pptp, #ppp').hide();
- break;
- }
- case "dhcp": {
- jQuery('#none, #staticv4, #pppoe, #pptp, #ppp').hide();
- break;
- }
- case "ppp": {
- jQuery('#none, #staticv4, #dhcp, #pptp, #pppoe').hide();
- country_list();
- break;
- }
- case "pppoe": {
- jQuery('#none, #staticv4, #dhcp, #pptp, #ppp').hide();
- break;
- }
- case "l2tp":
- case "pptp": {
- jQuery('#none, #staticv4, #dhcp, #pppoe, #ppp').hide();
- jQuery('#pptp').show();
- break;
- }
- }
- if (t != "l2tp" && t != "pptp") {
- jQuery('#'+t).show();
- }
- }
- function updateTypeSix(t) {
- if (!isNaN(t[0])) t = '_' + t;
- switch (t) {
- case "none": {
- jQuery('#staticv6, #dhcp6, #_6rd, #_6to4, #track6, #slaac').hide();
- break;
- }
- case "staticv6": {
- jQuery('#none, #dhcp6, #_6rd, #_6to4, #track6, #slaac').hide();
- break;
- }
- case "slaac": {
- jQuery('#none, #staticv6, #_6rd, #_6to4, #track6, #dhcp6').hide();
- break;
- }
- case "dhcp6": {
- jQuery('#none, #staticv6, #_6rd, #_6to4, #track6, #slaac').hide();
- break;
- }
- case "_6rd": {
- jQuery('#none, #dhcp6, #staticv6, #_6to4, #track6, #slaac').hide();
- break;
- }
- case "_6to4": {
- jQuery('#none, #dhcp6, #staticv6, #_6rd, #track6, #slaac').hide();
- break;
- }
- case "track6": {
- jQuery('#none, #dhcp6, #staticv6, #_6rd, #_6to4, #slaac').hide();
- update_track6_prefix();
- break;
- }
- }
- if (t != "l2tp" && t != "pptp") {
- jQuery('#'+t).show();
- }
- }
+$closehead = false;
- function show_allcfg(obj) {
- if (obj.checked) {
- jQuery('#allcfg').show();
- } else {
- jQuery('#allcfg').hide();
- }
- }
+// Get the MAC address
+$ip = $_SERVER['REMOTE_ADDR'];
+$mymac = `/usr/sbin/arp -an | grep '('{$ip}')' | head -n 1 | cut -d" " -f4`;
+$mymac = str_replace("\n","",$mymac);
+
+function build_mediaopts_list() {
+ global $mediaopts_list;
+
+ $list = ["" => "Default (no preference, typically autoselect)",
+ " " => "------- Media Supported by this interface -------"
+ ];
+
+ foreach ($mediaopts_list as $mediaopt) {
+ $list[$mediaopt] = $mediaopt;
+ }
+
+ return($list);
+}
- function show_reset_settings(reset_type) {
- if (reset_type == 'preset') {
- jQuery('#pppoepresetwrap').show();
- jQuery('#pppoecustomwrap').hide();
- } else if (reset_type == 'custom') {
- jQuery('#pppoecustomwrap').show();
- jQuery('#pppoepresetwrap').hide();
- } else {
- jQuery('#pppoecustomwrap').hide();
- jQuery('#pppoepresetwrap').hide();
+function build_gateway_list() {
+ global $a_gateways;
+
+ $list = array("none" => "None");
+ foreach ($a_gateways as $gateway) {
+ if (($gateway['interface'] == $if) && (is_ipaddrv4($gateway['gateway']))) {
+ $list[$gateway['name']] = $gateway['name'] . " - " . $gateway['gateway'];
}
}
+
+ return($list);
+}
- function show_mon_config() {
- jQuery("#showmonbox").html('');
- jQuery('#showmon').css('display', 'block');
- }
+include("head.inc");
- function openwindow(url) {
- var oWin = window.open(url, "pfSensePop", "width=620,height=400,top=150,left=150");
- if (oWin == null || typeof(oWin) == "undefined") {
- return false;
- } else {
- return true;
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if (is_subsystem_dirty('interfaces'))
+ print_info_box_np(sprintf(gettext("The %s configuration has been changed."), $wancfg['descr']) . "<br />" .
+ gettext("You must apply the changes in order for them to take effect. Don't forget to adjust the DHCP Server range if needed after applying."));
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+
+require('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'Submit',
+ gettext("Save")
+));
+
+$section = new Form_Section('General configuration');
+
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'Enable',
+ 'Enable interface',
+ $pconfig['enable'],
+ 'yes'
+));
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('Enter a description (name) for the interface here.');
+
+$section->addInput(new Form_Select(
+ 'type',
+ 'IPv4 Configuration Type',
+ $pconfig['type'],
+ $types4
+));
+
+$section->addInput(new Form_Select(
+ 'type6',
+ 'IPv6 Configuration Type',
+ $pconfig['type6'],
+ $types6
+));
+
+$macaddress = new Form_Input(
+ 'mac',
+ 'MAC Address',
+ 'text',
+ $pconfig['mac'],
+ ['placeholder' => 'xx:xx:xx:xx:xx:xx']
+);
+
+$btnmymac = new Form_Button(
+ 'btnmymac',
+ 'Copy My MAC'
+ );
+
+$btnmymac->removeClass('btn-primary')->addClass('btn-success btn-sm');
+
+$group = new Form_Group('MAC controls');
+$group->add($macaddress);
+$group->add($btnmymac);
+$group->setHelp('This field can be used to modify ("spoof") the MAC address of this interface.' . '<br />' .
+ 'Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx or leave blank');
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'mtu',
+ 'MTU',
+ 'number',
+ $pconfig['mtu']
+))->setHelp('If you leave this field blank, the adapter\'s default MTU will be used. ' .
+ 'This is typically 1500 bytes but can vary in some circumstances.');
+
+$section->addInput(new Form_Input(
+ 'mss',
+ 'MSS',
+ 'number',
+ $pconfig['mss']
+))->setHelp('If you enter a value in this field, then MSS clamping for TCP connections to the value entered above minus 40 (TCP/IP ' .
+ 'header size) will be in effect.');
+
+if (count($mediaopts_list) > 0) {
+ $section->addInput(new Form_Select(
+ 'mediaopt',
+ 'Speed and Duplex',
+ rtrim($mediaopt_from_config),
+ build_mediaopts_list()
+ ))->setHelp('Here you can explicitly set speed and duplex mode for this interface.' . '<br />' .
+ 'WARNING: You MUST leave this set to autoselect (automatically negotiate speed) unless the port this interface connects to has its speed and duplex forced.');
+}
+
+$form->add($section);
+
+$section = new Form_Section('Static IPv4 configuration');
+
+$section->addInput(new Form_IpAddress(
+ 'ipaddr',
+ 'IPv4 Address',
+ $pconfig['ipaddr']
+))->addMask('subnet', $pconfig['subnet'], 32);
+
+$group = new Form_Group('IPv4 Upstream gateway');
+
+$group->add(new Form_Select(
+ 'gateway',
+ 'IPv4 Upstream Gateway',
+ $pconfig['gateway'],
+ build_gateway_list()
+));
+
+$group->add(new Form_Button(
+ 'addgw',
+ 'Add a new gateway'
+))->removeClass('btn-primary');
+
+$group->setHelp('If this interface is an Internet connection, select an existing Gateway from the list or add a new one using the "Add" button.' . '<br />' .
+ 'On local LANs the upstream gateway should be "none". ');
+
+$section->add($group);
+
+$group = new Form_group('New gateway');
+
+$group->add(new Form_Checkbox(
+ 'defaultgw',
+ null,
+ 'Default gateway',
+ ($if == "wan" || $if == "WAN")
+));
+
+$group->add(new Form_Input(
+ 'name',
+ 'Gateway name',
+ 'text',
+ $wancfg['descr'] . "GW"
+))->setHelp('Name');
+
+$group->add(new Form_IpAddress(
+ 'gatewayip',
+ 'Gateway IPv4',
+ null
+))->setHelp('IP address');
+
+$group->add(new Form_Input(
+ 'gatewaydescr',
+ 'Description',
+ 'text'
+))->setHelp('Description');
+
+$group->add(new Form_Button(
+ 'add',
+ 'Add'
+))->removeClass('btn-primary')->addClass('btn-success');
+
+$section->add($group);
+
+$form->add($section);
+
+$section = new Form_Section('Static IPv6 configuration');
+
+$section->addInput(new Form_IpAddress(
+ 'ipaddrv6',
+ 'IPv6 address',
+ $pconfig['ipaddrv6']
+))->addMask('subnetv6', $pconfig['sunbetv6'], 128);
+
+$group = new Form_Group('IPv6 Upstream gateway');
+
+$group->add(new Form_Select(
+ 'gatewayv6',
+ 'IPv4 Upstream Gateway',
+ $pconfig['gateway'],
+ build_gateway_list()
+));
+
+$group->add(new Form_Button(
+ 'addgwv6',
+ 'Add a new gateway'
+))->removeClass('btn-primary');
+
+$group->setHelp('If this interface is an Internet connection, select an existing Gateway from the list or add a new one using the "Add" button.' . '<br />' .
+ 'On local LANs the upstream gateway should be "none". ');
+
+$group = new Form_group('IPv6 upstream gateway');
+
+$group->add(new Form_Checkbox(
+ 'defaultgwv6',
+ null,
+ 'Default gateway',
+ ($if == "wan" || $if == "WAN")
+));
+
+$group->add(new Form_Input(
+ 'namev6',
+ 'Gateway name',
+ 'text',
+ $wancfg['descr'] . "GWv6"
+))->setHelp('Name');
+
+$group->add(new Form_IpAddress(
+ 'gatewayipv6',
+ 'Gateway IPv6',
+ null
+))->setHelp('IP address');
+
+$group->add(new Form_Input(
+ 'gatewaydescrv6',
+ 'Description',
+ 'text'
+))->setHelp('Description');
+
+$group->add(new Form_Button(
+ 'addv6',
+ 'Add'
+))->removeClass('btn-primary')->addClass('btn-success');
+
+$section->add($group);
+
+$form->add($section);
+
+// ==== DHCP client configuration =============================
+
+$section = new Form_Section('DHCP client configuration');
+
+$section->addInput(new Form_Input(
+ 'dhcphostname',
+ 'Hostname',
+ 'text',
+ $pconfig['dhcphostname']
+))->setHelp('The value in this field is sent as the DHCP client identifier and hostname when requesting a DHCP lease. Some ISPs may require this (for client identification).');
+
+$section->addInput(new Form_IpAddress(
+ 'alias-address',
+ 'Alias IPv4 address',
+ $pconfig['alias-address']
+))->addMask('alias-subnet', $pconfig['alias-subnet'], 32)->setHelp('The value in this field is used as a fixed alias IPv4 address by the DHCP client.');
+
+$section->addInput(new Form_Input(
+ 'dhcprejectfrom',
+ 'Reject leases from',
+ 'text',
+ $pconfig['dhcprejectfrom']
+))->setHelp('If there is a certain upstream DHCP server that should be ignored, place the IP address or subnet of the DHCP server to be ignored here. ' .
+ 'This is useful for rejecting leases from cable modems that offer private IPs when they lose upstream sync.');
+
+$group = new Form_Group('Protocol timing');
+
+$group->add(new Form_Input(
+ 'adv_dhcp_pt_timeout',
+ null,
+ 'number',
+ $pconfig['adv_dhcp_pt_timeout']
+))->setHelp('Timeout');
+
+$group->add(new Form_Input(
+ 'adv_dhcp_pt_retry',
+ null,
+ 'number',
+ $pconfig['adv_dhcp_pt_retry']
+))->setHelp('Retry');
+
+$group->add(new Form_Input(
+ 'adv_dhcp_pt_select_timeout',
+ null,
+ 'number',
+ $pconfig['adv_dhcp_pt_select_timeout']
+))->setHelp('Select timeout');
+
+$group->add(new Form_Input(
+ 'adv_dhcp_pt_reboot',
+ null,
+ 'number',
+ $pconfig['adv_dhcp_pt_reboot']
+))->setHelp('Reboot');
+
+$group->add(new Form_Input(
+ 'adv_dhcp_pt_backoff_cutoff',
+ null,
+ 'number',
+ $pconfig['adv_dhcp_pt_backoff_cutoff']
+))->setHelp('Backoff cutoff');
+
+$group->add(new Form_Input(
+ 'adv_dhcp_pt_initial_interval',
+ null,
+ 'number',
+ $pconfig['adv_dhcp_pt_initial_interval']
+))->setHelp('Initial interval');
+
+$section->add($group);
+
+$group = new Form_Group('Presets');
+
+$group->add(new Form_Checkbox(
+ 'adv_dhcp_pt_values',
+ null,
+ 'Free BDS default',
+ null,
+ 'DHCP'
+))->displayAsRadio();
+
+$group->add(new Form_Checkbox(
+ 'adv_dhcp_pt_values',
+ null,
+ 'Clear',
+ null,
+ 'Clear'
+))->displayAsRadio();
+
+$group->add(new Form_Checkbox(
+ 'adv_dhcp_pt_values',
+ null,
+ 'pfSense Default',
+ null,
+ 'pfSense'
+))->displayAsRadio();
+
+$group->add(new Form_Checkbox(
+ 'adv_dhcp_pt_values',
+ null,
+ 'Saved Cfg',
+ null,
+ 'SavedCfg'
+))->displayAsRadio();
+
+$group->setHelp('The values in these fields are DHCP protocol timings used when requesting a lease.' . '<br />' .
+ '<a href="http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&sektion=5#PROTOCOL_TIMING">' . 'See here more information' . '</a>');
+
+$section->add($group);
+
+$form->add($section);
+
+$section = new Form_Section('Lease Requirements and Requests');
+
+$section->addInput(new Form_Input(
+ 'adv_dhcp_send_options',
+ 'Send options',
+ 'text',
+ $pconfig['adv_dhcp_send_options']
+))->sethelp('The values in this field are DHCP options to be sent when requesting a DHCP lease. [option declaration [, ...]]' . '<br />' .
+ 'Value Substitutions: {interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD}' . '<br />' .
+ 'Where C is U(pper) or L(ower) Case, and D is " :-." Delimiter (space, colon, hyphen, or period) (omitted for none).' . '<br />' .
+ 'Some ISPs may require certain options be or not be sent.');
+
+$section->addInput(new Form_Input(
+ 'adv_dhcp_request_options',
+ 'Request options',
+ 'text',
+ $pconfig['adv_dhcp_request_options']
+))->sethelp('The values in this field are DHCP option 55 to be sent when requesting a DHCP lease. [option [, ...]]' . '<br />' .
+ 'Some ISPs may require certain options be or not be requested.');
+
+$section->addInput(new Form_Input(
+ 'adv_dhcp_require_options',
+ 'Request options',
+ 'text',
+ $pconfig['adv_dhcp_require_options']
+))->sethelp('The values in this field are DHCP options required by the client when requesting a DHCP lease. [option [, ...]]');
+
+$section->addInput(new Form_Input(
+ 'adv_dhcp_option_modifiers',
+ 'Option modifiers',
+ 'text',
+ $pconfig['adv_dhcp_option_modifiers']
+))->sethelp('The values in this field are DHCP option modifiers applied to obtained DHCP lease. [modifier option declaration [, ...]]' . '<br />' .
+ 'modifiers: (default, supersede, prepend, append)');
+
+$section->addInput(new Form_Input(
+ 'adv_dhcp_config_file_override_path',
+ 'Option modifiers',
+ 'text',
+ $pconfig['adv_dhcp_config_file_override_path']
+))->sethelp('The value in this field is the full absolute path to a DHCP client configuration file. [/[dirname/[.../]]filename[.ext]]' . '<br />' .
+ 'Value Substitutions in Config File: {interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD}' . '<br />' .
+ 'Where C is U(pper) or L(ower) Case, and D is ":-." Delimiter (space, colon, hyphen, or period) (omitted for none).' . '<br />' .
+ 'Some ISPs may require certain options be or not be sent.');
+
+$form->add($section);
+
+// DHCP6 client config
+
+$section = new Form_Section('DHCP6 client configuration');
+$section->addInput(new Form_Checkbox(
+ 'dhcp6usev4iface',
+ 'Use IPv4 connectivity as parent interface',
+ 'Request a IPv6 prefix/information through the IPv4 connectivity link',
+ $pconfig['dhcp6usev4iface']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'dhcp6prefixonly',
+ 'Request only an IPv6 prefix',
+ 'Only request an IPv6 prefix, do not request an IPv6 address',
+ $pconfig['dhcp6prefixonly']
+));
+
+$section->addInput(new Form_Select(
+ 'dhcp6-ia-pd-len',
+ 'DHCPv6 Prefix Delegation size',
+ $pconfig['dhcp6-ia-pd-len'],
+ array("none" => "None", 16 => "48", 12 => "52", 8 => "56", 4 => "60", 3 => "61", 2 => "62", 1 => "63", 0 => "64")
+))->setHelp('The value in this field is the delegated prefix length provided by the DHCPv6 server. Normally specified by the ISP.');
+
+$section->addInput(new Form_Checkbox(
+ 'dhcp6-ia-pd-send-hint',
+ 'Send IPv6 prefix hint',
+ 'Send an IPv6 prefix hint to indicate the desired prefix size for delegation',
+ $pconfig['dhcp6-ia-pd-send-hint']
+));
+
+$form->add($section);
+
+// DHCP6 client config - Advanced
+
+$section = new Form_Section('Advanced DHCP6 client configuration');
+$section->addInput(new Form_Checkbox(
+ 'adv_dhcp6_interface_statement_information_only_enable',
+ 'Information only',
+ null,
+ false
+));
+
+$section->addInput(new Form_Input(
+ 'adv_dhcp6_interface_statement_send_options',
+ 'Send options',
+ 'text',
+ $pconfig['adv_dhcp6_interface_statement_send_options']
+))->sethelp('DHCP send options to be sent when requesting a DHCP lease. [option declaration [, ...]]' . '<br />' .
+ 'Value Substitutions: {interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD}' . '<br />' .
+ 'Where C is U(pper) or L(ower) Case, and D is \" :-.\" Delimiter (space, colon, hyphen, or period) (omitted for none).' . '<br />' .
+ 'Some DHCP services may require certain options be or not be sent.');
+
+$section->addInput(new Form_Input(
+ 'adv_dhcp6_interface_statement_request_options',
+ 'Request Options',
+ 'text',
+ $pconfig['adv_dhcp6_interface_statement_request_options']
+))->sethelp('DHCP request options to be sent when requesting a DHCP lease. [option [, ...]]' . '<br />' .
+ 'Some DHCP services may require certain options be or not be requested.');
+
+$section->addInput(new Form_Input(
+ 'adv_dhcp6_interface_statement_script',
+ 'Scripts',
+ 'text',
+ $pconfig['adv_dhcp6_interface_statement_request_options']
+))->sethelp('Absolute path to a script invoked on certain conditions including when a reply message is received.' . '<br />' .
+ '[/[dirname/[.../]]filename[.ext]].');
+
+$group = new Form_Group('Identity Association Statement');
+
+$group->add(new Form_Checkbox(
+ 'adv_dhcp6_id_assoc_statement_address_enable',
+ null,
+ 'Non-Temporary Address Allocation',
+ false
+));
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_id_assoc_statement_address_id',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_id_assoc_statement_address_id']
+))->sethelp('id-assoc na ID');
+
+$group->add(new Form_IpAddress(
+ 'adv_dhcp6_id_assoc_statement_address',
+ null,
+ $pconfig['adv_dhcp6_id_assoc_statement_address']
+))->sethelp('IPv6 address');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_id_assoc_statement_address_pltime',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_id_assoc_statement_address_pltime']
+))->sethelp('pltime');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_id_assoc_statement_address_vltime',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_id_assoc_statement_address_vltime']
+))->sethelp('vltime');
+
+$section->add($group);
+
+// Prefix delegation
+$group = new Form_Group('');
+
+$group->add(new Form_Checkbox(
+ 'adv_dhcp6_id_assoc_statement_prefix_enable',
+ null,
+ 'Prefix Delegation ',
+ false
+));
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_id_assoc_statement_prefix_id',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_id_assoc_statement_prefix_id']
+))->sethelp('id-assoc pd ID');
+
+$group->add(new Form_IpAddress(
+ 'adv_dhcp6_id_assoc_statement_prefix',
+ null,
+ $pconfig['adv_dhcp6_id_assoc_statement_prefix']
+))->sethelp('IPv6 prefix');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_id_assoc_statement_prefix_pltime',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_id_assoc_statement_prefix_pltime']
+))->sethelp('pltime');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_id_assoc_statement_prefix_vltime',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_id_assoc_statement_prefix_vltime']
+))->sethelp('vltime');
+
+$section->add($group);
+
+$group = new Form_Group('Prefix interface statement');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_prefix_interface_statement_sla_id',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_prefix_interface_statement_sla_id']
+))->sethelp('Prefix Interface sla-id');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_prefix_interface_statement_sla_len',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_prefix_interface_statement_sla_len']
+))->sethelp('sla-len');
+
+$section->add($group);
+
+$group = new Form_Group('Authentication statement');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_authentication_statement_authname',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_authentication_statement_authname']
+))->sethelp('Authname');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_authentication_statement_protocol',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_authentication_statement_protocol']
+))->sethelp('Protocol');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_authentication_statement_algorithm',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_authentication_statement_algorithm']
+))->sethelp('Algorithm');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_authentication_statement_rdm',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_authentication_statement_rdm']
+))->sethelp('RDM');
+
+$section->add($group);
+
+$group = new Form_Group('Keyinfo statement');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_key_info_statement_keyname',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_key_info_statement_keyname']
+))->sethelp('Keyname');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_key_info_statement_realm',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_key_info_statement_realm']
+))->sethelp('Realm');
+
+$section->add($group);
+
+$group = new Form_Group('');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_key_info_statement_keyid',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_key_info_statement_keyid']
+))->sethelp('KeyID');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_key_info_statement_secret',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_key_info_statement_secret']
+))->sethelp('Secret');
+
+$group->add(new Form_Input(
+ 'adv_dhcp6_key_info_statement_expire',
+ null,
+ 'text',
+ $pconfig['adv_dhcp6_key_info_statement_expire']
+))->sethelp('Expire');
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'adv_dhcp6_config_file_override_path',
+ 'Configuration File Override',
+ 'text',
+ $pconfig['adv_dhcp6_config_file_override_path']
+))->setHelp('The value in this field is the full absolute path to a DHCP client configuration file. [/[dirname/[.../]]filename[.ext]]' . '<br />' .
+ 'Value Substitutions in Config File: {interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD}' . '<br />' .
+ 'Where C is U(pper) or L(ower) Case, and D is \" :-.\" Delimiter (space, colon, hyphen, or period) (omitted for none).' . '<br />' .
+ 'Some ISPs may require certain options be or not be sent.');
+
+$form->add($section);
+
+$section = new Form_Section('6RD Configuration');
+
+$section->addInput(new Form_Input(
+ 'prefix-6rd',
+ '6RD Prefix',
+ 'text',
+ $pconfig['prefix-6rd']
+))->sethelp('6RD IPv6 prefix assigned by your ISP. e.g. "2001:db8::/32"');
+
+$section->addInput(new Form_Input(
+ 'gateway-6rd',
+ '6RD Border relay',
+ 'text',
+ $pconfig['prefix-6rd']
+))->sethelp('6RD IPv4 gateway address assigned by your ISP');
+
+$section->addInput(new Form_Select(
+ 'prefix-6rd-v4plen',
+ 'DHCPv6 Prefix Delegation size',
+ $pconfig['prefix-6rd-v4plen'],
+ array_combine(range(0, 32), range(0,32))
+))->setHelp('6RD IPv4 prefix length. Normally specified by the ISP. A value of 0 means we embed the entire IPv4 address in the 6RD prefix..');
+
+$form->add($section);
+
+// Track IPv6 ointerface section
+$section = new Form_Section('Track IPv6 Interface');
+
+function build_ipv6interface_list() {
+ $list = array('' => '');
+
+ $interfaces = get_configured_interface_with_descr(false, true);
+ $dynv6ifs = array();
+
+ foreach ($interfaces as $iface => $ifacename) {
+ switch ($config['interfaces'][$iface]['ipaddrv6']) {
+ case "6to4":
+ case "6rd":
+ case "dhcp6":
+ $dynv6ifs[$iface] = array(
+ 'name' => $ifacename,
+ 'ipv6_num_prefix_ids' => pow(2, calculate_ipv6_delegation_length($iface)) - 1
+ );
+ break;
+ default:
+ continue;
}
}
- function country_list() {
- jQuery('#country').children().remove();
- jQuery('#provider_list').children().remove();
- jQuery('#providerplan').children().remove();
- jQuery.ajax("getserviceproviders.php",{
- success: function(response) {
- var responseTextArr = response.split("\n");
- responseTextArr.sort();
- responseTextArr.each( function(value) {
- var option = new Element('option');
- country = value.split(":");
- option.text = country[0];
- option.value = country[1];
- jQuery('#country').append(option);
- });
- }
- });
- jQuery('#trcountry').css('display', "table-row");
- }
-
- function providers_list() {
- jQuery('#provider_list').children().remove();
- jQuery('#providerplan').children().remove();
- jQuery.ajax("getserviceproviders.php",{
- type: 'post',
- data: {country : jQuery('#country').val()},
- success: function(response) {
- var responseTextArr = response.split("\n");
- responseTextArr.sort();
- responseTextArr.each( function(value) {
- var option = new Element('option');
- option.text = value;
- option.value = value;
- jQuery('#provider_list').append(option);
- });
- }
- });
- jQuery('#trprovider').css("display", "table-row");
- jQuery('#trproviderplan').css("display", "none");
- }
-
- function providerplan_list() {
- jQuery('#providerplan').children().remove();
- jQuery('#providerplan').append( new Element('option') );
- jQuery.ajax("getserviceproviders.php",{
- type: 'post',
- data: {country : jQuery('#country').val(), provider : jQuery('#provider_list').val()},
- success: function(response) {
- var responseTextArr = response.split("\n");
- responseTextArr.sort();
- responseTextArr.each( function(value) {
- if (value != "") {
- providerplan = value.split(":");
-
- var option = new Element('option');
- option.text = providerplan[0] + " - " + providerplan[1];
- option.value = providerplan[1];
- jQuery('#providerplan').append(option);
- }
- });
- }
- });
- jQuery('#trproviderplan').css("display", "table-row");
- }
-
- function prefill_provider() {
- jQuery.ajax("getserviceproviders.php",{
- type: 'post',
- data: {country : jQuery('#country').val(), provider : jQuery('#provider_list').val(), plan : jQuery('#providerplan').val()},
- success: function(data, textStatus, response) {
- var xmldoc = response.responseXML;
- var provider = xmldoc.getElementsByTagName('connection')[0];
- jQuery('#ppp_username').val('');
- jQuery('#ppp_password').val('');
- if (provider.getElementsByTagName('apn')[0].firstChild.data == "CDMA") {
- jQuery('#phone').val('#777');
- jQuery('#apn').val('');
- } else {
- jQuery('#phone').val('*99#');
- jQuery('#apn').val(provider.getElementsByTagName('apn')[0].firstChild.data);
- }
- ppp_username = provider.getElementsByTagName('ppp_username')[0].firstChild.data;
- ppp_password = provider.getElementsByTagName('ppp_password')[0].firstChild.data;
- jQuery('#ppp_username').val(ppp_username);
- jQuery('#ppp_password').val(ppp_password);
- }
- });
- }
-
- function update_track6_prefix() {
- var iface = jQuery("#track6-interface").val();
- if (iface == null) {
- return;
- }
- var track6_prefix_ids = jQuery('#ipv6-num-prefix-ids-' + iface).val();
- if (track6_prefix_ids == null) {
- return;
- }
- track6_prefix_ids = parseInt(track6_prefix_ids).toString(16);
- jQuery('#track6-prefix-id-range').html('(<b>hexadecimal</b> from 0 to ' + track6_prefix_ids + ')');
+ foreach ($dynv6ifs as $iface => $ifacedata) {
+ $list[$iface] = $ifacedata['name'];
+
+ $section->addInput(new Form_Input(
+ 'ipv6-num-prefix-ids-' . $iface,
+ null,
+ 'hidden',
+ $ifacedata['ipv6_num_prefix_ids']
+ ));
}
+
+ return($list);
+}
-//]]>
-</script>
-</head>
- <body link="#0000CC" vlink="#0000CC" alink="#0000CC">
- <?php include("fbegin.inc"); ?>
- <form action="interfaces.php" method="post" name="iform" id="iform">
- <?php if ($input_errors) print_input_errors($input_errors); ?>
- <?php if (is_subsystem_dirty('interfaces')): ?><p>
- <?php print_info_box_np(sprintf(gettext("The %s configuration has been changed."), $wancfg['descr']) . "</p><p>" . gettext("You must apply the changes in order for them to take effect.") . "</p><p>" . gettext("Don't forget to adjust the DHCP Server range if needed after applying."));?></p><br />
- <?php endif; ?>
- <?php if ($savemsg) print_info_box($savemsg); ?>
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces">
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabs">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("General configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Enable"); ?></td>
- <td width="78%" class="vtable">
- <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable'] == true) echo "checked=\"checked\""; ?> onclick="show_allcfg(this);" />
- <strong><?=gettext("Enable Interface"); ?></strong>
- </td>
- </tr>
- </table>
- <div style="display:none;" id="allcfg">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="allcfg">
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="30" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br /><span class="vexpl"><?= gettext("Enter a description (name) for the interface here."); ?></span>
- </td>
- </tr>
- <tr>
- <td valign="middle" class="vncell"><strong><?=gettext("IPv4 Configuration Type"); ?></strong></td>
- <td class="vtable">
- <select name="type" onchange="updateType(this.value);" <?php echo $type_disabled; ?> class="formselect" id="type">
- <?php
- foreach ($types4 as $key => $opt) {
- echo "<option onclick=\"updateType('{$key}');\"";
- if ($key == $pconfig['type']) {
- echo " selected=\"selected\"";
- }
- echo " value=\"{$key}\" >" . htmlspecialchars($opt);
- echo "</option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td valign="middle" class="vncell"><strong><?=gettext("IPv6 Configuration Type"); ?></strong></td>
- <td class="vtable">
- <select name="type6" onchange="updateTypeSix(this.value);" <?php echo $type_disabled; ?> class="formselect" id="type6">
- <?php
- foreach ($types6 as $key => $opt) {
- echo "<option onclick=\"updateTypeSix('{$key}');\"";
- if ($key == $pconfig['type6']) {
- echo " selected=\"selected\"";
- }
- echo " value=\"{$key}\" >" . htmlspecialchars($opt);
- echo "</option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("MAC address"); ?></td>
- <td class="vtable">
- <input name="spoofmac" type="text" class="formfld unknown" id="spoofmac" size="30" value="<?=htmlspecialchars($pconfig['spoofmac']);?>" />
- <br />
- <?=gettext("This field can be used to modify (\"spoof\") the MAC " .
- "address of this interface"); ?><br />
- <?=gettext("Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx " .
- "or leave blank"); ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("MTU"); ?></td>
- <td class="vtable">
- <input name="mtu" type="text" class="formfld unknown" id="mtu" size="8" value="<?=htmlspecialchars($pconfig['mtu']);?>" />
- <br />
- <?php
- print gettext("If you leave this field blank, the adapter's default MTU will " .
- "be used. This is typically 1500 bytes but can vary in some circumstances.");
- ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("MSS"); ?></td>
- <td class="vtable">
- <input name="mss" type="text" class="formfld unknown" id="mss" size="8" value="<?=htmlspecialchars($pconfig['mss']);?>" />
- <br />
- <?=gettext("If you enter a value in this field, then MSS clamping for " .
- "TCP connections to the value entered above minus 40 (TCP/IP " .
- "header size) will be in effect."); ?>
- </td>
- </tr>
- <?php
- if (count($mediaopts_list) > 0) {
- $mediaopt_from_config = $config['interfaces'][$if]['media'] . ' ' . $config['interfaces'][$if]['mediaopt'];
- echo "<tr>";
- echo '<td valign="top" class="vncell">' . gettext("Speed and duplex") . '</td>';
- echo '<td class="vtable">';
- echo '<div id="showadvmediabox"';
- if ($mediaopt_from_config != 'autoselect ' && $mediaopt_from_config != ' ') {
- echo " style='display:none'>";
- } else {
- echo '>';
- }
- echo '<input type="button" onclick="show_advanced_media()" value="' . gettext("Advanced") . '" /> - ' . gettext("Show advanced option");
- echo "</div>";
- echo '<div id="showmediaadv" ';
- if ($mediaopt_from_config == 'autoselect ' || $mediaopt_from_config == ' ') {
- echo "style='display:none'>";
- } else {
- echo '>';
- }
- echo '<select name="mediaopt" class="formselect" id="mediaopt">';
- print "<option value=\"\">Default (no preference, typically autoselect)</option>";
- print "<option value=\"\">------- Media Supported by this interface -------</option>";
- foreach ($mediaopts_list as $mediaopt) {
- if ($mediaopt != rtrim($mediaopt_from_config)) {
- print "<option value=\"$mediaopt\">" . gettext("$mediaopt") . "</option>";
- } else {
- print "<option value=\"$mediaopt\" selected=\"selected\">" . gettext("$mediaopt") . "</option>";
- }
- }
- echo '</select><br />';
- echo gettext("Here you can explicitly set speed and duplex mode for this interface. WARNING: You MUST leave this set to autoselect (automatically negotiate speed) unless the port this interface connects to has its speed and duplex forced.");
- echo '</div>';
- echo '</td>';
- echo '</tr>';
- }
- ?>
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
- <tr style="display:none;" id="none">
- <td style="display:none;"></td>
- </tr>
- <tr style="display:none;" id="staticv4">
- <td colspan="2" style="padding:0px;">
- <a name="gatewaysection"></a>
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="staticv4">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Static IPv4 configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("IPv4 address"); ?></td>
- <td width="78%" class="vtable">
- <input name="ipaddr" type="text" class="formfld unknown" id="ipaddr" size="20" value="<?=htmlspecialchars($pconfig['ipaddr']);?>" />
- /
- <select name="subnet" class="formselect" id="subnet">
- <?php
- for ($i = 32; $i > 0; $i--) {
- echo "<option value=\"{$i}\" ";
- if ($i == $pconfig['subnet']) {
- echo "selected=\"selected\"";
- }
- echo ">" . $i . "</option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Upstream Gateway"); ?></td>
- <td width="78%" class="vtable">
- <select name="gateway" class="formselect" id="gateway">
- <option value="none" selected="selected"><?=gettext("None"); ?></option>
- <?php
- if (count($a_gateways) > 0) {
- foreach ($a_gateways as $gateway) {
- if (($gateway['interface'] == $if) && (is_ipaddrv4($gateway['gateway']))) {
- ?>
- <option value="<?=$gateway['name'];?>" <?php if ($gateway['name'] == $pconfig['gateway']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($gateway['name']) . " - " . htmlspecialchars($gateway['gateway']);?>
- </option>
- <?php
- }
- }
- }
- ?>
- </select>
- - or <strong><a onclick="show_add_gateway();" href="#gatewaysection"><?=gettext("add a new one."); ?></a></strong>
- <br />
- <div id='addgwbox'>
- <?=gettext("If this interface is an Internet connection, select an existing Gateway from the list or add a new one using the link above."); ?><br />
- <?=gettext("On local LANs the upstream gateway should be \"none\"."); ?>
- </div>
- <div id='notebox'>
- </div>
- <div id="status">
- </div>
- <div style="display:none" id="addgateway">
- <p>&nbsp;</p>
- <table border="1" class="addgatewaybox" summary="addgateway">
- <tr>
- <td>
- <table class="addgatewaybox" cellpadding="1" cellspacing="1" summary="addgateway">
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2"><center><b><font color="white"><?=gettext("Add new gateway:"); ?></font></b></center></td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <?php
- if ($if == "wan" || $if == "WAN") {
- $checked = " checked=\"checked\"";
- }
- ?>
- <tr>
- <td width="45%" align="right"><font color="white"><?=gettext("Default gateway:"); ?></font></td><td><input type="checkbox" id="defaultgw" name="defaultgw"<?=$checked?> /></td>
- </tr>
- <tr>
- <td align="right"><font color="white"><?=gettext("Gateway Name:"); ?></font></td><td><input id="name" name="name" value="<?=$wancfg['descr'] . "GW"?>" /></td>
- </tr>
- <tr>
- <td align="right"><font color="white"><?=gettext("Gateway IPv4:"); ?></font></td><td><input id="gatewayip" name="gatewayip" /></td>
- </tr>
- <tr>
- <td align="right"><font color="white"><?=gettext("Description:"); ?></font></td><td><input id="gatewaydescr" name="gatewaydescr" /></td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2">
- <center>
- <div id='savebuttondiv'>
- <input id="gwsave" type="button" value="<?=gettext("Save Gateway"); ?>" onclick='hide_add_gatewaysave();' />
- <input id="gwcancel" type="button" value="<?=gettext("Cancel"); ?>" onclick='hide_add_gateway();' />
- </div>
- </center>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr style="display:none;" id="staticv6">
- <td colspan="2" style="padding:0px;">
- <a name="gatewayv6section"></a>
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="staticv6">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Static IPv6 configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("IPv6 address"); ?></td>
- <td width="78%" class="vtable">
- <input name="ipaddrv6" type="text" class="formfld unknown" id="ipaddrv6" size="28" value="<?=htmlspecialchars($pconfig['ipaddrv6']);?>" />
- /
- <select name="subnetv6" class="formselect" id="subnetv6">
- <?php
- for ($i = 128; $i > 0; $i--) {
- echo "<option value=\"{$i}\" ";
- if ($i == $pconfig['subnetv6']) {
- echo "selected=\"selected\"";
- }
- echo ">" . $i . "</option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Upstream Gateway"); ?></td>
- <td width="78%" class="vtable">
- <select name="gatewayv6" class="formselect" id="gatewayv6">
- <option value="none" selected="selected"><?=gettext("None"); ?></option>
- <?php
- if (count($a_gateways) > 0) {
- foreach ($a_gateways as $gateway) {
- if (($gateway['interface'] == $if) && (is_ipaddrv6($gateway['gateway']))) {
- ?>
- <option value="<?=$gateway['name'];?>" <?php if ($gateway['name'] == $pconfig['gatewayv6']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($gateway['name']) . " - " . htmlspecialchars($gateway['gateway']);?>
- </option>
- <?php
- }
- }
- }
- ?>
- </select>
- - or <strong><a onclick="show_add_gateway_v6();" href="#gatewayv6section"><?=gettext("add a new one."); ?></a></strong>
- <br />
- <div id='addgwboxv6'>
- <?=gettext("If this interface is an Internet connection, select an existing Gateway from the list or add a new one using the link above."); ?><br />
- <?=gettext("On local LANs the upstream gateway should be \"none\"."); ?>
- </div>
- <div id='noteboxv6'>
- </div>
- <div id="statusv6">
- </div>
- <div style="display:none" id="addgatewayv6">
- <p>&nbsp;</p>
- <table border="1" class="addgatewaybox" summary="addgatewayv6">
- <tr>
- <td>
- <table class="addgatewaybox" cellpadding="1" cellspacing="1" summary="addgatewayv6">
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2"><center><b><font color="white"><?=gettext("Add new v6 gateway:"); ?></font></b></center></td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <?php
- if ($if == "wan" || $if == "WAN") {
- $checked = " checked=\"checked\"";
- }
- ?>
- <tr>
- <td width="45%" align="right"><font color="white"><?=gettext("Default v6 gateway:"); ?></font></td><td><input type="checkbox" id="defaultgwv6" name="defaultgwv6"<?=$checked?> /></td>
- </tr>
- <tr>
- <td align="right"><font color="white"><?=gettext("Gateway Name IPv6:"); ?></font></td><td><input id="namev6" name="namev6" value="<?=$wancfg['descr'] . "GWv6"?>" /></td>
- </tr>
- <tr>
- <td align="right"><font color="white"><?=gettext("Gateway IPv6:"); ?></font></td><td><input id="gatewayipv6" name="gatewayipv6" /></td>
- </tr>
- <tr>
- <td align="right"><font color="white"><?=gettext("Description:"); ?></font></td><td><input id="gatewaydescrv6" name="gatewaydescrv6" /></td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2">
- <center>
- <div id='savebuttondivv6'>
- <input id="gwsavev6" type="button" value="<?=gettext("Save Gateway"); ?>" onclick='hide_add_gatewaysave_v6();' />
- <input id="gwcancelv6" type="button" value="<?=gettext("Cancel"); ?>" onclick='hide_add_gateway_v6();' />
- </div>
- </center>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr style="display:none;" id="dhcp">
- <td colspan="2" style="padding: 0px;">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="dhcp">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("DHCP client configuration &nbsp; &nbsp; " .
- ' <input name="adv_dhcp_config_advanced" type="checkbox" id="adv_dhcp_config_advanced" value="" onclick="show_adv_dhcp_config(this)" /> ' .
- " Advanced &nbsp; &nbsp; " .
- ' <input name="adv_dhcp_config_file_override" type="checkbox" id="adv_dhcp_config_file_override" value="" onclick="show_adv_dhcp_config(this)" /> ' .
- " Config File Override &nbsp; &nbsp; "); ?>
- </td>
- </tr>
- <!-- Uncomment to expose DHCP+ in GUI
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Enable DHCP+"); ?></td>
- <td width="78%" class="vtable">
- <input name="dhcp_plus" type="checkbox" value="yes" <?php if ($pconfig['dhcp_plus'] == true) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable DHCP+L2TP or DHCP+PPTP."); ?></strong>
- <br />
- <?=gettext("Status changes on this interface will trigger reconfiguration (if necessary) of the associated PPTP/L2TP link."); ?>
- </td>
- </tr>
- -->
- <tr style='display:none' id="show_basic_dhcphostname">
- <td width="22%" valign="top" class="vncell"><?=gettext("Hostname"); ?></td>
- <td width="78%" class="vtable">
- <input name="dhcphostname" type="text" class="formfld unknown" id="dhcphostname" size="40" value="<?=htmlspecialchars($pconfig['dhcphostname']);?>" />
- <br />
- <?=gettext("The value in this field is sent as the DHCP client identifier " .
- "and hostname when requesting a DHCP lease. Some ISPs may require " .
- "this (for client identification)."); ?>
- </td>
- </tr>
- <tr style='display:none' id="show_basic_dhcpalias-address">
- <td width="22%" valign="top" class="vncell"><?=gettext("Alias IPv4 address"); ?></td>
- <td width="78%" class="vtable">
- <input name="alias-address" type="text" class="formfld unknown" id="alias-address" size="20" value="<?=htmlspecialchars($pconfig['alias-address']);?>" />
- <select name="alias-subnet" class="formselect" id="alias-subnet">
- <?php
- for ($i = 32; $i > 0; $i--) {
- echo "<option value=\"{$i}\" ";
- if ($i == $pconfig['alias-subnet']) {
- echo "selected=\"selected\"";
- }
- echo ">" . $i . "</option>";
- }
- ?>
- </select>
- <?=gettext("The value in this field is used as a fixed alias IPv4 address by the " .
- "DHCP client."); ?>
- </td>
- </tr>
- <tr style='display:none' id="show_basic_dhcprejectlease">
- <td width="22%" valign="top" class="vncell"><?=gettext("Reject Leases From"); ?></td>
- <td width="78%" class="vtable">
- <input name="dhcprejectfrom" type="text" class="formfld unknown" id="dhcprejectfrom" size="20" value="<?=htmlspecialchars($pconfig['dhcprejectfrom']);?>" />
- <br />
- <?=gettext("If there is a certain upstream DHCP server that should be ignored, place the IP address or subnet of the DHCP server to be ignored here."); ?>
- <?=gettext("This is useful for rejecting leases from cable modems that offer private IPs when they lose upstream sync."); ?>
- </td>
- </tr>
-
- <tr style='display:none' id="show_adv_dhcp_protocol_timing">
- <td width="22%" valign="top" class="vncell"><a target="_blank" href="http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5#PROTOCOL_TIMING"><?=gettext("Protocol Timing"); ?></a></td>
- <td width="48%" class="vtable">
- Timeout: <input name="adv_dhcp_pt_timeout" type="text" class="formfld unknown" id="adv_dhcp_pt_timeout" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp_pt_timeout']);?>" onchange="customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, '');" />
- Retry: <input name="adv_dhcp_pt_retry" type="text" class="formfld unknown" id="adv_dhcp_pt_retry" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp_pt_retry']);?>" onchange="customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, '');" />
- Select Timeout: <input name="adv_dhcp_pt_select_timeout" type="text" class="formfld unknown" id="adv_dhcp_pt_select_timeout" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp_pt_select_timeout']);?>" onchange="customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, '');" />
-
- &nbsp; &nbsp; &nbsp; &nbsp;
- Presets: &nbsp;
- <input name="adv_dhcp_pt_values" type="radio" value="DHCP" id="customdhcpptdhcpdefaults" onclick="customdhcpptsetvalues(this, iform);" />FreeBSD Default &nbsp;
- <input name="adv_dhcp_pt_values" type="radio" value="Clear" id="customdhcpptclear" onclick="customdhcpptsetvalues(this, iform);" />Clear
-
- <br />
- Reboot: <input name="adv_dhcp_pt_reboot" type="text" class="formfld unknown" id="adv_dhcp_pt_reboot" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp_pt_reboot']);?>" onchange="customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, '');" />
- Backoff Cutoff: <input name="adv_dhcp_pt_backoff_cutoff" type="text" class="formfld unknown" id="adv_dhcp_pt_backoff_cutoff" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp_pt_backoff_cutoff']);?>" onchange="customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, '');" />
- Initial Interval: <input name="adv_dhcp_pt_initial_interval" type="text" class="formfld unknown" id="adv_dhcp_pt_initial_interval" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp_pt_initial_interval']);?>" onchange="customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, '');" />
-
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
- <input name="adv_dhcp_pt_values" type="radio" value="pfSense" id="customdhcpptpfsensedefaults" onclick="customdhcpptsetvalues(this, iform);" />pfSense Default &nbsp;
- <input name="adv_dhcp_pt_values" type="radio" value="SavedCfg" checked="checked" id="customdhcpptsavedcfg" onclick="customdhcpptsetvalues(this, iform);" />Saved Cfg
-
- <br />
- <?=gettext("The values in these fields are DHCP protocol timings used when requesting a lease. <br /> "); ?>
-
- <script type="text/javascript">
- //<![CDATA[
- function customdhcpptcheckradiobuton(T, BUTTON) {
- for (var i = 0; i < T.length; i++) {
- T[i].checked = false;
- if (T[i].value == BUTTON) T[i].checked = true;
- }
- T.value = BUTTON;
- }
-
- function customdhcpptsetvalues(T, FORM) {
- // timeout, retry, select-timeout, reboot, backoff-cutoff, initial-interval
- if (T.value == "DHCP") customdhcpptsetvaluesnow(T, FORM, "60", "300", "0", "10", "120", "10");
- if (T.value == "pfSense") customdhcpptsetvaluesnow(T, FORM, "60", "15", "0", "", "", "1");
- if (T.value == "SavedCfg") customdhcpptsetvaluesnow(T, FORM, "<?=htmlspecialchars($pconfig['adv_dhcp_pt_timeout']);?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_retry']);?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_select_timeout']);?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_reboot']);?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_backoff_cutoff']);?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_initial_interval']);?>");
- if (T.value == "Clear") customdhcpptsetvaluesnow(T, FORM, "", "", "", "", "", "");
- }
-
- function customdhcpptsetvaluesnow(T, FORM, timeout, retry, selecttimeout, reboot, backoffcutoff, initialinterval) {
- FORM.adv_dhcp_pt_timeout.value = timeout;
- FORM.adv_dhcp_pt_retry.value = retry;
- FORM.adv_dhcp_pt_select_timeout.value = selecttimeout;
- FORM.adv_dhcp_pt_reboot.value = reboot;
- FORM.adv_dhcp_pt_backoff_cutoff.value = backoffcutoff;
- FORM.adv_dhcp_pt_initial_interval.value = initialinterval;
-
- FORM.adv_dhcp_pt_values.value = T.value;
- }
-
- <!-- Set the adv_dhcp_pt_values radio button from saved config -->
- var RADIOBUTTON_VALUE = "<?=htmlspecialchars($pconfig['adv_dhcp_pt_values']);?>";
- if (RADIOBUTTON_VALUE == "") RADIOBUTTON_VALUE = "SavedCfg";
- customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, RADIOBUTTON_VALUE);
- //]]>
- </script>
- </td>
- </tr>
-
- <tr style='display:none' id="show_adv_dhcp_lease_requirements_and_requests">
- <td width="22%" valign="top" class="vncell"><?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Lease Requirements and Requests</a>"); ?></td>
- <td width="78%" class="vtable">
- <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Send</a> <a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp-options&amp;sektion=5\">Options</a>"); ?><br />
- <input name="adv_dhcp_send_options" type="text" class="formfld unknown" id="adv_dhcp_send_options" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp_send_options']);?>" />
- <br />
- <?=gettext("The values in this field are DHCP options to be sent when requesting a DHCP lease. [option declaration [, ...]] <br />" .
- "Value Substitutions: {interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD} <br />" .
- "Where C is U(pper) or L(ower) Case, and D is \" :-.\" Delimiter (space, colon, hyphen, or period) (omitted for none). <br />" .
- "Some ISPs may require certain options be or not be sent. "); ?>
- <hr/>
- <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Request</a> <a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp-options&amp;sektion=5\">Options</a>"); ?><br />
- <input name="adv_dhcp_request_options" type="text" class="formfld unknown" id="adv_dhcp_request_options" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp_request_options']);?>" />
- <br />
- <?=gettext("The values in this field are DHCP option 55 to be sent when requesting a DHCP lease. [option [, ...]] <br />" .
- "Some ISPs may require certain options be or not be requested. "); ?>
- <hr/>
- <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Require</a> <a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp-options&amp;sektion=5\">Options</a>"); ?><br />
- <input name="adv_dhcp_required_options" type="text" class="formfld unknown" id="adv_dhcp_required_options" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp_required_options']);?>" />
- <br />
- <?=gettext("The values in this field are DHCP options required by the client when requesting a DHCP lease. [option [, ...]] "); ?>
- </td>
- </tr>
-
- <tr style='display:none' id="show_adv_dhcp_option_modifiers">
- <td width="22%" valign="top" class="vncell"><?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp-options&amp;sektion=5\">Option</a> <a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5#OPTION_MODIFIERS\">Modifiers</a>"); ?></td>
- <td width="78%" class="vtable">
- <input name="adv_dhcp_option_modifiers" type="text" class="formfld unknown" id="adv_dhcp_option_modifiers" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp_option_modifiers']);?>" />
- <br />
- <?=gettext("The values in this field are DHCP option modifiers applied to obtained DHCP lease. [modifier option declaration [, ...]] <br /> " .
- "modifiers: (default, supersede, prepend, append)"); ?>
- </td>
- </tr>
-
- <tr style='display:none' id="show_adv_dhcp_config_file_override">
- <td width="22%" valign="top" class="vncell"><?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5\">Configuration File</a> Override"); ?></td>
- <td width="78%" class="vtable">
- <input name="adv_dhcp_config_file_override_path" type="text" class="formfld unknown" id="adv_dhcp_config_file_override_path" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp_config_file_override_path']);?>" />
- <br />
- <?=gettext("The value in this field is the full absolute path to a DHCP client configuration file. [/[dirname/[.../]]filename[.ext]] <br /> " .
- "Value Substitutions in Config File: {interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD} <br />" .
- "Where C is U(pper) or L(ower) Case, and D is \" :-.\" Delimiter (space, colon, hyphen, or period) (omitted for none). <br />" .
- "Some ISPs may require certain options be or not be sent. "); ?>
- </td>
- </tr>
-
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
-
- </table>
-
- <script type="text/javascript">
- //<![CDATA[
- function show_adv_dhcp_config(T) {
-
- if (T.checked) {
- T.value = "Selected";
- } else {
- T.value = "";
- }
-
- if (document.iform.adv_dhcp_config_file_override.checked) {
- show_hide_adv_dhcp('none', 'none', '');
- } else if (document.iform.adv_dhcp_config_advanced.checked) {
- show_hide_adv_dhcp('', '', 'none');
- } else {
- show_hide_adv_dhcp('', 'none', 'none');
- }
- }
-
- function show_hide_adv_dhcp(basic, advanced, override) {
-
- document.getElementById("show_basic_dhcphostname").style.display = basic;
- document.getElementById("show_basic_dhcpalias-address").style.display = basic;
- document.getElementById("show_basic_dhcprejectlease").style.display = basic;
-
- document.getElementById("show_adv_dhcp_protocol_timing").style.display = advanced;
- document.getElementById("show_adv_dhcp_lease_requirements_and_requests").style.display = advanced;
- document.getElementById("show_adv_dhcp_option_modifiers").style.display = advanced;
-
- document.getElementById("show_adv_dhcp_config_file_override").style.display = override;
- }
-
- <!-- Set the adv_dhcp_config_advanced checkbox from saved config -->
- if ("<?=htmlspecialchars($pconfig['adv_dhcp_config_advanced']);?>" == "Selected") {
- document.iform.adv_dhcp_config_advanced.checked = true;
- }
- show_adv_dhcp_config(document.iform.adv_dhcp_config_advanced);
-
- <!-- Set the adv_dhcp_config_file_override checkbox from saved config -->
- if ("<?=htmlspecialchars($pconfig['adv_dhcp_config_file_override']);?>" == "Selected") {
- document.iform.adv_dhcp_config_file_override.checked = true;
- }
- show_adv_dhcp_config(document.iform.adv_dhcp_config_file_override);
- //]]>
- </script>
-
- </td>
- </tr>
- <tr style="display:none;" id="dhcp6">
- <td colspan="2" style="padding: 0px;">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="dhcp6">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("DHCP6 client configuration &nbsp; &nbsp; " .
- ' <input name="adv_dhcp6_config_advanced" type="checkbox" id="adv_dhcp6_config_advanced" value="" onclick="show_adv_dhcp6_config(this)" /> ' .
- " Advanced &nbsp; &nbsp; " .
- ' <input name="adv_dhcp6_config_file_override" type="checkbox" id="adv_dhcp6_config_file_override" value="" onclick="show_adv_dhcp6_config(this)" /> ' .
- " Config File Override &nbsp; &nbsp; "); ?>
- </td>
- </tr>
- <!--- Leave commented out for now
- <tr style='display:none' id="basicdhcp6_show_dhcp6_duid">
- <td width="22%" valign="top" class="vncell"><?=gettext("DHCPv6 Unique Identifier (DUID)"); ?></td>
- <td width="78%" class="vtable">
- <input name="dhcp6-duid" type="text" class="formfld unknown" id="dhcp6-duid" size="40" value="<?=htmlspecialchars($pconfig['dhcp6-duid']);?>" />
- <br />
- <?=gettext("The value in this field is sent as the DHCPv6 client identifier " .
- "when requesting a DHCPv6 lease."); ?><br />
- <?php if (is_readable("/var/db/dhcp6c_duid")) {
- // $current_duid = file_get_contents("/var/db/dhcp6c_duid");
- }
- printf(gettext("The current DUID is: '%s'"), $current_duid);
- // hexdump -e '"%07.7_ax " 1/2 "%04x" " " 14/1 "%02x:" "\n"'
- ?>
- </td>
- </tr>
- -->
- <tr style='display:none' id="basicdhcp6_use_pppoeinterface">
- <td width="22%" valign="top" class="vncell"><?=gettext("Use IPv4 connectivity as parent interface"); ?></td>
- <td width="78%" class="vtable">
- <input name="dhcp6usev4iface" type="checkbox" id="dhcp6usev4iface" value="yes" <?php if ($pconfig['dhcp6usev4iface'] == true) echo "checked=\"checked\""; ?> />
- <?=gettext("Request a IPv6 prefix/information through the IPv4 connectivity link"); ?>
- </td>
- </tr>
- <tr style='display:none' id="basicdhcp6_show_dhcp6_prefix_only">
- <td width="22%" valign="top" class="vncell"><?=gettext("Request only an IPv6 prefix"); ?></td>
- <td width="78%" class="vtable">
- <input name="dhcp6prefixonly" type="checkbox" id="dhcp6prefixonly" value="yes" <?php if ($pconfig['dhcp6prefixonly'] == true) echo "checked=\"checked\""; ?> />
- <?=gettext("Only request an IPv6 prefix, do not request an IPv6 address"); ?>
- </td>
- </tr>
- <tr style='display:none' id="basicdhcp6_show_dhcp6_prefix_delegation_size">
- <td width="22%" valign="top" class="vncell"><?=gettext("DHCPv6 Prefix Delegation size"); ?></td>
- <td width="78%" class="vtable">
- <select name="dhcp6-ia-pd-len" class="formselect" id="dhcp6-ia-pd-len">
- <?php
- $sizes = array("none" => "None", 16 => "48", 12 => "52", 8 => "56", 4 => "60", 3 => "61", 2 => "62", 1 => "63", 0 => "64");
- foreach ($sizes as $bits => $length) {
- echo "<option value=\"{$bits}\" ";
- if (is_numeric($pconfig['dhcp6-ia-pd-len']) && ($bits == $pconfig['dhcp6-ia-pd-len'])) {
- echo "selected=\"selected\"";
- }
- echo ">" . $length . "</option>";
- }
- ?>
- </select>
- <br />
- <?=gettext("The value in this field is the delegated prefix length provided by the DHCPv6 server. Normally specified by the ISP."); ?>
- </td>
- </tr>
- <tr style='display:none' id="basicdhcp6_show_dhcp6_prefix_send_hint">
- <td width="22%" valign="top" class="vncell"><?=gettext("Send IPv6 prefix hint"); ?></td>
- <td width="78%" class="vtable">
- <input name="dhcp6-ia-pd-send-hint" type="checkbox" id="dhcp6-ia-pd-send-hint" value="yes" <?php if ($pconfig['dhcp6-ia-pd-send-hint'] == true) echo "checked=\"checked\""; ?> />
- <?=gettext("Send an IPv6 prefix hint to indicate the desired prefix size for delegation"); ?>
- </td>
- </tr>
-
- <tr style='display:none' id="show_adv_dhcp6_interface_statement">
- <td width="22%" valign="top" class="vncell">
- <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports#Interface_statement\">Interface Statement</a>"); ?>
- <br /><br />
- <input name="adv_dhcp6_interface_statement_information_only_enable" type="checkbox" id="adv_dhcp6_interface_statement_information_only_enable" value="" onclick="show_adv_dhcp6_config(this)" />
- <?=gettext("Information Only"); ?>
- </td>
- <td width="78%" class="vtable">
- <?=gettext("Send Options"); ?><br />
- <input name="adv_dhcp6_interface_statement_send_options" type="text" class="formfld unknown" id="adv_dhcp6_interface_statement_send_options" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp6_interface_statement_send_options']);?>" />
- <br />
- <?=gettext("The values in this field are DHCP send options to be sent when requesting a DHCP lease. [option declaration [, ...]] <br />" .
- "Value Substitutions: {interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD} <br />" .
- "Where C is U(pper) or L(ower) Case, and D is \" :-.\" Delimiter (space, colon, hyphen, or period) (omitted for none). <br />" .
- "Some DHCP services may require certain options be or not be sent. "); ?>
- <br />
- <br />
- <?=gettext("Request Options"); ?><br />
- <input name="adv_dhcp6_interface_statement_request_options" type="text" class="formfld unknown" id="adv_dhcp6_interface_statement_request_options" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp6_interface_statement_request_options']);?>" />
- <br />
- <?=gettext("The values in this field are DHCP request options to be sent when requesting a DHCP lease. [option [, ...]] <br />" .
- "Some DHCP services may require certain options be or not be requested. "); ?>
- <br />
- <br />
- <?=gettext("Script"); ?><br />
- <input name="adv_dhcp6_interface_statement_script" type="text" class="formfld unknown" id="adv_dhcp6_interface_statement_script" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp6_interface_statement_script']);?>" />
- <br />
- <?=gettext("The value in this field is the absolute path to a script invoked on certain conditions including when a reply message is received. <br />" .
- "[/[dirname/[.../]]filename[.ext]] "); ?>
- </td>
- </tr>
-
- <tr style='display:none' id="show_adv_dhcp6_id_assoc_statement">
- <td width="22%" valign="top" class="vncell">
- <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports#Identity_association_statement\">Identity Association Statement</a>"); ?>
- </td>
- <td width="78%" class="vtable">
-
- <input name="adv_dhcp6_id_assoc_statement_address_enable" type="checkbox" id="adv_dhcp6_id_assoc_statement_address_enable" value="" onclick="show_adv_dhcp6_config(this);" />
- <?=gettext("Non-Temporary Address Allocation"); ?>
- <div style='display:none' id="show_adv_dhcp6_id_assoc_statement_address">
- <?=gettext("id-assoc na"); ?>
- <?=gettext("<i>ID</i>"); ?>
- <input name="adv_dhcp6_id_assoc_statement_address_id" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_address_id" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_address_id']);?>" />
- <br />
- <?=gettext("Address"); ?>
- <?=gettext("<i>ipv6-address</i>"); ?>
- <input name="adv_dhcp6_id_assoc_statement_address" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_address" size="34" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_address']);?>" />
- <?=gettext("<i>pltime</i>"); ?>
- <input name="adv_dhcp6_id_assoc_statement_address_pltime" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_address_pltime" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_address_pltime']);?>" />
- <?=gettext("<i>vltime</i>"); ?>
- <input name="adv_dhcp6_id_assoc_statement_address_vltime" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_address_vltime" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_address_vltime']);?>" />
- </div>
- <hr/>
-
- <input name="adv_dhcp6_id_assoc_statement_prefix_enable" type="checkbox" id="adv_dhcp6_id_assoc_statement_prefix_enable" value="" onclick="show_adv_dhcp6_config(this)" />
- <?=gettext("Prefix Delegation"); ?>
- <div style='display:none' id="show_adv_dhcp6_id_assoc_statement_prefix">
- <?=gettext("id-assoc pd"); ?>
- <?=gettext("<i>ID</i>"); ?>
- <input name="adv_dhcp6_id_assoc_statement_prefix_id" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_prefix_id" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_prefix_id']);?>" />
- <br />
- <?=gettext("Prefix"); ?>
- <?=gettext("<i>ipv6-prefix</i>"); ?>
- <input name="adv_dhcp6_id_assoc_statement_prefix" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_prefix" size="37" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_prefix']);?>" />
- <?=gettext("<i>pltime</i>"); ?>
- <input name="adv_dhcp6_id_assoc_statement_prefix_pltime" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_prefix_pltime" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_prefix_pltime']);?>" />
- <?=gettext("<i>vltime</i>"); ?>
- <input name="adv_dhcp6_id_assoc_statement_prefix_vltime" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_prefix_vltime" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_prefix_vltime']);?>" />
- </div>
- </td>
- </tr>
-
- <tr style='display:none' id="show_adv_dhcp6_prefix_interface_statement">
- <td width="22%" valign="top" class="vncell">
- <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports#Prefix_interface_statement\">Prefix Interface Statement</a>"); ?>
- </td>
- <td width="78%" class="vtable">
- <?=gettext("Prefix Interface "); ?>
- <?=gettext("<i>sla-id</i>"); ?>
- <input name="adv_dhcp6_prefix_interface_statement_sla_id" type="text" class="formfld unknown" id="adv_dhcp6_prefix_interface_statement_sla_id" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_prefix_interface_statement_sla_id']);?>" />
- <?=gettext("<i>sla-len</i>"); ?>
- <input name="adv_dhcp6_prefix_interface_statement_sla_len" type="text" class="formfld unknown" id="adv_dhcp6_prefix_interface_statement_sla_len" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_prefix_interface_statement_sla_len']);?>" />
- </td>
- </tr>
-
- <tr style='display:none' id="show_adv_dhcp6_authentication_statement">
- <td width="22%" valign="top" class="vncell">
- <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports#Authentication_statement\">Authentication Statement</a>"); ?>
- </td>
- <td width="78%" class="vtable">
- <?=gettext("<i>authname</i>"); ?>
- <input name="adv_dhcp6_authentication_statement_authname" type="text" class="formfld unknown" id="adv_dhcp6_authentication_statement_authname" size="10" value="<?=htmlspecialchars($pconfig['adv_dhcp6_authentication_statement_authname']);?>" />
- <?=gettext("<i>protocol</i>"); ?>
- <input name="adv_dhcp6_authentication_statement_protocol" type="text" class="formfld unknown" id="adv_dhcp6_authentication_statement_protocol" size="6" value="<?=htmlspecialchars($pconfig['adv_dhcp6_authentication_statement_protocol']);?>" />
- <?=gettext("<i>algorithm</i>"); ?>
- <input name="adv_dhcp6_authentication_statement_algorithm" type="text" class="formfld unknown" id="adv_dhcp6_authentication_statement_algorithm" size="8" value="<?=htmlspecialchars($pconfig['adv_dhcp6_authentication_statement_algorithm']);?>" />
- <?=gettext("<i>rdm</i>"); ?>
- <input name="adv_dhcp6_authentication_statement_rdm" type="text" class="formfld unknown" id="adv_dhcp6_authentication_statement_rdm" size="9" value="<?=htmlspecialchars($pconfig['adv_dhcp6_authentication_statement_rdm']);?>" />
- </td>
- </tr>
-
- <tr style='display:none' id="show_adv_dhcp6_key_info_statement">
- <td width="22%" valign="top" class="vncell">
- <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports#Keyinfo_statement\">Keyinfo Statement</a>"); ?>
- </td>
- <td width="78%" class="vtable">
- <?=gettext("<i>keyname</i>"); ?>
- <input name="adv_dhcp6_key_info_statement_keyname" type="text" class="formfld unknown" id="adv_dhcp6_key_info_statement_keyname" size="27" value="<?=htmlspecialchars($pconfig['adv_dhcp6_key_info_statement_keyname']);?>" />
- <?=gettext("<i>realm</i>"); ?>
- <input name="adv_dhcp6_key_info_statement_realm" type="text" class="formfld unknown" id="adv_dhcp6_key_info_statement_realm" size="37" value="<?=htmlspecialchars($pconfig['adv_dhcp6_key_info_statement_realm']);?>" />
- <br />
- <?=gettext("<i>keyid</i>"); ?>
- <input name="adv_dhcp6_key_info_statement_keyid" type="text" class="formfld unknown" id="adv_dhcp6_key_info_statement_keyid" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp6_key_info_statement_keyid']);?>" />
- <?=gettext("<i>secret</i>"); ?>
- <input name="adv_dhcp6_key_info_statement_secret" type="text" class="formfld unknown" id="adv_dhcp6_key_info_statement_secret" size="36" value="<?=htmlspecialchars($pconfig['adv_dhcp6_key_info_statement_secret']);?>" />
- <?=gettext("<i>expire</i>"); ?>
- <input name="adv_dhcp6_key_info_statement_expire" type="text" class="formfld unknown" id="adv_dhcp6_key_info_statement_expire" size="15" value="<?=htmlspecialchars($pconfig['adv_dhcp6_key_info_statement_expire']);?>" />
- </td>
- </tr>
-
- <tr style='display:none' id="show_adv_dhcp6_config_file_override">
- <td width="22%" valign="top" class="vncell">
- <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports\">Configuration File</a> Override"); ?>
- </td>
- <td width="78%" class="vtable">
- <input name="adv_dhcp6_config_file_override_path" type="text" class="formfld unknown" id="adv_dhcp6_config_file_override_path" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp6_config_file_override_path']);?>" />
- <br />
- <?=gettext("The value in this field is the full absolute path to a DHCP client configuration file. [/[dirname/[.../]]filename[.ext]] <br /> " .
- "Value Substitutions in Config File: {interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD} <br />" .
- "Where C is U(pper) or L(ower) Case, and D is \" :-.\" Delimiter (space, colon, hyphen, or period) (omitted for none). <br />" .
- "Some ISPs may require certain options be or not be sent. "); ?>
- </td>
- </tr>
-
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
-
- </table>
-
- <script type="text/javascript">
- //<![CDATA[
- function show_adv_dhcp6_config(T) {
-
- if (T.checked) {
- T.value = "Selected";
- } else {
- T.value = "";
- }
-
- if (document.iform.adv_dhcp6_config_file_override.checked) {
- show_hide_adv_dhcp6('none', 'none', '');
- } else if (document.iform.adv_dhcp6_config_advanced.checked) {
- show_hide_adv_dhcp6('none', '', 'none');
- } else {
- show_hide_adv_dhcp6('', 'none', 'none');
- }
- }
-
- function show_hide_adv_dhcp6(basic, advanced, override) {
-
- document.getElementById("basicdhcp6_use_pppoeinterface").style.display = basic;
- document.getElementById("basicdhcp6_show_dhcp6_prefix_delegation_size").style.display = basic;
- document.getElementById("basicdhcp6_show_dhcp6_prefix_send_hint").style.display = basic;
- document.getElementById("basicdhcp6_show_dhcp6_prefix_only").style.display = basic;
- document.getElementById("show_adv_dhcp6_interface_statement").style.display = advanced;
- document.getElementById("show_adv_dhcp6_id_assoc_statement").style.display = advanced;
- document.getElementById("show_adv_dhcp6_id_assoc_statement_address").style.display = 'none';
- if (document.iform.adv_dhcp6_id_assoc_statement_address_enable.checked) {
- document.getElementById("show_adv_dhcp6_id_assoc_statement_address").style.display = advanced;
- }
+$section->addInput(new Form_Select(
+ 'prefix-6rd-v4plen',
+ 'IPv6 Interface',
+ $pconfig['prefix-6rd-v4plen'],
+ build_ipv6interface_list()
+))->setHelp('selects the dynamic IPv6 WAN interface to track for configuration');
- document.getElementById("show_adv_dhcp6_id_assoc_statement_prefix").style.display = 'none';
- document.getElementById("show_adv_dhcp6_prefix_interface_statement").style.display = 'none';
- if (document.iform.adv_dhcp6_id_assoc_statement_prefix_enable.checked) {
- document.getElementById("show_adv_dhcp6_id_assoc_statement_prefix").style.display = advanced;
- document.getElementById("show_adv_dhcp6_prefix_interface_statement").style.display = advanced;
- }
+if ($pconfig['track6-prefix-id'] == "") {
+ $pconfig['track6-prefix-id'] = 0;
+}
- document.getElementById("show_adv_dhcp6_authentication_statement").style.display = advanced;
- document.getElementById("show_adv_dhcp6_key_info_statement").style.display = advanced;
+$section->addInput(new Form_Input(
+ 'track6-prefix-id--hex' . $iface,
+ 'IPv6 Prefix ID',
+ 'text',
+ sprintf("%x", $pconfig['track6-prefix-id'])
+))->setHelp('The value in this field is the (Delegated) IPv6 prefix ID. This determines the configurable network ID based on the dynamic IPv6 connection. The default value is 0.');
+
+$form->add($section);
+
+/// PPP section
+
+$section = new Form_Section('PPP Configuration');
+
+$section->addInput(new Form_Select(
+ 'country',
+ 'Country',
+ $pconfig['country'],
+ []
+));
+
+$section->addInput(new Form_Select(
+ 'provider_list',
+ 'Provider',
+ $pconfig['provider_list'],
+ []
+));
+
+$section->addInput(new Form_Select(
+ 'providerplan',
+ 'Plan',
+ $pconfig['providerplan'],
+ []
+))->setHelp('Select to fill in data for your service provider.');
+
+$section->addInput(new Form_Input(
+ 'ppp_username',
+ 'Username',
+ 'text',
+ $pconfig['ppp_username']
+));
+
+$section->addInput(new Form_Input(
+ 'ppp_password',
+ 'Password',
+ 'password',
+ $pconfig['ppp_password']
+));
+
+if($pconfig['type'] == 'ppp') {
+ $section->addInput(new Form_Input(
+ 'phone',
+ 'Phone number',
+ 'text',
+ $pconfig['phone']
+ ))->setHelp('Typically *99# for GSM networks and #777 for CDMA networks');
+}
- document.getElementById("show_adv_dhcp6_config_file_override").style.display = override;
- }
+$section->addInput(new Form_Input(
+ 'apn',
+ 'Access Point Name (APN)',
+ 'text',
+ $pconfig['apn']
+));
+
+function build_port_list() {
+ $list = array('' => '');
+
+ $portlist = glob("/dev/cua*");
+ $modems = glob("/dev/modem*");
+ $portlist = array_merge($portlist, $modems);
+
+ foreach ($portlist as $port) {
+ if (preg_match("/\.(lock|init)$/", $port)) {
+ continue;
+ }
+
+ $list[trim($port)] = $port;
+ }
+
+ return($list);
+}
+$section->addInput(new Form_Select(
+ 'port',
+ 'Modem port',
+ $pconfig['port'],
+ build_port_list()
+));
+
+if (isset($pconfig['pppid'])) {
+ $section->addInput(new Form_StaticText(
+ 'Advanced PPP',
+ '<a href="/interfaces_ppps_edit.php?id=' . htmlspecialchars($pconfig['pppid']). '" class="navlnk">' . gettext("Click here to edit PPP configuration") . '</a>'
+ ));
+} else {
+ $section->addInput(new Form_StaticText(
+ 'Advanced PPP',
+ '<a href="/interfaces_ppps_edit.php" class="navlnk">' . gettext("Click here to create a PPP configuration") . '</a>'
+ ));
+}
+
+$form->add($section);
+
+// PPPoE configuration
+$section = new Form_Section('PPPoE Configuration');
+
+$section->addInput(new Form_Input(
+ 'pppoe_username',
+ 'Username',
+ 'text',
+ $pconfig['pppoe_username']
+));
+
+$section->addInput(new Form_Input(
+ 'pppoe_password',
+ 'Password',
+ 'password',
+ $pconfig['pppoe_password']
+));
+
+$section->addInput(new Form_Input(
+ 'provider',
+ 'Service name',
+ 'text',
+ $pconfig['provider']
+))->setHelp('This field can usually be left empty');
+
+$section->addInput(new Form_Checkbox(
+ 'pppoe_dialondemand',
+ 'Dial on demand',
+ 'Enable Dial-On-Demand mode ',
+ $pconfig['pppoe_dialondemand'],
+ 'enable'
+));
+
+$section->addInput(new Form_Input(
+ 'pppoe_idletimeout',
+ 'Idle timeout',
+ 'number',
+ $pconfig['pppoe_idletimeout'],
+ [min => 0]
+))->setHelp('If no qualifying outgoing packets are transmitted for the specified number of seconds, the connection is brought down. ' .
+ 'An idle timeout of zero disables this feature.');
+
+$section->addInput(new Form_Select(
+ 'pppoe-reset-type',
+ 'Periodic reset',
+ $pconfig['pppoe-reset-type'],
+ ['' => 'Disabled', 'custom' => 'Custom', 'preset' => 'Pre-set']
+))->setHelp('Select a reset timing type');
+
+$group = new Form_Group('Custom reest');
+
+$group->add(new Form_Input(
+ 'pppoe_resethour',
+ null,
+ 'number',
+ $pconfig['pppoe_resethour'],
+ [min => 0, max => 23]
+))->setHelp('Hour (0-23)');
+
+$group->add(new Form_Input(
+ 'pppoe_resetminute',
+ null,
+ 'number',
+ $pconfig['pppoe_resetminute'],
+ [min => 0, max => 59]
+))->setHelp('Minutes (0-59)');
+
+// ToDo: Need a date-picker here
+$group->add(new Form_Input(
+ 'pppoe_resetdate',
+ null,
+ 'text',
+ $pconfig['pppoe_resetdate']
+))->setHelp('Specific date (mm/dd/yyyy)');
+
+$group->setHelp('If you leave the date field empty, the reset will be executed each day at the time you specified using the minutes and hour field');
+
+$section->add($group);
+
+$group = new Form_MultiCheckboxGroup('cron based reset');
+
+$group->add(new Form_MultiCheckbox(
+ 'pppoe_pr_preset_val',
+ null,
+ 'Reset at each month ("0 0 1 * *")',
+ $pconfig['pppoe_monthly'],
+ 'monthly'
+))->displayAsRadio();
+
+$group->add(new Form_MultiCheckbox(
+ 'pppoe_pr_preset_val',
+ null,
+ 'Reset at each month ("0 0 * * 0")',
+ $pconfig['pppoe_weekly'],
+ 'weekly'
+))->displayAsRadio();
+
+$group->add(new Form_MultiCheckbox(
+ 'pppoe_pr_preset_val',
+ null,
+ 'Reset at each month ("0 0 * * *")',
+ $pconfig['pppoe_daily'],
+ 'daily'
+))->displayAsRadio();
+
+$group->add(new Form_MultiCheckbox(
+ 'pppoe_pr_preset_val',
+ null,
+ 'Reset at each month ("0 * * * *")',
+ $pconfig['pppoe_hourly'],
+ 'hourly'
+))->displayAsRadio();
+
+$section->add($group);
+
+if (isset($pconfig['pppid'])) {
+ $section->addInput(new Form_StaticText(
+ 'Advanced and MLPPP',
+ '<a href="/interfaces_ppps_edit.php?id=' . htmlspecialchars($pconfig['pppid']) . '" class="navlnk">Click here for additional PPPoE configuration options. Save first if you made changes.</a>'
+ ));
+} else {
+ $section->addInput(new Form_StaticText(
+ 'Advanced and MLPPP',
+ '<a href="/interfaces_ppps_edit.php" class="navlnk">Click here for additional PPPoE configuration options and for MLPPP configuration.</a>'
+ ));
+}
- <!-- Set the adv_dhcp6_config_advanced checkbox from saved config -->
- if ("<?=htmlspecialchars($pconfig['adv_dhcp6_config_advanced']);?>" == "Selected") {
- document.iform.adv_dhcp6_config_advanced.checked = true;
- }
- show_adv_dhcp6_config(document.iform.adv_dhcp6_config_advanced);
+$form->add($section);
+
+// PPTP & L2TP Configuration section
+$section = new Form_Section('PPTP/L2TP Configuraion');
+
+$section->addInput(new Form_Input(
+ 'pptp_username',
+ 'Username',
+ 'text',
+ $pconfig['pptp_username']
+));
+
+$section->addInput(new Form_Input(
+ 'pptp_password',
+ 'Password',
+ 'password',
+ $pconfig['pptp_password']
+));
+
+$section->addInput(new Form_IpAddress(
+ 'pptp_local',
+ 'Local IP address',
+ $pconfig['pptp_local']
+))->addMask('pptp_subnet', $pconfig['pptp_subnet'][0]);
+
+$section->addInput(new Form_IpAddress(
+ 'pptp_remote',
+ 'Remote IP address',
+ $pconfig['pptp_remote']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'pptp_dialondemand',
+ 'Dial on demand',
+ 'Enable Dial-On-Demand mode ',
+ $pconfig['pptp_dialondemand'],
+ 'enable'
+))->setHelp('This option causes the interface to operate in dial-on-demand mode, allowing you to have a virtual full time connection. ' .
+ 'The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected.');
+
+$section->addInput(new Form_Input(
+ 'pptp_idletimeout',
+ 'Idle timeout (seconds)',
+ 'number',
+ $pconfig['pptp_idletimeout'],
+ [min => 0]
+))->setHelp('If no qualifying outgoing packets are transmitted for the specified number of seconds, the connection is brought down. ' .
+ 'An idle timeout of zero disables this feature.');
+
+if (isset($pconfig['pppid'])) {
+ $section->addInput(new Form_StaticText(
+ 'Advanced and MLPPP',
+ '<a href="/interfaces_ppps_edit.php?id=' . htmlspecialchars($pconfig['pppid']) . '" class="navlnk">Click here for additional PPTP and L2TP configuration options. Save first if you made changes.</a>'
+ ));
+} else {
+ $section->addInput(new Form_StaticText(
+ 'Advanced and MLPPP',
+ '<a href="/interfaces_ppps_edit.php" class="navlnk">Click here for additional PPTP and L2TP configuration options.</a>'
+ ));
+}
- <!-- Set the adv_dhcp6_config_file_override checkbox from saved config -->
- if ("<?=htmlspecialchars($pconfig['adv_dhcp6_config_file_override']);?>" == "Selected") {
- document.iform.adv_dhcp6_config_file_override.checked = true;
- }
- show_adv_dhcp6_config(document.iform.adv_dhcp6_config_file_override);
+$form->add($section);
- <!-- Set the adv_dhcp6_interface_statement_information_only_enable checkbox from saved config -->
- if ("<?=htmlspecialchars($pconfig['adv_dhcp6_interface_statement_information_only_enable']);?>" == "Selected") {
- document.iform.adv_dhcp6_interface_statement_information_only_enable.checked = true;
- }
- show_adv_dhcp6_config(document.iform.adv_dhcp6_interface_statement_information_only_enable);
+// Wireless interface
+if (true || isset($wancfg['wireless'])) { // DEBUG
- <!-- Set the adv_dhcp6_id_assoc_statement_address_enable checkbox from saved config -->
- if ("<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_address_enable']);?>" == "Selected") {
- document.iform.adv_dhcp6_id_assoc_statement_address_enable.checked = true;
- }
- show_adv_dhcp6_config(document.iform.adv_dhcp6_id_assoc_statement_address_enable);
+$section = new Form_Section('Common wireless configuration - Settings apply to all wireless networks on ' . $wlanbaseif . '.');
- <!-- Set the adv_dhcp6_id_assoc_statement_prefix_enable checkbox from saved config -->
- if ("<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_prefix_enable']);?>" == "Selected") {
- document.iform.adv_dhcp6_id_assoc_statement_prefix_enable.checked = true;
- }
- show_adv_dhcp6_config(document.iform.adv_dhcp6_id_assoc_statement_prefix_enable);
- //]]>
- </script>
+$form->add($section);
+}
- </td>
- </tr>
- <tr style="display:none;" id="_6rd">
- <td colspan="2" style="padding: 0px;">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="6rd">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("6RD Configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("6RD prefix"); ?></td>
- <td width="78%" class="vtable">
- <input name="prefix-6rd" type="text" class="formfld unknown" id="prefix-6rd" size="40" value="<?=htmlspecialchars($pconfig['prefix-6rd']);?>" />
- <br />
- <?=gettext("The value in this field is the 6RD IPv6 prefix assigned by your ISP. e.g. '2001:db8::/32'") ?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("6RD Border Relay"); ?></td>
- <td width="78%" class="vtable">
- <input name="gateway-6rd" type="text" class="formfld unknown" id="gateway-6rd" size="40" value="<?=htmlspecialchars($pconfig['gateway-6rd']);?>" />
- <br />
- <?=gettext("The value in this field is 6RD IPv4 gateway address assigned by your ISP") ?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("6RD IPv4 Prefix length"); ?></td>
- <td width="78%" class="vtable">
- <select name="prefix-6rd-v4plen" class="formselect" id="prefix-6rd-v4plen">
- <?php
- for ($i = 0; $i < 32; $i++) {
- echo "<option value=\"{$i}\" ";
- if (is_numeric($pconfig['prefix-6rd-v4plen']) && ($i == $pconfig['prefix-6rd-v4plen'])) {
- echo "selected=\"selected\"";
- }
- echo ">" . $i . " bits</option>";
- }
- ?>
- </select>
- <br />
- <?=gettext("The value in this field is the 6RD IPv4 prefix length. Normally specified by the ISP. A value of 0 means we embed the entire IPv4 address in the 6RD prefix."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr style="display:none;" id="track6">
- <td colspan="2" style="padding: 0px;">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="track6">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Track IPv6 Interface"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Interface"); ?></td>
- <td width="78%" class="vtable">
- <select name="track6-interface" id='track6-interface' class='formselect' onchange="update_track6_prefix();">
- <?php
- $interfaces = get_configured_interface_with_descr(false, true);
- $dynv6ifs = array();
- foreach ($interfaces as $iface => $ifacename) {
- switch ($config['interfaces'][$iface]['ipaddrv6']) {
- case "6to4":
- case "6rd":
- case "dhcp6":
- $dynv6ifs[$iface] = array(
- 'name' => $ifacename,
- 'ipv6_num_prefix_ids' => pow(2, calculate_ipv6_delegation_length($iface)) - 1
- );
- break;
- default:
- continue;
- }
- }
- $rowIndex = 0;
- foreach ($dynv6ifs as $iface => $ifacedata) {
- $rowIndex++;
- echo "<option value=\"{$iface}\"";
- if ($iface == $pconfig['track6-interface']) {
- echo " selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($ifacedata['name']) . "</option>";
- }
- if ($rowIndex == 0) {
- echo "<option></option>";
- }
- ?>
- </select> <br />
- <?php
- foreach ($dynv6ifs as $iface => $ifacedata) {
- echo "<input type=\"hidden\" name=\"ipv6-num-prefix-ids-{$iface}\" id=\"ipv6-num-prefix-ids-{$iface}\" value=\"{$ifacedata['ipv6_num_prefix_ids']}\">\n";
- }
- ?>
- <br />
- <?=gettext("This selects the dynamic IPv6 WAN interface to track for configuration") ?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Prefix ID"); ?></td>
- <td width="78%" class="vtable">
- <?php
- if ($pconfig['track6-prefix-id'] == "") {
- $pconfig['track6-prefix-id'] = 0;
- }
- $track6_prefix_id_hex = sprintf("%x", $pconfig['track6-prefix-id']);
- ?>
- <input name="track6-prefix-id--hex" type="text" class="formfld unknown" id="track6-prefix-id--hex" size="8" value="<?= $track6_prefix_id_hex ?>" />
- <span id="track6-prefix-id-range"></span>
- <input type="hidden" id="track6-prefix-id-max" value="0"></input>
- <br />
- <?= gettext("The value in this field is the (Delegated) IPv6 prefix ID. This determines the configurable network ID based on the dynamic IPv6 connection"); ?>
- <br />
- <?= gettext("default value is 0."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr style="display:none;" id="ppp">
- <td colspan="2" style="padding: 0px;">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="ppp">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("PPP configuration"); ?></td>
- </tr>
- <tr id="ppp_provider">
- <td width="22%" valign="top" class="vncell"><?=gettext("Service Provider"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="0" cellspacing="0" summary="service provider">
- <tr id="trcountry">
- <td><?=gettext("Country:"); ?> &nbsp;&nbsp;</td>
- <td>
- <select class="formselect" name="country" id="country" onchange="providers_list()">
- <option></option>
- </select>
- </td>
- </tr>
- <tr id="trprovider" style="display:none">
- <td><?=gettext("Provider:"); ?> &nbsp;&nbsp;</td>
- <td>
- <select class="formselect" name="provider_list" id="provider_list" onchange="providerplan_list()">
- <option></option>
- </select>
- </td>
- </tr>
- <tr id="trproviderplan" style="display:none">
- <td><?=gettext("Plan:"); ?> &nbsp;&nbsp;</td>
- <td>
- <select class="formselect" name="providerplan" id="providerplan" onchange="prefill_provider()">
- <option></option>
- </select>
- </td>
- </tr>
- </table>
- <br /><span class="vexpl"><?=gettext("Select to fill in data for your service provider."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Username"); ?></td>
- <td width="78%" class="vtable">
- <input name="ppp_username" type="text" class="formfld user" id="ppp_username" size="20" value="<?=htmlspecialchars($pconfig['ppp_username']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Password"); ?></td>
- <td width="78%" class="vtable">
- <input name="ppp_password" type="password" class="formfld pwd" id="ppp_password" size="20" value="<?=htmlspecialchars($pconfig['ppp_password']);?>" />
- </td>
- </tr>
- <tr id="phone_num">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Phone Number"); ?></td>
- <td width="78%" class="vtable">
- <input name="phone" type="text" class="formfld unknown" id="phone" size="12" value="<?=htmlspecialchars($pconfig['phone']);?>" />
- </td>
- </tr>
- <tr id="apn_">
- <td width="22%" valign="top" class="vncell"><?=gettext("Access Point Name (APN)"); ?></td>
- <td width="78%" class="vtable">
- <input name="apn" type="text" class="formfld unknown" id="apn" size="40" value="<?=htmlspecialchars($pconfig['apn']);?>" />
- </td>
- </tr>
- <tr id="interface" >
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Modem Port"); ?></td>
- <td width="78%" class="vtable">
- <select name="port" id="port" class="formselect">
- <?php
- $portlist = glob("/dev/cua*");
- $modems = glob("/dev/modem*");
- $portlist = array_merge($portlist, $modems);
- $rowIndex = 0;
- foreach ($portlist as $port) {
- if (preg_match("/\.(lock|init)$/", $port)) {
- continue;
- }
- $rowIndex++;
- echo "<option value=\"".trim($port)."\"";
- if ($pconfig['port'] == $port) {
- echo " selected=\"selected\"";
- }
- echo ">{$port}</option>";
- }
- if ($rowIndex == 0) {
- echo "<option></option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Advanced PPP"); ?></td>
- <?php if (isset($pconfig['pppid'])): ?>
- <td width="78%" class="vtable">
- <a href="/interfaces_ppps_edit.php?id=<?=htmlspecialchars($pconfig['pppid']);?>" class="navlnk"><?=gettext("Click here"); ?> </a>
- <?=gettext("to edit PPP configuration."); ?>
- </td>
- <?php else: ?>
- <td width="78%" class="vtable">
- <a href="/interfaces_ppps_edit.php" class="navlnk"><?=gettext("Click here"); ?> </a>
- <?=gettext("to create a PPP configuration."); ?>
- </td>
- <?php endif; ?>
- </tr>
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr style="display:none;" id="pppoe">
- <td colspan="2" style="padding:0px;">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="pppoe">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("PPPoE configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Username"); ?></td>
- <td width="78%" class="vtable">
- <input name="pppoe_username" type="text" class="formfld user" id="pppoe_username" size="20" value="<?=htmlspecialchars($pconfig['pppoe_username']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Password"); ?></td>
- <td width="78%" class="vtable">
- <input name="pppoe_password" type="password" class="formfld pwd" id="pppoe_password" size="20" value="<?=htmlspecialchars($pconfig['pppoe_password']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Service name"); ?></td>
- <td width="78%" class="vtable"><input name="provider" type="text" class="formfld unknown" id="provider" size="20" value="<?=htmlspecialchars($pconfig['provider']);?>" />
- <br /> <span class="vexpl"><?=gettext("Hint: this field can usually be left empty"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Dial on demand"); ?></td>
- <td width="78%" class="vtable">
- <input name="pppoe_dialondemand" type="checkbox" id="pppoe_dialondemand" value="enable" <?php if ($pconfig['pppoe_dialondemand']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable Dial-On-Demand mode"); ?></strong><br />
- <?=gettext("This option causes the interface to operate in dial-on-demand mode, allowing you to have a "); ?><i><?=gettext("virtual full time"); ?></i> <?=gettext("connection. The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Idle timeout"); ?></td>
- <td width="78%" class="vtable">
- <input name="pppoe_idletimeout" type="text" class="formfld unknown" id="pppoe_idletimeout" size="8" value="<?=htmlspecialchars($pconfig['pppoe_idletimeout']);?>" /> <?=gettext("seconds"); ?><br /><?=gettext("If no qualifying outgoing packets are transmitted for the specified number of seconds, the connection is brought down. An idle timeout of zero disables this feature."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Periodic reset");?></td>
- <td width="78%" class="vtable">
- <table id="presetwrap" cellspacing="0" cellpadding="0" width="100%" summary="periodic reset">
- <tr>
- <td align="left" valign="top">
- <p style="margin: 4px; padding: 4px 0 4px 0; width: 94%;">
- <select style="vertical-align:top" id="reset_type" name="pppoe-reset-type" class="formselect" onchange="show_reset_settings(this.value);">
- <option value=""><?=gettext("Disabled"); ?></option>
- <option value="custom" <?php if ($pconfig['pppoe-reset-type'] == "custom") echo "selected=\"selected\""; ?>><?=gettext("Custom"); ?></option>
- <option value="preset" <?php if ($pconfig['pppoe-reset-type'] == "preset") echo "selected=\"selected\""; ?>><?=gettext("Pre-Set"); ?></option>
- </select> <?=gettext("Select a reset timing type"); ?>
- </p>
- <?php if ($pconfig['pppoe_pr_custom']): ?>
- <p style="margin: 2px; padding: 4px; width: 94%;" id="pppoecustomwrap">
- <?php else: ?>
- <p style="margin: 2px; padding: 4px; width: 94%; display: none;" id="pppoecustomwrap">
- <?php endif; ?>
- <input type="text" name="pppoe_resethour" class="fd_incremental_inp_range_0_23 fd_increment_1 fd_classname_dec_buttonDec fd_classname_inc_buttonInc" maxlength="2" id="pppoe_resethour" value="<?= htmlspecialchars($pconfig['pppoe_resethour']); ?>" size="3" />
- <?=gettext("hour (0-23)"); ?><br />
- <input type="text" name="pppoe_resetminute" class="fd_incremental_inp_range_0_59 fd_increment_1 fd_classname_dec_buttonDec fd_classname_inc_buttonInc" maxlength="2" id="pppoe_resetminute" value="<?= htmlspecialchars($pconfig['pppoe_resetminute']); ?>" size="3" />
- <?=gettext("minute (0-59)"); ?><br />
- <input name="pppoe_resetdate" type="text" class="w8em format-m-d-y highlight-days-67" id="pppoe_resetdate" maxlength="10" size="10" value="<?=htmlspecialchars($pconfig['pppoe_resetdate']);?>" />
- <?=gettext("reset at a specific date (mm/dd/yyyy)"); ?>
- <br />&nbsp;<br />
- <span class="red"><strong><?=gettext("Note:"); ?> </strong></span>
- <?=gettext("If you leave the date field empty, the reset will be executed each day at the time you did specify using the minutes and hour field."); ?>
- </p>
- <?php if ($pconfig['pppoe_pr_preset']): ?>
- <p style="margin: 2px; padding: 4px; width: 94%;" id="pppoepresetwrap">
- <?php else: ?>
- <p style="margin: 2px; padding: 4px; width: 94%; display: none;" id="pppoepresetwrap">
- <?php endif; ?>
- <input name="pppoe_pr_preset_val" type="radio" id="pppoe_monthly" value="monthly" <?php if ($pconfig['pppoe_monthly']) echo "checked=\"checked\""; ?> />
- <?=gettext("reset at each month ('0 0 1 * *')"); ?>
- <br />
- <input name="pppoe_pr_preset_val" type="radio" id="pppoe_weekly" value="weekly" <?php if ($pconfig['pppoe_weekly']) echo "checked=\"checked\""; ?> />
- <?=gettext("reset at each week ('0 0 * * 0')"); ?>
- <br />
- <input name="pppoe_pr_preset_val" type="radio" id="pppoe_daily" value="daily" <?php if ($pconfig['pppoe_daily']) echo "checked=\"checked\""; ?> />
- <?=gettext("reset at each day ('0 0 * * *')"); ?>
- <br />
- <input name="pppoe_pr_preset_val" type="radio" id="pppoe_hourly" value="hourly" <?php if ($pconfig['pppoe_hourly']) echo "checked=\"checked\""; ?> />
- <?=gettext("reset at each hour ('0 * * * *')"); ?>
- </p>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+print($form);
+?>
+ <form action="interfaces.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabs">
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Advanced and MLPPP"); ?></td>
- <?php if (isset($pconfig['pppid'])): ?>
- <td width="78%" class="vtable">
- <a href="/interfaces_ppps_edit.php?id=<?=htmlspecialchars($pconfig['pppid']);?>" class="navlnk"><?=gettext("Click here"); ?> </a>
- <?=gettext("for additional PPPoE configuration options. Save first if you made changes."); ?>
- </td>
- <?php else: ?>
- <td width="78%" class="vtable">
- <a href="/interfaces_ppps_edit.php" class="navlnk"><?=gettext("Click here"); ?> </a>
- <?=gettext("for advanced PPPoE configuration options and MLPPP configuration."); ?>
- </td>
- <?php endif; ?>
- </tr>
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr style="display:none;" id="pptp">
- <td colspan="2" style="padding:0px;">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="pptp">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("PPTP/L2TP configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Username"); ?></td>
- <td width="78%" class="vtable">
- <input name="pptp_username" type="text" class="formfld user" id="pptp_username" size="20" value="<?=htmlspecialchars($pconfig['pptp_username']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Password"); ?></td>
- <td width="78%" class="vtable">
- <input name="pptp_password" type="password" class="formfld pwd" id="pptp_password" size="20" value="<?=htmlspecialchars($pconfig['pptp_password']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Local IP address"); ?></td>
- <td width="78%" class="vtable">
- <input name="pptp_local" type="text" class="formfld unknown" id="pptp_local" size="20" value="<?=htmlspecialchars($pconfig['pptp_local'][0]);?>" />
- /
- <select name="pptp_subnet" class="formselect" id="pptp_subnet">
- <?php for ($i = 31; $i > 0; $i--): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['pptp_subnet'][0]) echo "selected=\"selected\""; ?>>
- <?=$i;?>
- </option>
- <?php endfor; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Remote IP address"); ?></td>
- <td width="78%" class="vtable">
- <input name="pptp_remote" type="text" class="formfld unknown" id="pptp_remote" size="20" value="<?=htmlspecialchars($pconfig['pptp_remote'][0]);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Dial on demand"); ?></td>
- <td width="78%" class="vtable">
- <input name="pptp_dialondemand" type="checkbox" id="pptp_dialondemand" value="enable" <?php if ($pconfig['pptp_dialondemand']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable Dial-On-Demand mode"); ?></strong><br />
- <?=gettext("This option causes the interface to operate in dial-on-demand mode, allowing you to have a"); ?> <i><?=gettext("virtual full time"); ?></i> <?=gettext("connection. The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Idle timeout"); ?></td>
- <td width="78%" class="vtable">
- <input name="pptp_idletimeout" type="text" class="formfld unknown" id="pptp_idletimeout" size="8" value="<?=htmlspecialchars($pconfig['pptp_idletimeout']);?>" /> <?=gettext("seconds"); ?><br /><?=gettext("If no qualifying outgoing packets are transmitted for the specified number of seconds, the connection is brought down. An idle timeout of zero disables this feature."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Advanced"); ?></td>
- <?php if (isset($pconfig['pppid'])): ?>
- <td width="78%" class="vtable">
- <a href="/interfaces_ppps_edit.php?id=<?=htmlspecialchars($pconfig['pppid']);?>" class="navlnk"><?=gettext("Click here");?></a>
- <?=gettext("for additional PPTP and L2TP configuration options. Save first if you made changes.");?>
- </td>
- <?php else: ?>
- <td width="78%" class="vtable">
- <a href="/interfaces_ppps_edit.php" class="navlnk"><?=gettext("Click here");?></a>
- <?=gettext("for advanced PPTP and L2TP configuration options");?>.
- </td>
- <?php endif; ?>
- </tr>
- <tr>
- <td colspan="2" valign="top" height="16"></td>
- </tr>
- </table>
- </td>
- </tr>
<?php
/* Wireless interface? */
if (isset($wancfg['wireless'])):
?>
<tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Common wireless configuration - Settings apply to all wireless networks on"); ?> <?=$wlanbaseif;?>.</td>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Common wireless configuration - Settings apply to all wireless networks on"); ?><?=$wlanbaseif?>.</td>
</tr>
<tr>
- <td valign="top" class="vncell"><?=gettext("Persist common settings");?></td>
+ <td valign="top" class="vncell"><?=gettext("Persist common settings")?></td>
<td class="vtable">
- <input name="persistcommonwireless" type="checkbox" value="yes" class="formfld" id="persistcommonwireless" <?php if ($pconfig['persistcommonwireless']) echo "checked=\"checked\"";?> />
- <br /><?=gettext("Enabling this preserves the common wireless configuration through interface deletions and reassignments.");?>
+ <input name="persistcommonwireless" type="checkbox" value="yes" class="formfld" id="persistcommonwireless" <?php if ($pconfig['persistcommonwireless']) echo "checked=\"checked\""?> />
+ <br /><?=gettext("Enabling this preserves the common wireless configuration through interface deletions and reassignments.")?>
</td>
</tr>
<tr>
@@ -3215,9 +2773,9 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<td valign="top" class="vncellreq">802.11g OFDM <?=gettext("Protection Mode"); ?></td>
<td class="vtable">
<select name="protmode" class="formselect" id="protmode">
- <option <?php if ($pconfig['protmode'] == 'off') echo "selected=\"selected\"";?> value="off"><?=gettext("Protection mode off"); ?></option>
- <option <?php if ($pconfig['protmode'] == 'cts') echo "selected=\"selected\"";?> value="cts"><?=gettext("Protection mode CTS to self"); ?></option>
- <option <?php if ($pconfig['protmode'] == 'rtscts') echo "selected=\"selected\"";?> value="rtscts"><?=gettext("Protection mode RTS and CTS"); ?></option>
+ <option <?php if ($pconfig['protmode'] == 'off') echo "selected=\"selected\""?> value="off"><?=gettext("Protection mode off"); ?></option>
+ <option <?php if ($pconfig['protmode'] == 'cts') echo "selected=\"selected\""?> value="cts"><?=gettext("Protection mode CTS to self"); ?></option>
+ <option <?php if ($pconfig['protmode'] == 'rtscts') echo "selected=\"selected\""?> value="rtscts"><?=gettext("Protection mode RTS and CTS"); ?></option>
</select>
<br />
<?=gettext("For IEEE 802.11g, use the specified technique for protecting OFDM frames in a mixed 11b/11g network."); ?>
@@ -3332,7 +2890,7 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<tr>
<td valign="top" class="vncell"><?=gettext("Distance setting"); ?></td>
<td class="vtable">
- <input name="distance" type="text" class="formfld unknown" id="distance" size="5" value="<?=htmlspecialchars($pconfig['distance']);?>" />
+ <input name="distance" type="text" class="formfld unknown" id="distance" size="5" value="<?=htmlspecialchars($pconfig['distance'])?>" />
<br />
<?=gettext("Note: This field can be used to tune ACK/CTS timers to fit the distance between AP and Client"); ?><br />
<?=gettext("(measured in meters)"); ?>
@@ -3391,15 +2949,15 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<td colspan="2" valign="top" height="16"></td>
</tr>
<tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Network-specific wireless configuration");?></td>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Network-specific wireless configuration")?></td>
</tr>
<tr>
<td valign="top" class="vncellreq"><?=gettext("Mode"); ?></td>
<td class="vtable">
<select name="mode" class="formselect" id="mode">
- <option <?php if ($pconfig['mode'] == 'bss') echo "selected=\"selected\"";?> value="bss"><?=gettext("Infrastructure (BSS)"); ?></option>
- <option <?php if ($pconfig['mode'] == 'adhoc') echo "selected=\"selected\"";?> value="adhoc"><?=gettext("Ad-hoc (IBSS)"); ?></option>
- <option <?php if ($pconfig['mode'] == 'hostap') echo "selected=\"selected\"";?> value="hostap"><?=gettext("Access Point"); ?></option>
+ <option <?php if ($pconfig['mode'] == 'bss') echo "selected=\"selected\""?> value="bss"><?=gettext("Infrastructure (BSS)"); ?></option>
+ <option <?php if ($pconfig['mode'] == 'adhoc') echo "selected=\"selected\""?> value="adhoc"><?=gettext("Ad-hoc (IBSS)"); ?></option>
+ <option <?php if ($pconfig['mode'] == 'hostap') echo "selected=\"selected\""?> value="hostap"><?=gettext("Access Point"); ?></option>
</select>
</td>
</tr>
@@ -3416,11 +2974,11 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<td valign="top" class="vncell"><?=gettext("Minimum wireless standard"); ?></td>
<td class="vtable">
<select name="puremode" class="formselect" id="puremode">
- <option <?php if ($pconfig['puremode'] == 'any') echo "selected=\"selected\"";?> value="any"><?=gettext("Any"); ?></option>
+ <option <?php if ($pconfig['puremode'] == 'any') echo "selected=\"selected\""?> value="any"><?=gettext("Any"); ?></option>
<?php if (isset($wl_modes['11g'])): ?>
- <option <?php if ($pconfig['puremode'] == '11g') echo "selected=\"selected\"";?> value="11g"><?=gettext("802.11g"); ?></option>
+ <option <?php if ($pconfig['puremode'] == '11g') echo "selected=\"selected\""?> value="11g"><?=gettext("802.11g"); ?></option>
<?php endif; ?>
- <option <?php if ($pconfig['puremode'] == '11n') echo "selected=\"selected\"";?> value="11n"><?=gettext("802.11n"); ?></option>
+ <option <?php if ($pconfig['puremode'] == '11n') echo "selected=\"selected\""?> value="11n"><?=gettext("802.11n"); ?></option>
</select>
<br />
<?=gettext("When operating as an access point, allow only stations capable of the selected wireless standard to associate (stations not capable are not permitted to associate)."); ?>
@@ -3430,7 +2988,7 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<tr>
<td valign="top" class="vncell"><?=gettext("802.11g only"); ?></td>
<td class="vtable">
- <input name="puremode" type="checkbox" value="11g" class="formfld" id="puremode" <?php if ($pconfig['puremode'] == '11g') echo "checked=\"checked\"";?> />
+ <input name="puremode" type="checkbox" value="11g" class="formfld" id="puremode" <?php if ($pconfig['puremode'] == '11g') echo "checked=\"checked\""?> />
<br /><?=gettext("When operating as an access point in 802.11g mode, allow only 11g-capable stations to associate (11b-only stations are not permitted to associate)."); ?>
</td>
</tr>
@@ -3438,7 +2996,7 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<tr>
<td valign="top" class="vncell"><?=gettext("Allow intra-BSS communication"); ?></td>
<td class="vtable">
- <input name="apbridge_enable" type="checkbox" value="yes" class="formfld" id="apbridge_enable" <?php if ($pconfig['apbridge_enable']) echo "checked=\"checked\"";?> />
+ <input name="apbridge_enable" type="checkbox" value="yes" class="formfld" id="apbridge_enable" <?php if ($pconfig['apbridge_enable']) echo "checked=\"checked\""?> />
<br />
<?=gettext("When operating as an access point, enable this if you want to pass packets between wireless clients directly."); ?>
<br />
@@ -3448,14 +3006,14 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<tr>
<td valign="top" class="vncell"><?=gettext("Enable WME"); ?></td>
<td class="vtable">
- <input name="wme_enable" type="checkbox" class="formfld" id="wme_enable" value="yes" <?php if ($pconfig['wme_enable']) echo "checked=\"checked\"";?> />
+ <input name="wme_enable" type="checkbox" class="formfld" id="wme_enable" value="yes" <?php if ($pconfig['wme_enable']) echo "checked=\"checked\""?> />
<br /><?=gettext("Setting this option will force the card to use WME (wireless QoS)."); ?>
</td>
</tr>
<tr>
<td valign="top" class="vncell"><?=gettext("Enable Hide SSID"); ?></td>
<td class="vtable">
- <input name="hidessid_enable" type="checkbox" class="formfld" id="hidessid_enable" value="yes" <?php if ($pconfig['hidessid_enable']) echo "checked=\"checked\"";?> />
+ <input name="hidessid_enable" type="checkbox" class="formfld" id="hidessid_enable" value="yes" <?php if ($pconfig['hidessid_enable']) echo "checked=\"checked\""?> />
<br />
<?=gettext("Setting this option will force the card to NOT broadcast its SSID"); ?>
<br />
@@ -3476,37 +3034,37 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<tr>
<td><?=gettext("Key 1:"); ?>&nbsp;&nbsp;</td>
<td>
- <input name="key1" type="text" class="formfld unknown" id="key1" size="30" value="<?=htmlspecialchars($pconfig['key1']);?>" />
+ <input name="key1" type="text" class="formfld unknown" id="key1" size="30" value="<?=htmlspecialchars($pconfig['key1'])?>" />
</td>
<td align="center">
- <input name="txkey" type="radio" value="1" <?php if ($pconfig['txkey'] == 1) echo "checked=\"checked\"";?> />
+ <input name="txkey" type="radio" value="1" <?php if ($pconfig['txkey'] == 1) echo "checked=\"checked\""?> />
</td>
</tr>
<tr>
<td><?=gettext("Key 2:"); ?>&nbsp;&nbsp;</td>
<td>
- <input name="key2" type="text" class="formfld unknown" id="key2" size="30" value="<?=htmlspecialchars($pconfig['key2']);?>" />
+ <input name="key2" type="text" class="formfld unknown" id="key2" size="30" value="<?=htmlspecialchars($pconfig['key2'])?>" />
</td>
<td align="center">
- <input name="txkey" type="radio" value="2" <?php if ($pconfig['txkey'] == 2) echo "checked=\"checked\"";?> />
+ <input name="txkey" type="radio" value="2" <?php if ($pconfig['txkey'] == 2) echo "checked=\"checked\""?> />
</td>
</tr>
<tr>
<td><?=gettext("Key 3:"); ?>&nbsp;&nbsp;</td>
<td>
- <input name="key3" type="text" class="formfld unknown" id="key3" size="30" value="<?=htmlspecialchars($pconfig['key3']);?>" />
+ <input name="key3" type="text" class="formfld unknown" id="key3" size="30" value="<?=htmlspecialchars($pconfig['key3'])?>" />
</td>
<td align="center">
- <input name="txkey" type="radio" value="3" <?php if ($pconfig['txkey'] == 3) echo "checked=\"checked\"";?> />
+ <input name="txkey" type="radio" value="3" <?php if ($pconfig['txkey'] == 3) echo "checked=\"checked\""?> />
</td>
</tr>
<tr>
<td><?=gettext("Key 4:"); ?>&nbsp;&nbsp;</td>
<td>
- <input name="key4" type="text" class="formfld unknown" id="key4" size="30" value="<?=htmlspecialchars($pconfig['key4']);?>" />
+ <input name="key4" type="text" class="formfld unknown" id="key4" size="30" value="<?=htmlspecialchars($pconfig['key4'])?>" />
</td>
<td align="center">
- <input name="txkey" type="radio" value="4" <?php if ($pconfig['txkey'] == 4) echo "checked=\"checked\"";?> />
+ <input name="txkey" type="radio" value="4" <?php if ($pconfig['txkey'] == 4) echo "checked=\"checked\""?> />
</td>
</tr>
</table>
@@ -3529,7 +3087,7 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<tr>
<td><?=gettext("PSK:"); ?>&nbsp;&nbsp;</td>
<td>
- <input name="passphrase" type="text" class="formfld unknown" id="passphrase" size="66" value="<?=htmlspecialchars($pconfig['passphrase']);?>" />
+ <input name="passphrase" type="text" class="formfld unknown" id="passphrase" size="66" value="<?=htmlspecialchars($pconfig['passphrase'])?>" />
</td>
</tr>
</table>
@@ -3540,9 +3098,9 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<td valign="top" class="vncell"><?=gettext("WPA Mode"); ?></td>
<td class="vtable">
<select name="wpa_mode" class="formselect" id="wpa_mode">
- <option <?php if ($pconfig['wpa_mode'] == '1') echo "selected=\"selected\"";?> value="1"><?=gettext("WPA"); ?></option>
- <option <?php if ($pconfig['wpa_mode'] == '2' || !isset($pconfig['wpa_mode'])) echo "selected=\"selected\"";?> value="2"><?=gettext("WPA2"); ?></option>
- <option <?php if ($pconfig['wpa_mode'] == '3') echo "selected=\"selected\"";?> value="3"><?=gettext("Both"); ?></option>
+ <option <?php if ($pconfig['wpa_mode'] == '1') echo "selected=\"selected\""?> value="1"><?=gettext("WPA"); ?></option>
+ <option <?php if ($pconfig['wpa_mode'] == '2' || !isset($pconfig['wpa_mode'])) echo "selected=\"selected\""?> value="2"><?=gettext("WPA2"); ?></option>
+ <option <?php if ($pconfig['wpa_mode'] == '3') echo "selected=\"selected\""?> value="3"><?=gettext("Both"); ?></option>
</select>
</td>
</tr>
@@ -3550,9 +3108,9 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<td valign="top" class="vncell"><?=gettext("WPA Key Management Mode"); ?></td>
<td class="vtable">
<select name="wpa_key_mgmt" class="formselect" id="wpa_key_mgmt">
- <option <?php if ($pconfig['wpa_key_mgmt'] == 'WPA-PSK') echo "selected=\"selected\"";?> value="WPA-PSK"><?=gettext("Pre-Shared Key"); ?></option>
- <option <?php if ($pconfig['wpa_key_mgmt'] == 'WPA-EAP') echo "selected=\"selected\"";?> value="WPA-EAP"><?=gettext("Extensible Authentication Protocol"); ?></option>
- <option <?php if ($pconfig['wpa_key_mgmt'] == 'WPA-PSK WPA-EAP') echo "selected=\"selected\"";?> value="WPA-PSK WPA-EAP"><?=gettext("Both"); ?></option>
+ <option <?php if ($pconfig['wpa_key_mgmt'] == 'WPA-PSK') echo "selected=\"selected\""?> value="WPA-PSK"><?=gettext("Pre-Shared Key"); ?></option>
+ <option <?php if ($pconfig['wpa_key_mgmt'] == 'WPA-EAP') echo "selected=\"selected\""?> value="WPA-EAP"><?=gettext("Extensible Authentication Protocol"); ?></option>
+ <option <?php if ($pconfig['wpa_key_mgmt'] == 'WPA-PSK WPA-EAP') echo "selected=\"selected\""?> value="WPA-PSK WPA-EAP"><?=gettext("Both"); ?></option>
</select>
</td>
</tr>
@@ -3560,9 +3118,9 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<td valign="top" class="vncell"><?=gettext("Authentication"); ?></td>
<td class="vtable">
<select name="auth_algs" class="formselect" id="auth_algs">
- <option <?php if ($pconfig['auth_algs'] == '1') echo "selected=\"selected\"";?> value="1"><?=gettext("Open System Authentication"); ?></option>
- <option <?php if ($pconfig['auth_algs'] == '2') echo "selected=\"selected\"";?> value="2"><?=gettext("Shared Key Authentication"); ?></option>
- <option <?php if ($pconfig['auth_algs'] == '3') echo "selected=\"selected\"";?> value="3"><?=gettext("Both"); ?></option>
+ <option <?php if ($pconfig['auth_algs'] == '1') echo "selected=\"selected\""?> value="1"><?=gettext("Open System Authentication"); ?></option>
+ <option <?php if ($pconfig['auth_algs'] == '2') echo "selected=\"selected\""?> value="2"><?=gettext("Shared Key Authentication"); ?></option>
+ <option <?php if ($pconfig['auth_algs'] == '3') echo "selected=\"selected\""?> value="3"><?=gettext("Both"); ?></option>
</select>
<br /><?=gettext("Note: Shared Key Authentication requires WEP."); ?><br />
</td>
@@ -3571,23 +3129,23 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<td valign="top" class="vncell"><?=gettext("WPA Pairwise"); ?></td>
<td class="vtable">
<select name="wpa_pairwise" class="formselect" id="wpa_pairwise">
- <option <?php if ($pconfig['wpa_pairwise'] == 'CCMP TKIP') echo "selected=\"selected\"";?> value="CCMP TKIP"><?=gettext("Both"); ?></option>
- <option <?php if ($pconfig['wpa_pairwise'] == 'CCMP' || !isset($pconfig['wpa_pairwise'])) echo "selected=\"selected\"";?> value="CCMP"><?=gettext("AES (recommended)"); ?></option>
- <option <?php if ($pconfig['wpa_pairwise'] == 'TKIP') echo "selected=\"selected\"";?> value="TKIP"><?=gettext("TKIP"); ?></option>
+ <option <?php if ($pconfig['wpa_pairwise'] == 'CCMP TKIP') echo "selected=\"selected\""?> value="CCMP TKIP"><?=gettext("Both"); ?></option>
+ <option <?php if ($pconfig['wpa_pairwise'] == 'CCMP' || !isset($pconfig['wpa_pairwise'])) echo "selected=\"selected\""?> value="CCMP"><?=gettext("AES (recommended)"); ?></option>
+ <option <?php if ($pconfig['wpa_pairwise'] == 'TKIP') echo "selected=\"selected\""?> value="TKIP"><?=gettext("TKIP"); ?></option>
</select>
</td>
</tr>
<tr>
<td valign="top" class="vncell"><?=gettext("Key Rotation"); ?></td>
<td class="vtable">
- <input name="wpa_group_rekey" type="text" class="formfld unknown" id="wpa_group_rekey" size="30" value="<?php echo htmlspecialchars($pconfig['wpa_group_rekey']) ? $pconfig['wpa_group_rekey'] : "60";?>" />
+ <input name="wpa_group_rekey" type="text" class="formfld unknown" id="wpa_group_rekey" size="30" value="<?=htmlspecialchars($pconfig['wpa_group_rekey']) ? $pconfig['wpa_group_rekey'] : "60"?>" />
<br /><?=gettext("Specified in seconds. Allowed values are 1-9999. Must be shorter than Master Key Regeneration time."); ?>
</td>
</tr>
<tr>
<td valign="top" class="vncell"><?=gettext("Master Key Regeneration"); ?></td>
<td class="vtable">
- <input name="wpa_gmk_rekey" type="text" class="formfld" id="wpa_gmk_rekey" size="30" value="<?php echo htmlspecialchars($pconfig['wpa_gmk_rekey']) ? $pconfig['wpa_gmk_rekey'] : "3600";?>" />
+ <input name="wpa_gmk_rekey" type="text" class="formfld" id="wpa_gmk_rekey" size="30" value="<?=htmlspecialchars($pconfig['wpa_gmk_rekey']) ? $pconfig['wpa_gmk_rekey'] : "3600"?>" />
<br /><?=gettext("Specified in seconds. Allowed values are 1-9999. Must be longer than Key Rotation time."); ?>
</td>
</tr>
@@ -3601,50 +3159,50 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<tr>
<td valign="top" class="vncell"><?=gettext("Enable IEEE802.1X Authentication"); ?></td>
<td class="vtable">
- <input name="ieee8021x" type="checkbox" value="yes" class="formfld" id="ieee8021x" <?php if ($pconfig['ieee8021x']) echo "checked=\"checked\"";?> />
+ <input name="ieee8021x" type="checkbox" value="yes" class="formfld" id="ieee8021x" <?php if ($pconfig['ieee8021x']) echo "checked=\"checked\""?> />
<br /><?=gettext("Setting this option will enable 802.1X authentication."); ?>
- <br /><span class="red"><strong><?=gettext("NOTE"); ?>:</strong></span> <?=gettext("this option requires checking the \"Enable WPA box\"."); ?>
+ <br /><span class="red"><strong><?=gettext("NOTE"); ?>:</strong></span><?=gettext("this option requires checking the \"Enable WPA box\"."); ?>
</td>
</tr>
<tr>
<td valign="top" class="vncell"><?=gettext("802.1X Authentication Server IP Address"); ?></td>
<td class="vtable">
- <input name="auth_server_addr" id="auth_server_addr" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_addr']);?>" />
+ <input name="auth_server_addr" id="auth_server_addr" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_addr'])?>" />
<br /><?=gettext("Enter the IP address of the 802.1X Authentication Server. This is commonly a Radius server (FreeRadius, Internet Authentication Services, etc.)"); ?>
</td>
</tr>
<tr>
<td valign="top" class="vncell"><?=gettext("802.1X Authentication Server Port"); ?></td>
<td class="vtable">
- <input name="auth_server_port" id="auth_server_port" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_port']);?>" />
+ <input name="auth_server_port" id="auth_server_port" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_port'])?>" />
<br /><?=gettext("Leave blank for the default port 1812."); ?>
</td>
</tr>
<tr>
<td valign="top" class="vncell"><?=gettext("802.1X Authentication Server Shared Secret"); ?></td>
<td class="vtable">
- <input name="auth_server_shared_secret" id="auth_server_shared_secret" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_shared_secret']);?>" />
+ <input name="auth_server_shared_secret" id="auth_server_shared_secret" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_shared_secret'])?>" />
<br />
</td>
</tr>
<tr>
<td valign="top" class="vncell"><?=gettext("Secondary 802.1X Authentication Server IP Address"); ?></td>
<td class="vtable">
- <input name="auth_server_addr2" id="auth_server_addr2" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_addr2']);?>" />
+ <input name="auth_server_addr2" id="auth_server_addr2" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_addr2'])?>" />
<br /><?=gettext("Enter the IP address of the 802.1X Authentication Server. This is commonly a Radius server (FreeRadius, Internet Authentication Services, etc.)"); ?>
</td>
</tr>
<tr>
<td valign="top" class="vncell"><?=gettext("Secondary 802.1X Authentication Server Port"); ?></td>
<td class="vtable">
- <input name="auth_server_port2" id="auth_server_port2" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_port2']);?>" />
+ <input name="auth_server_port2" id="auth_server_port2" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_port2'])?>" />
<br /><?=gettext("Leave blank for the default port 1812."); ?>
</td>
</tr>
<tr>
<td valign="top" class="vncell"><?=gettext("Secondary 802.1X Authentication Server Shared Secret"); ?></td>
<td class="vtable">
- <input name="auth_server_shared_secret2" id="auth_server_shared_secret2" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_shared_secret2']);?>" />
+ <input name="auth_server_shared_secret2" id="auth_server_shared_secret2" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_shared_secret2'])?>" />
<br />
</td>
</tr>
@@ -3688,8 +3246,8 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<?=gettext("Note: The update frequency can be changed under System->Advanced Firewall/NAT settings.")?>
</td>
</tr>
- </table> <!-- End "allcfg" table -->
- </div> <!-- End "allcfg" div -->
+ </table><!-- End "allcfg" table -->
+ </div><!-- End "allcfg" div -->
<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="buttons">
<tr>
@@ -3699,23 +3257,234 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
<td width="78%">
<br />
<input id="save" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input id="cancel" type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <input name="if" type="hidden" id="if" value="<?=htmlspecialchars($if);?>" />
+ <input id="cancel" type="button" class="formbtn" value="<?=gettext("Cancel")?>" onclick="window.location.href='<?=$referer?>'" />
+ <input name="referer" type="hidden" value="<?=$referer?>" />
+ <input name="if" type="hidden" id="if" value="<?=htmlspecialchars($if)?>" />
<?php if ($wancfg['if'] == $a_ppps[$pppid]['if']) : ?>
- <input name="ppp_port" type="hidden" value="<?=htmlspecialchars($pconfig['port']);?>" />
+ <input name="ppp_port" type="hidden" value="<?=htmlspecialchars($pconfig['port'])?>" />
<?php endif; ?>
- <input name="ptpid" type="hidden" value="<?=htmlspecialchars($pconfig['ptpid']);?>" />
+ <input name="ptpid" type="hidden" value="<?=htmlspecialchars($pconfig['ptpid'])?>" />
</td>
</tr>
</table>
- </div>
- </td>
- </tr>
- </table>
+
</form>
- <script type="text/javascript">
+
+<script type="text/javascript">
//<![CDATA[
+events.push(function(){
+
+/*
+ function updateType(t) {
+ switch (t) {
+ case "none": {
+ jQuery('#staticv4, #dhcp, #pppoe, #pptp, #ppp').hide();
+ break;
+ }
+ case "staticv4": {
+ jQuery('#none, #dhcp, #pppoe, #pptp, #ppp').hide();
+ break;
+ }
+ case "dhcp": {
+ jQuery('#none, #staticv4, #pppoe, #pptp, #ppp').hide();
+ break;
+ }
+ case "ppp": {
+ jQuery('#none, #staticv4, #dhcp, #pptp, #pppoe').hide();
+ country_list();
+ break;
+ }
+ case "pppoe": {
+ jQuery('#none, #staticv4, #dhcp, #pptp, #ppp').hide();
+ break;
+ }
+ case "l2tp":
+ case "pptp": {
+ jQuery('#none, #staticv4, #dhcp, #pppoe, #ppp').hide();
+ jQuery('#pptp').show();
+ break;
+ }
+ }
+ if (t != "l2tp" && t != "pptp") {
+ jQuery('#'+t).show();
+ }
+ }
+
+ function updateTypeSix(t) {
+ if (!isNaN(t[0])) t = '_' + t;
+ switch (t) {
+ case "none": {
+ jQuery('#staticv6, #dhcp6, #_6rd, #_6to4, #track6, #slaac').hide();
+ break;
+ }
+ case "staticv6": {
+ jQuery('#none, #dhcp6, #_6rd, #_6to4, #track6, #slaac').hide();
+ break;
+ }
+ case "slaac": {
+ jQuery('#none, #staticv6, #_6rd, #_6to4, #track6, #dhcp6').hide();
+ break;
+ }
+ case "dhcp6": {
+ jQuery('#none, #staticv6, #_6rd, #_6to4, #track6, #slaac').hide();
+ break;
+ }
+ case "_6rd": {
+ jQuery('#none, #dhcp6, #staticv6, #_6to4, #track6, #slaac').hide();
+ break;
+ }
+ case "_6to4": {
+ jQuery('#none, #dhcp6, #staticv6, #_6rd, #track6, #slaac').hide();
+ break;
+ }
+ case "track6": {
+ jQuery('#none, #dhcp6, #staticv6, #_6rd, #_6to4, #slaac').hide();
+ update_track6_prefix();
+ break;
+ }
+ }
+ if (t != "l2tp" && t != "pptp") {
+ jQuery('#'+t).show();
+ }
+ }
+
+ function show_allcfg(obj) {
+ if (obj.checked) {
+ jQuery('#allcfg').show();
+ } else {
+ jQuery('#allcfg').hide();
+ }
+ }
+
+ function show_reset_settings(reset_type) {
+ if (reset_type == 'preset') {
+ jQuery('#pppoepresetwrap').show();
+ jQuery('#pppoecustomwrap').hide();
+ } else if (reset_type == 'custom') {
+ jQuery('#pppoecustomwrap').show();
+ jQuery('#pppoepresetwrap').hide();
+ } else {
+ jQuery('#pppoecustomwrap').hide();
+ jQuery('#pppoepresetwrap').hide();
+ }
+ }
+
+ function show_mon_config() {
+ jQuery("#showmonbox").html('');
+ jQuery('#showmon').css('display', 'block');
+ }
+
+ function openwindow(url) {
+ var oWin = window.open(url, "pfSensePop", "width=620,height=400,top=150,left=150");
+ if (oWin == null || typeof(oWin) == "undefined") {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ function country_list() {
+ jQuery('#country').children().remove();
+ jQuery('#provider_list').children().remove();
+ jQuery('#providerplan').children().remove();
+ jQuery.ajax("getserviceproviders.php",{
+ success: function(response) {
+ var responseTextArr = response.split("\n");
+ responseTextArr.sort();
+ responseTextArr.each( function(value) {
+ var option = new Element('option');
+ country = value.split(":");
+ option.text = country[0];
+ option.value = country[1];
+ jQuery('#country').append(option);
+ });
+ }
+ });
+ jQuery('#trcountry').css('display', "table-row");
+ }
+
+ function providers_list() {
+ jQuery('#provider_list').children().remove();
+ jQuery('#providerplan').children().remove();
+ jQuery.ajax("getserviceproviders.php",{
+ type: 'post',
+ data: {country : jQuery('#country').val()},
+ success: function(response) {
+ var responseTextArr = response.split("\n");
+ responseTextArr.sort();
+ responseTextArr.each( function(value) {
+ var option = new Element('option');
+ option.text = value;
+ option.value = value;
+ jQuery('#provider_list').append(option);
+ });
+ }
+ });
+ jQuery('#trprovider').css("display", "table-row");
+ jQuery('#trproviderplan').css("display", "none");
+ }
+
+ function providerplan_list() {
+ jQuery('#providerplan').children().remove();
+ jQuery('#providerplan').append( new Element('option') );
+ jQuery.ajax("getserviceproviders.php",{
+ type: 'post',
+ data: {country : jQuery('#country').val(), provider : jQuery('#provider_list').val()},
+ success: function(response) {
+ var responseTextArr = response.split("\n");
+ responseTextArr.sort();
+ responseTextArr.each( function(value) {
+ if (value != "") {
+ providerplan = value.split(":");
+
+ var option = new Element('option');
+ option.text = providerplan[0] + " - " + providerplan[1];
+ option.value = providerplan[1];
+ jQuery('#providerplan').append(option);
+ }
+ });
+ }
+ });
+ jQuery('#trproviderplan').css("display", "table-row");
+ }
+
+ function prefill_provider() {
+ jQuery.ajax("getserviceproviders.php",{
+ type: 'post',
+ data: {country : jQuery('#country').val(), provider : jQuery('#provider_list').val(), plan : jQuery('#providerplan').val()},
+ success: function(data, textStatus, response) {
+ var xmldoc = response.responseXML;
+ var provider = xmldoc.getElementsByTagName('connection')[0];
+ jQuery('#ppp_username').val('');
+ jQuery('#ppp_password').val('');
+ if (provider.getElementsByTagName('apn')[0].firstChild.data == "CDMA") {
+ jQuery('#phone').val('#777');
+ jQuery('#apn').val('');
+ } else {
+ jQuery('#phone').val('*99#');
+ jQuery('#apn').val(provider.getElementsByTagName('apn')[0].firstChild.data);
+ }
+ ppp_username = provider.getElementsByTagName('ppp_username')[0].firstChild.data;
+ ppp_password = provider.getElementsByTagName('ppp_password')[0].firstChild.data;
+ jQuery('#ppp_username').val(ppp_username);
+ jQuery('#ppp_password').val(ppp_password);
+ }
+ });
+ }
+
+ function update_track6_prefix() {
+ var iface = jQuery("#track6-interface").val();
+ if (iface == null) {
+ return;
+ }
+ var track6_prefix_ids = jQuery('#ipv6-num-prefix-ids-' + iface).val();
+ if (track6_prefix_ids == null) {
+ return;
+ }
+ track6_prefix_ids = parseInt(track6_prefix_ids).toString(16);
+ jQuery('#track6-prefix-id-range').html('(<b>hexadecimal</b> from 0 to ' + track6_prefix_ids + ')');
+ }
+
var gatewayip;
var name;
var gatewayipv6;
@@ -3762,7 +3531,7 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
}
function hide_add_gatewaysave() {
document.getElementById("addgateway").style.display = 'none';
- jQuery('#status').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /> One moment please...');
+ jQuery('#status').html('<img src="/themes/<?=$g['theme']?>/images/misc/loader.gif" alt="loader" /> One moment please...');
var iface = jQuery('#if').val();
name = jQuery('#name').val();
var descr = jQuery('#gatewaydescr').val();
@@ -3783,9 +3552,10 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
success: save_callback
});
}
+
function hide_add_gatewaysave_v6() {
document.getElementById("addgatewayv6").style.display = 'none';
- jQuery('#statusv6').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /> One moment please...');
+ jQuery('#statusv6').html('<img src="/themes/<?=$g['theme']?>/images/misc/loader.gif" alt="loader" /> One moment please...');
var iface = jQuery('#if').val();
name = jQuery('#namev6').val();
var descr = jQuery('#gatewaydescrv6').val();
@@ -3805,6 +3575,7 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
success: save_callback_v6
});
}
+
function addOption(selectbox, text, value)
{
var optn = document.createElement("OPTION");
@@ -3812,8 +3583,9 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
optn.value = value;
selectbox.append(optn);
selectbox.prop('selectedIndex', selectbox.children().length - 1);
- jQuery('#notebox').html("<p><strong><?=gettext("NOTE:"); ?><\/strong> <?=gettext("You can manage Gateways"); ?> <a target='_blank' href='system_gateways.php'><?=gettext("here"); ?><\/a>.<\/p>");
+ jQuery('#notebox').html("<p><strong><?=gettext("NOTE:"); ?><\/strong><?=gettext("You can manage Gateways"); ?><a target='_blank' href='system_gateways.php'><?=gettext("here"); ?><\/a>.<\/p>");
}
+
function addOption_v6(selectbox, text, value)
{
var optn = document.createElement("OPTION");
@@ -3821,8 +3593,9 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
optn.value = value;
selectbox.append(optn);
selectbox.prop('selectedIndex', selectbox.children().length - 1);
- jQuery('#noteboxv6').html("<p><strong><?=gettext("NOTE:"); ?><\/strong> <?=gettext("You can manage Gateways"); ?> <a target='_blank' href='system_gateways.php'><?=gettext("here"); ?><\/a>.<\/p>");
+ jQuery('#noteboxv6').html("<p><strong><?=gettext("NOTE:"); ?><\/strong><?=gettext("You can manage Gateways"); ?><a target='_blank' href='system_gateways.php'><?=gettext("here"); ?><\/a>.<\/p>");
}
+
function report_failure(request, textStatus, errorThrown) {
if (textStatus === "error" && request.getResponseHeader("Content-Type") === "text/plain") {
alert(request.responseText);
@@ -3831,6 +3604,7 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
}
hide_add_gateway();
}
+
function report_failure_v6(request, textStatus, errorThrown) {
if (textStatus === "error" && request.getResponseHeader("Content-Type") === "text/plain") {
alert(request.responseText);
@@ -3839,6 +3613,7 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
}
hide_add_gateway_v6();
}
+
function save_callback(response) {
if (response) {
document.getElementById("addgateway").style.display = 'none';
@@ -3847,16 +3622,18 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
addOption(jQuery('#gateway'), gwtext, name);
// Auto submit form?
//document.iform.submit();
- //jQuery('#status').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader /">');
+ //jQuery('#status').html('<img src="/themes/<?=$g['theme']?>/images/misc/loader.gif" alt="loader /">');
} else {
report_failure();
}
}
+
function show_advanced_media() {
document.getElementById("showadvmediabox").innerHTML='';
aodiv = document.getElementById('showmediaadv');
aodiv.style.display = "block";
}
+
function save_callback_v6(response_v6) {
if (response_v6) {
document.getElementById("addgatewayv6").style.display = 'none';
@@ -3865,18 +3642,185 @@ $types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"),
addOption_v6(jQuery('#gatewayv6'), gwtext_v6, name);
// Auto submit form?
//document.iform.submit();
- //jQuery('#statusv6').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" />');
+ //jQuery('#statusv6').html('<img src="/themes/<?=$g['theme']?>/images/misc/loader.gif" alt="loader" />');
} else {
report_failure_v6();
}
}
- <?php
+
+
+ function customdhcpptcheckradiobuton(T, BUTTON) {
+ for (var i = 0; i < T.length; i++) {
+ T[i].checked = false;
+ if (T[i].value == BUTTON) T[i].checked = true;
+ }
+ T.value = BUTTON;
+ }
+
+ function customdhcpptsetvalues(T, FORM) {
+ // timeout, retry, select-timeout, reboot, backoff-cutoff, initial-interval
+ if (T.value == "DHCP") customdhcpptsetvaluesnow(T, FORM, "60", "300", "0", "10", "120", "10");
+ if (T.value == "pfSense") customdhcpptsetvaluesnow(T, FORM, "60", "15", "0", "", "", "1");
+ if (T.value == "SavedCfg") customdhcpptsetvaluesnow(T, FORM, "<?=htmlspecialchars($pconfig['adv_dhcp_pt_timeout'])?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_retry'])?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_select_timeout'])?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_reboot'])?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_backoff_cutoff'])?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_initial_interval'])?>");
+ if (T.value == "Clear") customdhcpptsetvaluesnow(T, FORM, "", "", "", "", "", "");
+ }
+
+ function customdhcpptsetvaluesnow(T, FORM, timeout, retry, selecttimeout, reboot, backoffcutoff, initialinterval) {
+ FORM.adv_dhcp_pt_timeout.value = timeout;
+ FORM.adv_dhcp_pt_retry.value = retry;
+ FORM.adv_dhcp_pt_select_timeout.value = selecttimeout;
+ FORM.adv_dhcp_pt_reboot.value = reboot;
+ FORM.adv_dhcp_pt_backoff_cutoff.value = backoffcutoff;
+ FORM.adv_dhcp_pt_initial_interval.value = initialinterval;
+
+ FORM.adv_dhcp_pt_values.value = T.value;
+ }
+
+ <!-- Set the adv_dhcp_pt_values radio button from saved config -->
+ var RADIOBUTTON_VALUE = "<?=htmlspecialchars($pconfig['adv_dhcp_pt_values'])?>";
+ if (RADIOBUTTON_VALUE == "") RADIOBUTTON_VALUE = "SavedCfg";
+ //customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, RADIOBUTTON_VALUE);
+
+ function show_adv_dhcp_config(T) {
+
+ if (T.checked) {
+ T.value = "Selected";
+ } else {
+ T.value = "";
+ }
+
+ if (document.iform.adv_dhcp_config_file_override.checked) {
+ show_hide_adv_dhcp('none', 'none', '');
+ } else if (document.iform.adv_dhcp_config_advanced.checked) {
+ show_hide_adv_dhcp('', '', 'none');
+ } else {
+ show_hide_adv_dhcp('', 'none', 'none');
+ }
+ }
+
+ function show_adv_dhcp6_config(T) {
+
+ if (T.checked) {
+ T.value = "Selected";
+ } else {
+ T.value = "";
+ }
+
+ if (document.iform.adv_dhcp6_config_file_override.checked) {
+ show_hide_adv_dhcp6('none', 'none', '');
+ } else if (document.iform.adv_dhcp6_config_advanced.checked) {
+ show_hide_adv_dhcp6('none', '', 'none');
+ } else {
+ show_hide_adv_dhcp6('', 'none', 'none');
+ }
+ }
+
+ function show_hide_adv_dhcp6(basic, advanced, override) {
+ document.getElementById("basicdhcp6_use_pppoeinterface").style.display = basic;
+ document.getElementById("basicdhcp6_show_dhcp6_prefix_delegation_size").style.display = basic;
+ document.getElementById("basicdhcp6_show_dhcp6_prefix_send_hint").style.display = basic;
+ document.getElementById("basicdhcp6_show_dhcp6_prefix_only").style.display = basic;
+
+ document.getElementById("show_adv_dhcp6_interface_statement").style.display = advanced;
+ document.getElementById("show_adv_dhcp6_id_assoc_statement").style.display = advanced;
+
+ document.getElementById("show_adv_dhcp6_id_assoc_statement_address").style.display = 'none';
+ if (document.iform.adv_dhcp6_id_assoc_statement_address_enable.checked) {
+ document.getElementById("show_adv_dhcp6_id_assoc_statement_address").style.display = advanced;
+ }
+
+ document.getElementById("show_adv_dhcp6_id_assoc_statement_prefix").style.display = 'none';
+ document.getElementById("show_adv_dhcp6_prefix_interface_statement").style.display = 'none';
+ if (document.iform.adv_dhcp6_id_assoc_statement_prefix_enable.checked) {
+ document.getElementById("show_adv_dhcp6_id_assoc_statement_prefix").style.display = advanced;
+ document.getElementById("show_adv_dhcp6_prefix_interface_statement").style.display = advanced;
+ }
+
+ document.getElementById("show_adv_dhcp6_authentication_statement").style.display = advanced;
+ document.getElementById("show_adv_dhcp6_key_info_statement").style.display = advanced;
+
+ document.getElementById("show_adv_dhcp6_config_file_override").style.display = override;
+ }
+
+ <!-- Set the adv_dhcp6_config_advanced checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp6_config_advanced'])?>" == "Selected") {
+ document.iform.adv_dhcp6_config_advanced.checked = true;
+ }
+ show_adv_dhcp6_config(document.iform.adv_dhcp6_config_advanced);
+
+ <!-- Set the adv_dhcp6_config_file_override checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp6_config_file_override'])?>" == "Selected") {
+ document.iform.adv_dhcp6_config_file_override.checked = true;
+ }
+ show_adv_dhcp6_config(document.iform.adv_dhcp6_config_file_override);
+
+ <!-- Set the adv_dhcp6_interface_statement_information_only_enable checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp6_interface_statement_information_only_enable'])?>" == "Selected") {
+ document.iform.adv_dhcp6_interface_statement_information_only_enable.checked = true;
+ }
+ show_adv_dhcp6_config(document.iform.adv_dhcp6_interface_statement_information_only_enable);
+
+ <!-- Set the adv_dhcp6_id_assoc_statement_address_enable checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_address_enable'])?>" == "Selected") {
+ document.iform.adv_dhcp6_id_assoc_statement_address_enable.checked = true;
+ }
+ show_adv_dhcp6_config(document.iform.adv_dhcp6_id_assoc_statement_address_enable);
+
+ <!-- Set the adv_dhcp6_id_assoc_statement_prefix_enable checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_prefix_enable'])?>" == "Selected") {
+ document.iform.adv_dhcp6_id_assoc_statement_prefix_enable.checked = true;
+ }
+ show_adv_dhcp6_config(document.iform.adv_dhcp6_id_assoc_statement_prefix_enable);
+
+ function show_hide_adv_dhcp(basic, advanced, override) {
+
+ document.getElementById("show_basic_dhcphostname").style.display = basic;
+ document.getElementById("show_basic_dhcpalias-address").style.display = basic;
+ document.getElementById("show_basic_dhcprejectlease").style.display = basic;
+
+ document.getElementById("show_adv_dhcp_protocol_timing").style.display = advanced;
+ document.getElementById("show_adv_dhcp_lease_requirements_and_requests").style.display = advanced;
+ document.getElementById("show_adv_dhcp_option_modifiers").style.display = advanced;
+
+ document.getElementById("show_adv_dhcp_config_file_override").style.display = override;
+ }
+
+ <!-- Set the adv_dhcp_config_advanced checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp_config_advanced'])?>" == "Selected") {
+ document.iform.adv_dhcp_config_advanced.checked = true;
+ }
+ show_adv_dhcp_config(document.iform.adv_dhcp_config_advanced);
+
+ <!-- Set the adv_dhcp_config_file_override checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp_config_file_override'])?>" == "Selected") {
+ document.iform.adv_dhcp_config_file_override.checked = true;
+ }
+ show_adv_dhcp_config(document.iform.adv_dhcp_config_file_override);
+*/
+ // Make the ‘Copy My MAC’ button a plain button, not a submit button
+ $("#btnmymac").prop('type','button');
+
+ // On click, copy the hidden 'mymac' text to the 'mac' input
+ $("#btnmymac").click(function() {
+ $('#mac').val('<?=$mymac?>');
+ });
+
+ $('#country').on('change', function() {
+ window.location = 'interfaces_ppps_edit.php?id=' + $('#id').val() + '&country=' + this.value + '&type=' + $('#type').val();
+ });
+
+ $('#provider').on('change', function() {
+ window.location = 'interfaces_ppps_edit.php?id=' + $('#id').val() + '&provider=' + this.value + '&type=' + $('#type').val() + '&country=' + $('#country').val();
+ });
+
+<?php
echo "show_allcfg(document.iform.enable);";
echo "updateType('{$pconfig['type']}');\n";
echo "updateTypeSix('{$pconfig['type6']}');\n";
?>
+ });
//]]>
</script>
- <?php include("fend.inc"); ?>
- </body>
-</html>
+
+
+ <?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/interfaces_assign.php b/src/usr/local/www/interfaces_assign.php
index 03fe582..1e38812 100644
--- a/src/usr/local/www/interfaces_assign.php
+++ b/src/usr/local/www/interfaces_assign.php
@@ -206,7 +206,7 @@ if (is_array($config['openvpn'])) {
}
}
-if (isset($_POST['add_x']) && isset($_POST['if_add'])) {
+if (isset($_POST['if_add'])) {
/* Be sure this port is not being used */
$portused = false;
foreach ($config['interfaces'] as $ifname => $ifdata) {
@@ -378,13 +378,9 @@ if (isset($_POST['add_x']) && isset($_POST['if_add'])) {
enable_rrd_graphing();
}
} else {
- /* yuck - IE won't send value attributes for image buttons, while Mozilla does - so we use .x/.y to find move button clicks instead... */
unset($delbtn);
- foreach ($_POST as $pn => $pd) {
- if (preg_match("/del_(.+)_x/", $pn, $matches)) {
- $delbtn = $matches[1];
- }
- }
+ if (!empty($_POST['del']))
+ $delbtn = key($_POST['del']);
if (isset($delbtn)) {
$id = $delbtn;
@@ -469,14 +465,7 @@ if (file_exists("/var/run/interface_mismatch_reboot_needed")) {
$savemsg = gettext("Interface mismatch detected. Please resolve the mismatch and click 'Apply changes'. The firewall will reboot afterwards.");
}
}
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="interfaces_assign.php" method="post" name="iform" id="iform">
-
-<?php
if (file_exists("/tmp/reload_interfaces")) {
echo "<p>\n";
print_info_box_np(gettext("The interface configuration has been changed.<br />You must apply the changes in order for them to take effect."));
@@ -486,112 +475,85 @@ if (file_exists("/tmp/reload_interfaces")) {
}
pfSense_handle_custom_code("/usr/local/pkg/interfaces_assign/pre_input_errors");
-if ($input_errors) {
+
+if ($input_errors)
print_input_errors($input_errors);
-}
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces assign">
- <tr><td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Interface assignments"), true, "interfaces_assign.php");
- $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
- $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
- $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
- $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
- $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
- $tab_array[7] = array(gettext("GRE"), false, "interfaces_gre.php");
- $tab_array[8] = array(gettext("GIF"), false, "interfaces_gif.php");
- $tab_array[9] = array(gettext("Bridges"), false, "interfaces_bridge.php");
- $tab_array[10] = array(gettext("LAGG"), false, "interfaces_lagg.php");
- display_top_tabs($tab_array);
-?>
- </td></tr>
- <tr><td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td class="listhdrr"><?=gettext("Interface"); ?></td>
- <td class="listhdr"><?=gettext("Network port"); ?></td>
- <td class="list">&nbsp;</td>
- </tr>
-<?php
- foreach ($config['interfaces'] as $ifname => $iface):
- if ($iface['descr']) {
- $ifdescr = $iface['descr'];
- } else {
- $ifdescr = strtoupper($ifname);
- }
-?>
- <tr>
- <td class="listlr" valign="middle"><strong><u><span onclick="location.href='/interfaces.php?if=<?=$ifname;?>'" style="cursor: pointer;"><?=$ifdescr;?></span></u></strong></td>
- <td valign="middle" class="listr">
- <select onchange="javascript:jQuery('#savediv').show();" name="<?=$ifname;?>" id="<?=$ifname;?>">
-<?php
- foreach ($portlist as $portname => $portinfo):
-?>
- <option value="<?=$portname;?>" <?php if ($portname == $iface['if']) echo " selected=\"selected\"";?>>
- <?=interface_assign_description($portinfo, $portname);?>
- </option>
-<?php
- endforeach;
-?>
- </select>
- </td>
- <td valign="middle" class="list">
-<?php
- if ($ifname != 'wan'):
-?>
- <input name="del_<?=$ifname;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif"
- title="<?=gettext("delete interface");?>"
- type="image" style="height:17;width:17;border:0"
- onclick="return confirm('<?=gettext("Do you really want to delete this interface?"); ?>')" />
-<?php
- endif;
+$tab_array = array();
+$tab_array[0] = array(gettext("Interface assignments"), true, "interfaces_assign.php");
+$tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+$tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+$tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+$tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+$tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+$tab_array[7] = array(gettext("GRE"), false, "interfaces_gre.php");
+$tab_array[8] = array(gettext("GIF"), false, "interfaces_gif.php");
+$tab_array[9] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+$tab_array[10] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+display_top_tabs($tab_array);
?>
- </td>
- </tr>
+<form action="interfaces_assign.php" method="post">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><?=gettext("Interface")?></th>
+ <th><?=gettext("Network port")?></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- endforeach;
- if (count($config['interfaces']) < count($portlist)):
+ foreach ($config['interfaces'] as $ifname => $iface):
+ if ($iface['descr'])
+ $ifdescr = $iface['descr'];
+ else
+ $ifdescr = strtoupper($ifname);
?>
- <tr>
- <td class="list">
- <strong><?=gettext("Available network ports:");?></strong>
- </td>
- <td class="list">
- <select name="if_add" id="if_add">
-<?php
- foreach ($unused_portlist as $portname => $portinfo):
-?>
- <option value="<?=$portname;?>" <?php if ($portname == $iface['if']) echo " selected=\"selected\"";?>>
- <?=interface_assign_description($portinfo, $portname);?>
- </option>
-<?php
- endforeach;
+ <tr>
+ <td><a href="/interfaces.php?if=<?=$ifname?>"><?=$ifdescr?></a></td>
+ <td>
+ <select name="<?=$ifname?>" id="<?=$ifname?>" class="form-control">
+<?php foreach ($portlist as $portname => $portinfo):?>
+ <option value="<?=$portname?>" <?=($portname == $iface['if']) ? ' selected="selected"': ''?>>
+ <?=interface_assign_description($portinfo, $portname)?>
+ </option>
+<?php endforeach;?>
+ </select>
+ </td>
+ <td>
+<?php if ($ifname != 'wan'):?>
+ <input type="submit" name="del[<?=$ifname?>]" class="btn btn-danger" value="<?=gettext("delete interface")?>"/>
+<?php endif;?>
+ </td>
+ </tr>
+<?php endforeach;
+ if (count($config['interfaces']) < count($portlist)):
?>
- </select>
- </td>
- <td class="list">
- <input name="add" type="image" src="/themes/<?=$g['theme'];?>/images/icons/icon_plus.gif" style="width:17;height:17;border:0" title="<?=gettext("add selected interface");?>" />
- </td>
- </tr>
-<?php
- endif;
-?>
- </table>
- </div>
- <br />
- <div id='savediv' style='display:none'>
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" /><br /><br />
- </div>
- <ul>
- <li><span class="vexpl"><?=gettext("Interfaces that are configured as members of a lagg(4) interface will not be shown."); ?></span></li>
- </ul>
- </td></tr>
-</table>
+ <tr>
+ <th>
+ <?=gettext("Available network ports:")?>
+ </th>
+ <td>
+ <select name="if_add" id="if_add" class="form-control">
+<?php foreach ($unused_portlist as $portname => $portinfo):?>
+ <option value="<?=$portname?>" <?=($portname == $iface['if']) ? ' selected="selected"': ''?>>
+ <?=interface_assign_description($portinfo, $portname)?>
+ </option>
+<?php endforeach;?>
+ </select>
+ </td>
+ <td>
+ <input type="submit" name="add" title="<?=gettext("add selected interface")?>" value="add interface" class="btn btn-success" />
+ </td>
+ </tr>
+<?php endif;?>
+ </tbody>
+ </table>
+ </div>
+
+ <input name="Submit" type="submit" class="btn btn-default" value="<?=gettext("Save")?>" /><br /><br />
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<p class="alert alert-info"><?=gettext("Interfaces that are configured as members of a lagg(4) interface will not be shown.")?></p>
+
+<?php include("foot.inc")?> \ No newline at end of file
diff --git a/src/usr/local/www/interfaces_bridge.php b/src/usr/local/www/interfaces_bridge.php
index b7e557f..df28e78 100644
--- a/src/usr/local/www/interfaces_bridge.php
+++ b/src/usr/local/www/interfaces_bridge.php
@@ -30,7 +30,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /bin/rm
- pfSense_MODULE: interfaces_assign
+ pfSense_MODULE: interfaces_assign
*/
##|+PRIV
@@ -52,6 +52,7 @@ function bridge_inuse($num) {
global $config, $a_bridges;
$iflist = get_configured_interface_list(false, true);
+
foreach ($iflist as $if) {
if ($config['interfaces'][$if]['if'] == $a_bridges[$num]['bridgeif']) {
return true;
@@ -85,95 +86,82 @@ if ($_GET['act'] == "del") {
}
}
-
-$pgtitle = array(gettext("Interfaces"), gettext("Bridge"));
+$pgtitle = array(gettext("Interfaces"),gettext("Bridge"));
$shortcut_section = "interfaces";
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors); ?>
+<?php
+$tab_array = array();
+$tab_array[] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+$tab_array[] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+$tab_array[] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+$tab_array[] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+$tab_array[] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+$tab_array[] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+$tab_array[] = array(gettext("GRE"), false, "interfaces_gre.php");
+$tab_array[] = array(gettext("GIF"), false, "interfaces_gif.php");
+$tab_array[] = array(gettext("Bridges"), true, "interfaces_bridge.php");
+$tab_array[] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+display_top_tabs($tab_array);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces bridge">
- <tr><td>
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Interface"); ?></th>
+ <th><?=gettext("Members"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
- $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
- $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
- $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
- $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
- $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
- $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
- $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
- $tab_array[8] = array(gettext("Bridges"), true, "interfaces_bridge.php");
- $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
- display_top_tabs($tab_array);
+
+$i = 0;
+$ifdescrs = get_configured_interface_with_descr();
+
+foreach ($a_bridges as $bridge) {
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Interface"); ?></td>
- <td width="20%" class="listhdrr"><?=gettext("Members"); ?></td>
- <td width="50%" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="10%" class="list"></td>
- </tr>
- <?php
- $i = 0;
- $ifdescrs = get_configured_interface_with_descr();
- foreach ($a_bridges as $bridge):
- ?>
- <tr ondblclick="document.location='interfaces_bridge_edit.php?id=<?=$i;?>'">
- <td class="listlr">
- <?=htmlspecialchars(strtoupper($bridge['bridgeif']));?>
- </td>
- <td class="listr">
- <?php
- $members = explode(',', $bridge['members']);
- $j = 0;
- foreach ($members as $member) {
- if (isset($ifdescrs[$member])) {
- echo $ifdescrs[$member];
- $j++;
- }
- if ($j > 0 && $j < count($members)) {
- echo ", ";
- }
- }
- ?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($bridge['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap"> <a href="interfaces_bridge_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;<a href="interfaces_bridge.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this bridge?"); ?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
- <?php
- $i++;
- endforeach;
- ?>
- <tr>
- <td class="list" colspan="3">&nbsp;</td>
- <td class="list"> <a href="interfaces_bridge_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- <tr>
- <td colspan="3" class="list"><p class="vexpl"><span class="red"><strong>
- <?=gettext("Note:"); ?><br />
- </strong></span>
- <?=gettext("Here you can configure bridging of interfaces."); ?></p>
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ <tr>
+ <td>
+ <?=htmlspecialchars(strtoupper($bridge['bridgeif']))?>
+ </td>
+ <td>
+<?php
+ $members = explode(',', $bridge['members']);
+ $j = 0;
+ foreach ($members as $member) {
+ if (isset($ifdescrs[$member])) {
+ echo $ifdescrs[$member];
+ $j++;
+ }
+ if ($j > 0 && $j < count($members))
+ echo ", ";
+ }
+?>
+ </td>
+ <td>
+ <?=htmlspecialchars($bridge['descr'])?>
+ </td>
+ <td>
+ <a href="interfaces_bridge_edit.php?id=<?=$i?>" class="btn btn-default btn-xs"><?=gettext("Edit")?></a>
+ <a href="interfaces_bridge.php?act=del&amp;id=<?=$i?>" class="btn btn-danger btn-xs"><?=gettext("Delete")?></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+}
+?>
+ </tbody>
+ </table>
+
+ <nav class="action-buttons">
+ <a href="interfaces_bridge_edit.php" class="btn btn-success"><?=gettext("Add")?></a>
+ </nav>
+
+</div>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/interfaces_bridge_edit.php b/src/usr/local/www/interfaces_bridge_edit.php
index 1787ca1..c38afb6 100644
--- a/src/usr/local/www/interfaces_bridge_edit.php
+++ b/src/usr/local/www/interfaces_bridge_edit.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -41,19 +41,13 @@
require("guiconfig.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_bridge.php');
-}
-
-if (!is_array($config['bridges']['bridged'])) {
+if (!is_array($config['bridges']['bridged']))
$config['bridges']['bridged'] = array();
-}
$a_bridges = &$config['bridges']['bridged'];
$ifacelist = get_configured_interface_with_descr();
+
foreach ($ifacelist as $bif => $bdescr) {
if (substr(get_real_interface($bif), 0, 3) == "gre") {
unset($ifacelist[$bif]);
@@ -89,6 +83,7 @@ if (isset($id) && $a_bridges[$id]) {
$pconfig['priority'] = $a_bridges[$id]['priority'];
$pconfig['proto'] = $a_bridges[$id]['proto'];
$pconfig['holdcnt'] = $a_bridges[$id]['holdcnt'];
+
if (!empty($a_bridges[$id]['ifpriority'])) {
$pconfig['ifpriority'] = explode(",", $a_bridges[$id]['ifpriority']);
$ifpriority = array();
@@ -101,6 +96,7 @@ if (isset($id) && $a_bridges[$id]) {
}
$pconfig['ifpriority'] = $ifpriority;
}
+
if (!empty($a_bridges[$id]['ifpathcost'])) {
$pconfig['ifpathcost'] = explode(",", $a_bridges[$id]['ifpathcost']);
$ifpathcost = array();
@@ -113,6 +109,7 @@ if (isset($id) && $a_bridges[$id]) {
}
$pconfig['ifpathcost'] = $ifpathcost;
}
+
$pconfig['span'] = $a_bridges[$id]['span'];
if (isset($a_bridges[$id]['edge'])) {
$pconfig['edge'] = $a_bridges[$id]['edge'];
@@ -129,7 +126,6 @@ if (isset($id) && $a_bridges[$id]) {
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -165,7 +161,9 @@ if ($_POST) {
$input_errors[] = "{$ifdescr} " . gettext("interface priority for STP needs to be an integer between 0 and 240.");
}
}
+
$i = 0;
+
foreach ($ifacelist as $ifn => $ifdescr) {
if ($_POST["{$ifn}{$i}"] <> "" && !is_numeric($_POST["{$ifn}{$i}"])) {
$input_errors[] = "{$ifdescr} " . gettext("interface path cost for STP needs to be an integer between 1 and 200000000.");
@@ -217,6 +215,7 @@ if ($_POST) {
$i = 0;
$ifpriority = "";
$ifpathcost = "";
+
foreach ($ifacelist as $ifn => $ifdescr) {
if ($_POST[$ifn] <> "") {
if ($i > 0) {
@@ -232,6 +231,7 @@ if ($_POST) {
}
$i++;
}
+
$bridge['ifpriority'] = $ifpriority;
$bridge['ifpathcost'] = $ifpathcost;
@@ -253,6 +253,7 @@ if ($_POST) {
$bridge['autoptp'] = implode(',', $_POST['autoptp']);
}
+
$bridge['bridgeif'] = $_POST['bridgeif'];
interface_bridge_configure($bridge);
if ($bridge['bridgeif'] == "" || !stristr($bridge['bridgeif'], "bridge")) {
@@ -277,432 +278,284 @@ if ($_POST) {
}
}
-$pgtitle = array(gettext("Interfaces"), gettext("Bridge"), gettext("Edit"));
+function build_spanport_list() {
+ global $ifacelist;
+
+ $splist = array('none' => 'None');
+
+ foreach ($ifacelist as $ifn => $ifdescr)
+ $splist[$ifn] = $ifdescr;
+
+ return($splist);
+}
+
+function build_member_list() {
+ global $pconfig, $ifacelist;
+
+ $memberlist = array('list' => array(),
+ 'selected' => array());
+
+ $members_array = explode(',', $pconfig['members']);
+ foreach ($ifacelist as $ifn => $ifinfo) {
+ $memberlist['list'][$ifn] = $ifinfo;
+
+ if (in_array($ifn, $members_array))
+ array_push($memberlist['selected'], $ifn);
+ }
+ unset($members_array);
+ return($memberlist);
+}
+
+function build_port_list($selecton) {
+ global $pconfig, $ifacelist;
+
+ $portlist = array('list' => array(),
+ 'selected' => array());
+
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ $portlist['list'][$ifn] = $ifdescr;
+
+ if (stristr($selecton, $ifn))
+ array_push($portlist['selected'], $ifn);
+ }
+
+ return($portlist);
+}
+
+$pgtitle = array(gettext("Interfaces"),gettext("Bridge"),gettext("Edit"));
$shortcut_section = "interfaces";
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<script type="text/javascript">
-//<![CDATA[
-function show_source_port_range() {
- document.getElementById("sprtable").style.display = 'none';
- document.getElementById("sprtable1").style.display = '';
- document.getElementById("sprtable2").style.display = '';
- document.getElementById("sprtable3").style.display = '';
- document.getElementById("sprtable4").style.display = '';
- document.getElementById("sprtable5").style.display = '';
- document.getElementById("sprtable6").style.display = '';
- document.getElementById("sprtable7").style.display = '';
- document.getElementById("sprtable8").style.display = '';
- document.getElementById("sprtable9").style.display = '';
- document.getElementById("sprtable10").style.display = '';
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Bridge Configuration');
+
+$memberslist = build_member_list();
+
+$section->addInput(new Form_Select(
+ 'members',
+ 'Member Interfaces',
+ $memberslist['selected'],
+ $memberslist['list'],
+ true // Allow multiples
+))->setHelp('Interfaces participating in the bridge');
+
+$section->addInput(new Form_Input(
+ 'Descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'showadvanced',
+ 'Advanced',
+ 'Show advanced options',
+ $pconfig['showadvanced']
+))->toggles('.toggle-advanced');
+
+$form->add($section);
+
+$section = new Form_Section('Advanced Configuration');
+
+// Set initial toggle state manually for now
+if($pconfig['showadvanced'])
+ $section->addClass('toggle-advanced in');
+else
+ $section->addClass('toggle-advanced collapse');
+
+$section->addInput(new Form_Input(
+ 'maxaddr',
+ 'Cache Size',
+ 'text',
+ $pconfig['maxaddr']
+))->setHelp('Set the size of the bridge address cache. The default is 100 entries');
+
+$section->addInput(new Form_Input(
+ 'timeout',
+ 'Cache expire time',
+ 'text',
+ $pconfig['timeout']
+))->setHelp('Set the timeout of address cache entries to this number of seconds. If seconds is zero, then address cache entries will not be expired. The default is 240 seconds');
+
+$section->addInput(new Form_Select(
+ 'span',
+ 'Span Port',
+ $pconfig['span'],
+ build_spanport_list()
+))->setHelp('Add the interface named by interface as a span port on the bridge. Span ports transmit a copy of every frame received by the bridge.' .
+ 'This is most useful for snooping a bridged network passively on another host connected to one of the span ports of the bridge. <br />' .
+ '%sThe span interface cannot be part of the bridge member interfaces.%s', ['<strong>', '</strong>']);
+
+$edgelist = build_port_list($pconfig['edge']);
+
+$section->addInput(new Form_Select(
+ 'edge[]',
+ 'Edge Ports',
+ $edgelist['selected'],
+ $edgelist['list'],
+ true
+))->setHelp('Set interface as an edge port. An edge port connects directly to end stations and cannot create bridging loops in the network; this allows it to transition straight to forwarding.');
+
+$edgelist = build_port_list($pconfig['autoedge']);
+
+$section->addInput(new Form_Select(
+ 'autoedge[]',
+ 'Auto Edge Ports',
+ $edgelist['selected'],
+ $edgelist['list'],
+ true
+))->setHelp('Allow interface to automatically detect edge status. This is the default for all interfaces added to a bridge.' .
+ '%sThis will disable the autoedge status of interfaces. %s', ['<strong>', '</strong>']);
+
+$edgelist = build_port_list($pconfig['ptp']);
+
+$section->addInput(new Form_Select(
+ 'ptp',
+ 'PTP Ports',
+ $edgelist['selected'],
+ $edgelist['list'],
+ true
+))->setHelp('Set the interface as a point-to-point link. This is required for straight transitions to forwarding and should be enabled on a direct link to another RSTP-capable switch.');
+
+$edgelist = build_port_list($pconfig['autoptp']);
+
+$section->addInput(new Form_Select(
+ 'autoptp[]',
+ 'Auto PTP Ports',
+ $edgelist['selected'],
+ $edgelist['list'],
+ true
+))->setHelp('Automatically detect the point-to-point status on interface by checking the full duplex link status. This is the default for interfaces added to the bridge.' .
+ '%sThe interfaces selected here will be removed from default autoedge status. %s', ['<strong>', '</strong>']);
+
+$edgelist = build_port_list($pconfig['static']);
+
+$section->addInput(new Form_Select(
+ 'static[]',
+ 'Sticky Ports',
+ $edgelist['selected'],
+ $edgelist['list'],
+ true
+))->setHelp('Mark an interface as a "sticky" interface. Dynamically learned address entries are treated as static once entered into the cache. ' .
+ 'Sticky entries are never aged out of the cache or replaced, even if the address is seen on a different interface.');
+
+$edgelist = build_port_list($pconfig['private']);
+
+$section->addInput(new Form_Select(
+ 'private[]',
+ 'Private Ports',
+ $edgelist['selected'],
+ $edgelist['list'],
+ true
+))->setHelp('Mark an interface as a "private" interface. A private interface does not forward any traffic to any other port that is also a private interface. ');
+
+// STP section
+// ToDo: - Should disable spanning tree section when not checked
+$section->addInput(new Form_Checkbox(
+ 'enablestp',
+ 'Enable RSTP/STP',
+ null,
+ $pconfig['enablestp']
+));
+
+// Show the spanning tree section
+$form->add($section);
+$section = new Form_Section('RSTP/STP');
+if($pconfig['showadvanced'])
+ $section->addClass('toggle-advanced in');
+else
+ $section->addClass('toggle-advanced collapse');
+
+$section->addInput(new Form_Select(
+ 'proto',
+ 'Protocol',
+ $pconfig['proto'],
+ array('rstp' => 'RSTP',
+ 'stp' => 'STP')
+))->setHelp('Protocol used for spanning tree.');
+
+$edgelist = build_port_list($pconfig['stp']);
+
+$section->addInput(new Form_Select(
+ 'stp[]',
+ 'STP Interfaces',
+ $edgelist['selected'],
+ $edgelist['list'],
+ true
+))->setHelp('Enable Spanning Tree Protocol on interface. The if_bridge(4) driver has support for the IEEE 802.1D Spanning Tree Protocol (STP).' .
+ 'STP is used to detect and remove loops in a network topology.');
+
+$section->addInput(new Form_Input(
+ 'maxage',
+ 'Valid time',
+ 'number',
+ $pconfig['maxage'],
+ ['placeholder' => 20, 'min' => 6, 'max' => 40]
+))->setHelp('Set the time that a Spanning Tree Protocol configuration is valid. The default is 20 seconds. The minimum is 6 seconds and the maximum is 40 seconds.');
+
+$section->addInput(new Form_Input(
+ 'fwdelay',
+ 'Forward time',
+ 'number',
+ $pconfig['fwdelay'],
+ ['placeholder' => 15, 'min' => 4, 'max' => 30]
+))->setHelp('Set the time that must pass before an interface begins forwarding packets when Spanning Tree is enabled. The default is 15 seconds. The minimum is 4 seconds and the maximum is 30 seconds. ');
+
+$section->addInput(new Form_Input(
+ 'hellotime',
+ 'Hello time',
+ 'number',
+ $pconfig['hellotime'],
+ ['placeholder' => 2, 'min' => 1, 'max' => 2, 'step' => '0.1']
+))->setHelp('Set the time in seconds between broadcasting of Spanning Tree Protocol configuration messages. The hello time may only be changed when operating in legacy STP mode.' .
+ 'The default is 2 seconds. The minimum is 1 second and the maximum is 2 seconds.');
+
+$section->addInput(new Form_Input(
+ 'priority',
+ 'Priority',
+ 'text',
+ $pconfig['priority'],
+ ['placeholder' => 32768, 'min' => 0, 'max' => 61440]
+))->setHelp('Set the bridge priority for Spanning Tree. The default is 32768. The minimum is 0 and the maximum is 61440. ');
+
+$section->addInput(new Form_Input(
+ 'holdcnt',
+ 'Hold Count',
+ 'number',
+ $pconfig['holdcnt'],
+ ['placeholder' => 6, 'min' => 1, 'max' => 10]
+))->setHelp('Set the transmit hold count for Spanning Tree. This is the number of packets transmitted before being rate limited. The default is 6. The minimum is 1 and the maximum is 10.');
+
+foreach ($ifacelist as $ifn => $ifdescr) {
+ $section->addInput(new Form_Input(
+ $ifn,
+ $ifdescr . ' Priority',
+ 'number',
+ $pconfig[$ifn],
+ ['placeholder' => 128, 'min' => 0, 'max' => 240, 'step' => 16]
+ ))->setHelp('Set the Spanning Tree priority of interface to value. The default is 128. The minimum is 0 and the maximum is 240. Increments of 16.');
}
-//]]>
-</script>
-
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php $size=count($ifacelist); ?>
-<form action="interfaces_bridge_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces bridge edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Bridge configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Member interfaces"); ?></td>
- <td width="78%" class="vtable">
- <select name="members[]" multiple="multiple" class="formselect" size="<?php echo $size; ?>">
- <?php
- $members_array = explode(',', $pconfig['members']);
- foreach ($ifacelist as $ifn => $ifinfo) {
- echo "<option value=\"{$ifn}\"";
- if (in_array($ifn, $members_array)) {
- echo " selected=\"selected\"";
- }
- echo ">{$ifinfo}</option>";
- }
- unset($members_array);
- ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Interfaces participating in the bridge."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input type="text" name="descr" id="descr" class="formfld unknown" size="50" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- </td>
- </tr>
- <tr id="sprtable">
- <td></td>
- <td>
- <p><input type="button" onclick="show_source_port_range()" value="<?=gettext("Show advanced options"); ?>" /></p>
- </td>
- </tr>
- <tr style="display:none" id="sprtable1">
- <td valign="top" class="vncell" align="center"><?=gettext("RSTP/STP"); ?> </td>
- <td class="vtable">
- <input type="checkbox" name="enablestp" id="enablestp" <?php if ($pconfig['enablestp']) echo "checked=\"checked\"";?> />
- <span class="vexpl"><strong><?=gettext("Enable spanning tree options for this bridge."); ?> </strong></span>
- <br /><br />
- <table id="stpoptions" border="0" cellpadding="6" cellspacing="0" summary="protocol">
- <tr>
- <td valign="top" class="vncell" width="20%"><?=gettext("Protocol"); ?></td>
- <td class="vtable" width="80%">
- <select name="proto" id="proto">
- <?php
- foreach (array("rstp", "stp") as $proto) {
- echo "<option value=\"{$proto}\"";
- if ($pconfig['proto'] == $proto) {
- echo " selected=\"selected\"";
- }
- echo ">".strtoupper($proto)."</option>";
- }
- ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Protocol used for spanning tree."); ?> </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell" width="20%"><?=gettext("STP interfaces"); ?></td>
- <td class="vtable" width="80%">
- <select name="stp[]" class="formselect" multiple="multiple" size="3">
- <?php
- foreach ($ifacelist as $ifn => $ifdescr) {
- echo "<option value=\"{$ifn}\"";
- if (stristr($pconfig['stp'], $ifn)) {
- echo " selected=\"selected\"";
- }
- echo ">{$ifdescr}</option>";
- }
- ?>
- </select>
- <br />
- <span class="vexpl" >
- <?=gettext("Enable Spanning Tree Protocol on interface. The if_bridge(4) " .
- "driver has support for the IEEE 802.1D Spanning Tree Protocol " .
- "(STP). STP is used to detect and remove loops in a " .
- "network topology."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell" width="20%"><?=gettext("Valid time"); ?></td>
- <td class="vtable" width="80%">
- <input name="maxage" type="text" class="formfld unknown" id="maxage" size="8" value="<?=htmlspecialchars($pconfig['maxage']);?>" /> <?=gettext("seconds"); ?>
- <br />
- <span class="vexpl">
- <?=gettext("Set the time that a Spanning Tree Protocol configuration is " .
- "valid. The default is 20 seconds. The minimum is 6 seconds and " .
- "the maximum is 40 seconds."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell" width="20%"><?=gettext("Forward time"); ?> </td>
- <td class="vtable" width="80%">
- <input name="fwdelay" type="text" class="formfld unknown" id="fwdelay" size="8" value="<?=htmlspecialchars($pconfig['fwdelay']);?>" /> <?=gettext("seconds"); ?>
- <br />
- <span class="vexpl">
- <?=gettext("Set the time that must pass before an interface begins forwarding " .
- "packets when Spanning Tree is enabled. The default is 15 seconds. The minimum is 4 seconds and the maximum is 30 seconds."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell" width="20%"><?=gettext("Hello time"); ?></td>
- <td class="vtable" width="80%">
- <input name="hellotime" type="text" class="formfld unknown" size="8" id="hellotime" value="<?=htmlspecialchars($pconfig['hellotime']);?>" /> <?=gettext("seconds"); ?>
- <br />
- <span class="vexpl">
- <?=gettext("Set the time between broadcasting of Spanning Tree Protocol configuration messages. The hello time may only be changed when " .
- "operating in legacy STP mode. The default is 2 seconds. The minimum is 1 second and the maximum is 2 seconds."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell" width="20%"><?=gettext("Priority"); ?></td>
- <td class="vtable" width="80%">
- <input name="priority" type="text" class="formfld unknown" id="priority" value="<?=htmlspecialchars($pconfig['priority']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Set the bridge priority for Spanning Tree. The default is 32768. " .
- "The minimum is 0 and the maximum is 61440."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell" width="20%"><?=gettext("Hold count"); ?></td>
- <td class="vtable" width="80%">
- <input name="holdcnt" type="text" class="formfld unknown" id="holdcnt" value="<?=htmlspecialchars($pconfig['holdcnt']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Set the transmit hold count for Spanning Tree. This is the number" .
- " of packets transmitted before being rate limited. The " .
- "default is 6. The minimum is 1 and the maximum is 10."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell" width="20%"><?=gettext("Priority"); ?></td>
- <td class="vtable" width="80%">
- <table summary="priority">
- <?php
- foreach ($ifacelist as $ifn => $ifdescr) {
- echo "<tr><td>{$ifdescr}</td><td><input size=\"5\" name=\"{$ifn}\" type=\"text\" class=\"formfld unknown\" id=\"{$ifn}\" value=\"{$ifpriority[$ifn]}\" /></td></tr>";
- }
- ?>
- <tr>
- <td></td>
- </tr>
- </table>
- <br />
- <span class="vexpl" >
- <?=gettext("Set the Spanning Tree priority of interface to value. The " .
- "default is 128. The minimum is 0 and the maximum is 240. Increments of 16."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell" width="20%"><?=gettext("Path cost"); ?></td>
- <td class="vtable" width="80%">
- <table summary="path cost">
- <?php
- $i = 0;
- foreach ($ifacelist as $ifn => $ifdescr) {
- echo "<tr><td>{$ifdescr}</td><td><input size=\"8\" name=\"{$ifn}{$i}\" type=\"text\" class=\"formfld unknown\" id=\"{$ifn}{$i}\" value=\"{$ifpathcost[$ifn]}\" /></td></tr>";
- }
- ?>
- <tr>
- <td></td>
- </tr>
- </table>
- <br />
- <span class="vexpl" >
- <?=gettext("Set the Spanning Tree path cost of interface to value. The " .
- "default is calculated from the link speed. To change a previously selected path cost back to automatic, set the cost to 0. ".
- "The minimum is 1 and the maximum is 200000000."); ?>
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr style="display:none" id="sprtable2">
- <td valign="top" class="vncell"><?=gettext("Cache size"); ?></td>
- <td class="vtable">
- <input name="maxaddr" size="10" type="text" class="formfld unknown" id="maxaddr" value="<?=htmlspecialchars($pconfig['maxaddr']);?>" /> <?=gettext("entries"); ?>
- <br />
- <span class="vexpl">
- <?=gettext("Set the size of the bridge address cache to size. The default is " .
- ".100 entries."); ?>
- </span>
- </td>
- </tr>
- <tr style="display:none" id="sprtable3">
- <td valign="top" class="vncell"><?=gettext("Cache entry expire time"); ?></td>
- <td>
- <input name="timeout" type="text" class="formfld unknown" id="timeout" size="10" value="<?=htmlspecialchars($pconfig['timeout']);?>" /> <?=gettext("seconds"); ?>
- <br />
- <span class="vexpl">
- <?=gettext("Set the timeout of address cache entries to this number of seconds. If " .
- "seconds is zero, then address cache entries will not be expired. " .
- "The default is 240 seconds."); ?>
- </span>
- </td>
- </tr>
- <tr style="display:none" id="sprtable4">
- <td valign="top" class="vncell"><?=gettext("Span port"); ?></td>
- <td class="vtable">
- <select name="span" class="formselect" id="span">
- <option value="none" selected="selected"><?=gettext("None"); ?></option>
- <?php
- foreach ($ifacelist as $ifn => $ifdescr) {
- echo "<option value=\"{$ifn}\"";
- if ($ifn == $pconfig['span']) {
- echo " selected=\"selected\"";
- }
- echo ">{$ifdescr}</option>";
- }
- ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Add the interface named by interface as a span port on the " .
- "bridge. Span ports transmit a copy of every frame received by " .
- "the bridge. This is most useful for snooping a bridged network " .
- "passively on another host connected to one of the span ports of " .
- "the bridge."); ?>
- </span>
- <p class="vexpl">
- <span class="red"><strong>
- <?=gettext("Note:"); ?><br />
- </strong></span>
- <?=gettext("The span interface cannot be part of the bridge member interfaces."); ?>
- </p>
- </td>
- </tr>
- <tr style="display:none" id="sprtable5">
- <td valign="top" class="vncell"><?=gettext("Edge ports"); ?></td>
- <td class="vtable">
- <select name="edge[]" class="formselect" multiple="multiple" size="3">
- <?php
- foreach ($ifacelist as $ifn => $ifdescr) {
- echo "<option value=\"{$ifn}\"";
- if (stristr($pconfig['edge'], $ifn)) {
- echo " selected=\"selected\"";
- }
- echo ">{$ifdescr}</option>";
- }
- ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Set interface as an edge port. An edge port connects directly to " .
- "end stations and cannot create bridging loops in the network; this " .
- "allows it to transition straight to forwarding."); ?>
- </span>
- </td>
- </tr>
- <tr style="display:none" id="sprtable6">
- <td valign="top" class="vncell"><?=gettext("Auto Edge ports"); ?></td>
- <td class="vtable">
- <select name="autoedge[]" class="formselect" multiple="multiple" size="3">
- <?php
- foreach ($ifacelist as $ifn => $ifdescr) {
- echo "<option value=\"{$ifn}\"";
- if (stristr($pconfig['autoedge'], $ifn)) {
- echo " selected=\"selected\"";
- }
- echo ">{$ifdescr}</option>";
- }
- ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Allow interface to automatically detect edge status. This is the " .
- "default for all interfaces added to a bridge."); ?>
- </span>
- <p class="vexpl">
- <span class="red"><strong>
- <?=gettext("Note:"); ?><br />
- </strong></span>
- <?=gettext("This will disable the autoedge status of interfaces."); ?>
- </p>
- </td>
- </tr>
- <tr style="display:none" id="sprtable7">
- <td valign="top" class="vncell"><?=gettext("PTP ports"); ?></td>
- <td class="vtable">
- <select name="ptp[]" class="formselect" multiple="multiple" size="3">
- <?php
- foreach ($ifacelist as $ifn => $ifdescr) {
- echo "<option value=\"{$ifn}\"";
- if (stristr($pconfig['ptp'], $ifn)) {
- echo " selected=\"selected\"";
- }
- echo ">{$ifdescr}</option>";
- }
- ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Set the interface as a point-to-point link. This is required for " .
- "straight transitions to forwarding and should be enabled on a " .
- "direct link to another RSTP-capable switch."); ?>
- </span>
- </td>
- </tr>
- <tr style="display:none" id="sprtable8">
- <td valign="top" class="vncell"><?=gettext("Auto PTP ports"); ?></td>
- <td class="vtable">
- <select name="autoptp[]" class="formselect" multiple="multiple" size="3">
- <?php
- foreach ($ifacelist as $ifn => $ifdescr) {
- echo "<option value=\"{$ifn}\"";
- if (stristr($pconfig['autoptp'], $ifn)) {
- echo " selected=\"selected\"";
- }
- echo ">{$ifdescr}</option>";
- }
- ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Automatically detect the point-to-point status on interface by " .
- "checking the full duplex link status. This is the default for " .
- "interfaces added to the bridge."); ?>
- </span>
- <p class="vexpl">
- <span class="red"><strong>
- <?=gettext("Note:"); ?><br />
- </strong></span>
- <?=gettext("The interfaces selected here will be removed from default autoedge status."); ?>
- </p>
- </td>
- </tr>
- <tr style="display:none" id="sprtable9">
- <td valign="top" class="vncell"><?=gettext("Sticky ports"); ?></td>
- <td class="vtable">
- <select name="static[]" class="formselect" multiple="multiple" size="3">
- <?php
- foreach ($ifacelist as $ifn => $ifdescr) {
- echo "<option value=\"{$ifn}\"";
- if (stristr($pconfig['static'], $ifn)) {
- echo " selected=\"selected\"";
- }
- echo ">{$ifdescr}</option>";
- }
- ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Mark an interface as a \"sticky\" interface. Dynamically learned " .
- "address entries are treated as static once entered into the " .
- "cache. Sticky entries are never aged out of the cache or " .
- "replaced, even if the address is seen on a different interface."); ?>
- </span>
- </td>
- </tr>
- <tr style="display:none" id="sprtable10">
- <td valign="top" class="vncell"><?=gettext("Private ports"); ?></td>
- <td class="vtable">
- <select name="private[]" class="formselect" multiple="multiple" size="3">
- <?php
- foreach ($ifacelist as $ifn => $ifdescr) {
- echo "<option value=\"{$ifn}\"";
- if (stristr($pconfig['private'], $ifn)) {
- echo " selected=\"selected\"";
- }
- echo ">{$ifdescr}</option>";
- }
- ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Mark an interface as a \"private\" interface. A private interface does not forward any traffic to any other port that is also " .
- "a private interface."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="bridgeif" value="<?=htmlspecialchars($pconfig['bridgeif']); ?>" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_bridges[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+$i = 0;
+foreach ($ifacelist as $ifn => $ifdescr) {
+ $section->addInput(new Form_Input(
+ $ifn . $i,
+ $ifdescr . ' Path cost',
+ 'number',
+ $ifpathcost[$ifn],
+ [ 'placeholder' => 0, 'min' => 1, 'max' => 200000000]
+ ))->setHelp('Set the Spanning Tree path cost of interface to value. The default is calculated from the link speed. '.
+ 'To change a previously selected path cost back to automatic, set the cost to 0. The minimum is 1 and the maximum is 200000000.');
+ $i++;
+}
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/interfaces_gif.php b/src/usr/local/www/interfaces_gif.php
index 0730090..8b62154 100644
--- a/src/usr/local/www/interfaces_gif.php
+++ b/src/usr/local/www/interfaces_gif.php
@@ -30,7 +30,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /sbin/ifconfig
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -84,79 +84,59 @@ $pgtitle = array(gettext("Interfaces"), gettext("GIF"));
$shortcut_section = "interfaces";
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+$tab_array[] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+$tab_array[] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+$tab_array[] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+$tab_array[] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+$tab_array[] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+$tab_array[] = array(gettext("GRE"), false, "interfaces_gre.php");
+$tab_array[] = array(gettext("GIF"), true, "interfaces_gif.php");
+$tab_array[] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+$tab_array[] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+display_top_tabs($tab_array);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces gif">
- <tr><td>
-<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
- $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
- $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
- $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
- $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
- $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
- $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
- $tab_array[7] = array(gettext("GIF"), true, "interfaces_gif.php");
- $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
- $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
- display_top_tabs($tab_array);
-?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Interface"); ?></td>
- <td width="20%" class="listhdrr"><?=gettext("Tunnel to..."); ?></td>
- <td width="50%" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="10%" class="list"></td>
- </tr>
- <?php
- $i = 0;
- foreach ($a_gifs as $gif):
- ?>
- <tr ondblclick="document.location='interfaces_gif_edit.php?id=<?=$i;?>'">
- <td class="listlr">
- <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($gif['if']));?>
- </td>
- <td class="listr">
- <?=htmlspecialchars($gif['remote-addr']);?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($gif['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap"> <a href="interfaces_gif_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;<a href="interfaces_gif.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this gif tunnel?"); ?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
- <?php
- $i++;
- endforeach;
- ?>
- <tr>
- <td class="list" colspan="3">&nbsp;</td>
- <td class="list"> <a href="interfaces_gif_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- <tr>
- <td colspan="3" class="list"><p class="vexpl"><span class="red"><strong>
- <?=gettext("Note:"); ?><br />
- </strong></span>
- <?=gettext("GIF tunnels are configured here."); ?>
- <br /><br />
- <?php echo gettext("If you are using a GIF tunnel to connect to a Hurricane Electric (he.net) Tunnel Broker on a WAN with a dynamic IP, you may want to add a"); ?> <a href="services_dyndns.php"><?php echo gettext("HE.net Tunnelbroker type DynDNS Entry"); ?></a> <?php echo gettext("to keep your tunnel functional when your IP changes."); ?></p>
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Interface"); ?></th>
+ <th><?=gettext("Tunnel to &hellip;"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php foreach ($a_gifs as $i => $gif): ?>
+ <tr>
+ <td>
+ <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($gif['if']))?>
+ </td>
+ <td>
+ <?=htmlspecialchars($gif['remote-addr'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($gif['descr'])?>
+ </td>
+ <td>
+ <a href="interfaces_gif_edit.php?id=<?=$i?>" class="btn btn-default btn-xs"><?=gettext("Edit")?></a>
+ <a href="interfaces_gif.php?act=del&amp;id=<?=$i?>" class="btn btn-danger btn-xs"><?=gettext("Delete")?></a>
+ </td>
+ </tr>
+<?php endforeach; ?>
+ </tbody>
+ </table>
+</div>
+
+<nav class="action-buttons">
+ <a href="interfaces_gif_edit.php" class="btn btn-success">
+ <?=gettext("Add")?>
+ </a>
+</nav>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/interfaces_gif_edit.php b/src/usr/local/www/interfaces_gif_edit.php
index 2870c79..7600717 100644
--- a/src/usr/local/www/interfaces_gif_edit.php
+++ b/src/usr/local/www/interfaces_gif_edit.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -41,15 +41,8 @@
require("guiconfig.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_gif.php');
-}
-
-if (!is_array($config['gifs']['gif'])) {
+if (!is_array($config['gifs']['gif']))
$config['gifs']['gif'] = array();
-}
$a_gifs = &$config['gifs']['gif'];
@@ -76,7 +69,6 @@ if (isset($id) && $a_gifs[$id]) {
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -121,23 +113,22 @@ if ($_POST) {
$gif['link1'] = isset($_POST['link1']);
$gif['link0'] = isset($_POST['link0']);
$gif['gifif'] = $_POST['gifif'];
-
$gif['gifif'] = interface_gif_configure($gif);
- if ($gif['gifif'] == "" || !stristr($gif['gifif'], "gif")) {
+
+ if ($gif['gifif'] == "" || !stristr($gif['gifif'], "gif"))
$input_errors[] = gettext("Error occurred creating interface, please retry.");
- } else {
- if (isset($id) && $a_gifs[$id]) {
+ else {
+ if (isset($id) && $a_gifs[$id])
$a_gifs[$id] = $gif;
- } else {
+ else
$a_gifs[] = $gif;
- }
write_config();
$confif = convert_real_interface_to_friendly_interface_name($gif['gifif']);
- if ($confif <> "") {
+
+ if ($confif != "")
interface_configure($confif);
- }
header("Location: interfaces_gif.php");
exit;
@@ -145,128 +136,94 @@ if ($_POST) {
}
}
-$pgtitle = array(gettext("Interfaces"), gettext("GIF"), gettext("Edit"));
+function build_parent_list() {
+ $parentlist = array();
+ $portlist = get_possible_listen_ips();
+ foreach ($portlist as $ifn => $ifinfo)
+ $parentlist[$ifn] = $ifinfo;
+
+ return($parentlist);
+}
+
+$pgtitle = array(gettext("Interfaces"),gettext("GIF"),gettext("Edit"));
$shortcut_section = "interfaces";
include("head.inc");
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('GIF Configuration');
+
+$section->addInput(new Form_Select(
+ 'if',
+ 'Parent Interface',
+ $pconfig['if'],
+ build_parent_list()
+))->setHelp('This interface serves as the local address to be used for the GIF tunnel.');
+
+$section->addInput(new Form_IpAddress(
+ 'remote-addr',
+ 'GIF Remote Address',
+ $pconfig['remote-addr']
+))->setHelp('Peer address where encapsulated gif packets will be sent.');
+
+$section->addInput(new Form_IpAddress(
+ 'tunnel-local-addr',
+ 'GIF tunnel local address',
+ $pconfig['tunnel-local-addr']
+))->setHelp('Local gif tunnel endpoint.');
+
+$section->addInput(new Form_IpAddress(
+ 'tunnel-remote-addr',
+ 'GIF tunnel remote address',
+ $pconfig['tunnel-remote-addr']
+))->setHelp('Remote GIF address endpoint.');
+
+$section->addInput(new Form_Select(
+ 'tunnel-remote-net',
+ 'GIF tunnel remote subnet',
+ $pconfig['tunnel-remote-net'],
+ array_combine(range(128, 1, -1), range(128, 1, -1))
+))->setHelp('The subnet is used for determining the network that is tunnelled');
+
+$section->addInput(new Form_Checkbox(
+ 'link0',
+ 'Route Caching',
+ 'Specify if route caching can be enabled. (Be careful with these settings on dynamic networks.)',
+ $pconfig['link0']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'link1',
+ 'ECN friendly behavior',
+ 'ECN friendly behavior violates RFC2893. This should be used in mutual agreement with the peer. ',
+ $pconfig['link1']
+));
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$section->addInput(new Form_Input(
+ 'gifif',
+ null,
+ 'hidden',
+ $pconfig['gifif']
+));
+
+if (isset($id) && $a_gifs[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+print($form);
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="interfaces_gif_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces gif edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("GIF configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface"); ?></td>
- <td width="78%" class="vtable">
- <select name="if" class="formselect">
- <?php
- $portlist = get_possible_listen_ips();
- foreach ($portlist as $ifn => $ifinfo) {
- echo "<option value=\"{$ifn}\"";
- if ($ifn == $pconfig['if']) {
- echo " selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($ifinfo) . "</option>\n";
- }
- ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("The interface here serves as the local address to be used for the gif tunnel."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("gif remote address"); ?></td>
- <td class="vtable">
- <input name="remote-addr" type="text" class="formfld unknown" id="remote-addr" size="24" value="<?=htmlspecialchars($pconfig['remote-addr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Peer address where encapsulated gif packets will be sent. "); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("gif tunnel local address"); ?></td>
- <td class="vtable">
- <input name="tunnel-local-addr" type="text" class="formfld unknown" id="tunnel-local-addr" size="24" value="<?=htmlspecialchars($pconfig['tunnel-local-addr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Local gif tunnel endpoint"); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("gif tunnel remote address "); ?></td>
- <td class="vtable">
- <input name="tunnel-remote-addr" type="text" class="formfld unknown ipv4v6" id="tunnel-remote-addr" size="24" value="<?=htmlspecialchars($pconfig['tunnel-remote-addr']);?>" />
- <select name="tunnel-remote-net" class="formselect ipv4v6" id="tunnel-remote-net">
- <?php
- for ($i = 128; $i > 0; $i--) {
- echo "<option value=\"{$i}\"";
- if ($i == $pconfig['tunnel-remote-net']) {
- echo " selected=\"selected\"";
- }
- echo ">" . $i . "</option>";
- }
- ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Remote gif address endpoint. The subnet part is used for determining the network that is tunnelled."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Route caching "); ?></td>
- <td class="vtable">
- <input name="link0" type="checkbox" id="link0" <?if ($pconfig['link0']) echo "checked=\"checked\"";?> />
- <br />
- <span class="vexpl">
- <?=gettext("Specify if route caching can be enabled. Be careful with these settings on dynamic networks. "); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("ECN friendly behavior"); ?></td>
- <td class="vtable">
- <input name="link1" type="checkbox" id="link1" <?if ($pconfig['link1']) echo "checked=\"checked\"";?> />
- <br />
- <span class="vexpl">
- <?=gettext("Note that the ECN friendly behavior violates RFC2893. This should be " .
- "used in mutual agreement with the peer."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed)."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="gifif" value="<?=htmlspecialchars($pconfig['gifif']); ?>" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_gifs[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc");
diff --git a/src/usr/local/www/interfaces_gre.php b/src/usr/local/www/interfaces_gre.php
index 3431987..7d77c66 100644
--- a/src/usr/local/www/interfaces_gre.php
+++ b/src/usr/local/www/interfaces_gre.php
@@ -30,7 +30,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /sbin/ifconfig
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -84,75 +84,62 @@ if ($_GET['act'] == "del") {
$pgtitle = array(gettext("Interfaces"), gettext("GRE"));
$shortcut_section = "interfaces";
include("head.inc");
-
+if ($input_errors)
+ print_input_errors($input_errors);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+$tab_array[] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+$tab_array[] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+$tab_array[] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+$tab_array[] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+$tab_array[] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+$tab_array[] = array(gettext("GRE"), true, "interfaces_gre.php");
+$tab_array[] = array(gettext("GIF"), false, "interfaces_gif.php");
+$tab_array[] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+$tab_array[] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+display_top_tabs($tab_array);
?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces gre">
- <tr><td>
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Interface"); ?></th>
+ <th><?=gettext("Tunnel to &hellip;"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php foreach ($a_gres as $i => $gre): ?>
+ <tr>
+ <td>
+ <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($gre['if']))?>
+ </td>
+ <td>
+ <?=htmlspecialchars($gre['remote-addr'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($gre['descr'])?>
+ </td>
+ <td>
+ <a href="interfaces_gre_edit.php?id=<?=$i?>" class="btn btn-default btn-xs">
+ <?=gettext("Edit")?>
+ </a>
+ <a href="interfaces_gre.php?act=del&amp;id=<?=$i?>" class="btn btn-danger btn-xs">
+ <?=gettext("Delete")?>
+ </a>
+ </td>
+ </tr>
+<?php endforeach; ?>
+ </tbody>
+ </table>
+</div>
+
+<nav class="action-buttons">
+ <a href="interfaces_gre_edit.php" class="btn btn-success">
+ <?=gettext("Add")?>
+ </a>
+</nav>
<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
- $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
- $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
- $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
- $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
- $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
- $tab_array[6] = array(gettext("GRE"), true, "interfaces_gre.php");
- $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
- $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
- $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
- display_top_tabs($tab_array);
-?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Interface");?></td>
- <td width="20%" class="listhdrr"><?=gettext("Tunnel to...");?></td>
- <td width="50%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list"></td>
- </tr>
- <?php
- $i = 0;
- foreach ($a_gres as $gre):
- ?>
- <tr ondblclick="document.location='interfaces_gre_edit.php?id=<?=$i;?>'">
- <td class="listlr">
- <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($gre['if']));?>
- </td>
- <td class="listr">
- <?=htmlspecialchars($gre['remote-addr']);?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($gre['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap"> <a href="interfaces_gre_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;<a href="interfaces_gre.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this GRE tunnel?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
- <?php
- $i++;
- endforeach;
- ?>
- <tr>
- <td class="list" colspan="3">&nbsp;</td>
- <td class="list"> <a href="interfaces_gre_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- <tr>
- <td class="tabcont" colspan="3">
- <p><span class="vexpl"><span class="red"><strong><?=gettext("Note:");?><br /></strong></span><?=gettext("Here you can configure Generic Routing Encapsulation (GRE - RFC 2784) tunnels.");?></span></p>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/interfaces_gre_edit.php b/src/usr/local/www/interfaces_gre_edit.php
index a6cde04..8a6497b 100644
--- a/src/usr/local/www/interfaces_gre_edit.php
+++ b/src/usr/local/www/interfaces_gre_edit.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -42,15 +42,8 @@
require("guiconfig.inc");
require_once("functions.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_gre.php');
-}
-
-if (!is_array($config['gres']['gre'])) {
+if (!is_array($config['gres']['gre']))
$config['gres']['gre'] = array();
-}
$a_gres = &$config['gres']['gre'];
@@ -128,9 +121,9 @@ if ($_POST) {
write_config();
$confif = convert_real_interface_to_friendly_interface_name($gre['greif']);
- if ($confif <> "") {
+
+ if ($confif != "")
interface_configure($confif);
- }
header("Location: interfaces_gre.php");
exit;
@@ -138,125 +131,101 @@ if ($_POST) {
}
}
-$pgtitle = array(gettext("Interfaces"), gettext("GRE"), gettext("Edit"));
+function build_parent_list() {
+ $parentlist = array();
+ $portlist = get_possible_listen_ips();
+ foreach ($portlist as $ifn => $ifinfo)
+ $parentlist[$ifn] = $ifinfo;
+
+ return($parentlist);
+}
+
+$pgtitle = array(gettext("Interfaces"),gettext("GRE"),gettext("Edit"));
$shortcut_section = "interfaces";
include("head.inc");
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('GRE Configuration');
+
+$section->addInput(new Form_Select(
+ 'if',
+ 'Parent Interface',
+ $pconfig['if'],
+ build_parent_list()
+))->setHelp('This interface serves as the local address to be used for the GRE tunnel.');
+
+$section->addInput(new Form_IpAddress(
+ 'remote-addr',
+ 'GRE Remote Address',
+ $pconfig['remote-addr']
+))->setHelp('Peer address where encapsulated GRE packets will be sent.');
+
+$section->addInput(new Form_IpAddress(
+ 'tunnel-local-addr',
+ 'GRE tunnel local address',
+ $pconfig['tunnel-local-addr']
+))->setHelp('Local GRE tunnel endpoint.');
+
+$section->addInput(new Form_IpAddress(
+ 'tunnel-remote-addr',
+ 'GRE tunnel remote address',
+ $pconfig['tunnel-remote-addr']
+))->setHelp('Remote GRE address endpoint.');
+
+$section->addInput(new Form_Select(
+ 'tunnel-remote-net',
+ 'GRE tunnel remote subnet',
+ $pconfig['tunnel-remote-net'],
+ array_combine(range(128, 1, -1), range(128, 1, -1))
+))->setHelp('The subnet is used for determining the network that is tunnelled');
+
+$section->addInput(new Form_Checkbox(
+ 'link0',
+ 'Route Caching',
+ 'Specify if route caching can be enabled. (Be careful with these settings on dynamic networks.)',
+ $pconfig['link0']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'link1',
+ 'ECN friendly behavior',
+ 'ECN friendly behavior violates RFC2893. This should be used in mutual agreement with the peer. ',
+ $pconfig['link1']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'link2',
+ 'WCCP Version',
+ 'Check this box for WCCP encapsulation version 2, or leave unchecked for version 1.',
+ $pconfig['link2']
+));
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$section->addInput(new Form_Input(
+ 'greif',
+ null,
+ 'hidden',
+ $pconfig['greif']
+));
+
+if (isset($id) && $a_gres[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+print($form);
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="interfaces_gre_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces gre edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("GRE configuration");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface");?></td>
- <td width="78%" class="vtable">
- <select name="if" class="formselect">
- <?php
- $portlist = get_possible_listen_ips();
- foreach ($portlist as $ifn => $ifinfo) {
- echo "<option value=\"{$ifn}\"";
- if ($ifn == $pconfig['if']) {
- echo " selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($ifinfo) . "</option>\n";
- }
- ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("The interface here serves as the local address to be used for the GRE tunnel.");?></span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Remote tunnel endpoint IP address");?></td>
- <td class="vtable">
- <input name="remote-addr" type="text" class="formfld unknown" id="remote-addr" size="16" value="<?=htmlspecialchars($pconfig['remote-addr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Peer address where encapsulated GRE packets will be sent ");?></span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Local tunnel IP address ");?></td>
- <td class="vtable">
- <input name="tunnel-local-addr" type="text" class="formfld unknown" id="tunnel-local-addr" size="16" value="<?=htmlspecialchars($pconfig['tunnel-local-addr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Local IP address assigned inside this tunnel");?></span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Remote tunnel IP address ");?></td>
- <td class="vtable">
- <input name="tunnel-remote-addr" type="text" class="formfld unknown ipv4v6" id="tunnel-remote-addr" size="16" value="<?=htmlspecialchars($pconfig['tunnel-remote-addr']);?>" />
- <select name="tunnel-remote-net" class="formselect ipv4v6" id="tunnel-remote-net">
- <?php
- for ($i = 128; $i > 0; $i--) {
- echo "<option value=\"{$i}\"";
- if ($i == $pconfig['tunnel-remote-net']) {
- echo " selected=\"selected\"";
- }
- echo ">" . $i . "</option>";
- }
- ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("IP address inside this tunnel on the remote end. The subnet part is used for the determining the network that is tunneled.");?></span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Mobile encapsulation");?></td>
- <td class="vtable">
- <input name="link0" type="checkbox" id="link0" <?if ($pconfig['link0']) echo "checked=\"checked\"";?> />
- <br />
- <span class="vexpl"><?=gettext("Check this box to use mobile encapsulation (IP protocol 55, RFC 2004). When unchecked, uses GRE encapsulation (IP protocol 47, RFCs 1701, 1702).");?></span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Route search type");?></td>
- <td class="vtable">
- <input name="link1" type="checkbox" id="link1" <?if ($pconfig['link1']) echo "checked=\"checked\"";?> />
- <br />
- <span class="vexpl">
- <?=gettext("For correct operation, the GRE device needs a route to the destination".
- " that is less specific than the one over the tunnel. (Basically, there".
- " needs to be a route to the decapsulating host that does not run over the".
- " tunnel, as this would be a loop.");?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("WCCP version");?></td>
- <td class="vtable">
- <input name="link2" type="checkbox" id="link2" <?if ($pconfig['link2']) echo "checked=\"checked\"";?> />
- <br />
- <span class="vexpl"><?=gettext("Check this box for WCCP encapsulation version 2, or leave unchecked for version 1.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br /> <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="greif" value="<?=htmlspecialchars($pconfig['greif']); ?>" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_gres[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/interfaces_groups.php b/src/usr/local/www/interfaces_groups.php
index 6342bcf..a6a2c32 100644
--- a/src/usr/local/www/interfaces_groups.php
+++ b/src/usr/local/www/interfaces_groups.php
@@ -30,7 +30,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /sbin/ifconfig
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -67,105 +67,80 @@ if ($_GET['act'] == "del") {
$pgtitle = array(gettext("Interfaces"), gettext("Groups"));
$shortcut_section = "interfaces";
-include("head.inc");
-?>
+include("head.inc");
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
+$tab_array = array();
+$tab_array[] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+$tab_array[] = array(gettext("Interface Groups"), true, "interfaces_groups.php");
+$tab_array[] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+$tab_array[] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+$tab_array[] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+$tab_array[] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+$tab_array[] = array(gettext("GRE"), false, "interfaces_gre.php");
+$tab_array[] = array(gettext("GIF"), false, "interfaces_gif.php");
+$tab_array[] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+$tab_array[] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+display_top_tabs($tab_array);
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces groups">
- <tr><td>
-<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
- $tab_array[1] = array(gettext("Interface Groups"), true, "interfaces_groups.php");
- $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
- $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
- $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
- $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
- $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
- $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
- $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
- $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
- display_top_tabs($tab_array);
+print_info_box(gettext('Interface Groups allow you to setup rules for multiple interfaces without duplicating the rules.<br />' .
+ 'If you remove members from an interface group, the group rules are no longer applicable to that interface.'));
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="15%" class="listhdrr"><?=gettext("Name");?></td>
- <td width="35%" class="listhdrr"><?=gettext("Members");?></td>
- <td width="25%" class="listhdr"><?=gettext("Description");?></td>
- <td width="5%" class="list"></td>
- </tr>
-<?php
- if (count ($a_ifgroups)):
- $i = 0;
- foreach ($a_ifgroups as $ifgroupentry):
-?>
- <tr>
- <td class="listlr" ondblclick="document.location='interfaces_groups_edit.php?id=<?=$i;?>';">
- <a href="/firewall_rules.php?if=<?=htmlspecialchars($ifgroupentry['ifname']);?>"><?=htmlspecialchars($ifgroupentry['ifname']);?></a>
- </td>
- <td class="listr" ondblclick="document.location='interfaces_groups_edit.php?id=<?=$i;?>';">
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext('Name');?></th>
+ <th><?=gettext('Members');?></th>
+ <th><?=gettext('Description');?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php foreach ($a_ifgroups as $i => $ifgroupentry): ?>
+ <tr>
+ <td>
+ <?=htmlspecialchars($ifgroupentry['ifname']); ?>
+ </td>
+ <td>
<?php
- $members_arr = explode(" ", $ifgroupentry['members']);
- $iflist = get_configured_interface_with_descr(false, true);
- $memberses_arr = array();
- foreach ($members_arr as $memb) {
- $memberses_arr[] = $iflist[$memb] ? $iflist[$memb] : $memb;
- }
- unset($iflist);
- $memberses = implode(", ", $memberses_arr);
- echo $memberses;
- if (count($members_arr) < 10) {
- echo " ";
- } else {
- echo "...";
- }
+ $members_arr = explode(" ", $ifgroupentry['members']);
+ $iflist = get_configured_interface_with_descr(false, true);
+ $memberses_arr = array();
+ foreach ($members_arr as $memb)
+ $memberses_arr[] = $iflist[$memb] ? $iflist[$memb] : $memb;
+
+ unset($iflist);
+ $memberses = implode(", ", $memberses_arr);
+ echo $memberses;
+ if(count($members_arr) >= 10) {
+ echo '&hellip;';
+ }
?>
- </td>
- <td class="listbg" ondblclick="document.location='interfaces_groups_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($ifgroupentry['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
- <tr>
- <td valign="middle"><a href="interfaces_groups_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit group");?>" alt="edit" /></a></td>
- <td><a href="interfaces_groups.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this group? All elements that still use it will become invalid (e.g. filter rules)!");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete ifgroupentry");?>" alt="delete" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
+ </td>
+ <td>
+ <?=htmlspecialchars($ifgroupentry['descr']);?>
+ </td>
+ <td>
+ <a class="btn btn-default btn-sm" role="button" href="interfaces_groups_edit.php?id=<?=$i; ?>">
+ <?=gettext('Edit'); ?>
+ </a>
+ <a class="btn btn-danger btn-sm" role="button" href="interfaces_groups.php?act=del&amp;id=<?=$i; ?>">
+ <?=gettext("Delete"); ?>
+ </a>
+ </td>
+ </tr>
+<?php endforeach; ?>
+ </tbody>
+ </table>
+</div>
+
+<nav class="action-buttons">
+ <a class="btn btn-success btn-sm" href="interfaces_groups_edit.php" role="button">
+ <?=gettext("Add Group");?>
+ </a>
+</nav>
+
<?php
- $i++;
- endforeach;
- endif;
-?>
- <tr>
- <td class="list" colspan="3"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td valign="middle" width="17">&nbsp;</td>
- <td valign="middle"><a href="interfaces_groups_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new group");?>" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td class="tabcont" colspan="3">
- <p><span class="vexpl"><span class="red"><strong><?=gettext("Note:");?><br /></strong></span><?=gettext("Interface Groups allow you to create rules that apply to multiple interfaces without duplicating the rules. If you remove members from an interface group, the group rules no longer apply to that interface.");?></span></p>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+include("fend.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/interfaces_groups_edit.php b/src/usr/local/www/interfaces_groups_edit.php
index 22b8567..8e7b6da 100644
--- a/src/usr/local/www/interfaces_groups_edit.php
+++ b/src/usr/local/www/interfaces_groups_edit.php
@@ -66,11 +66,10 @@ if (isset($id) && $a_ifgroups[$id]) {
$pconfig['descr'] = html_entity_decode($a_ifgroups[$id]['descr']);
}
-$iflist = get_configured_interface_with_descr();
-$iflist_disabled = get_configured_interface_with_descr(false, true);
+$interface_list = get_configured_interface_with_descr();
+$interface_list_disabled = get_configured_interface_with_descr(false, true);
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -103,11 +102,14 @@ if ($_POST) {
}
}
+ $members = isset($_POST['members']) ? join(' ', $_POST['members']) : "";
+
if (!$input_errors) {
$ifgroupentry = array();
$ifgroupentry['members'] = $members;
$ifgroupentry['descr'] = $_POST['descr'];
+ // Edit group name
if (isset($id) && $a_ifgroups[$id] && $_POST['ifname'] != $a_ifgroups[$id]['ifname']) {
if (!empty($config['filter']) && is_array($config['filter']['rule'])) {
foreach ($config['filter']['rule'] as $ridx => $rule) {
@@ -148,6 +150,8 @@ if ($_POST) {
}
$ifgroupentry['ifname'] = $_POST['ifname'];
$a_ifgroups[$id] = $ifgroupentry;
+
+ // Edit old group
} else if (isset($id) && $a_ifgroups[$id]) {
$omembers = explode(" ", $a_ifgroups[$id]['members']);
$nmembers = explode(" ", $members);
@@ -162,13 +166,14 @@ if ($_POST) {
}
$ifgroupentry['ifname'] = $_POST['ifname'];
$a_ifgroups[$id] = $ifgroupentry;
+
+ // Create new group
} else {
$ifgroupentry['ifname'] = $_POST['ifname'];
$a_ifgroups[] = $ifgroupentry;
}
write_config();
-
interface_group_setup($ifgroupentry);
header("Location: interfaces_groups.php");
@@ -181,198 +186,72 @@ if ($_POST) {
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-
-<script type="text/javascript">
-//<![CDATA[
-// Global Variables
-var rowname = new Array(9999);
-var rowtype = new Array(9999);
-var newrow = new Array(9999);
-var rowsize = new Array(9999);
-
-for (i = 0; i < 9999; i++) {
- rowname[i] = '';
- rowtype[i] = 'select';
- newrow[i] = '';
- rowsize[i] = '30';
-}
-
-var field_counter_js = 0;
-var loaded = 0;
-var is_streaming_progress_bar = 0;
-var temp_streaming_text = "";
-
-var addRowTo = (function() {
- return (function (tableId) {
- var d, tbody, tr, td, bgc, i, ii, j;
- d = document;
- tbody = d.getElementById(tableId).getElementsByTagName("tbody").item(0);
- tr = d.createElement("tr");
- for (i = 0; i < field_counter_js; i++) {
- td = d.createElement("td");
- <?php
- $innerHTML="\"<input type='hidden' value='\" + totalrows +\"' name='\" + rowname[i] + \"_row-\" + totalrows + \"' /><select size='1' name='\" + rowname[i] + totalrows + \"'>\" +\"";
-
- foreach ($iflist as $ifnam => $ifdescr) {
- $innerHTML .= "<option value='{$ifnam}'>{$ifdescr}<\/option>";
- }
- $innerHTML .= "<\/select>\";";
- ?>
- td.innerHTML=<?=$innerHTML;?>
- tr.appendChild(td);
- }
- td = d.createElement("td");
- td.rowSpan = "1";
-
- td.innerHTML = '<a onclick="removeRow(this);return false;" href="#"><img border="0" src="/themes/' + theme + '/images/icons/icon_x.gif" alt="remove" /><\/a>';
- tr.appendChild(td);
- tbody.appendChild(tr);
- totalrows++;
- });
-})();
-
-function removeRow(el) {
- var cel;
- while (el && el.nodeName.toLowerCase() != "tr") {
- el = el.parentNode;
- }
-
- if (el && el.parentNode) {
- cel = el.getElementsByTagName("td").item(0);
- el.parentNode.removeChild(el);
- }
+if ($input_errors) {
+ print_input_errors($input_errors);
}
- rowname[0] = "members";
- rowtype[0] = "textbox";
- rowsize[0] = "30";
-
- rowname[2] = "detail";
- rowtype[2] = "textbox";
- rowsize[2] = "50";
-//]]>
-</script>
-<input type='hidden' name='members_type' value='textbox' class="formfld unknown" />
-
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<div id="inputerrors"></div>
-
-<form action="interfaces_groups_edit.php" method="post" name="iform" id="iform">
-<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces groups edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Interface Groups Edit");?></td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Group Name");?></td>
- <td class="vtable">
- <input class="formfld unknown" name="ifname" id="ifname" maxlength="15" value="<?=htmlspecialchars($pconfig['ifname']);?>" />
- <br />
- <?=gettext("No numbers or spaces are allowed. Only characters in a-zA-Z");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed).");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><div id="membersnetworkport"><?=gettext("Member (s)");?></div></td>
- <td width="78%" class="vtable">
- <table id="maintable" summary="main table">
- <tbody>
- <tr>
- <td>
- <div id="onecolumn"><?=gettext("Interface");?></div>
- </td>
- </tr>
-<?php
- $counter = 0;
- $members = $pconfig['members'];
- if ($members <> "") {
- $item = explode(" ", $members);
- foreach ($item as $ww) {
- $members = $item[$counter];
- $tracker = $counter;
?>
- <tr>
- <td class="vtable">
- <select name="members<?php echo $tracker; ?>" class="formselect" id="members<?php echo $tracker; ?>">
+<div id="inputerrors"></div>
<?php
- $found = false;
- foreach ($iflist as $ifnam => $ifdescr) {
- echo "<option value=\"{$ifnam}\"";
- if ($ifnam == $members) {
- $found = true;
- echo " selected=\"selected\"";
- }
- echo ">{$ifdescr}</option>";
- }
+$tab_array = array();
+$tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+$tab_array[1] = array(gettext("Interface Groups"), true, "interfaces_groups.php");
+$tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+$tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+$tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+$tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+$tab_array[7] = array(gettext("GRE"), false, "interfaces_gre.php");
+$tab_array[8] = array(gettext("GIF"), false, "interfaces_gif.php");
+$tab_array[9] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+$tab_array[10] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+$form = new Form;
+$section = new Form_Section('Interface Group Edit');
+
+$section->addInput(new Form_Input(
+ 'ifname',
+ 'Group Name',
+ 'text',
+ $pconfig['ifname'],
+ ['placeholder' => 'Group Name']
+))->setWidth(6)->setHelp('No numbers or spaces are allowed. '.
+ 'Only characters in a-zA-Z');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Group Description',
+ 'text',
+ $pconfig['descr'],
+ ['placeholder' => 'Group Description']
+))->setWidth(6)->setHelp('You may enter a group decsription '.
+ 'here for your reference (not parsed)');
+
+$section->addInput(new Form_Select(
+ 'members[]',
+ 'Group Members',
+ explode(' ', $pconfig['members']),
+ $interface_list,
+ true
+))->setWidth(6)->setHelp('NOTE: Rules for WAN type '.
+ 'interfaces in groups do not contain the reply-to mechanism upon which '.
+ 'Multi-WAN typically relies. '.
+ '<a href="https://doc.pfsense.org/index.php/ifgroups">More Information</a>');
- if ($found === false) {
- foreach ($iflist_disabled as $ifnam => $ifdescr) {
- if ($ifnam == $members) {
- echo "<option value=\"{$ifnam}\" selected=\"selected\">{$ifdescr}</option>";
- }
- }
- }
-?>
- </select>
- </td>
- <td>
- <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="remove" /></a>
- </td>
- </tr>
-<?php
- $counter++;
- } // end foreach
- } // end if
-?>
- </tbody>
- </table>
- <a onclick="javascript:addRowTo('maintable'); return false;" href="#">
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
- </a>
- <br /><br />
- <strong><?php echo gettext("NOTE:");?></strong>
- <?php echo gettext("Rules for WAN type interfaces in groups do not contain the reply-to mechanism upon which Multi-WAN typically relies.");?>
- <a href="https://doc.pfsense.org/index.php/Interface_Groups"><?PHP echo gettext("More Information");?></a>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <a href="interfaces_groups.php"><input id="cancelbutton" name="cancelbutton" type="button" class="formbtn" value="<?=gettext("Cancel");?>" /></a>
- <?php if (isset($id) && $a_ifgroups[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
-</table>
-</form>
-
-<script type="text/javascript">
-//<![CDATA[
- field_counter_js = 1;
- rows = 1;
- totalrows = <?php echo $counter; ?>;
- loaded = <?php echo $counter; ?>;
-//]]>
-</script>
+if (isset($id) && $a_ifgroups[$id]) {
+ $form->addGlobal(new Form_Input(
+ 'id',
+ 'id',
+ 'hidden',
+ $id
+ ));
+}
-<?php
- unset($iflist);
- unset($iflist_disabled);
- include("fend.inc");
+$form->add($section);
+print $form;
+
+unset($interface_list);
+unset($interface_list_disabled);
+include("fend.inc");
?>
-</body>
-</html>
diff --git a/src/usr/local/www/interfaces_lagg.php b/src/usr/local/www/interfaces_lagg.php
index 32b2a21..6724e1e 100644
--- a/src/usr/local/www/interfaces_lagg.php
+++ b/src/usr/local/www/interfaces_lagg.php
@@ -30,7 +30,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /sbin/ifconfig
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -91,79 +91,64 @@ $pgtitle = array(gettext("Interfaces"), gettext("LAGG"));
$shortcut_section = "interfaces";
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+$tab_array[] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+$tab_array[] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+$tab_array[] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+$tab_array[] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+$tab_array[] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+$tab_array[] = array(gettext("GRE"), false, "interfaces_gre.php");
+$tab_array[] = array(gettext("GIF"), false, "interfaces_gif.php");
+$tab_array[] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+$tab_array[] = array(gettext("LAGG"), true, "interfaces_lagg.php");
+display_top_tabs($tab_array);
?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces lagg">
- <tr><td>
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Interface"); ?></th>
+ <th><?=gettext("Members"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
- $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
- $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
- $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
- $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
- $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
- $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
- $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
- $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
- $tab_array[9] = array(gettext("LAGG"), true, "interfaces_lagg.php");
- display_top_tabs($tab_array);
+
+$i = 0;
+
+foreach ($a_laggs as $lagg) {
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Interface"); ?></td>
- <td width="20%" class="listhdrr"><?=gettext("Members"); ?></td>
- <td width="50%" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="10%" class="list"></td>
- </tr>
+ <tr>
+ <td>
+ <?=htmlspecialchars(strtoupper($lagg['laggif']))?>
+ </td>
+ <td>
+ <?=htmlspecialchars($lagg['members'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($lagg['descr'])?>
+ </td>
+ <td>
+ <a href="interfaces_lagg_edit.php?id=<?=$i?>" class="btn btn-default btn-xs"><?=gettext("Edit")?></a>
+ <a href="interfaces_lagg.php?act=del&amp;id=<?=$i?>" class="btn btn-danger btn-xs"><?=gettext("Delete")?></a>
+ </td>
+ </tr>
<?php
- $i = 0;
- foreach ($a_laggs as $lagg):
+ $i++;
+}
?>
- <tr ondblclick="document.location='interfaces_lagg_edit.php?id=<?=$i;?>'">
- <td class="listlr">
- <?=htmlspecialchars(strtoupper($lagg['laggif']));?>
- </td>
- <td class="listr">
- <?=htmlspecialchars($lagg['members']);?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($lagg['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap"> <a href="interfaces_lagg_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;<a href="interfaces_lagg.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('Do you really want to delete this LAGG interface?')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a></td>
- </tr>
+ </tbody>
+ </table>
+
+ <nav class="action-buttons">
+ <a href="interfaces_lagg_edit.php" class="btn btn-success"><?=gettext("Add")?></a>
+ </nav>
+</div>
<?php
- $i++;
- endforeach;
-?>
- <tr>
- <td class="list" colspan="3">&nbsp;</td>
- <td class="list"> <a href="interfaces_lagg_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- <tr>
- <td colspan="3" class="list">
- <p class="vexpl">
- <span class="red"><strong>
- <?=gettext("Note:"); ?><br />
- </strong></span>
- <?=gettext("LAGG allows for link aggregation, bonding and fault tolerance. Only unassigned interfaces can be added to LAGG."); ?>
- </p>
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc");
diff --git a/src/usr/local/www/interfaces_lagg_edit.php b/src/usr/local/www/interfaces_lagg_edit.php
index d548160..3a03172 100644
--- a/src/usr/local/www/interfaces_lagg_edit.php
+++ b/src/usr/local/www/interfaces_lagg_edit.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -41,19 +41,65 @@
require("guiconfig.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_lagg.php');
-}
-
-if (!is_array($config['laggs']['lagg'])) {
+if (!is_array($config['laggs']['lagg']))
$config['laggs']['lagg'] = array();
-}
$a_laggs = &$config['laggs']['lagg'];
$portlist = get_interface_list();
+$laggprotos = array("none", "lacp", "failover", "fec", "loadbalance", "roundrobin");
+$laggprotosuc = array("NONE", "LACP", "FAILOVER", "FEC", "LOADBALANCE", "ROUNDROBIN");
+
+$protohelp =
+'<ul>' .
+ '<li>' .
+ '<strong>' . gettext($laggprotos[0]) . '</strong><br />' .
+ gettext('This protocol is intended to do nothing: it disables any ' .
+ 'traffic without disabling the lagg interface itself') .
+ '</li>' .
+ '<li>' .
+ '<strong>' . gettext($laggprotos[1]) . '</strong><br />' .
+ gettext('Supports the IEEE 802.3ad Link Aggregation Control Protocol ' .
+ '(LACP) and the Marker Protocol. LACP will negotiate a set ' .
+ 'of aggregable links with the peer in to one or more Link ' .
+ 'Aggregated Groups. Each LAG is composed of ports of the ' .
+ 'same speed, set to full-duplex operation. The traffic will ' .
+ 'be balanced across the ports in the LAG with the greatest ' .
+ 'total speed, in most cases there will only be one LAG which ' .
+ 'contains all ports. In the event of changes in physical ' .
+ 'connectivity, Link Aggregation will quickly converge to a ' .
+ 'new configuration.') .
+ '</li>' .
+ '<li>' .
+ '<strong>' . gettext($laggprotos[2]) . '</strong><br />' .
+ gettext('Sends and receives traffic only through the master port. If ' .
+ 'the master port becomes unavailable, the next active port is ' .
+ 'used. The first interface added is the master port; any ' .
+ 'interfaces added after that are used as failover devices.') .
+ '</li>' .
+ '<li>' .
+ '<strong>' . gettext($laggprotos[3]) . '</strong><br />' .
+ gettext('Supports Cisco EtherChannel. This is a static setup and ' .
+ 'does not negotiate aggregation with the peer or exchange ' .
+ 'frames to monitor the link.') .
+ '</li>' .
+ '<li>' .
+ '<strong>' . gettext($laggprotos[4]) . '</strong><br />' .
+ gettext('Balances outgoing traffic across the active ports based on ' .
+ 'hashed protocol header information and accepts incoming ' .
+ 'traffic from any active port. This is a static setup and ' .
+ 'does not negotiate aggregation with the peer or exchange ' .
+ 'frames to monitor the link. The hash includes the Ethernet ' .
+ 'source and destination address, and, if available, the VLAN ' .
+ 'tag, and the IP source and destination address') .
+ '</li>' .
+ '<li>' .
+ '<strong>' . gettext($laggprotos[5]) . '</strong><br />' .
+ gettext('Distributes outgoing traffic using a round-robin scheduler ' .
+ 'through all active ports and accepts incoming traffic from ' .
+ 'any active port') .
+ '</li>' .
+'</ul>';
$realifchecklist = array();
/* add LAGG interfaces */
@@ -68,15 +114,15 @@ if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
}
$checklist = get_configured_interface_list(false, true);
+
foreach ($checklist as $tmpif) {
$realifchecklist[get_real_interface($tmpif)] = $tmpif;
}
-$laggprotos = array("none", "lacp", "failover", "fec", "loadbalance", "roundrobin");
-
if (is_numericint($_GET['id'])) {
$id = $_GET['id'];
}
+
if (isset($_POST['id']) && is_numericint($_POST['id'])) {
$id = $_POST['id'];
}
@@ -93,7 +139,6 @@ if (isset($id) && $a_laggs[$id]) {
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -140,9 +185,8 @@ if ($_POST) {
write_config();
$confif = convert_real_interface_to_friendly_interface_name($lagg['laggif']);
- if ($confif <> "") {
+ if ($confif != "")
interface_configure($confif);
- }
header("Location: interfaces_lagg.php");
exit;
@@ -150,129 +194,69 @@ if ($_POST) {
}
}
-$pgtitle = array(gettext("Interfaces"), gettext("LAGG"), gettext("Edit"));
+function build_member_list() {
+ global $pconfig, $portlist, $realifchecklist;
+
+ $memberlist = array('list' => array(),
+ 'selected' => array());
+
+ $members_array = explode(',', $pconfig['members']);
+ foreach ($portlist as $ifn => $ifinfo) {
+ if (array_key_exists($ifn, $realifchecklist))
+ continue;
+
+ $memberlist['list'][$ifn] = $ifn . '(' . $ifinfo['mac'] . ')';
+
+ if (stristr($pconfig['members'], $ifn))
+ array_push($memberlist['selected'], $ifn);
+ }
+
+ return($memberlist);
+}
+
+$pgtitle = array(gettext("Interfaces"),gettext("LAGG"),gettext("Edit"));
$shortcut_section = "interfaces";
include("head.inc");
+require('classes/Form.class.php');
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="interfaces_lagg_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces lagg edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("LAGG configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface"); ?></td>
- <td width="78%" class="vtable">
- <select name="members[]" multiple="multiple" size="4" class="formselect">
-<?php
- foreach ($portlist as $ifn => $ifinfo) {
- if (array_key_exists($ifn, $realifchecklist)) {
- continue;
- }
- echo "<option value=\"{$ifn}\"";
- if (stristr($pconfig['members'], $ifn)) {
- echo " selected=\"selected\"";
- }
- echo ">". $ifn ."(".$ifinfo['mac'] .")</option>";
- }
-?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Choose the members that will be used for the link aggregation"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Lag proto"); ?></td>
- <td class="vtable">
- <select name="proto" class="formselect" id="proto">
-<?php
- foreach ($laggprotos as $proto) {
- echo "<option value=\"{$proto}\"";
- if ($proto == $pconfig['proto']) {
- echo " selected=\"selected\"";
- }
- echo ">".strtoupper($proto)."</option>";
- }
-?>
- </select>
- <br />
- <ul class="vexpl">
- <li>
- <b><?=gettext("failover"); ?></b><br />
- <?=gettext("Sends and receives traffic only through the master port. If " .
- "the master port becomes unavailable, the next active port is " .
- "used. The first interface added is the master port; any " .
- "interfaces added after that are used as failover devices."); ?>
- </li>
- <li>
- <b><?=gettext("fec"); ?></b><br />
- <?=gettext("Supports Cisco EtherChannel. This is a static setup and " .
- "does not negotiate aggregation with the peer or exchange " .
- "frames to monitor the link."); ?>
- </li>
- <li>
- <b><?=gettext("lacp"); ?></b><br />
- <?=gettext("Supports the IEEE 802.3ad Link Aggregation Control Protocol " .
- "(LACP) and the Marker Protocol. LACP will negotiate a set " .
- "of aggregable links with the peer in to one or more Link " .
- "Aggregated Groups. Each LAG is composed of ports of the " .
- "same speed, set to full-duplex operation. The traffic will " .
- "be balanced across the ports in the LAG with the greatest " .
- "total speed, in most cases there will only be one LAG which " .
- "contains all ports. In the event of changes in physical " .
- "connectivity, Link Aggregation will quickly converge to a " .
- "new configuration."); ?>
- </li>
- <li>
- <b><?=gettext("loadbalance"); ?></b><br />
- <?=gettext("Balances outgoing traffic across the active ports based on " .
- "hashed protocol header information and accepts incoming " .
- "traffic from any active port. This is a static setup and " .
- "does not negotiate aggregation with the peer or exchange " .
- "frames to monitor the link. The hash includes the Ethernet " .
- "source and destination address, and, if available, the VLAN " .
- "tag, and the IP source and destination address") ?>.
- </li>
- <li>
- <b><?=gettext("roundrobin"); ?></b><br />
- <?=gettext("Distributes outgoing traffic using a round-robin scheduler " .
- "through all active ports and accepts incoming traffic from " .
- "any active port"); ?>.
- </li>
- <li>
- <b><?=gettext("none"); ?></b><br />
- <?=gettext("This protocol is intended to do nothing: it disables any " .
- "traffic without disabling the lagg interface itself"); ?>.
- </li>
- </ul>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="laggif" value="<?=htmlspecialchars($pconfig['laggif']); ?>" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_laggs[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+$form = new Form();
+
+$section = new Form_Section('LAGG Configuration');
+
+$memberslist = build_member_list();
+
+$section->addInput(new Form_Select(
+ 'members[]',
+ 'Parent Interfaces',
+ $memberslist['selected'],
+ $memberslist['list'],
+ true // Allow multiples
+))->setHelp('Choose the members that will be used for the link aggregation.');
+
+$section->addInput(new Form_Select(
+ 'proto',
+ 'LAGG Protocol',
+ $pconfig['proto'],
+ array_combine($laggprotos, $laggprotosuc)
+))->setHelp($protohelp);
+
+$section->addInput(new Form_Input(
+ 'laggif',
+ null,
+ 'hidden',
+ $pconfig['laggif']
+));
+
+if (isset($id) && $a_laggs[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/interfaces_ppps.php b/src/usr/local/www/interfaces_ppps.php
index 85b5181..966a6ca 100644
--- a/src/usr/local/www/interfaces_ppps.php
+++ b/src/usr/local/www/interfaces_ppps.php
@@ -31,7 +31,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /sbin/ifconfig
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -46,6 +46,7 @@ require_once("functions.inc");
function ppp_inuse($num) {
global $config, $g;
+
$iflist = get_configured_interface_list(false, true);
if (!is_array($config['ppps']['ppp'])) {
return false;
@@ -56,6 +57,7 @@ function ppp_inuse($num) {
return true;
}
}
+
return false;
}
@@ -79,81 +81,73 @@ if (!is_array($config['ppps']['ppp'])) {
}
$a_ppps = $config['ppps']['ppp'];
-$pgtitle = gettext("Interfaces: PPPs");
+$pgtitle = array(gettext("Interfaces"),gettext("PPPs"));
$shortcut_section = "interfaces";
include("head.inc");
+$tab_array = array();
+$tab_array[] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+$tab_array[] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+$tab_array[] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+$tab_array[] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+$tab_array[] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+$tab_array[] = array(gettext("PPPs"), true, "interfaces_ppps.php");
+$tab_array[] = array(gettext("GRE"), false, "interfaces_gre.php");
+$tab_array[] = array(gettext("GIF"), false, "interfaces_gif.php");
+$tab_array[] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+$tab_array[] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+display_top_tabs($tab_array);
?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces ppps">
- <tr><td>
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Interface"); ?></th>
+ <th><?=gettext("Interface(s)/Port(s)"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
- $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
- $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
- $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
- $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
- $tab_array[5] = array(gettext("PPPs"), true, "interfaces_ppps.php");
- $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
- $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
- $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
- $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
- display_top_tabs($tab_array);
+
+$i = 0;
+
+foreach ($a_ppps as $id => $ppp) {
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Interface");?></td>
- <td width="20%" class="listhdrr"><?=gettext("Interface(s)/Port(s)");?></td>
- <td width="40%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list"></td>
- </tr>
+ <tr>
+ <td>
+ <?=htmlspecialchars($ppp['if'])?>
+ </td>
+ <td>
<?php
- $i = 0;
- foreach ($a_ppps as $id => $ppp):
+ $portlist = explode(",", $ppp['ports']);
+ foreach ($portlist as $portid => $port) {
+ if ($port != get_real_interface($port) && $ppp['type'] != "ppp")
+ $portlist[$portid] = convert_friendly_interface_to_friendly_descr($port);
+ }
+ echo htmlspecialchars(implode(",", $portlist));
?>
- <tr ondblclick="document.location='interfaces_ppps_edit.php?id=<?=$i;?>'">
- <td class="listr">
- <?=htmlspecialchars($ppp['if']);?>
- </td>
- <td class="listr">
+ </td>
+ <td>
+ <?=htmlspecialchars($ppp['descr'])?>
+ </td>
+ <td>
+ <a href="interfaces_ppps_edit.php?id=<?=$i?>" class="btn btn-default btn-xs"><?=gettext("Edit")?></a>
+ <a href="interfaces_ppps.php?act=del&amp;id=<?=$i?>" class="btn btn-danger btn-xs"><?=gettext("Delete")?></a>
+ </td>
+ </tr>
<?php
- $portlist = explode(",", $ppp['ports']);
- foreach ($portlist as $portid => $port) {
- if ($port != get_real_interface($port) && $ppp['type'] != "ppp") {
- $portlist[$portid] = convert_friendly_interface_to_friendly_descr($port);
- }
- }
- echo htmlspecialchars(implode(",", $portlist));
+ $i++;
+}
?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($ppp['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap"> <a href="interfaces_ppps_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;<a href="interfaces_ppps.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this PPP interface?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="remove" /></a>
- </td>
- </tr>
+ </tbody>
+ </table>
+
+ <nav class="action-buttons">
+ <a href="interfaces_ppps_edit.php" class="btn btn-success"><?=gettext("Add")?></a>
+ </nav>
+</div>
<?php
- $i++;
- endforeach;
-?>
- <tr>
- <td class="list" colspan="3">&nbsp;</td>
- <td class="list"> <a href="interfaces_ppps_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc");
+
diff --git a/src/usr/local/www/interfaces_ppps_edit.php b/src/usr/local/www/interfaces_ppps_edit.php
index 2a7eaf9..62363a7 100644
--- a/src/usr/local/www/interfaces_ppps_edit.php
+++ b/src/usr/local/www/interfaces_ppps_edit.php
@@ -33,7 +33,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -46,12 +46,6 @@
require("guiconfig.inc");
require("functions.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_ppps.php');
-}
-
define("CRON_MONTHLY_PATTERN", "0 0 1 * *");
define("CRON_WEEKLY_PATTERN", "0 0 * * 0");
define("CRON_DAILY_PATTERN", "0 0 * * *");
@@ -73,12 +67,20 @@ if (is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
}
}
-if (is_numericint($_GET['id'])) {
+if($_GET && $_GET['type'])
+ $pconfig['type'] = $_GET['type'];
+
+if($_GET && $_GET['country'])
+ $pconfig['country'] = $_GET['country'];
+
+if($_GET && $_GET['provider'])
+ $pconfig['provider'] = $_GET['provider'];
+
+if (is_numericint($_GET['id']))
$id = $_GET['id'];
-}
-if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+
+if (isset($_POST['id']) && is_numericint($_POST['id']))
$id = $_POST['id'];
-}
if (isset($id) && $a_ppps[$id]) {
$pconfig['ptpid'] = $a_ppps[$id]['ptpid'];
@@ -93,13 +95,14 @@ if (isset($id) && $a_ppps[$id]) {
$pconfig['idletimeout'] = $a_ppps[$id]['idletimeout'];
$pconfig['uptime'] = $a_ppps[$id]['uptime'];
$pconfig['descr'] = $a_ppps[$id]['descr'];
- $pconfig['bandwidth'] = explode(",", $a_ppps[$id]['bandwidth']);
- $pconfig['mtu'] = explode(",", $a_ppps[$id]['mtu']);
- $pconfig['mru'] = explode(",", $a_ppps[$id]['mru']);
- $pconfig['mrru'] = explode(",", $a_ppps[$id]['mrru']);
- if (isset($a_ppps[$id]['shortseq'])) {
+ $pconfig['bandwidth'] = explode(",",$a_ppps[$id]['bandwidth']);
+ $pconfig['mtu'] = explode(",",$a_ppps[$id]['mtu']);
+ $pconfig['mru'] = explode(",",$a_ppps[$id]['mru']);
+ $pconfig['mrru'] = explode(",",$a_ppps[$id]['mrru']);
+
+ if (isset($a_ppps[$id]['shortseq']))
$pconfig['shortseq'] = true;
- }
+
if (isset($a_ppps[$id]['acfcomp'])) {
$pconfig['acfcomp'] = true;
}
@@ -161,6 +164,7 @@ if (isset($id) && $a_ppps[$id]) {
}
} else if ($a_ppps[$id]['pppoe-reset-type'] == "preset") {
$pconfig['pppoe_pr_preset'] = true;
+
switch ($resetTime) {
case CRON_MONTHLY_PATTERN:
$pconfig['pppoe_monthly'] = true;
@@ -356,6 +360,7 @@ if ($_POST) {
unset($ppp['apn']);
unset($ppp['apnum']);
}
+
$ppp['phone'] = $_POST['phone'];
$ppp['localip'] = implode(',', $port_data['localip']);
$ppp['gateway'] = implode(',', $port_data['gateway']);
@@ -437,467 +442,686 @@ include("head.inc");
$types = array("select" => gettext("Select"), "ppp" => "PPP", "pppoe" => "PPPoE", "pptp" => "PPTP", "l2tp" => "L2TP"/*, "tcp" => "TCP", "udp" => "UDP"*/);
-?>
- <script type="text/javascript" src="/javascript/numericupdown/js/numericupdown.js"></script>
- <link href="/javascript/numericupdown/css/numericupdown.css" rel="stylesheet" type="text/css" />
- <script type="text/javascript" src="/javascript/datepicker/js/datepicker.js"></script>
- <link href="/javascript/datepicker/css/datepicker.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript">
- //<![CDATA[
- jQuery(document).ready(function() { updateType(<?php echo "'{$pconfig['type']}'";?>); });
- //]]>
- </script>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" >
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="interfaces_ppps_edit.php" method="post" name="iform" id="iform">
- <table id="interfacetable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces ppps edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?= gettext("PPPs configuration"); ?></td>
- </tr>
- <tr>
- <td valign="middle" class="vncell"><strong><?= gettext("Link Type"); ?></strong></td>
- <td class="vtable">
- <select name="type" onchange="updateType(this.value);" class="formselect" id="type">
- <?php
- foreach ($types as $key => $opt) {
- echo "<option onclick=\"updateType('{$key}');\"";
- if ($key == $pconfig['type']) {
- echo " selected=\"selected\"";
- }
- echo " value=\"{$key}\" >" . htmlspecialchars($opt) . "</option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr name="interface" id="interface" >
- <td width="22%" valign="top" class="vncellreq"><?= gettext("Link interface(s)"); ?></td>
- <td width="78%" class="vtable">
- <select style="vertical-align:top" name="interfaces[]" multiple="multiple" class="formselect" size="4" onchange="show_hide_linkfields(this.options);">
- <option></option>
- </select>
- <br />
- <span class="vexpl"><?= gettext("Select at least two interfaces for Multilink (MLPPP) connections."); ?></span>
- </td>
- </tr>
- <tr style="display:none" name="portlists" id="portlists">
- <td id="serialports">
- <?php
- $selected_ports = explode(',', $pconfig['interfaces']);
- if (!is_dir("/var/spool/lock")) {
- mwexec("/bin/mkdir -p /var/spool/lock");
- }
- // $serialports = pfSense_get_modem_devices();
- // Match files in /dev starting with "cua" then:
- // [a-zA-Z] = any single alpha character e.g. like "cuau"
- // [0-9] = a digit from 0 to 9
- // stuff in {} = the various possible digit and dot combinations to allow an optional 2nd digit, dot, followed by 1 or 2 optional digits
- // This supports up to 100 device numbers (0 to 99), e.g. cuau0 cuau1 ... cuau10 cuau11 ... cuau99 and also possibilities like cuau1.1 cuau1.11 cuau11.1 cuau11.11
- $serialports = glob("/dev/cua[a-zA-Z][0-9]{,.[0-9],.[0-9][0-9],[0-9],[0-9].[0-9],[0-9].[0-9][0-9]}", GLOB_BRACE);
- $serport_count = 0;
- foreach ($serialports as $port) {
- $serport_count++;
- echo $port . "," . trim($port);
- if (in_array($port, $selected_ports)) {
- echo ",1|";
- } else {
- echo ",|";
- }
- }
- echo $serport_count;
- ?>
- </td>
- <td id="ports">
- <?php
- $port_count = 0;
- foreach ($portlist as $ifn => $ifinfo) {
- $port_count++;
- $string = "";
- if (is_array($ifinfo)) {
- $string .= $ifn;
- if ($ifinfo['mac']) {
- $string .= " ({$ifinfo['mac']})";
+$serviceproviders_xml = "/usr/local/share/mobile-broadband-provider-info/serviceproviders.xml";
+$serviceproviders_contents = file_get_contents($serviceproviders_xml);
+$serviceproviders_attr = xml2array($serviceproviders_contents,1,"attr");
+
+$serviceproviders = &$serviceproviders_attr['serviceproviders']['country'];
+
+function build_country_list() {
+ global $serviceproviders;
+
+ $list = array();
+
+ // get_country_name is in pfSense-utils.inc
+ $country_list = get_country_name("ALL");
+
+ foreach($country_list as $country) {
+ $list[$country['code']] = $country['name'];
+ }
+
+ return($list);
+}
+
+function build_provider_list($country) {
+ global $serviceproviders;
+
+ $list = array();
+
+ foreach($serviceproviders as $sp) {
+ if($sp['attr']['code'] == strtolower($country)) {
+ if(is_array($sp['provider'][0])) {
+ foreach($sp['provider'] as $provider) {
+ array_push($list, $provider['name']['value']);
+ }
+ }
+ }
+ }
+
+ return array_combine($list, $list);
+}
+
+function build_plans_list($country, $provider) {
+ global $serviceproviders;
+
+ $list = array();
+
+ foreach($serviceproviders as $sprecord) {
+ if($sprecord['attr']['code'] == strtolower($country)) {
+ foreach($sprecord['provider'] as $sp) {
+ if(strtolower($sp['name']['value']) == strtolower($provider)) {
+ if(array_key_exists('gsm', $sp)) {
+
+ if(array_key_exists('attr',$sp['gsm']['apn'])) {
+ $name = ($sp['gsm']['apn']['name'] ? $sp['gsm']['apn']['name'] : $sp['name']['value']);
+ echo $name . ":" . $sp['gsm']['apn']['attr']['value'];
+ } else {
+ foreach($sp['gsm']['apn'] as $apn_info) {
+ $name = ($apn_info['name']['value'] ? $apn_info['name']['value'] : $apn_info['gsm']['apn']['name']);
+
+ $key = $apn_info['attr']['value'];
+ $list[$key] = $name . ($key ? ' ':'') . '- ' . $key;
+ }
}
- } else {
- $string .= $ifinfo;
}
- $string .= ",{$ifn}";
- echo htmlspecialchars($string);
- if (in_array($ifn, $selected_ports)) {
- echo ",1|";
- } else {
- echo ",|";
+
+ if(array_key_exists('cdma',$sp)) {
+ $name = $sp['cdma']['name']['value'] ? $sp['cdma']['name']['value']:$sp['name']['value'];
+ $key = 'CDMA';
+ $list[$key] = $name . ' - ' . $key;
}
}
- echo $port_count;
- if ($serport_count > $port_count) {
- $port_count = $serport_count;
- }
- ?>
- </td>
- <td style="display:none" name="port_count" id="port_count"><?=htmlspecialchars($port_count);?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?= gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl"><?= gettext("You may enter a description here for your reference. Description will appear in the \"Interfaces Assign\" select lists."); ?></span>
- </td>
- </tr>
- <tr style="display:none" name="select" id="select"><td style="display:none"></td></tr>
- <?php
- $k = 0;
- ?>
- <tr style="display:none" name="ppp_provider" id="ppp_provider">
- <td width="22%" valign="top" class="vncell">
- <?= gettext("Service Provider"); ?>
- </td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="0" cellspacing="0" summary="service provider">
- <tr id="trcountry" style="display:none">
- <td><?= gettext("Country:"); ?> &nbsp;&nbsp;</td>
- <td>
- <select class="formselect" name="country" id="country" onchange="providers_list()">
- <option></option>
- </select>
- </td>
- </tr>
- <tr id="trprovider" style="display:none">
- <td><?= gettext("Provider:"); ?> &nbsp;&nbsp;</td>
- <td>
- <select class="formselect" name="provider" id="provider" onchange="providerplan_list()">
- <option></option>
- </select>
- </td>
- </tr>
- <tr id="trproviderplan" style="display:none">
- <td><?= gettext("Plan:"); ?> &nbsp;&nbsp;</td>
- <td>
- <select class="formselect" name="providerplan" id="providerplan" onchange="prefill_provider()">
- <option></option>
- </select>
- </td>
- </tr>
- </table>
- <br /><span class="vexpl"><?= gettext("Select to fill in data for your service provider."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?= gettext("Username"); ?></td>
- <td width="78%" class="vtable">
- <input name="username" type="text" class="formfld user" id="username" size="20" value="<?=htmlspecialchars($pconfig['username']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?= gettext("Password"); ?></td>
- <td width="78%" class="vtable">
- <input name="passwordfld" type="password" class="formfld pwd" id="passwordfld" size="20" value="<?=htmlspecialchars($pconfig['password']);?>" />
- </td>
- </tr>
-
- <tr style="display:none" name="phone_num" id="phone_num">
- <td width="22%" valign="top" class="vncellreq"><?= gettext("Phone Number"); ?></td>
- <td width="78%" class="vtable">
- <input name="phone" type="text" class="formfld unknown" id="phone" size="40" value="<?=htmlspecialchars($pconfig['phone']);?>" />
- <br />
- <span class="vexpl"><?= gettext("Note: Typically *99# for GSM networks and #777 for CDMA networks"); ?></span>
- </td>
- </tr>
- <tr style="display:none" name="apn_" id="apn_">
- <td width="22%" valign="top" class="vncell"><?= gettext("Access Point Name (APN)"); ?></td>
- <td width="78%" class="vtable">
- <input name="apn" type="text" class="formfld unknown" id="apn" size="40" value="<?=htmlspecialchars($pconfig['apn']);?>" />
- </td>
- </tr>
-
- <tr style="display:none" name="ppp" id="ppp">
- <td colspan="2" style="padding:0px;">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="advanced">
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td width="22%" valign="top" class="vncell"><?= gettext("APN number (optional)"); ?></td>
- <td width="78%" class="vtable">
- <input name="apnum" type="text" class="formfld unknown" id="apnum" size="2" value="<?=htmlspecialchars($pconfig['apnum']);?>" />
- <br />
- <span class="vexpl"><?= gettext("Note: Defaults to 1 if you set APN above. Ignored if you set no APN above."); ?></span>
- </td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td width="22%" valign="top" class="vncell"><?= gettext("SIM PIN"); ?></td>
- <td width="78%" class="vtable">
- <input name="simpin" type="text" class="formfld unknown" id="simpin" size="12" value="<?=htmlspecialchars($pconfig['simpin']);?>" />
- </td>
- </tr>
-
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td width="22%" valign="top" class="vncell"><?= gettext("SIM PIN wait"); ?></td>
- <td width="78%" class="vtable">
- <input name="pin-wait" type="text" class="formfld unknown" id="pin-wait" size="2" value="<?=htmlspecialchars($pconfig['pin-wait']);?>" />
- <br />
- <span class="vexpl"><?= gettext("Note: Time to wait for SIM to discover network after PIN is sent to SIM (seconds)."); ?></span>
- </td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td width="22%" valign="top" class="vncell"><?= gettext("Init String"); ?></td>
- <td width="78%" class="vtable">
- <input type="text" size="40" class="formfld unknown" id="initstr" name="initstr" value="<?=htmlspecialchars($pconfig['initstr']);?>" />
- <br />
- <span class="vexpl"><?= gettext("Note: Enter the modem initialization string here. Do NOT include the \"AT\"" .
- " string at the beginning of the command. Many modern USB 3G modems don't need an initialization string."); ?></span>
- </td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td width="22%" valign="top" class="vncell"><?= gettext("Connection Timeout"); ?></td>
- <td width="78%" class="vtable">
- <input name="connect-timeout" type="text" class="formfld unknown" id="connect-timeout" size="2" value="<?=htmlspecialchars($pconfig['connect-timeout']);?>" />
- <br />
- <span class="vexpl"><?= gettext("Note: Enter timeout in seconds for connection to be established (sec.) Default is 45 sec."); ?></span>
- </td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td valign="top" class="vncell"><?= gettext("Uptime Logging"); ?></td>
- <td class="vtable">
- <input type="checkbox" value="on" id="uptime" name="uptime" <?php if (isset($pconfig['uptime'])) echo "checked=\"checked\""; ?> /> <?= gettext("Enable persistent logging of connection uptime."); ?>
- <br />
- <span class="vexpl"><?= gettext("This option causes cumulative uptime to be recorded and displayed on the Status Interfaces page."); ?></span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr style="display:none" name="pppoe" id="pppoe">
- <td colspan="2" style="padding:0px;">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="service name">
- <tr>
- <td width="22%" valign="top" class="vncell"><?= gettext("Service name"); ?></td>
- <td width="78%" class="vtable"><input name="provider" type="text" class="formfld unknown" id="provider" size="20" value="<?=htmlspecialchars($pconfig['provider']);?>" />&nbsp;&nbsp;
- <input type="checkbox" value="on" id="null_service" name="null_service" <?php if (isset($pconfig['null_service'])) echo "checked=\"checked\""; ?> /> <?= gettext("Configure a NULL Service name"); ?>
- <br />
- <span class="vexpl"><?= gettext("Hint: this field can usually be left empty. Service name will not be configured if this field is empty. Check the \"Configure NULL\" box to configure a blank Service name."); ?></span>
- </td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td width="22%" valign="top" class="vncell"><?=gettext("Periodic reset");?></td>
- <td width="78%" class="vtable">
- <table id="presetwrap" cellspacing="0" cellpadding="0" width="100%" summary="periodic reset">
- <tr>
- <td align="left" valign="top">
- <p style="margin: 4px; padding: 4px 0 4px 0; width: 94%;">
- <select style="vertical-align:top" id="reset_type" name="pppoe-reset-type" class="formselect" onchange="show_reset_settings(this.value);">
- <option value = ""><?= gettext("Disabled"); ?></option>
- <option value="custom" <?php if ($pconfig['pppoe-reset-type'] == "custom") echo "selected=\"selected\""; ?>><?= gettext("Custom"); ?></option>
- <option value="preset" <?php if ($pconfig['pppoe-reset-type'] == "preset") echo "selected=\"selected\""; ?>><?= gettext("Pre-Set"); ?></option>
- </select> <?= gettext("Select a reset timing type"); ?>
- </p>
- <?php if ($pconfig['pppoe_pr_custom']): ?>
- <p style="margin: 2px; padding: 4px; width: 94%;" id="pppoecustomwrap">
- <?php else: ?>
- <p style="margin: 2px; padding: 4px; width: 94%; display: none;" id="pppoecustomwrap">
- <?php endif; ?>
- <input type="text" name="pppoe_resethour" class="fd_incremental_inp_range_0_23 fd_increment_1 fd_classname_dec_buttonDec fd_classname_inc_buttonInc" maxlength="2" id="pppoe_resethour" value="<?= htmlspecialchars($pconfig['pppoe_resethour']); ?>" size="3" />
- <?= gettext("hour (0-23)"); ?><br />
- <input type="text" name="pppoe_resetminute" class="fd_incremental_inp_range_0_59 fd_increment_1 fd_classname_dec_buttonDec fd_classname_inc_buttonInc" maxlength="2" id="pppoe_resetminute" value="<?= htmlspecialchars($pconfig['pppoe_resetminute']); ?>" size="3" />
- <?= gettext("minute (0-59)"); ?><br />
- <input name="pppoe_resetdate" type="text" class="w8em format-m-d-y highlight-days-67" id="pppoe_resetdate" maxlength="10" size="10" value="<?=htmlspecialchars($pconfig['pppoe_resetdate']);?>" />
- <?= gettext("reset at a specific date (mm/dd/yyyy)"); ?>
- <br />&nbsp;<br />
- <span class="red"><strong><?=gettext("Note:");?></strong></span>
- <?= gettext("If you leave the date field empty, the reset will be executed each day at the time you did specify using the minutes and hour field."); ?>
- </p>
- <?php if ($pconfig['pppoe_pr_preset']): ?>
- <p style="margin: 2px; padding: 4px; width: 94%;" id="pppoepresetwrap">
- <?php else: ?>
- <p style="margin: 2px; padding: 4px; width: 94%; display: none;" id="pppoepresetwrap">
- <?php endif; ?>
- <input name="pppoe_pr_preset_val" type="radio" id="pppoe_monthly" value="monthly" <?php if ($pconfig['pppoe_monthly']) echo "checked=\"checked\""; ?> />
- <?= gettext("reset at each month ('0 0 1 * *')"); ?>
- <br />
- <input name="pppoe_pr_preset_val" type="radio" id="pppoe_weekly" value="weekly" <?php if ($pconfig['pppoe_weekly']) echo "checked=\"checked\""; ?> />
- <?= gettext("reset at each week ('0 0 * * 0')"); ?>
- <br />
- <input name="pppoe_pr_preset_val" type="radio" id="pppoe_daily" value="daily" <?php if ($pconfig['pppoe_daily']) echo "checked=\"checked\""; ?> />
- <?= gettext("reset at each day ('0 0 * * *')"); ?>
- <br />
- <input name="pppoe_pr_preset_val" type="radio" id="pppoe_hourly" value="hourly" <?php if ($pconfig['pppoe_hourly']) echo "checked=\"checked\""; ?> />
- <?= gettext("reset at each hour ('0 * * * *')"); ?>
- </p>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+ }
+ }
+ }
-<?php
- for ($j = 0; $j < $port_count; $j++) :
-?>
+ return($list);
+}
- <tr style="display:none" id="gw_fields<?=$j;?>">
- <td width="22%" id="localiplabel<?=$j;?>" valign="top" class="vncell"><?= gettext("Local IP"); ?></td>
- <td width="78%" class="vtable">
- <input name="localip[]" type="text" class="formfld unknown" id="localip<?=$j;?>" size="20" value="<?=htmlspecialchars($pconfig['localip'][$j]);?>" />
- /
- <select name="subnet[]" class="formselect" id="subnet<?=$j;?>" disabled="disabled">
- <?php for ($i = 31; $i > 0; $i--): ?>
- <option value="<?=$i;?>"<?php if ($i == $pconfig['subnet'][$j]) echo " selected=\"selected\""; ?>><?=$i;?></option>
- <?php endfor; ?>
- </select> <?= gettext("IP Address"); ?>
- </td>
- </tr>
- <tr style="display:none" id="ip_fields<?=$j;?>">
- <td width="22%" id="gatewaylabel<?=$j;?>" valign="top" class="vncell"></td>
- <td width="78%" class="vtable">
- <input name="gateway[]" type="text" class="formfld unknown" id="gateway<?=$j;?>" size="20" value="<?=htmlspecialchars($pconfig['gateway'][$j]);?>" /><?= gettext("IP Address OR Hostname"); ?>
- </td>
- </tr>
-<?php
- endfor;
-?>
+$port_count = 0;
+$serport_count = 0;
+
+function build_link_list() {
+ global $pconfig, $portlist, $port_count, $serport_count;
+
+ $linklist = array('list' => array(),
+ 'selected' => array());
+
+ $selected_ports = explode(',',$pconfig['interfaces']);
+
+ if (!is_dir("/var/spool/lock"))
+ mwexec("/bin/mkdir -p /var/spool/lock");
+
+ if($pconfig['type'] == 'ppp') {
+ $serialports = glob("/dev/cua?[0-9]{,.[0-9]}", GLOB_BRACE);
+ //DEBUG
+ $serialports = glob("/dev/tty?[0-9]{,.[0-9]}", GLOB_BRACE);
+
+ $serport_count = 0;
+
+ foreach ($serialports as $port) {
+ $serport_count++;
+
+ $linklist['list'][$port] = trim($port);
+
+ if (in_array($port, $selected_ports))
+ array_push($linklist['selected'], $port);
+ }
+ }
+ else {
+ $port_count = 0;
+ foreach ($portlist as $ifn => $ifinfo){
+ $port_count++;
+ $string = "";
+
+ if (is_array($ifinfo)) {
+ $string .= $ifn;
+ if ($ifinfo['mac'])
+ $string .= " ({$ifinfo['mac']})";
+ } else
+ $string .= $ifinfo;
+
+ $linklist['list'][$ifn] = $string;
+
+ if (in_array($ifn, $selected_ports))
+ array_push($linklist['selected'], $ifn);
+ }
+
+ if($serport_count > $port_count)
+ $port_count=$serport_count;
+ }
+
+ return($linklist);
+}
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+$linkparamstr = gettext('Bandwidth is set only for MLLP conncetions and when links have diferent bandwidths' . '<br />' .
+ 'MTU defaults to 1492' . '<br />' .
+ 'MRU will be auto-negotiated by default' . '<br />' .
+ 'Set only for MLLP conncetions. MRRU will be auto-negotiated by default.');
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('PPPs Configuration');
+
+$section->addInput(new Form_Select(
+ 'type',
+ 'Link Type',
+ $pconfig['type'],
+ $types
+));
+
+$linklist = build_link_list();
+
+$section->addInput(new Form_Select(
+ 'interfaces',
+ 'Link Interface(s)',
+ $linklist['selected'],
+ $linklist['list'],
+ true // Allow multiples
+))->addClass('interfaces')->setHelp('Select at least two interfaces for Multilink (MLPPP) connections.');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference. Description will appear in the "Interfaces Assign" select lists.');
+
+$section->addInput(new Form_Select(
+ 'country',
+ 'Country',
+ $pconfig['country'],
+ build_country_list()
+));
+
+$section->addInput(new Form_Select(
+ 'provider',
+ 'Provider',
+ $pconfig['provider'],
+ build_provider_list($pconfig['country'])
+));
+
+$section->addInput(new Form_Select(
+ 'providerplan',
+ 'Plan',
+ $pconfig['providerplan'],
+ build_plans_list($pconfig['country'], $pconfig['provider'])
+))->setHelp('Select to fill in data for your service provider.');
+
+$section->addInput(new Form_Input(
+ 'username',
+ 'Username',
+ 'text',
+ $pconfig['username']
+));
+
+$section->addInput(new Form_Input(
+ 'passwordfld',
+ 'Password',
+ 'password',
+ $pconfig['passwordfld']
+));
+
+// These elements arehidden by default, and un-hidden in Javascript
+if($pconfig['type'] == 'pptp' || $pconfig['type'] == 'l2tp') {
+ $j = 0;
+ foreach($linklist['list'] as $ifnm =>$nm) {
+
+ $group = new Form_Group('IP/Gateway (' . $ifnm . ')');
+
+ $group->add(new Form_IpAddress(
+ 'localiplabel' . $j,
+ null,
+ $pconfig['localip'][$j]
+ ))->addMask('subnet' . $j, $pconfig['subnet'][$j], 31)->setHelp('IP Address');
+
+ $group->add(new Form_Input(
+ 'gateway' . $j,
+ null,
+ 'password',
+ $pconfig['gateway'][$j]
+ ))->setHelp('IP or Hostname');
+
+ $j++;
+
+ $group->addClass('localip')->addClass('localip' . $ifnm);
+ $section->add($group);
+ }
+}
+
+if($pconfig['type'] == 'ppp') {
+ $section->addInput(new Form_Input(
+ 'phone',
+ 'Phone number',
+ 'text',
+ $pconfig['phone']
+ ))->setHelp('Typically *99# for GSM networks and #777 for CDMA networks');
+}
+
+$section->addInput(new Form_Input(
+ 'apn',
+ 'Access Point Name (APN)',
+ 'text',
+ $pconfig['apn']
+));
+
+$section->addInput(new Form_Input(
+ 'apnum',
+ 'APN number (optional)',
+ 'text',
+ $pconfig['apnum']
+))->setHelp('Defaults to 1 if APN is set. Ignored if no APN is set.');
+
+$section->addInput(new Form_Input(
+ 'simpin',
+ 'SIM PIN',
+ 'text',
+ $pconfig['simpin']
+));
+
+$section->addInput(new Form_Input(
+ 'pin-wait',
+ 'SIM PIN wait',
+ 'text',
+ $pconfig['pin-wait']
+))->setHelp('Time to wait for SIM to discover network after PIN is sent to SIM (seconds).');
+
+$section->addInput(new Form_Input(
+ 'initstr',
+ 'Init string',
+ 'text',
+ $pconfig['initstr']
+))->setHelp('Enter the modem initialization string here. Do NOT include the "AT" string at the beginning of the command. ' .
+ 'Many modern USB 3G modems don\'t need an initialization string.');
+
+$section->addInput(new Form_Input(
+ 'connect-timeout',
+ 'Connection Timeout',
+ 'text',
+ $pconfig['connect-timeout']
+))->setHelp('Enter timeout in seconds for connection to be established (sec.) Default is 45 sec.');
+
+$section->addInput(new Form_Checkbox(
+ 'uptime',
+ 'Uptime logging',
+ 'Enable persistent logging of connection uptime. ',
+ $pconfig['uptime']
+))->setHelp(sprintf('Causes cumulative uptime to be recorded and displayed on the %sStatus->Interfaces%s page.', '<a href="status_interfaces.php">', '</a>'));
+
+$group = new Form_Group('Service name');
+$group->addClass('pppoe');
+
+$group->add(new Form_Input(
+ 'provider',
+ null,
+ 'text',
+ $pconfig['provider']
+));
+
+$group->add(new Form_Checkbox(
+ 'null_service',
+ null,
+ 'Configure NULL service name',
+ $pconfig['null_service']
+));
+
+$group->setHelp('This field can usually be left empty. Service name will not be configured if this field is empty. ' .
+ 'Check the "Configure NULL" box to configure a blank Service name.');
+
+$section->add($group);
+
+$section->addInput(new Form_Select(
+ 'pppoe-reset-type',
+ 'Periodic Reset',
+ $pconfig['pppoe-reset-type'],
+ array(
+ '' => 'Disabled',
+ 'custom' => 'Custom',
+ 'preset' => 'Pre-set'
+ )
+))->addClass('pppoe')->setHelp('Select a reset timing type');
+
+$group = new Form_Group('Rest Date/Time');
+$group->addClass('pppoe-reset-date');
+
+$group->add(new Form_Input(
+ 'pppoe_resethour',
+ null,
+ 'text',
+ $pconfig['pppoe_resethour']
+))->setHelp('Hour');
+
+$group->add(new Form_Input(
+ 'pppoe_resetminute',
+ null,
+ 'text',
+ $pconfig['pppoe_resetminute']
+))->setHelp('Minute');
+
+$group->add(new Form_Input(
+ 'pppoe_resetdate',
+ null,
+ 'text',
+ $pconfig['pppoe_resetdate'],
+ ['placeholder' => 'mm/dd/yyyy']
+))->setHelp('Specific date');
+
+$group->setHelp('Leaving the date field empty will cause the reset to be executed each day at the time you specified in the minutes and hour fields. ');
+
+$section->add($group);
+
+$group = new Form_Group('Rest frequency');
+$group->addClass('pppoe-reset-cron');
+
+$group->add(new Form_Checkbox(
+ 'pppoe_pr_preset_val',
+ null,
+ 'Monthly (0 0 1 * *)',
+ $pconfig['pppoe_monthly'],
+ 'monthly'
+))->displayAsRadio();
+
+$group->add(new Form_Checkbox(
+ 'pppoe_pr_preset_val',
+ null,
+ 'Weekly (0 0 * * 0)',
+ $pconfig['pppoe_weekly'],
+ 'weekly'
+))->displayAsRadio();
+
+$group->add(new Form_Checkbox(
+ 'pppoe_pr_preset_val',
+ null,
+ 'Daily (0 0 * * *)',
+ $pconfig['pppoe_daily'],
+ 'daily'
+))->displayAsRadio();
+
+$group->add(new Form_Checkbox(
+ 'pppoe_pr_preset_val',
+ null,
+ 'Hourly (0 * * * *)',
+ $pconfig['pppoe_hourly'],
+ 'hourly'
+))->displayAsRadio();
+
+$section->add($group);
+
+$btnadvanced = new Form_Button(
+ 'btnadvanced',
+ 'Show'
+);
+
+$btnadvanced->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'Advanced options',
+ $btnadvanced
+));
+
+$form->add($section);
+
+$section = new Form_Section('Advanced Configuration');
+$section->addClass('sec-advanced'); // This will allow the section to be hidden/shown by calling e.g.: hideClass('advanced', true);
+
+$section->addInput(new Form_Checkbox(
+ 'ondemand',
+ 'Dial On Demand',
+ 'Enable Dial-on-Demand mode. ',
+ $pconfig['ondemand']
+))->setHelp('Causes the interface to operate in dial-on-demand mode. Do NOT enable if you want your link to be always up. ' .
+ 'The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected.');
+
+$section->addInput(new Form_Input(
+ 'idletimeout',
+ 'Idle Timeout',
+ 'text',
+ $pconfig['idletimeout']
+))->setHelp('If no incoming or outgoing packets are transmitted for the entered number of seconds the connection is brought down.' .
+ 'When the idle timeout occurs, if the dial-on-demand option is enabled, mpd goes back into dial-on-demand mode. ' .
+ 'Otherwise, the interface is brought down and all associated routes removed.');
+
+$section->addInput(new Form_Checkbox(
+ 'vjcomp',
+ 'Compression',
+ 'Disable vjcomp (compression, auto-negotiated by default).',
+ $pconfig['vjcomp']
+))->setHelp('Disable vjcomp(compression) (auto-negotiated by default).' . '<br />' .
+ 'This option enables Van Jacobson TCP header compression, which saves several bytes per TCP data packet.' .
+ 'This option is almost always required. Compression is not effective for TCP connections with enabled modern extensions like time ' .
+ 'stamping or SACK, which modify TCP options between sequential packets.');
+
+$section->addInput(new Form_Checkbox(
+ 'tcpmssfix',
+ 'TCPmssFix',
+ 'Disable tcpmssfix (enabled by default).',
+ $pconfig['tcpmssfix']
+))->setHelp('Causes mpd to adjust incoming and outgoing TCP SYN segments so that the requested maximum segment size is not greater than the amount ' .
+ 'allowed by the interface MTU. This is necessary in many setups to avoid problems caused by routers that drop ICMP Datagram Too Big messages. Without these messages, ' .
+ 'the originating machine sends data, it passes the rogue router then hits a machine that has an MTU that is not big enough for the data. Because the IP Don\'t Fragment option is set, ' .
+ 'this machine sends an ICMP Datagram Too Big message back to the originator and drops the packet. The rogue router drops the ICMP message and the originator never ' .
+ 'gets to discover that it must reduce the fragment size or drop the IP Don\'t Fragment option from its outgoing data.');
+
+$section->addInput(new Form_Checkbox(
+ 'shortseq',
+ 'ShortSeq',
+ 'Disable shortseq (auto-negotiated by default).',
+ $pconfig['shortseq']
+))->setHelp('This option is only meaningful if multi-link PPP is negotiated. It proscribes shorter multi-link fragment headers, saving two bytes on every frame. ' .
+ 'It is not necessary to disable this for connections that are not multi-link.');
+
+$section->addInput(new Form_Checkbox(
+ 'acfcomp',
+ 'ACFComp',
+ 'Disable ACF compression (auto-negotiated by default)',
+ $pconfig['acfcomp']
+))->setHelp('Address and control field compression. This option only applies to asynchronous link types. It saves two bytes per frame.');
+
+$section->addInput(new Form_Checkbox(
+ 'protocomp',
+ 'ProtoComp',
+ 'Disable Protocol compression (auto-negotiated by default)',
+ $pconfig['protocomp']
+))->setHelp('Protocol field compression. This option saves one byte per frame for most frames.');
+
+// Display the Link parameters. We will hide this by default, then un-hide the selected ones on clicking 'Advanced'
+$j = 0;
+
+foreach($linklist['list'] as $ifnm =>$nm) {
+
+ $group = new Form_Group('Link Parameters (' . $ifnm . ')');
+
+ $group->add(new Form_Input(
+ 'bandwidth' . $j,
+ null,
+ 'text',
+ $pconfig['bandwidth'][$j]
+ ))->setHelp('Bandwidth');
+
+ $group->add(new Form_Input(
+ 'mtu' . $j,
+ null,
+ 'password',
+ $pconfig['mtu'][$j]
+ ))->setHelp('MTU');
+
+ $group->add(new Form_Input(
+ 'mru' . $j,
+ null,
+ 'password',
+ $pconfig['mru'][$j]
+ ))->setHelp('MRU');
+
+ $group->add(new Form_Input(
+ 'mrru' . $j,
+ null,
+ 'password',
+ $pconfig['mrru'][$j]
+ ))->setHelp('MRRU');
+
+ $j++;
+
+ $section->add($group);
+
+ $group->addClass('localip sec-advanced')->addClass('linkparam' . $ifnm);
+}
+
+$linkparamhelp = new Form_StaticText(
+ null,
+ '<span id="linkparamhelp">' . $linkparamstr . '</span>'
+);
+
+$section->addInput($linkparamhelp);
+
+if (isset($id) && $a_ppps[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$section->addInput(new Form_Input(
+ 'ptpid',
+ null,
+ 'hidden',
+ $ptpid
+));
+
+$form->add($section);
+
+print($form);
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td colspan="2" valign="top" height="16"></td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td colspan="2" valign="top" class="listtopic"><?= gettext("Advanced Options"); ?></td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td valign="top" class="vncell"><?= gettext("Dial On Demand"); ?></td>
- <td class="vtable">
- <input type="checkbox" value="on" id="ondemand" name="ondemand" <?php if (isset($pconfig['ondemand'])) echo "checked=\"checked\""; ?> /> <?= gettext("Enable Dial-on-Demand mode"); ?>
- <br />
- <span class="vexpl"><?= gettext("This option causes the interface to operate in dial-on-demand mode. Do NOT enable if you want your link to be always up. " .
- "The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected."); ?> </span>
- </td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td valign="top" class="vncell"><?= gettext("Idle Timeout"); ?></td>
- <td class="vtable">
- <input name="idletimeout" type="text" class="formfld unknown" id="idletimeout" size="12" value="<?=htmlspecialchars($pconfig['idletimeout']);?>" /> <?= gettext("(seconds) Default is 0, which disables the timeout feature."); ?>
- <br />
- <span class="vexpl"><?= gettext("If no incoming or outgoing packets are transmitted for the entered number of seconds the connection is brought down.");?>
- <br />
- <?=gettext("When the idle timeout occurs, if the dial-on-demand option is enabled, mpd goes back into dial-on-demand mode. Otherwise, the interface is brought down and all associated routes removed."); ?></span>
- </td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td width="22%" valign="top" class="vncell"><?= gettext("Compression"); ?></td>
- <td width="78%" class="vtable">
- <input type="checkbox" value="on" id="vjcomp" name="vjcomp" <?php if (isset($pconfig['vjcomp'])) echo "checked=\"checked\""; ?> />&nbsp;<?= gettext("Disable vjcomp(compression) (auto-negotiated by default)."); ?>
- <br />
- <span class="vexpl"><?=gettext("This option enables Van Jacobson TCP header compression, which saves several bytes per TCP data packet. " .
- "You almost always want this option. This compression ineffective for TCP connections with enabled modern extensions like time " .
- "stamping or SACK, which modify TCP options between sequential packets.");?></span>
- </td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td width="22%" valign="top" class="vncell"><?= gettext("TCPmssFix"); ?></td>
- <td width="78%" class="vtable">
- <input type="checkbox" value="on" id="tcpmssfix" name="tcpmssfix" <?php if (isset($pconfig['tcpmssfix'])) echo "checked=\"checked\""; ?> />&nbsp;<?= gettext("Disable tcpmssfix (enabled by default)."); ?>
- <br />
- <span class="vexpl"><?=gettext("This option causes mpd to adjust incoming and outgoing TCP SYN segments so that the requested maximum segment size is not greater than the amount ".
- "allowed by the interface MTU. This is necessary in many setups to avoid problems caused by routers that drop ICMP Datagram Too Big messages. Without these messages, ".
- "the originating machine sends data, it passes the rogue router then hits a machine that has an MTU that is not big enough for the data. Because the IP Don't Fragment option is set, ".
- "this machine sends an ICMP Datagram Too Big message back to the originator and drops the packet. The rogue router drops the ICMP message and the originator never ".
- "gets to discover that it must reduce the fragment size or drop the IP Don't Fragment option from its outgoing data.");?></span>
- </td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td width="22%" valign="top" class="vncell"><?=gettext("ShortSeq");?></td>
- <td width="78%" class="vtable">
- <input type="checkbox" value="on" id="shortseq" name="shortseq" <?php if (isset($pconfig['shortseq'])) echo "checked=\"checked\""; ?> />&nbsp;<?= gettext("Disable shortseq (auto-negotiated by default)."); ?>
- <br />
- <span class="vexpl"><?= gettext("This option is only meaningful if multi-link PPP is negotiated. It proscribes shorter multi-link fragment headers, saving two bytes on every frame. " .
- "It is not necessary to disable this for connections that are not multi-link."); ?></span>
- </td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td width="22%" valign="top" class="vncell"><?=gettext("ACFComp"); ?></td>
- <td width="78%" class="vtable">
- <input type="checkbox" value="on" id="acfcomp" name="acfcomp" <?php if (isset($pconfig['acfcomp'])) echo "checked=\"checked\""; ?> />&nbsp;<?= gettext("Disable acfcomp (compression) (auto-negotiated by default)."); ?>
- <br />
- <span class="vexpl"><?= gettext("Address and control field compression. This option only applies to asynchronous link types. It saves two bytes per frame."); ?></span>
- </td>
- </tr>
- <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
- <td width="22%" valign="top" class="vncell"><?=gettext("ProtoComp"); ?></td>
- <td width="78%" class="vtable">
- <input type="checkbox" value="on" id="protocomp" name="protocomp" <?php if (isset($pconfig['protocomp'])) echo "checked=\"checked\""; ?> />&nbsp;<?= gettext("Disable protocomp (compression) (auto-negotiated by default)."); ?>
- <br />
- <span class="vexpl"><?= gettext("Protocol field compression. This option saves one byte per frame for most frames."); ?></span>
- </td>
- </tr>
- <tr id="advanced_" name="advanced_">
- <td>&nbsp;</td>
- <td>
- <p><input type="button" onclick="show_advanced(1)" value="<?=gettext("Show advanced options"); ?>" /></p>
- </td>
- <td style="display:none" id="adv_rows" name="adv_rows"><?=$k;?></td>
- <td style="display:none" id="adv_show" name="adv_show">0</td>
- </tr>
-<?php
- for ($i = 0; $i < $port_count; $i++) :
?>
- <tr style="display:none" id="link<?=$i;?>">
- <td width="22%" valign="top" id="linklabel<?=$i;?>" class="vncell"> <?=gettext("Link Parameters");?></td>
- <td class="vtable">
- <table name="link_parameters" border="0" cellpadding="6" cellspacing="0" summary="link parameters">
- <tr>
- <td width="22%" id="bwlabel<?=$i;?>" valign="top"class="vncell"> <?=gettext("Bandwidth");?></td>
- <td width="78%" class="vtable">
- <br />
- <input name="bandwidth[]" id="bandwidth<?=$i;?>" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['bandwidth'][$i]);?>" />
- <br />
- <span class="vexpl"><?=gettext("Set ONLY for MLPPP connections and ONLY when links have different bandwidths.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" id="mtulabel<?=$i;?>" valign="top" class="vncell"> <?=gettext("MTU"); ?></td>
- <td width="78%" class="vtable">
- <input name="mtu[]" id="mtu<?=$i;?>" type="text" class="formfld unknown" size="6" value="<?=htmlspecialchars($pconfig['mtu'][$i]);?>" />
- <br />
- <span class="vexpl"><?=gettext("MTU will default to 1492.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" id="mrulabel<?=$i;?>" valign="top" class="vncell"> <?=gettext("MRU"); ?></td>
- <td width="78%" class="vtable">
- <input name="mru[]" id="mru<?=$i;?>" type="text" class="formfld unknown" size="6" value="<?=htmlspecialchars($pconfig['mru'][$i]);?>" />
- <br />
- <span class="vexpl">MRU <?=gettext("will be auto-negotiated by default.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" id="mrrulabel<?=$i;?>" valign="top" class="vncell"> <?=gettext("MRRU"); ?></td>
- <td width="78%" class="vtable">
- <input name="mrru[]" id="mrru<?=$i;?>" type="text" class="formfld unknown" size="6" value="<?=htmlspecialchars($pconfig['mrru'][$i]);?>" />
- <br />
- <span class="vexpl"><?=gettext("Set ONLY for MLPPP connections.");?> MRRU <?=gettext("will be auto-negotiated by default.");?></span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+
+<script>
+//<![CDATA[
+events.push(function(){
+ var showadvanced = false;
+
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
+
+ // Hides the <div> in which the specified checkbox lives so that the checkbox, its label and help text are hidden
+ function hideCheckbox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
+ }
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
+ }
+
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ // Simple test in which clicking the ‘clear’ button toggles certain display elements
+ function setAdvVisible() {
+ // Update the button text and toggle showadvanced
+ if(showadvanced) {
+ $("#btnadvanced").prop('value', 'Hide');
+ showadvanced = false;
+ }
+ else {
+ $("#btnadvanced").prop('value', 'Show');
+ showadvanced = true;
+ }
+
+ hideClass('sec-advanced', showadvanced);
+
+ // The options that follow are only shown if type == 'ppp'
+ var ppptype = ($('#type').val() == 'ppp');
+
+ hideInput('apnum', showadvanced && ppptype);
+ hideInput('simpin', showadvanced && ppptype);
+ hideInput('pin-wait', showadvanced && ppptype);
+ hideInput('initstr', showadvanced && ppptype);
+ hideInput('connect-timeout', showadvanced && ppptype);
+ hideCheckbox('uptime', showadvanced && ppptype);
+
+ // The options that follow are only shown if type == 'pppoe'
+ var pppoetype = ($('#type').val() != 'pppoe');
+
+ hideClass('pppoe', showadvanced || pppoetype);
+ hideInput('pppoe-reset-type', showadvanced || pppoetype);
+
+ hideResetDisplay(true);
+
+ hideInterfaces();
+ }
+
+ function hideResetDisplay(hide) {
+
+ hideClass('pppoe-reset-date', true);
+ hideClass('pppoe-reset-cron', true);
+
+ if(!hide) {
+ switch($('#pppoe-reset-type').val()) {
+ case 'custom' :
+ hideClass('pppoe-reset-date', false);
+ break;
+ case 'preset' :
+ hideClass('pppoe-reset-cron', false);
+ break;
+ }
+ }
+ }
+
+ function hideInterfaces() {
+ hideClass('localip', true);
+ hideClass('linkparam', true);
+ hideInput('linkparamhelp', true);
+
+ var selected = $('.interfaces').val();
+ var length = selected.length;
+
+ for(var i=0; i<length; i++) {
+ hideClass('localip' + selected[i], false);
+
+ if(!showadvanced) {
+ hideClass('linkparam' + selected[i], false);
+ hideInput('linkparamhelp', false);
+ }
+ }
+ }
+
+ // Make the ‘btnadvanced’ button a plain button, not a submit button
+ $("#btnadvanced").prop('type','button');
+
+ $("#btnadvanced").click(function() {
+ setAdvVisible();
+ });
+
+ $('#pppoe-reset-type').on('change', function() {
+ hideResetDisplay(false);
+ });
+
+ // When interfaces changed, read the selected items and unhide the corresponding IP/Gateway controls
+ // Multiselect boxes must be handled by class
+ $('.interfaces').on('change', function() {
+ hideInterfaces();
+ });
+
+ // When type, country or provider are changed, reload the page and build the new selector arrays
+ $('#type').on('change', function() {
+ window.location = 'interfaces_ppps_edit.php?id=' + $('#id').val() + '&type=' + this.value;
+ });
+
+ $('#country').on('change', function() {
+ window.location = 'interfaces_ppps_edit.php?id=' + $('#id').val() + '&country=' + this.value + '&type=' + $('#type').val();
+ });
+
+ $('#provider').on('change', function() {
+ window.location = 'interfaces_ppps_edit.php?id=' + $('#id').val() + '&provider=' + this.value + '&type=' + $('#type').val() + '&country=' + $('#country').val();
+ });
+
+ // Set element visibility on initial page load
+ setAdvVisible();
+
+ hideClass('linkparam', true);
+});
+//]]>
+
+</script>
<?php
- endfor;
-?>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <input name="ptpid" type="hidden" value="<?=htmlspecialchars($pconfig['ptpid']);?>" />
- <?php if (isset($id) && $a_ppps[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+include("foot.inc");
diff --git a/src/usr/local/www/interfaces_qinq.php b/src/usr/local/www/interfaces_qinq.php
index dac5801..f68ac54 100644
--- a/src/usr/local/www/interfaces_qinq.php
+++ b/src/usr/local/www/interfaces_qinq.php
@@ -29,7 +29,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /usr/sbin/ngctl
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -67,6 +67,8 @@ if ($_GET['act'] == "del") {
/* check if still in use */
if (qinq_inuse($id)) {
$input_errors[] = gettext("This QinQ cannot be deleted because it is still being used as an interface.");
+ } elseif (empty($a_qinqs[$id]['vlanif']) || !does_interface_exist($a_qinqs[$id]['vlanif'])) {
+ $input_errors[] = gettext("QinQ interface does not exist");
} else {
$qinq =& $a_qinqs[$id];
@@ -92,90 +94,73 @@ $pgtitle = array(gettext("Interfaces"), gettext("QinQ"));
$shortcut_section = "interfaces";
include("head.inc");
-?>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+$tab_array[] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+$tab_array[] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+$tab_array[] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+$tab_array[] = array(gettext("QinQs"), true, "interfaces_qinq.php");
+$tab_array[] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+$tab_array[] = array(gettext("GRE"), false, "interfaces_gre.php");
+$tab_array[] = array(gettext("GIF"), false, "interfaces_gif.php");
+$tab_array[] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+$tab_array[] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+display_top_tabs($tab_array);
+
+print_info_box(sprintf(gettext('Not all drivers/NICs support 802.1Q QinQ tagging properly. <br />On cards that do not explicitly support it, ' .
+ 'QinQ tagging will still work, but the reduced MTU may cause problems.<br />' .
+ 'See the %s handbook for information on supported cards.'), $g['product_name']));
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces qinqs">
- <tr><td>
-<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
- $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
- $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
- $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
- $tab_array[4] = array(gettext("QinQs"), true, "interfaces_qinq.php");
- $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
- $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
- $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
- $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
- $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
- display_top_tabs($tab_array);
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="15%" class="listhdrr"><?=gettext("Interface");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Tag");?></td>
- <td width="20%" class="listhdrr"><?=gettext("QinQ members");?></td>
- <td width="45%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list"></td>
- </tr>
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Interface"); ?></th>
+ <th><?=gettext("Tag");?></td>
+ <th><?=gettext("QinQ members"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php foreach ($a_qinqs as $i => $qinq):?>
+ <tr>
+ <td>
+ <?=htmlspecialchars($qinq['if'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($qinq['tag'])?>
+ </td>
+ <td>
+<?php if (strlen($qinq['members']) > 20):?>
+ <?=substr(htmlspecialchars($qinq['members']), 0, 20)?>&hellip;
+<?php else:?>
+ <?=htmlspecialchars($qinq['members'])?>
+<?php endif; ?>
+ </td>
+ <td>
+ <?=htmlspecialchars($qinq['descr'])?>&nbsp;
+ </td>
+ <td>
+ <a href="interfaces_qinq_edit.php?id=<?=$i?>" class="btn btn-default btn-xs"><?=gettext("Edit")?></a>
+ <a href="interfaces_qinq.php?act=del&amp;id=<?=$i?>" class="btn btn-danger btn-xs"><?=gettext("Delete")?></a>
+ </td>
+ </tr>
<?php
- $i = 0;
- foreach ($a_qinqs as $qinq):
+endforeach;
?>
- <tr ondblclick="document.location='interfaces_qinq_edit.php?id=<?=$i;?>'">
- <td class="listlr">
- <?=htmlspecialchars($qinq['if']);?>
- </td>
- <td class="listlr">
- <?=htmlspecialchars($qinq['tag']);?>
- </td>
- <td class="listr">
- <?php
- if (strlen($qinq['members']) > 20) {
- echo substr(htmlspecialchars($qinq['members']), 0, 20) . "...";
- } else {
- echo htmlspecialchars($qinq['members']);
- }
- ?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($qinq['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap"> <a href="interfaces_qinq_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;<a href="interfaces_qinq.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this QinQ?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="remove" /></a>
- </td>
- </tr>
+ </tbody>
+ </table>
+</div>
+
+<nav class="action-buttons">
+ <a href="interfaces_qinq_edit.php" class="btn btn-success">
+ <?=gettext("Add")?>
+ </a>
+</nav>
<?php
- $i++;
- endforeach;
-?>
- <tr>
- <td class="list" colspan="4">&nbsp;</td>
- <td class="list"> <a href="interfaces_qinq_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- <tr>
- <td colspan="4" class="list">
- <p class="vexpl">
- <span class="red"><strong>
- <?=gettext("Note:");?><br />
- </strong></span>
- <?php printf(gettext("Not all drivers/NICs support 802.1Q QinQ tagging properly. On cards that do not explicitly support it, QinQ tagging will still work, but the reduced MTU may cause problems. See the %s handbook for information on supported cards."), $g['product_name']);?>
- </p>
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc");
diff --git a/src/usr/local/www/interfaces_qinq_edit.php b/src/usr/local/www/interfaces_qinq_edit.php
index 93048a9..9460884 100644
--- a/src/usr/local/www/interfaces_qinq_edit.php
+++ b/src/usr/local/www/interfaces_qinq_edit.php
@@ -76,16 +76,11 @@ if (isset($id) && $a_qinqs[$id]) {
$pconfig['tag'] = $a_qinqs[$id]['tag'];
$pconfig['members'] = $a_qinqs[$id]['members'];
$pconfig['descr'] = html_entity_decode($a_qinqs[$id]['descr']);
-/*
- $pconfig['autoassign'] = isset($a_qinqs[$id]['autoassign']);
- $pconfig['autoenable'] = isset($a_qinqs[$id]['autoenable']);
-*/
$pconfig['autogroup'] = isset($a_qinqs[$id]['autogroup']);
$pconfig['autoadjustmtu'] = isset($a_qinqs[$id]['autoadjustmtu']);
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -116,49 +111,34 @@ if ($_POST) {
$qinqentry = array();
$qinqentry['if'] = $_POST['if'];
$qinqentry['tag'] = $_POST['tag'];
-/*
- if ($_POST['autoassign'] == "yes") { {
- $qinqentry['autoassign'] = true;
- }
- if ($_POST['autoenable'] == "yes") {
- $qinqentry['autoenable'] = true;
- }
- if ($_POST['autoadjust'] == "yes") {
- $qinqentry['autoadjustmtu'] = true;
- }
-*/
+
if ($_POST['autogroup'] == "yes") {
$qinqentry['autogroup'] = true;
}
$members = "";
$isfirst = 0;
- /* item is a normal qinqentry type */
- for ($x = 0; $x < 9999; $x++) {
- if ($_POST["members{$x}"] <> "") {
- $member = explode("-", $_POST["members{$x}"]);
- if (count($member) > 1) {
- if (preg_match("/([^0-9])+/", $member[0], $match) ||
- preg_match("/([^0-9])+/", $member[1], $match)) {
- $input_errors[] = gettext("Tags can contain only numbers or a range in format #-#.");
- }
- for ($i = $member[0]; $i <= $member[1]; $i++) {
- if ($isfirst > 0) {
- $members .= " ";
- }
- $members .= $i;
- $isfirst++;
- }
- } else {
- if (preg_match("/([^0-9])+/", $_POST["members{$x}"], $match)) {
- $input_errors[] = gettext("Tags can contain only numbers or a range in format #-#.");
- }
+ // Read the POSTed member array into a space separated list translating any ranges
+ // into their included values
+ foreach ($_POST['members'] as $memb) {
+ // Might be a range
+ $member = explode("-", $memb);
- if ($isfirst > 0) {
- $members .= " ";
- }
- $members .= $_POST["members{$x}"];
+ if (count($member) > 1) {
+ if (preg_match("/([^0-9])+/", $member[0], $match) || preg_match("/([^0-9])+/", $member[1], $match))
+ $input_errors[] = gettext("Tags can contain only numbers or a range in format #-#.");
+
+ for ($i = $member[0]; $i <= $member[1]; $i++) {
+ $members .= ($isfirst == 0 ? '':' ') . $i;
+ $isfirst++;
+ }
+ }
+ else { // Just a single number
+ if (preg_match("/([^0-9])+/", $memb, $match))
+ $input_errors[] = gettext("Tags can contain only numbers or a range in format #-#.");
+ else {
+ $members .= ($isfirst == 0 ? '':' ') . $memb;
$isfirst++;
}
}
@@ -235,210 +215,106 @@ if ($_POST) {
}
}
-include("head.inc");
+function build_parent_list() {
+ global $portlist;
-?>
+ $list = array();
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
+ foreach ($portlist as $ifn => $ifinfo) {
+ if (is_jumbo_capable($ifn))
+ $list[$ifn] = $ifn . ' (' . $ifinfo['mac'] . ')';
+ }
-<script type="text/javascript">
-//<![CDATA[
-// Global Variables
-var rowname = new Array(9999);
-var rowtype = new Array(9999);
-var newrow = new Array(9999);
-var rowsize = new Array(9999);
+ return($list);
+}
+
+include("head.inc");
-for (i = 0; i < 9999; i++) {
- rowname[i] = 'members';
- rowtype[i] = 'select';
- newrow[i] = '';
- rowsize[i] = '30';
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'Submit',
+ gettext("Save")
+));
+
+$section = new Form_Section('Interface QinQ Edit');
+
+$section->addInput(new Form_Select(
+ 'if',
+ 'Parent interface',
+ $pconfig['if'],
+ build_parent_list()
+))->setHelp('Only QinQ capable interfaces will be shown.');
+
+$section->addInput(new Form_Input(
+ 'tag',
+ 'First level tag',
+ 'number',
+ $pconfig['tag'],
+ ['max' => '4094', 'min' => '1']
+))->setHelp('This is the first level VLAN tag. On top of this are stacked the member VLANs defined below.');
+
+$section->addInput(new Form_Checkbox(
+ 'autogroup',
+ 'Option(s)',
+ 'Adds interface to QinQ interface groups',
+ $pconfig['autogroup']
+))->setHelp('Allows rules to be written more easily');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$section->addInput(new Form_StaticText(
+ 'Member(s)',
+ 'You can specify ranges in the inputs below. Enter a range (2-3) or individual numbers.' . '<br />' .
+ 'Click "Duplicate" as many times as needed to add new inputs'
+));
+
+if (isset($id) && $a_qinqs[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
}
-var field_counter_js = 0;
-var loaded = 0;
-var is_streaming_progress_bar = 0;
-var temp_streaming_text = "";
-
-var addRowTo = (function() {
- return (function (tableId) {
- var d, tbody, tr, td, bgc, i, ii, j;
- d = document;
- tbody = d.getElementById(tableId).getElementsByTagName("tbody").item(0);
- tr = d.createElement("tr");
- for (i = 0; i < field_counter_js; i++) {
- td = d.createElement("td");
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input size='" + rowsize[i] + "' class='formfld unknown' name='" + rowname[i] + totalrows + "' /> ";
- tr.appendChild(td);
- }
- td = d.createElement("td");
- td.rowSpan = "1";
-
- td.innerHTML = '<a onclick="removeRow(this);return false;" href="#"><img border="0" src="/themes/' + theme + '/images/icons/icon_x.gif" alt="remove" /><\/a>';
- tr.appendChild(td);
- tbody.appendChild(tr);
- totalrows++;
- });
-})();
-
-function removeRow(el) {
- var cel;
- while (el && el.nodeName.toLowerCase() != "tr") {
- el = el.parentNode;
- }
+$counter = 0;
+$members = $pconfig['members'];
- if (el && el.parentNode) {
- cel = el.getElementsByTagName("td").item(0);
- el.parentNode.removeChild(el);
- }
+// List each of the member tags from the space-separated list
+if ($members != "")
+ $item = explode(" ", $members);
+else
+ $item = array('');
+
+foreach($item as $ww) {
+ $member = $item[$counter];
+
+ $group = new Form_Group($counter == 0 ? 'Tag(s)':'');
+
+ $group->add(new Form_Input(
+ 'members',
+ null,
+ 'text',
+ $ww
+ ))->setWidth(6); // Width must be <= 8 to make room for the duplication buttons
+
+$counter++;
+
+$group->enableDuplication(null, true); // Buttons are in-line with the input
+$section->add($group);
}
- rowname[0] = <?=gettext("members");?>;
- rowtype[0] = "textbox";
- rowsize[0] = "30";
-
- rowname[2] = <?=gettext("detail");?>;
- rowtype[2] = "textbox";
- rowsize[2] = "50";
-//]]>
-</script>
-<input type='hidden' name='members_type' value='textbox' class="formfld unknown" />
-
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<div id="inputerrors"></div>
-
-<form action="interfaces_qinq_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces qinq edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Interface QinQ Edit");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface");?></td>
- <td width="78%" class="vtable">
- <select name="if" id="if" class="formselect">
- <?php
- foreach ($portlist as $ifn => $ifinfo) {
- if (is_jumbo_capable($ifn)) {
- echo "<option value=\"{$ifn}\"";
- if ($ifn == $pconfig['if']) {
- echo " selected=\"selected\"";
- }
- echo ">";
- echo htmlspecialchars($ifn . " (" . $ifinfo['mac'] . ")");
- echo "</option>";
- }
- }
- ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Only QinQ capable interfaces will be shown.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("First level tag");?></td>
- <td width="78%" class="vtable">
- <input name="tag" type="text" class="formfld unknown" id="tag" size="10" value="<?=htmlspecialchars($pconfig['tag']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("This is the first level VLAN tag. On top of this are stacked the member VLANs defined below.");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Options");?></td>
- <td width="78%" class="vtable">
-<?php /* ?>
- <br />
- <input type="checkbox" value="yes" name="autoassign" id="autoassign" <?php if ($pconfig['autoassign']) echo "checked=\"checked\""; ?> />
- <span class="vexpl"> Auto assign interface so it can be configured with ip etc...</span>
- <br />
- <input type="checkbox" value="yes" name="autoenable" id="autoenable" <?php if ($pconfig['autoenable']) echo "checked=\"checked\""; ?> />
- <span class="vexpl"> Auto enable interface so it can be used on filter rules.</span>
- <br />
- <input type="checkbox" value="yes" name="autoadjustmtu" id="autoadjustmtu" <?php if ($pconfig['autoadjustmtu']) echo "checked=\"checked\""; ?> />
- <span class="vexpl"> Allows to keep clients mtu unchanged(1500). <br />NOTE: if you are using jumbo frames this option is not needed and may produce incorrect results!</span>
-<?php */ ?>
- <br />
- <input name="autogroup" type="checkbox" value="yes" id="autogroup" <?php if ($pconfig['autogroup']) echo "checked=\"checked\""; ?> />
- <span class="vexpl"><?=gettext("Adds interface to QinQ interface groups so you can write filter rules easily.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed).");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><div id="membersnetworkport"><?=gettext("Member (s)");?></div></td>
- <td width="78%" class="vtable">
- <span class="vexpl">
- <?=gettext("You can specify ranges in the input below. The format is pretty simple i.e 9-100 or 10.20...");?>
- </span>
- <br />
- <table id="maintable" summary="main table">
- <tbody>
- <tr>
- <td><div id="onecolumn"><?=gettext("Tag");?></div></td>
- </tr>
+$form->add($section);
-<?php
- $counter = 0;
- $members = $pconfig['members'];
- if ($members <> "") {
- $item = explode(" ", $members);
- foreach ($item as $ww) {
- $member = $item[$counter];
-?>
- <tr>
- <td class="vtable">
- <input name="members<?php echo $counter; ?>" class="formselect" id="members<?php echo $counter; ?>" value="<?php echo htmlspecialchars($member);?>" />
- </td>
- <td>
- <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="remove" /></a>
- </td>
- </tr>
-<?php
- $counter++;
-
- } // end foreach
- } // end if
-?>
- </tbody>
- </table>
- <a onclick="javascript:addRowTo('maintable'); return false;" href="#">
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
- </a>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <a href="interfaces_qinq.php"><input id="cancelbutton" name="cancelbutton" type="button" class="formbtn" value="<?=gettext("Cancel");?>" /></a>
- <?php if (isset($id) && $a_qinqs[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-
-<script type="text/javascript">
-//<![CDATA[
- field_counter_js = 1;
- rows = 1;
- totalrows = <?php echo $counter; ?>;
- loaded = <?php echo $counter; ?>;
-//]]>
-</script>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+print($form);
+
+include("foot.inc");
diff --git a/src/usr/local/www/interfaces_vlan.php b/src/usr/local/www/interfaces_vlan.php
index 20453b4..d7a8ae2 100644
--- a/src/usr/local/www/interfaces_vlan.php
+++ b/src/usr/local/www/interfaces_vlan.php
@@ -31,7 +31,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /sbin/ifconfig
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -86,80 +86,56 @@ if ($_GET['act'] == "del") {
$pgtitle = array(gettext("Interfaces"), gettext("VLAN"));
$shortcut_section = "interfaces";
-include("head.inc");
-
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces vlan">
- <tr><td>
-<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
- $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
- $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
- $tab_array[3] = array(gettext("VLANs"), true, "interfaces_vlan.php");
- $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
- $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
- $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
- $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
- $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
- $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
- display_top_tabs($tab_array);
+include('head.inc');
+
+if ($input_errors) print_input_errors($input_errors);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+$tab_array[] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+$tab_array[] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+$tab_array[] = array(gettext("VLANs"), true, "interfaces_vlan.php");
+$tab_array[] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+$tab_array[] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+$tab_array[] = array(gettext("GRE"), false, "interfaces_gre.php");
+$tab_array[] = array(gettext("GIF"), false, "interfaces_gif.php");
+$tab_array[] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+$tab_array[] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+display_top_tabs($tab_array);
+
+print_info_box(sprintf(gettext('NOTE: Not all drivers/NICs support 802.1Q '.
+ 'VLAN tagging properly. <br />On cards that do not explicitly support it, VLAN '.
+ 'tagging will still work, but the reduced MTU may cause problems.<br />See the '.
+ '%s handbook for information on supported cards.'),$g['product_name']));
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Interface");?></td>
- <td width="20%" class="listhdrr"><?=gettext("VLAN tag");?></td>
- <td width="50%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list"></td>
- </tr>
+<div class="table-responsive">
+ <table class="table">
+ <tr>
+ <th><?=gettext('Interface');?></th>
+ <th><?=gettext('VLAN tag');?></th>
+ <th><?=gettext('Description');?></th>
+ </tr>
<?php
$i = 0;
- foreach ($a_vlans as $vlan):
+ foreach ($a_vlans as $vlan) {
?>
- <tr ondblclick="document.location='interfaces_vlan_edit.php?id=<?=$i;?>'">
- <td class="listlr">
- <?=htmlspecialchars($vlan['if']);?>
- </td>
- <td class="listr">
- <?=htmlspecialchars($vlan['tag']);?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($vlan['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap"> <a href="interfaces_vlan_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;<a href="interfaces_vlan.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this VLAN?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
-<?php
- $i++;
- endforeach;
+ <tr>
+ <td><?=htmlspecialchars($vlan['if']);?></td>
+ <td><?=htmlspecialchars($vlan['tag']);?></td>
+ <td><?=htmlspecialchars($vlan['descr']);?></td>
+ <td>
+ <a class="btn btn-primary btn-xs" role="button" href="interfaces_vlan_edit.php?id=<?=$i?>"><?=gettext('Edit')?></a>
+ <a class="btn btn-danger btn-xs" role="button" href="interfaces_vlan.php?act=del&amp;id=<?=$i?>"><?=gettext('Delete')?></a></td>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ }
?>
- <tr>
- <td class="list" colspan="3">&nbsp;</td>
- <td class="list"> <a href="interfaces_vlan_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- <tr>
- <td colspan="3" class="list"><p class="vexpl">
- <span class="red"><strong>
- <?=gettext("Note:");?><br />
- </strong></span>
- <?php printf(gettext("Not all drivers/NICs support 802.1Q VLAN tagging properly. On cards that do not explicitly support it, VLAN tagging will still work, but the reduced MTU may cause problems. See the %s handbook for information on supported cards."), $g['product_name']);?> </p>
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </table>
+ <nav class="action-buttons">
+ <a class="btn btn-success" role="button" href="interfaces_vlan_edit.php"><?=gettext('Add VLAN'); ?></a>
+ </nav>
+</div>
+<?php
+include("foot.inc");
diff --git a/src/usr/local/www/interfaces_vlan_edit.php b/src/usr/local/www/interfaces_vlan_edit.php
index dd9f1a7..0bf223a 100644
--- a/src/usr/local/www/interfaces_vlan_edit.php
+++ b/src/usr/local/www/interfaces_vlan_edit.php
@@ -42,15 +42,8 @@
require("guiconfig.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_vlan.php');
-}
-
-if (!is_array($config['vlans']['vlan'])) {
+if (!is_array($config['vlans']['vlan']))
$config['vlans']['vlan'] = array();
-}
$a_vlans = &$config['vlans']['vlan'];
@@ -132,9 +125,8 @@ if ($_POST) {
pfSense_interface_destroy("{$a_vlans[$id]['if']}_vlan{$a_vlans[$id]['tag']}");
$confif = convert_real_interface_to_friendly_interface_name("{$a_vlans[$id]['if']}_vlan{$a_vlans[$id]['tag']}");
}
- if ($confif <> "") {
+ if ($confif != "")
$config['interfaces'][$confif]['if'] = "{$_POST['if']}_vlan{$_POST['tag']}";
- }
}
}
$vlan = array();
@@ -142,7 +134,6 @@ if ($_POST) {
$vlan['tag'] = $_POST['tag'];
$vlan['descr'] = $_POST['descr'];
$vlan['vlanif'] = "{$_POST['if']}_vlan{$_POST['tag']}";
-
$vlan['vlanif'] = interface_vlan_configure($vlan);
if ($vlan['vlanif'] == "" || !stristr($vlan['vlanif'], "vlan")) {
$input_errors[] = gettext("Error occurred creating interface, please retry.");
@@ -155,10 +146,8 @@ if ($_POST) {
write_config();
- if ($confif <> "") {
+ if ($confif != "")
interface_configure($confif);
- }
-
header("Location: interfaces_vlan.php");
exit;
}
@@ -169,68 +158,66 @@ $pgtitle = array(gettext("Interfaces"), gettext("VLAN"), gettext("Edit"));
$shortcut_section = "interfaces";
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="interfaces_vlan_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces vlan edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("VLAN configuration");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface");?></td>
- <td width="78%" class="vtable">
- <select name="if" class="formselect">
- <?php
- foreach ($portlist as $ifn => $ifinfo) {
- if (is_jumbo_capable($ifn)) {
- echo "<option value=\"{$ifn}\"";
- if ($ifn == $pconfig['if']) {
- echo " selected=\"selected\"";
- }
- echo ">";
- echo htmlspecialchars($ifn . " (" . $ifinfo['mac'] . ")");
- echo "</option>";
- }
- }
- ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Only VLAN capable interfaces will be shown.");?></span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("VLAN tag ");?></td>
- <td class="vtable">
- <input name="tag" type="text" class="formfld unknown" id="tag" size="6" value="<?=htmlspecialchars($pconfig['tag']);?>" />
- <br />
- <span class="vexpl"><?=gettext("802.1Q VLAN tag (between 1 and 4094) ");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="vlanif" value="<?=htmlspecialchars($pconfig['vlanif']); ?>" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_vlans[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if ($input_errors) {
+ print_input_errors($input_errors);
+}
+
+require('classes/Form.class.php');
+$form = new Form;
+$section = new Form_Section('Interface VLAN Edit');
+
+$section->addInput(new Form_Select(
+ 'if',
+ 'Parent Interface',
+ $pconfig['if'],
+ array_combine(
+ array_keys($portlist),
+ array_map(
+ function($key, $value) {
+ return (is_jumbo_capable($key)) ? "{$key} ({$value['mac']})" : $value;
+ },
+ array_keys($portlist),
+ array_values($portlist)
+ )
+ ),
+ false
+))->setWidth(6)->setHelp('Only VLAN capable interfaces will be shown.');
+
+$section->addInput(new Form_Input(
+ 'tag',
+ 'VLAN Tag',
+ 'text',
+ $pconfig['tag'],
+ ['placeholder' => '1']
+))->setWidth(6)->setHelp(gettext('802.1Q VLAN tag (between 1 and 4094).'));
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr'],
+ ['placeholder' => 'Description']
+))->setWidth(6)->setHelp('You may enter a group description here '.
+ 'for your reference (not parsed).');
+
+$form->addGlobal(new Form_Input(
+ 'vlanif',
+ 'vlanif',
+ 'hidden',
+ $pconfig['vlanif']
+));
+
+if (isset($id) && $a_vlans[$id]) {
+ $form->addGlobal(new Form_Input(
+ 'id',
+ 'id',
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+print $form;
+
+include("foot.inc");
+
diff --git a/src/usr/local/www/interfaces_wireless.php b/src/usr/local/www/interfaces_wireless.php
index 86fc077..cb90387 100644
--- a/src/usr/local/www/interfaces_wireless.php
+++ b/src/usr/local/www/interfaces_wireless.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: interfaces_assign
+ pfSense_MODULE: interfaces_assign
*/
##|+PRIV
@@ -54,6 +54,7 @@ function clone_inuse($num) {
global $config, $a_clones;
$iflist = get_configured_interface_list(false, true);
+
foreach ($iflist as $if) {
if ($config['interfaces'][$if]['if'] == $a_clones[$num]['cloneif']) {
return true;
@@ -83,78 +84,66 @@ $pgtitle = array(gettext("Interfaces"), gettext("Wireless"));
$shortcut_section = "wireless";
include("head.inc");
-?>
+if ($input_errors)
+ print_input_errors($input_errors); ?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces wireless">
- <tr><td>
<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
- $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
- $tab_array[2] = array(gettext("Wireless"), true, "interfaces_wireless.php");
- $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
- $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
- $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
- $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
- $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
- $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
- $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
- display_top_tabs($tab_array);
+$tab_array = array();
+$tab_array[] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+$tab_array[] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+$tab_array[] = array(gettext("Wireless"), true, "interfaces_wireless.php");
+$tab_array[] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+$tab_array[] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+$tab_array[] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+$tab_array[] = array(gettext("GRE"), false, "interfaces_gre.php");
+$tab_array[] = array(gettext("GIF"), false, "interfaces_gif.php");
+$tab_array[] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+$tab_array[] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+display_top_tabs($tab_array);
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main table">
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Interface");?></td>
- <td width="20%" class="listhdrr"><?=gettext("Mode");?></td>
- <td width="50%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list"></td>
- </tr>
+
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Interface"); ?></th>
+ <th><?=gettext("Mode"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- $i = 0;
- foreach ($a_clones as $clone):
+
+$i = 0;
+
+foreach ($a_clones as $clone) {
?>
- <tr ondblclick="document.location='interfaces_wireless_edit.php?id=<?=$i;?>'">
- <td class="listlr">
- <?=htmlspecialchars($clone['cloneif']);?>
- </td>
- <td class="listr">
- <?= $wlan_modes[$clone['mode']]; ?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($clone['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap"> <a href="interfaces_wireless_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" ></a>
- &nbsp;<a href="interfaces_wireless.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this wireless clone?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
+ <tr>
+ <td>
+ <?=htmlspecialchars($clone['cloneif'])?>
+ </td>
+ <td>
+ <?= $wlan_modes[$clone['mode']]; ?>
+ </td>
+ <td>
+ <?=htmlspecialchars($clone['descr'])?>
+ </td>
+ <td>
+ <a href="interfaces_wireless_edit.php?id=<?=$i?>" class="btn btn-default btn-xs"><?=gettext("Edit")?></a>
+ <a href="interfaces_wireless.php?act=del&amp;id=<?=$i?>" class="btn btn-danger btn-xs"><?=gettext("Delete")?></a>
+ </td>
+ </tr>
<?php
- $i++;
- endforeach;
+ $i++;
+}
?>
- <tr>
- <td class="list" colspan="3">&nbsp;</td>
- <td class="list"> <a href="interfaces_wireless_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="edit" /></a></td>
- </tr>
- <tr>
- <td colspan="3" class="list"><p class="vexpl">
- <span class="red"><strong>
- <?=gettext("Note");?>:<br />
- </strong></span>
- <?=gettext("Here you can configure clones of wireless interfaces, which can be assigned as separate independent interfaces. Only available on wireless chipsets that support this, with limitations on the number that can be created in each mode.");?></p>
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </tbody>
+ </table>
+
+ <nav class="action-buttons">
+ <a href="interfaces_wireless_edit.php" class="btn btn-success"><?=gettext("Add")?></a>
+ </nav>
+</div>
+<?php
+include("foot.inc");
diff --git a/src/usr/local/www/interfaces_wireless_edit.php b/src/usr/local/www/interfaces_wireless_edit.php
index 6ccce5c..52d26ff 100644
--- a/src/usr/local/www/interfaces_wireless_edit.php
+++ b/src/usr/local/www/interfaces_wireless_edit.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -41,18 +41,11 @@
require("guiconfig.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_wireless.php');
-}
-
-if (!is_array($config['wireless'])) {
+if (!is_array($config['wireless']))
$config['wireless'] = array();
-}
-if (!is_array($config['wireless']['clone'])) {
+
+if (!is_array($config['wireless']['clone']))
$config['wireless']['clone'] = array();
-}
$a_clones = &$config['wireless']['clone'];
@@ -90,7 +83,6 @@ if (isset($id) && $a_clones[$id]) {
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -111,6 +103,7 @@ if ($_POST) {
$clone['cloneif'] = $a_clones[$id]['cloneif'];
}
}
+
if (!$clone['cloneif']) {
$clone_id = 1;
do {
@@ -135,9 +128,10 @@ if ($_POST) {
}
}
}
+
if (!$input_errors) {
if (!interface_wireless_clone($clone['cloneif'], $clone)) {
- $input_errors[] = sprintf(gettext('Error creating interface with mode %1$s. The %2$s interface may not support creating more clones with the selected mode.'), $wlan_modes[$clone['mode']], $clone['if']);
+ $input_errors[] = sprintf(gettext('Error creating interface with mode %1$s. The %2$s interface may not support creating more clones with the selected mode.'), $wlan_modes[$clone['mode']], $clone['if']);
} else {
if (isset($id) && $a_clones[$id]) {
if ($clone['if'] != $a_clones[$id]['if']) {
@@ -160,71 +154,79 @@ if ($_POST) {
}
}
-$pgtitle = array(gettext("Interfaces"), gettext("Wireless"), gettext("Edit"));
+function build_parent_list() {
+ global $g;
+
+ $parentlist = array();
+ $portlist = get_possible_listen_ips();
+ $count = 0;
+ foreach ($portlist as $ifn => $ifinfo) {
+ if (preg_match($g['wireless_regex'], $ifn)) {
+ $parentlist[$ifn] = htmlspecialchars($ifn . '(' . $ifinfo['mac'] . ')');
+ $count++;
+ }
+ }
+
+ if($count > 0)
+ return($parentlist);
+ else
+ return(array('0' => gettext('None available')));
+}
+
+$pgtitle = array(gettext("Interfaces"),gettext("Wireless"),gettext("Edit"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="interfaces_wireless_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces wireless edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Wireless clone configuration");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface");?></td>
- <td width="78%" class="vtable">
- <select name="if" class="formselect">
- <?php
- foreach ($portlist as $ifn => $ifinfo) {
- if (preg_match($g['wireless_regex'], $ifn)) {
- echo "<option value=\"{$ifn}\"";
- if ($ifn == $pconfig['if']) {
- echo " selected=\"selected\"";
- }
- echo ">";
- echo htmlspecialchars($ifn . " (" . $ifinfo['mac'] . ")");
- echo "</option>";
- }
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Mode");?></td>
- <td class="vtable">
- <select name="mode" class="formselect">
- <option <?php if ($pconfig['mode'] == 'bss') echo "selected=\"selected\"";?> value="bss"><?=gettext("Infrastructure (BSS)");?></option>
- <option <?php if ($pconfig['mode'] == 'adhoc') echo "selected=\"selected\"";?> value="adhoc"><?=gettext("Ad-hoc (IBSS)");?></option>
- <option <?php if ($pconfig['mode'] == 'hostap') echo "selected=\"selected\"";?> value="hostap"><?=gettext("Access Point");?></option>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="cloneif" value="<?=htmlspecialchars($pconfig['cloneif']); ?>" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_clones[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Wireless Interface');
+
+$section->addInput(new Form_Select(
+ 'parent',
+ 'Parent Interface',
+ $pconfig['if'],
+ build_parent_list()
+));
+
+$section->addInput(new Form_Select(
+ 'mode',
+ 'Mode',
+ $pconfig['mode'],
+ array(
+ 'bss' => 'Infrastructure (BSS)',
+ 'adhoc' => 'Ad-hoc (IBSS)',
+ 'hostap' => 'Access Point'
+ )
+));
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$section->addInput(new Form_Input(
+ 'cloneif',
+ null,
+ 'hidden',
+ $pconfig['cloneif']
+));
+
+if (isset($id) && $a_clones[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/autosuggest.js b/src/usr/local/www/javascript/autosuggest.js
deleted file mode 100644
index d9b5ac0..0000000
--- a/src/usr/local/www/javascript/autosuggest.js
+++ /dev/null
@@ -1,337 +0,0 @@
-
-/**
- * An autosuggest textbox control.
- * @class
- * @scope public
- */
-function AutoSuggestControl(oTextbox /*:HTMLInputElement*/,
- oProvider /*:SuggestionProvider*/) {
-
- /**
- * The currently selected suggestions.
- * @scope private
- */
- this.cur /*:int*/ = -1;
-
- /**
- * The dropdown list layer.
- * @scope private
- */
- this.layer = null;
-
- /**
- * Suggestion provider for the autosuggest feature.
- * @scope private.
- */
- this.provider /*:SuggestionProvider*/ = oProvider;
-
- /**
- * The textbox to capture.
- * @scope private
- */
- this.textbox /*:HTMLInputElement*/ = oTextbox;
-
- //initialize the control
- this.init();
-
-}
-
-/**
- * Autosuggests one or more suggestions for what the user has typed.
- * If no suggestions are passed in, then no autosuggest occurs.
- * @scope private
- * @param aSuggestions An array of suggestion strings.
- * @param bTypeAhead If the control should provide a type ahead suggestion.
- */
-AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/,
- bTypeAhead /*:boolean*/) {
-
- //make sure there's at least one suggestion
- if (aSuggestions.length > 0) {
- if (bTypeAhead) {
- this.typeAhead(aSuggestions[0]);
- }
-
- this.showSuggestions(aSuggestions);
- } else {
- this.hideSuggestions();
- }
-};
-
-/**
- * Creates the dropdown layer to display multiple suggestions.
- * @scope private
- */
-AutoSuggestControl.prototype.createDropDown = function () {
-
- var oThis = this;
-
- //create the layer and assign styles
- this.layer = document.createElement("div");
- this.layer.className = "suggestions";
- this.layer.style.visibility = "hidden";
- this.layer.style.width = this.textbox.offsetWidth;
-
- //when the user clicks on the a suggestion, get the text (innerHTML)
- //and place it into a textbox
- this.layer.onmousedown =
- this.layer.onmouseup =
- this.layer.onmouseover = function (oEvent) {
- oEvent = oEvent || window.event;
- oTarget = oEvent.target || oEvent.srcElement;
-
- if (oEvent.type == "mousedown") {
- oThis.textbox.value = oTarget.firstChild.nodeValue;
- oThis.hideSuggestions();
- } else if (oEvent.type == "mouseover") {
- oThis.highlightSuggestion(oTarget);
- } else {
- oThis.textbox.focus();
- }
- };
-
-
- document.body.appendChild(this.layer);
-};
-
-/**
- * Gets the left coordinate of the textbox.
- * @scope private
- * @return The left coordinate of the textbox in pixels.
- */
-AutoSuggestControl.prototype.getLeft = function () /*:int*/ {
-
- var oNode = this.textbox;
- var iLeft = 0;
-
- while(oNode.tagName != "BODY") {
- iLeft += oNode.offsetLeft;
- oNode = oNode.offsetParent;
- }
-
- return iLeft;
-};
-
-/**
- * Gets the top coordinate of the textbox.
- * @scope private
- * @return The top coordinate of the textbox in pixels.
- */
-AutoSuggestControl.prototype.getTop = function () /*:int*/ {
-
- var oNode = this.textbox;
- var iTop = 0;
-
- while(oNode.tagName != "BODY") {
- iTop += oNode.offsetTop;
- oNode = oNode.offsetParent;
- }
-
- return iTop;
-};
-
-/**
- * Handles three keydown events.
- * @scope private
- * @param oEvent The event object for the keydown event.
- */
-AutoSuggestControl.prototype.handleKeyDown = function (oEvent /*:Event*/) {
-
- switch(oEvent.keyCode) {
- case 38: //up arrow
- this.previousSuggestion();
- break;
- case 40: //down arrow
- this.nextSuggestion();
- break;
- case 13: //enter
- this.hideSuggestions();
- break;
- }
-
-};
-
-/**
- * Handles keyup events.
- * @scope private
- * @param oEvent The event object for the keyup event.
- */
-AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) {
-
- var iKeyCode = oEvent.keyCode;
-
- //for backspace (8) and delete (46), shows suggestions without typeahead
- if (iKeyCode == 8 || iKeyCode == 46) {
- this.provider.requestSuggestions(this, false);
-
- //make sure not to interfere with non-character keys
- } else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) {
- //ignore
- } else {
- //request suggestions from the suggestion provider with typeahead
- this.provider.requestSuggestions(this, true);
- }
-};
-
-/**
- * Hides the suggestion dropdown.
- * @scope private
- */
-AutoSuggestControl.prototype.hideSuggestions = function () {
- this.layer.style.visibility = "hidden";
-};
-
-/**
- * Highlights the given node in the suggestions dropdown.
- * @scope private
- * @param oSuggestionNode The node representing a suggestion in the dropdown.
- */
-AutoSuggestControl.prototype.highlightSuggestion = function (oSuggestionNode) {
-
- for (var i=0; i < this.layer.childNodes.length; i++) {
- var oNode = this.layer.childNodes[i];
- if (oNode == oSuggestionNode) {
- oNode.className = "current";
- } else if (oNode.className == "current") {
- oNode.className = "";
- }
- }
-};
-
-/**
- * Initializes the textbox with event handlers for
- * auto suggest functionality.
- * @scope private
- */
-AutoSuggestControl.prototype.init = function () {
-
- //save a reference to this object
- var oThis = this;
-
- //assign the onkeyup event handler
- this.textbox.onkeyup = function (oEvent) {
-
- //check for the proper location of the event object
- if (!oEvent) {
- oEvent = window.event;
- }
-
- //call the handleKeyUp() method with the event object
- oThis.handleKeyUp(oEvent);
- };
-
- //assign onkeydown event handler
- this.textbox.onkeydown = function (oEvent) {
-
- //check for the proper location of the event object
- if (!oEvent) {
- oEvent = window.event;
- }
-
- //call the handleKeyDown() method with the event object
- oThis.handleKeyDown(oEvent);
- };
-
- //assign onblur event handler (hides suggestions)
- this.textbox.onblur = function () {
- oThis.hideSuggestions();
- };
-
- //create the suggestions dropdown
- this.createDropDown();
-};
-
-/**
- * Highlights the next suggestion in the dropdown and
- * places the suggestion into the textbox.
- * @scope private
- */
-AutoSuggestControl.prototype.nextSuggestion = function () {
- var cSuggestionNodes = this.layer.childNodes;
-
- if (cSuggestionNodes.length > 0 && this.cur < cSuggestionNodes.length-1) {
- var oNode = cSuggestionNodes[++this.cur];
- this.highlightSuggestion(oNode);
- this.textbox.value = oNode.firstChild.nodeValue;
- }
-};
-
-/**
- * Highlights the previous suggestion in the dropdown and
- * places the suggestion into the textbox.
- * @scope private
- */
-AutoSuggestControl.prototype.previousSuggestion = function () {
- var cSuggestionNodes = this.layer.childNodes;
-
- if (cSuggestionNodes.length > 0 && this.cur > 0) {
- var oNode = cSuggestionNodes[--this.cur];
- this.highlightSuggestion(oNode);
- this.textbox.value = oNode.firstChild.nodeValue;
- }
-};
-
-/**
- * Selects a range of text in the textbox.
- * @scope public
- * @param iStart The start index (base 0) of the selection.
- * @param iLength The number of characters to select.
- */
-AutoSuggestControl.prototype.selectRange = function (iStart /*:int*/, iLength /*:int*/) {
-
- //use text ranges for Internet Explorer
- if (this.textbox.createTextRange) {
- var oRange = this.textbox.createTextRange();
- oRange.moveStart("character", iStart);
- oRange.moveEnd("character", iLength - this.textbox.value.length);
- oRange.select();
-
- //use setSelectionRange() for Mozilla
- } else if (this.textbox.setSelectionRange) {
- this.textbox.setSelectionRange(iStart, iLength);
- }
-
- //set focus back to the textbox
- this.textbox.focus();
-};
-
-/**
- * Builds the suggestion layer contents, moves it into position,
- * and displays the layer.
- * @scope private
- * @param aSuggestions An array of suggestions for the control.
- */
-AutoSuggestControl.prototype.showSuggestions = function (aSuggestions /*:Array*/) {
-
- var oDiv = null;
- this.layer.innerHTML = ""; //clear contents of the layer
-
- for (var i=0; i < aSuggestions.length; i++) {
- oDiv = document.createElement("div");
- oDiv.appendChild(document.createTextNode(aSuggestions[i]));
- this.layer.appendChild(oDiv);
- }
-
- this.layer.style.left = this.getLeft() + "px";
- this.layer.style.top = (this.getTop()+this.textbox.offsetHeight) + "px";
- this.layer.style.width = this.textbox.offsetWidth + "px";
- this.layer.style.visibility = "visible";
-
-};
-
-/**
- * Inserts a suggestion into the textbox, highlighting the
- * suggested part of the text.
- * @scope private
- * @param sSuggestion The suggestion for the textbox.
- */
-AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) {
-
- //check for support of typeahead functionality
- if (this.textbox.createTextRange || this.textbox.setSelectionRange){
- var iLen = this.textbox.value.length;
- this.textbox.value = sSuggestion;
- this.selectRange(iLen, sSuggestion.length);
- }
-};
-
diff --git a/src/usr/local/www/javascript/base64.js b/src/usr/local/www/javascript/base64.js
deleted file mode 100644
index 48d5f33..0000000
--- a/src/usr/local/www/javascript/base64.js
+++ /dev/null
@@ -1,142 +0,0 @@
-/**
- *
- * Base64 encode / decode
- * http://www.webtoolkit.info/
- * http://www.webtoolkit.info/licence
- **/
-
-var Base64 = {
-
- // private property
- _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
-
- // public method for encoding
- encode : function (input) {
- var output = "";
- var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
- var i = 0;
-
- input = Base64._utf8_encode(input);
-
- while (i < input.length) {
-
- chr1 = input.charCodeAt(i++);
- chr2 = input.charCodeAt(i++);
- chr3 = input.charCodeAt(i++);
-
- enc1 = chr1 >> 2;
- enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
- enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
- enc4 = chr3 & 63;
-
- if (isNaN(chr2)) {
- enc3 = enc4 = 64;
- } else if (isNaN(chr3)) {
- enc4 = 64;
- }
-
- output = output +
- this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
- this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
-
- }
-
- return output;
- },
-
- // public method for decoding
- decode : function (input) {
- var output = "";
- var chr1, chr2, chr3;
- var enc1, enc2, enc3, enc4;
- var i = 0;
-
- input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
-
- while (i < input.length) {
-
- enc1 = this._keyStr.indexOf(input.charAt(i++));
- enc2 = this._keyStr.indexOf(input.charAt(i++));
- enc3 = this._keyStr.indexOf(input.charAt(i++));
- enc4 = this._keyStr.indexOf(input.charAt(i++));
-
- chr1 = (enc1 << 2) | (enc2 >> 4);
- chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
- chr3 = ((enc3 & 3) << 6) | enc4;
-
- output = output + String.fromCharCode(chr1);
-
- if (enc3 != 64) {
- output = output + String.fromCharCode(chr2);
- }
- if (enc4 != 64) {
- output = output + String.fromCharCode(chr3);
- }
-
- }
-
- output = Base64._utf8_decode(output);
-
- return output;
-
- },
-
- // private method for UTF-8 encoding
- _utf8_encode : function (string) {
- string = string.replace(/\r\n/g,"\n");
- var utftext = "";
-
- for (var n = 0; n < string.length; n++) {
-
- var c = string.charCodeAt(n);
-
- if (c < 128) {
- utftext += String.fromCharCode(c);
- }
- else if((c > 127) && (c < 2048)) {
- utftext += String.fromCharCode((c >> 6) | 192);
- utftext += String.fromCharCode((c & 63) | 128);
- }
- else {
- utftext += String.fromCharCode((c >> 12) | 224);
- utftext += String.fromCharCode(((c >> 6) & 63) | 128);
- utftext += String.fromCharCode((c & 63) | 128);
- }
-
- }
-
- return utftext;
- },
-
- // private method for UTF-8 decoding
- _utf8_decode : function (utftext) {
- var string = "";
- var i = 0;
- var c = c1 = c2 = 0;
-
- while ( i < utftext.length ) {
-
- c = utftext.charCodeAt(i);
-
- if (c < 128) {
- string += String.fromCharCode(c);
- i++;
- }
- else if((c > 191) && (c < 224)) {
- c2 = utftext.charCodeAt(i+1);
- string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
- i += 2;
- }
- else {
- c2 = utftext.charCodeAt(i+1);
- c3 = utftext.charCodeAt(i+2);
- string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
- i += 3;
- }
-
- }
-
- return string;
- }
-
-}; \ No newline at end of file
diff --git a/src/usr/local/www/javascript/carp_status/carp_status.js b/src/usr/local/www/javascript/carp_status/carp_status.js
deleted file mode 100644
index c14201d..0000000
--- a/src/usr/local/www/javascript/carp_status/carp_status.js
+++ /dev/null
@@ -1,5 +0,0 @@
-
-window.onLoad = function () {
- NiftyCheck();
- Rounded("div#mainlevel","all","#FFF","#eeeeee","smooth");
-};
diff --git a/src/usr/local/www/javascript/chosen/chosen-sprite.png b/src/usr/local/www/javascript/chosen/chosen-sprite.png
deleted file mode 100644
index 6ec9bbf..0000000
--- a/src/usr/local/www/javascript/chosen/chosen-sprite.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/chosen/chosen.css b/src/usr/local/www/javascript/chosen/chosen.css
deleted file mode 100644
index d2b1eb4..0000000
--- a/src/usr/local/www/javascript/chosen/chosen.css
+++ /dev/null
@@ -1,317 +0,0 @@
-div.chzn-container {
- font-size: 13px;
- position: relative;
-}
-
-div.chzn-container input {
- background: #fff;
- background: -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
- background: -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
- background: -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
- border: 1px solid #aaa;
- font-family: sans-serif;
- font-size: 1em;
- margin: 0px;
- padding: 4px 5px;
- outline: none;
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- -o-border-radius: 3px;
- -ms-border-radius: 3px;
- -khtml-border-radius: 3px;
- border-radius: 3px;
-}
-div.chzn-container textarea:focus {
- border-color: #058cf5;
- -moz-box-shadow: 0px 0px 3px #aaa;
- -webkit-box-shadow: 0px 0px 3px #aaa;
- box-shadow: 0px 0px 3px #aaa;
-}
-
-
-div.chzn-container div.chzn-drop {
- background: #FFF;
- border: 1px solid #aaa;
- border-width: 0 1px 1px;
- left: 0;
- position: absolute;
- top: 29px;
- -webkit-box-shadow: 0px 4px 5px rgba(0, 0, 0, 0.15);
- -moz-box-shadow: 0px 4px 5px rgba(0, 0, 0, 0.15);
- box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.15);
- z-index: 20;
-}
-div.chzn-container-single div.chzn-drop {
- -moz-border-radius: 0 0 4px 4px;
- -webkit-border-radius: 0 0 4px 4px;
- -o-border-radius: 0 0 4px 4px;
- -ms-border-radius: 0 0 4px 4px;
- -khtml-border-radius: 0 0 4px 4px;
- border-radius: 0 0 4px 4px;
-}
-
-
-/* SINGLE */
-div.chzn-container a.chzn-single {
- background: #FFF;
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white));
- background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%);
- background-image: -o-linear-gradient(bottom, #eeeeee 0%, white 50%);
- border: 1px solid #aaa;
- display: block;
- overflow: hidden;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- -o-border-radius: 4px;
- -ms-border-radius: 4px;
- -khtml-border-radius: 4px;
- border-radius: 4px;
- height: 25px;
- color: #444;
- line-height: 26px;
- padding: 0px 0px 0px 8px;
- position: relative;
- text-decoration: none;
- z-index: 19;
- white-space: nowrap;
-}
-div.chzn-container a.chzn-single span {
- display: block;
- margin-right: 26px;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-div.chzn-container a.chzn-single div {
- -moz-border-radius-topright: 4px;
- -webkit-border-top-right-radius: 4px;
- -o-border-top-right-radius: 4px;
- -ms-border-top-right-radius: 4px;
- -khtml-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -moz-border-radius-bottomright: 4px;
- -webkit-border-bottom-right-radius: 4px;
- -o-border-bottom-right-radius: 4px;
- -ms-border-bottom-right-radius: 4px;
- -khtml-border-bottom-right-radius: 4px;
- border-bottom-right-radius: 4px;
- background: #ccc;
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
- background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
- background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%);
- border-left: 1px solid #aaa;
- display: block;
- height: 100%;
- position: absolute;
- right: 0;
- top: 0;
- width: 18px;
-}
-div.chzn-container a.chzn-single div b {
- background: url('chosen-sprite.png') no-repeat 0 1px;
- display: block;
- width: 100%;
- height: 100%;
-}
-div.chzn-container div.chzn-search {
- padding: 3px 4px;
- margin: 0px;
- white-space: nowrap;
-}
-div.chzn-container div.chzn-search input {
- background: url('chosen-sprite.png') no-repeat 97% -35px, #ffffff;
- background: url('chosen-sprite.png') no-repeat 97% -35px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
- background: url('chosen-sprite.png') no-repeat 97% -35px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
- background: url('chosen-sprite.png') no-repeat 97% -35px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- -o-border-radius: 0px;
- -ms-border-radius: 0px;
- -khtml-border-radius: 0px;
- border-radius: 0px;
- margin: 1px 0;
- outline: 0;
-}
-
-
-/* Multi */
-div.chzn-container ul.chzn-choices {
- background: #fff;
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
- background-image: -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
- background-image: -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
- margin: 0;
- cursor: text;
- border: 1px solid #aaa;
- overflow: hidden;
- height: auto !important;
- height: 1%;
- padding: 0;
- position: relative;
-}
-div.chzn-container ul.chzn-choices:focus {
- border-color: #058cf5;
- -moz-box-shadow: 0px 0px 5px #999;
- -webkit-box-shadow: 0px 0px 5px #999;
- box-shadow: 0px 0px 5px #999;
-}
-div.chzn-container ul.chzn-choices li {
- float: left;
- list-style-type: none;
- margin: 0px;
-}
-div.chzn-container ul.chzn-choices li.search-field {
- margin: 0px;
- white-space: nowrap;
- padding: 0px;
-}
-div.chzn-container ul.chzn-choices li.search-field input {
- color: #666;
- background: transparent !important;
- border: 0px !important;
- padding: 5px;
- margin: 1px 0;
- outline: 0;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-div.chzn-container ul.chzn-choices li.search-field input.default {
- color: #999;
-}
-div.chzn-container ul.chzn-choices li.search-choice {
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
- background: #e4e4e4;
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e4e4e4), color-stop(0.7, #eeeeee));
- background-image: -moz-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%);
- background-image: -o-linear-gradient(bottom, #e4e4e4 0%, #eeeeee 70%);
- color: #333;
- border: 1px solid #b4b4b4;
- line-height: 13px;
- padding: 3px 19px 3px 6px;
- position: relative;
- margin: 3px 0px 3px 5px;
-}
-div.chzn-container ul.chzn-choices li.search-choice span {
- cursor: default;
-}
-div.chzn-container ul.chzn-choices li.search-choice.search-choice-focus {
- background: #d4d4d4;
-}
-div.chzn-container ul.chzn-choices li.search-choice a.search-choice-close {
- position: absolute;
- right: 5px;
- top: 6px;
- display: block;
- width: 8px;
- height: 9px;
- font-size: 1px;
- background: url(chosen-sprite.png) right top no-repeat;
-}
-div.chzn-container ul.chzn-choices li.search-choice a.search-choice-close:hover {
- background-position: right -9px;
-}
-div.chzn-container ul.chzn-choices li.search-choice.search-choice-focus a.search-choice-close {
- background-position: right -9px;
-}
-
-
-/* Results */
-div.chzn-container ul.chzn-results {
- margin: 0 4px 4px 0;
- max-height: 190px;
- padding: 0 0 0 4px;
- position: relative;
- overflow-x: hidden;
- overflow-y: auto;
- z-index: 20;
-}
-div.chzn-container-multi ul.chzn-results {
- margin: -1px 0 0;
- padding: 0;
-}
-div.chzn-container-multi ul.chzn-results li {
- border-left: 0px !important;
- border-right: 0px !important;
-}
-div.chzn-container ul.chzn-results li {
- line-height: 80%;
- padding: 7px 7px 8px;
- z-index: 22;
- margin: 0;
- list-style-type: none;
-}
-div.chzn-container ul.chzn-results li.active-result {
- cursor: pointer;
-}
-div.chzn-container ul.chzn-results li em {
- font-style: normal;
- background: #FEFFDC;
-}
-div.chzn-container ul.chzn-results li.highlighted {
- background: #3875d7;
- color: #fff;
-}
-div.chzn-container ul.chzn-results li.highlighted em {
- background: transparent;
-}
-div.chzn-container ul.chzn-results li.no-results {
- background: #F4F4F4;
-}
-div.chzn-container ul.chzn-results li.group-result {
- cursor: default;
- color: #999;
- font-weight: bold;
-}
-div.chzn-container ul.chzn-results li.group-option {
- padding-left: 20px;
-}
-
-div.chzn-container-multi div.chzn-drop li.result-selected {
- display: none;
-}
-
-
-
-/* Active */
-div.chzn-container-active a.chzn-single {
- -webkit-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
- -moz-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
- box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
- border: 1px solid #5897fb;
-}
-div.chzn-container-active a.chzn-single-with-drop {
- border: 1px solid #aaa;
- border-width: 1px 1px 1px;
- -moz-box-shadow: 0px 1px 0px #FFF inset;
- -webkit-box-shadow: 0px 1px 0px #FFF inset;
- box-shadow: 0px 1px 0px #FFF inset;
- background: #EEE;
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee));
- background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%);
- background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%);
- -webkit-border-bottom-left-radius: 0px;
- -webkit-border-bottom-right-radius: 0px;
- -moz-border-radius-bottomleft: 0px;
- -moz-border-radius-bottomright: 0px;
- border-bottom-left-radius: 0px;
- border-bottom-right-radius: 0px;
-}
-div.chzn-container-active a.chzn-single-with-drop div {
- background: transparent;
- border-left: none;
-}
-div.chzn-container-active a.chzn-single-with-drop div b {
- background-position: -18px 1px;
-}
-div.chzn-container-active ul.chzn-choices {
- z-index: 21;
- -webkit-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
- -moz-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
- box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
- border: 1px solid #5897fb;
-}
-div.chzn-container-active ul.chzn-choices input {
- color: #111 !important;
-}
diff --git a/src/usr/local/www/javascript/chosen/chosen.jquery.js b/src/usr/local/www/javascript/chosen/chosen.jquery.js
deleted file mode 100644
index 21e822a..0000000
--- a/src/usr/local/www/javascript/chosen/chosen.jquery.js
+++ /dev/null
@@ -1,755 +0,0 @@
-(function() {
- /*
- Chosen, a Select Box Enhancer for jQuery and Protoype
- by Patrick Filler for Harvest, http://getharvest.com
-
- Available for use under the MIT License, http://en.wikipedia.org/wiki/MIT_License
-
- Copyright (c) 2011 by Harvest
- */ var $, Chosen, SelectParser, get_side_border_padding, root;
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
- root = typeof exports !== "undefined" && exports !== null ? exports : this;
- $ = jQuery;
- $.fn.extend({
- chosen: function(data, options) {
- return $(this).each(function(input_field) {
- if (!($(this)).hasClass("chzn-done")) {
- return new Chosen(this, data, options);
- }
- });
- }
- });
- Chosen = (function() {
- function Chosen(elmn) {
- this.set_default_values();
- this.form_field = elmn;
- this.form_field_jq = $(this.form_field);
- this.is_multiple = this.form_field.multiple;
- this.default_text_default = this.form_field.multiple ? "Select Some Options" : "Select an Option";
- this.set_up_html();
- this.register_observers();
- this.form_field_jq.addClass("chzn-done");
- }
- Chosen.prototype.set_default_values = function() {
- this.click_test_action = __bind(function(evt) {
- return this.test_active_click(evt);
- }, this);
- this.active_field = false;
- this.mouse_on_container = false;
- this.results_showing = false;
- this.result_highlighted = null;
- this.result_single_selected = null;
- return this.choices = 0;
- };
- Chosen.prototype.set_up_html = function() {
- var container_div, dd_top, dd_width, sf_width;
- this.container_id = this.form_field.id + "_chzn";
- this.f_width = this.form_field_jq.width();
- this.default_text = this.form_field_jq.attr('title') ? this.form_field_jq.attr('title') : this.default_text_default;
- container_div = $("<div />", {
- id: this.container_id,
- "class": 'chzn-container',
- style: 'width: ' + this.f_width + 'px;'
- });
- if (this.is_multiple) {
- container_div.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');
- } else {
- container_div.html('<a href="javascript:void(0)" class="chzn-single"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" /></div><ul class="chzn-results"></ul></div>');
- }
- this.form_field_jq.hide().after(container_div);
- this.container = $('#' + this.container_id);
- this.container.addClass("chzn-container-" + (this.is_multiple ? "multi" : "single"));
- this.dropdown = this.container.find('div.chzn-drop').first();
- dd_top = this.container.height();
- dd_width = this.f_width - get_side_border_padding(this.dropdown);
- this.dropdown.css({
- "width": dd_width + "px",
- "top": dd_top + "px"
- });
- this.search_field = this.container.find('input').first();
- this.search_results = this.container.find('ul.chzn-results').first();
- this.search_field_scale();
- this.search_no_results = this.container.find('li.no-results').first();
- if (this.is_multiple) {
- this.search_choices = this.container.find('ul.chzn-choices').first();
- this.search_container = this.container.find('li.search-field').first();
- } else {
- this.search_container = this.container.find('div.chzn-search').first();
- this.selected_item = this.container.find('.chzn-single').first();
- sf_width = dd_width - get_side_border_padding(this.search_container) - get_side_border_padding(this.search_field);
- this.search_field.css({
- "width": sf_width + "px"
- });
- }
- this.results_build();
- return this.set_tab_index();
- };
- Chosen.prototype.register_observers = function() {
- this.container.click(__bind(function(evt) {
- return this.container_click(evt);
- }, this));
- this.container.mouseenter(__bind(function(evt) {
- return this.mouse_enter(evt);
- }, this));
- this.container.mouseleave(__bind(function(evt) {
- return this.mouse_leave(evt);
- }, this));
- this.search_results.click(__bind(function(evt) {
- return this.search_results_click(evt);
- }, this));
- this.search_results.mouseover(__bind(function(evt) {
- return this.search_results_mouseover(evt);
- }, this));
- this.search_results.mouseout(__bind(function(evt) {
- return this.search_results_mouseout(evt);
- }, this));
- this.form_field_jq.bind("liszt:updated", __bind(function(evt) {
- return this.results_update_field(evt);
- }, this));
- this.search_field.blur(__bind(function(evt) {
- return this.input_blur(evt);
- }, this));
- this.search_field.keyup(__bind(function(evt) {
- return this.keyup_checker(evt);
- }, this));
- this.search_field.keydown(__bind(function(evt) {
- return this.keydown_checker(evt);
- }, this));
- if (this.is_multiple) {
- this.search_choices.click(__bind(function(evt) {
- return this.choices_click(evt);
- }, this));
- return this.search_field.focus(__bind(function(evt) {
- return this.input_focus(evt);
- }, this));
- } else {
- return this.selected_item.focus(__bind(function(evt) {
- return this.activate_field(evt);
- }, this));
- }
- };
- Chosen.prototype.container_click = function(evt) {
- if (evt && evt.type === "click") {
- evt.stopPropagation();
- }
- if (!this.pending_destroy_click) {
- if (!this.active_field) {
- if (this.is_multiple) {
- this.search_field.val("");
- }
- $(document).click(this.click_test_action);
- this.results_show();
- } else if (!this.is_multiple && evt && ($(evt.target) === this.selected_item || $(evt.target).parents("a.chzn-single").length)) {
- evt.preventDefault();
- this.results_toggle();
- }
- return this.activate_field();
- } else {
- return this.pending_destroy_click = false;
- }
- };
- Chosen.prototype.mouse_enter = function() {
- return this.mouse_on_container = true;
- };
- Chosen.prototype.mouse_leave = function() {
- return this.mouse_on_container = false;
- };
- Chosen.prototype.input_focus = function(evt) {
- if (!this.active_field) {
- return setTimeout((__bind(function() {
- return this.container_click();
- }, this)), 50);
- }
- };
- Chosen.prototype.input_blur = function(evt) {
- if (!this.mouse_on_container) {
- this.active_field = false;
- return setTimeout((__bind(function() {
- return this.blur_test();
- }, this)), 100);
- }
- };
- Chosen.prototype.blur_test = function(evt) {
- if (!this.active_field && this.container.hasClass("chzn-container-active")) {
- return this.close_field();
- }
- };
- Chosen.prototype.close_field = function() {
- $(document).unbind("click", this.click_test_action);
- if (!this.is_multiple) {
- this.selected_item.attr("tabindex", this.search_field.attr("tabindex"));
- this.search_field.attr("tabindex", -1);
- }
- this.active_field = false;
- this.results_hide();
- this.container.removeClass("chzn-container-active");
- this.winnow_results_clear();
- this.clear_backstroke();
- this.show_search_field_default();
- return this.search_field_scale();
- };
- Chosen.prototype.activate_field = function() {
- if (!this.is_multiple && !this.active_field) {
- this.search_field.attr("tabindex", this.selected_item.attr("tabindex"));
- this.selected_item.attr("tabindex", -1);
- }
- this.container.addClass("chzn-container-active");
- this.active_field = true;
- this.search_field.val(this.search_field.val());
- return this.search_field.focus();
- };
- Chosen.prototype.test_active_click = function(evt) {
- if ($(evt.target).parents('#' + this.container.id).length) {
- return this.active_field = true;
- } else {
- return this.close_field();
- }
- };
- Chosen.prototype.results_build = function() {
- var content, data, startTime, _i, _len, _ref;
- startTime = new Date();
- this.parsing = true;
- this.results_data = SelectParser.select_to_array(this.form_field);
- if (this.is_multiple && this.choices > 0) {
- this.search_choices.find("li.search-choice").remove();
- this.choices = 0;
- } else if (!this.is_multiple) {
- this.selected_item.find("span").text(this.default_text);
- }
- content = '';
- _ref = this.results_data;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- data = _ref[_i];
- if (data.group) {
- content += this.result_add_group(data);
- } else if (!data.empty) {
- content += this.result_add_option(data);
- if (data.selected && this.is_multiple) {
- this.choice_build(data);
- } else if (data.selected && !this.is_multiple) {
- this.selected_item.find("span").text(data.text);
- }
- }
- }
- this.show_search_field_default();
- this.search_field_scale();
- this.search_results.html(content);
- return this.parsing = false;
- };
- Chosen.prototype.result_add_group = function(group) {
- if (!group.disabled) {
- group.dom_id = this.form_field.id + "chzn_g_" + group.array_index;
- return '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>';
- } else {
- return "";
- }
- };
- Chosen.prototype.result_add_option = function(option) {
- var classes;
- if (!option.disabled) {
- option.dom_id = this.form_field.id + "chzn_o_" + option.array_index;
- classes = option.selected && this.is_multiple ? [] : ["active-result"];
- if (option.selected) {
- classes.push("result-selected");
- }
- if (option.group_array_index != null) {
- classes.push("group-option");
- }
- return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + $("<div />").text(option.text).html() + '</li>';
- } else {
- return "";
- }
- };
- Chosen.prototype.results_update_field = function() {
- this.result_clear_highlight();
- this.result_single_selected = null;
- return this.results_build();
- };
- Chosen.prototype.result_do_highlight = function(el) {
- var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
- if (el.length) {
- this.result_clear_highlight();
- this.result_highlight = el;
- this.result_highlight.addClass("highlighted");
- maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
- visible_top = this.search_results.scrollTop();
- visible_bottom = maxHeight + visible_top;
- high_top = this.result_highlight.position().top + this.search_results.scrollTop();
- high_bottom = high_top + this.result_highlight.outerHeight();
- if (high_bottom >= visible_bottom) {
- return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
- } else if (high_top < visible_top) {
- return this.search_results.scrollTop(high_top);
- }
- }
- };
- Chosen.prototype.result_clear_highlight = function() {
- if (this.result_highlight) {
- this.result_highlight.removeClass("highlighted");
- }
- return this.result_highlight = null;
- };
- Chosen.prototype.results_toggle = function() {
- if (this.results_showing) {
- return this.results_hide();
- } else {
- return this.results_show();
- }
- };
- Chosen.prototype.results_show = function() {
- var dd_top;
- if (!this.is_multiple) {
- this.selected_item.addClass("chzn-single-with-drop");
- if (this.result_single_selected) {
- this.result_do_highlight(this.result_single_selected);
- }
- }
- dd_top = this.is_multiple ? this.container.height() : this.container.height() - 1;
- this.dropdown.css({
- "top": dd_top + "px",
- "left": 0
- });
- this.results_showing = true;
- this.search_field.focus();
- this.search_field.val(this.search_field.val());
- return this.winnow_results();
- };
- Chosen.prototype.results_hide = function() {
- if (!this.is_multiple) {
- this.selected_item.removeClass("chzn-single-with-drop");
- }
- this.result_clear_highlight();
- this.dropdown.css({
- "left": "-9000px"
- });
- return this.results_showing = false;
- };
- Chosen.prototype.set_tab_index = function(el) {
- var ti;
- if (this.form_field_jq.attr("tabindex")) {
- ti = this.form_field_jq.attr("tabindex");
- this.form_field_jq.attr("tabindex", -1);
- if (this.is_multiple) {
- return this.search_field.attr("tabindex", ti);
- } else {
- this.selected_item.attr("tabindex", ti);
- return this.search_field.attr("tabindex", -1);
- }
- }
- };
- Chosen.prototype.show_search_field_default = function() {
- if (this.is_multiple && this.choices < 1 && !this.active_field) {
- this.search_field.val(this.default_text);
- return this.search_field.addClass("default");
- } else {
- this.search_field.val("");
- return this.search_field.removeClass("default");
- }
- };
- Chosen.prototype.search_results_click = function(evt) {
- var target;
- target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
- if (target.length) {
- this.result_highlight = target;
- return this.result_select();
- }
- };
- Chosen.prototype.search_results_mouseover = function(evt) {
- var target;
- target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
- if (target) {
- return this.result_do_highlight(target);
- }
- };
- Chosen.prototype.search_results_mouseout = function(evt) {
- if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
- return this.result_clear_highlight();
- }
- };
- Chosen.prototype.choices_click = function(evt) {
- evt.preventDefault();
- if (this.active_field && !($(evt.target).hasClass("search-choice" || $(evt.target).parents('.search-choice').first)) && !this.results_showing) {
- return this.results_show();
- }
- };
- Chosen.prototype.choice_build = function(item) {
- var choice_id, link;
- choice_id = this.form_field.id + "_chzn_c_" + item.array_index;
- this.choices += 1;
- this.search_container.before('<li class="search-choice" id="' + choice_id + '"><span>' + item.text + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>');
- link = $('#' + choice_id).find("a").first();
- return link.click(__bind(function(evt) {
- return this.choice_destroy_link_click(evt);
- }, this));
- };
- Chosen.prototype.choice_destroy_link_click = function(evt) {
- evt.preventDefault();
- this.pending_destroy_click = true;
- return this.choice_destroy($(evt.target));
- };
- Chosen.prototype.choice_destroy = function(link) {
- this.choices -= 1;
- this.show_search_field_default();
- if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) {
- this.results_hide();
- }
- this.result_deselect(link.attr("rel"));
- return link.parents('li').first().remove();
- };
- Chosen.prototype.result_select = function() {
- var high, high_id, item, position;
- if (this.result_highlight) {
- high = this.result_highlight;
- high_id = high.attr("id");
- this.result_clear_highlight();
- high.addClass("result-selected");
- if (this.is_multiple) {
- this.result_deactivate(high);
- } else {
- this.result_single_selected = high;
- }
- position = high_id.substr(high_id.lastIndexOf("_") + 1);
- item = this.results_data[position];
- item.selected = true;
- this.form_field.options[item.options_index].selected = true;
- if (this.is_multiple) {
- this.choice_build(item);
- } else {
- this.selected_item.find("span").first().text(item.text);
- }
- this.results_hide();
- this.search_field.val("");
- this.form_field_jq.trigger("change");
- return this.search_field_scale();
- }
- };
- Chosen.prototype.result_activate = function(el) {
- return el.addClass("active-result").show();
- };
- Chosen.prototype.result_deactivate = function(el) {
- return el.removeClass("active-result").hide();
- };
- Chosen.prototype.result_deselect = function(pos) {
- var result, result_data;
- result_data = this.results_data[pos];
- result_data.selected = false;
- this.form_field.options[result_data.options_index].selected = false;
- result = $("#" + this.form_field.id + "chzn_o_" + pos);
- result.removeClass("result-selected").addClass("active-result").show();
- this.result_clear_highlight();
- this.winnow_results();
- this.form_field_jq.trigger("change");
- return this.search_field_scale();
- };
- Chosen.prototype.results_search = function(evt) {
- if (this.results_showing) {
- return this.winnow_results();
- } else {
- return this.results_show();
- }
- };
- Chosen.prototype.winnow_results = function() {
- var found, option, part, parts, regex, result_id, results, searchText, startTime, startpos, text, zregex, _i, _j, _len, _len2, _ref;
- startTime = new Date();
- this.no_results_clear();
- results = 0;
- searchText = this.search_field.val() === this.default_text ? "" : $.trim(this.search_field.val());
- regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
- zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
- _ref = this.results_data;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- option = _ref[_i];
- if (!option.disabled && !option.empty) {
- if (option.group) {
- $('#' + option.dom_id).hide();
- } else if (!(this.is_multiple && option.selected)) {
- found = false;
- result_id = option.dom_id;
- if (regex.test(option.text)) {
- found = true;
- results += 1;
- } else if (option.text.indexOf(" ") >= 0 || option.text.indexOf("[") === 0) {
- parts = option.text.replace(/\[|\]/g, "").split(" ");
- if (parts.length) {
- for (_j = 0, _len2 = parts.length; _j < _len2; _j++) {
- part = parts[_j];
- if (regex.test(part)) {
- found = true;
- results += 1;
- }
- }
- }
- }
- if (found) {
- if (searchText.length) {
- startpos = option.text.search(zregex);
- text = option.text.substr(0, startpos + searchText.length) + '</em>' + option.text.substr(startpos + searchText.length);
- text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
- } else {
- text = option.text;
- }
- if ($("#" + result_id).html !== text) {
- $("#" + result_id).html(text);
- }
- this.result_activate($("#" + result_id));
- if (option.group_array_index != null) {
- $("#" + this.results_data[option.group_array_index].dom_id).show();
- }
- } else {
- if (this.result_highlight && result_id === this.result_highlight.attr('id')) {
- this.result_clear_highlight();
- }
- this.result_deactivate($("#" + result_id));
- }
- }
- }
- }
- if (results < 1 && searchText.length) {
- return this.no_results(searchText);
- } else {
- return this.winnow_results_set_highlight();
- }
- };
- Chosen.prototype.winnow_results_clear = function() {
- var li, lis, _i, _len, _results;
- this.search_field.val("");
- lis = this.search_results.find("li");
- _results = [];
- for (_i = 0, _len = lis.length; _i < _len; _i++) {
- li = lis[_i];
- li = $(li);
- _results.push(li.hasClass("group-result") ? li.show() : !this.is_multiple || !li.hasClass("result-selected") ? this.result_activate(li) : void 0);
- }
- return _results;
- };
- Chosen.prototype.winnow_results_set_highlight = function() {
- var do_high;
- if (!this.result_highlight) {
- do_high = this.search_results.find(".active-result").first();
- if (do_high) {
- return this.result_do_highlight(do_high);
- }
- }
- };
- Chosen.prototype.no_results = function(terms) {
- var no_results_html;
- no_results_html = $('<li class="no-results">No results match "<span></span>"</li>');
- no_results_html.find("span").first().text(terms);
- return this.search_results.append(no_results_html);
- };
- Chosen.prototype.no_results_clear = function() {
- return this.search_results.find(".no-results").remove();
- };
- Chosen.prototype.keydown_arrow = function() {
- var first_active, next_sib;
- if (!this.result_highlight) {
- first_active = this.search_results.find("li.active-result").first();
- if (first_active) {
- this.result_do_highlight($(first_active));
- }
- } else if (this.results_showing) {
- next_sib = this.result_highlight.nextAll("li.active-result").first();
- if (next_sib) {
- this.result_do_highlight(next_sib);
- }
- }
- if (!this.results_showing) {
- return this.results_show();
- }
- };
- Chosen.prototype.keyup_arrow = function() {
- var prev_sibs;
- if (!this.results_showing && !this.is_multiple) {
- return this.results_show();
- } else if (this.result_highlight) {
- prev_sibs = this.result_highlight.prevAll("li.active-result");
- if (prev_sibs.length) {
- return this.result_do_highlight(prev_sibs.first());
- } else {
- if (this.choices > 0) {
- this.results_hide();
- }
- return this.result_clear_highlight();
- }
- }
- };
- Chosen.prototype.keydown_backstroke = function() {
- if (this.pending_backstroke) {
- this.choice_destroy(this.pending_backstroke.find("a").first());
- return this.clear_backstroke();
- } else {
- this.pending_backstroke = this.search_container.siblings("li.search-choice").last();
- return this.pending_backstroke.addClass("search-choice-focus");
- }
- };
- Chosen.prototype.clear_backstroke = function() {
- if (this.pending_backstroke) {
- this.pending_backstroke.removeClass("search-choice-focus");
- }
- return this.pending_backstroke = null;
- };
- Chosen.prototype.keyup_checker = function(evt) {
- var stroke, _ref;
- stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
- this.search_field_scale();
- switch (stroke) {
- case 8:
- if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
- return this.keydown_backstroke();
- } else if (!this.pending_backstroke) {
- this.result_clear_highlight();
- return this.results_search();
- }
- break;
- case 13:
- evt.preventDefault();
- if (this.results_showing) {
- return this.result_select();
- }
- break;
- case 27:
- if (this.results_showing) {
- return this.results_hide();
- }
- break;
- case 9:
- case 38:
- case 40:
- case 16:
- break;
- default:
- return this.results_search();
- }
- };
- Chosen.prototype.keydown_checker = function(evt) {
- var stroke, _ref;
- stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
- this.search_field_scale();
- if (stroke !== 8 && this.pending_backstroke) {
- this.clear_backstroke();
- }
- switch (stroke) {
- case 8:
- this.backstroke_length = this.search_field.val().length;
- break;
- case 9:
- this.mouse_on_container = false;
- break;
- case 13:
- evt.preventDefault();
- break;
- case 38:
- evt.preventDefault();
- this.keyup_arrow();
- break;
- case 40:
- this.keydown_arrow();
- break;
- }
- };
- Chosen.prototype.search_field_scale = function() {
- var dd_top, div, h, style, style_block, styles, w, _i, _len;
- if (this.is_multiple) {
- h = 0;
- w = 0;
- style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
- styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
- for (_i = 0, _len = styles.length; _i < _len; _i++) {
- style = styles[_i];
- style_block += style + ":" + this.search_field.css(style) + ";";
- }
- div = $('<div />', {
- 'style': style_block
- });
- div.text(this.search_field.val());
- $('body').append(div);
- w = div.width() + 25;
- div.remove();
- if (w > this.f_width - 10) {
- w = this.f_width - 10;
- }
- this.search_field.css({
- 'width': w + 'px'
- });
- dd_top = this.container.height();
- return this.dropdown.css({
- "top": dd_top + "px"
- });
- }
- };
- return Chosen;
- })();
- get_side_border_padding = function(elmt) {
- var side_border_padding;
- return side_border_padding = elmt.outerWidth() - elmt.width();
- };
- root.get_side_border_padding = get_side_border_padding;
- SelectParser = (function() {
- function SelectParser() {
- this.options_index = 0;
- this.parsed = [];
- }
- SelectParser.prototype.add_node = function(child) {
- if (child.nodeName === "OPTGROUP") {
- return this.add_group(child);
- } else {
- return this.add_option(child);
- }
- };
- SelectParser.prototype.add_group = function(group) {
- var group_position, option, _i, _len, _ref, _results;
- group_position = this.parsed.length;
- this.parsed.push({
- array_index: group_position,
- group: true,
- label: group.label,
- children: 0,
- disabled: group.disabled
- });
- _ref = group.childNodes;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- option = _ref[_i];
- _results.push(this.add_option(option, group_position, group.disabled));
- }
- return _results;
- };
- SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
- if (option.nodeName === "OPTION") {
- if (option.text !== "") {
- if (group_position != null) {
- this.parsed[group_position].children += 1;
- }
- this.parsed.push({
- array_index: this.parsed.length,
- options_index: this.options_index,
- value: option.value,
- text: option.text,
- selected: option.selected,
- disabled: group_disabled === true ? group_disabled : option.disabled,
- group_array_index: group_position
- });
- } else {
- this.parsed.push({
- array_index: this.parsed.length,
- options_index: this.options_index,
- empty: true
- });
- }
- return this.options_index += 1;
- }
- };
- return SelectParser;
- })();
- SelectParser.select_to_array = function(select) {
- var child, parser, _i, _len, _ref;
- parser = new SelectParser();
- _ref = select.childNodes;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- child = _ref[_i];
- parser.add_node(child);
- }
- return parser.parsed;
- };
- root.SelectParser = SelectParser;
-}).call(this);
diff --git a/src/usr/local/www/javascript/chosen/chosen.jquery.min.js b/src/usr/local/www/javascript/chosen/chosen.jquery.min.js
deleted file mode 100644
index ae69f22..0000000
--- a/src/usr/local/www/javascript/chosen/chosen.jquery.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
-Chosen, a Select Box Enhancer for jQuery and Protoype
-by Patrick Filler for Harvest, http://getharvest.com
-
-Available for use under the MIT License, http://en.wikipedia.org/wiki/MIT_License
-
-Copyright (c) 2011 by Harvest
-*/
-(function(){var $,Chosen,SelectParser,get_side_border_padding,root;var __bind=function(fn,me){return function(){return fn.apply(me,arguments);};};root=typeof exports!=="undefined"&&exports!==null?exports:this;$=jQuery;$.fn.extend({chosen:function(data,options){return $(this).each(function(input_field){if(!($(this)).hasClass("chzn-done")){return new Chosen(this,data,options);}});}});Chosen=(function(){function Chosen(elmn){this.set_default_values();this.form_field=elmn;this.form_field_jq=$(this.form_field);this.is_multiple=this.form_field.multiple;this.default_text_default=this.form_field.multiple?"Select Some Options":"Select an Option";this.set_up_html();this.register_observers();this.form_field_jq.addClass("chzn-done");}Chosen.prototype.set_default_values=function(){this.click_test_action=__bind(function(evt){return this.test_active_click(evt);},this);this.active_field=false;this.mouse_on_container=false;this.results_showing=false;this.result_highlighted=null;this.result_single_selected=null;return this.choices=0;};Chosen.prototype.set_up_html=function(){var container_div,dd_top,dd_width,sf_width;this.container_id=this.form_field.id+"_chzn";this.f_width=this.form_field_jq.width();this.default_text=this.form_field_jq.attr("title")?this.form_field_jq.attr("title"):this.default_text_default;container_div=$("<div />",{id:this.container_id,"class":"chzn-container",style:"width: "+this.f_width+"px;"});if(this.is_multiple){container_div.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="'+this.default_text+'" class="default" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');}else{container_div.html('<a href="javascript:void(0)" class="chzn-single"><span>'+this.default_text+'</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" /></div><ul class="chzn-results"></ul></div>');}this.form_field_jq.hide().after(container_div);this.container=$("#"+this.container_id);this.container.addClass("chzn-container-"+(this.is_multiple?"multi":"single"));this.dropdown=this.container.find("div.chzn-drop").first();dd_top=this.container.height();dd_width=this.f_width-get_side_border_padding(this.dropdown);this.dropdown.css({width:dd_width+"px",top:dd_top+"px"});this.search_field=this.container.find("input").first();this.search_results=this.container.find("ul.chzn-results").first();this.search_field_scale();this.search_no_results=this.container.find("li.no-results").first();if(this.is_multiple){this.search_choices=this.container.find("ul.chzn-choices").first();this.search_container=this.container.find("li.search-field").first();}else{this.search_container=this.container.find("div.chzn-search").first();this.selected_item=this.container.find(".chzn-single").first();sf_width=dd_width-get_side_border_padding(this.search_container)-get_side_border_padding(this.search_field);this.search_field.css({width:sf_width+"px"});}this.results_build();return this.set_tab_index();};Chosen.prototype.register_observers=function(){this.container.click(__bind(function(evt){return this.container_click(evt);},this));this.container.mouseenter(__bind(function(evt){return this.mouse_enter(evt);},this));this.container.mouseleave(__bind(function(evt){return this.mouse_leave(evt);},this));this.search_results.click(__bind(function(evt){return this.search_results_click(evt);},this));this.search_results.mouseover(__bind(function(evt){return this.search_results_mouseover(evt);},this));this.search_results.mouseout(__bind(function(evt){return this.search_results_mouseout(evt);},this));this.form_field_jq.bind("liszt:updated",__bind(function(evt){return this.results_update_field(evt);},this));this.search_field.blur(__bind(function(evt){return this.input_blur(evt);},this));this.search_field.keyup(__bind(function(evt){return this.keyup_checker(evt);},this));this.search_field.keydown(__bind(function(evt){return this.keydown_checker(evt);},this));if(this.is_multiple){this.search_choices.click(__bind(function(evt){return this.choices_click(evt);},this));return this.search_field.focus(__bind(function(evt){return this.input_focus(evt);},this));}else{return this.selected_item.focus(__bind(function(evt){return this.activate_field(evt);},this));}};Chosen.prototype.container_click=function(evt){if(evt&&evt.type==="click"){evt.stopPropagation();}if(!this.pending_destroy_click){if(!this.active_field){if(this.is_multiple){this.search_field.val("");}$(document).click(this.click_test_action);this.results_show();}else{if(!this.is_multiple&&evt&&($(evt.target)===this.selected_item||$(evt.target).parents("a.chzn-single").length)){evt.preventDefault();this.results_toggle();}}return this.activate_field();}else{return this.pending_destroy_click=false;}};Chosen.prototype.mouse_enter=function(){return this.mouse_on_container=true;};Chosen.prototype.mouse_leave=function(){return this.mouse_on_container=false;};Chosen.prototype.input_focus=function(evt){if(!this.active_field){return setTimeout((__bind(function(){return this.container_click();},this)),50);}};Chosen.prototype.input_blur=function(evt){if(!this.mouse_on_container){this.active_field=false;return setTimeout((__bind(function(){return this.blur_test();},this)),100);}};Chosen.prototype.blur_test=function(evt){if(!this.active_field&&this.container.hasClass("chzn-container-active")){return this.close_field();}};Chosen.prototype.close_field=function(){$(document).unbind("click",this.click_test_action);if(!this.is_multiple){this.selected_item.attr("tabindex",this.search_field.attr("tabindex"));this.search_field.attr("tabindex",-1);}this.active_field=false;this.results_hide();this.container.removeClass("chzn-container-active");this.winnow_results_clear();this.clear_backstroke();this.show_search_field_default();return this.search_field_scale();};Chosen.prototype.activate_field=function(){if(!this.is_multiple&&!this.active_field){this.search_field.attr("tabindex",this.selected_item.attr("tabindex"));this.selected_item.attr("tabindex",-1);}this.container.addClass("chzn-container-active");this.active_field=true;this.search_field.val(this.search_field.val());return this.search_field.focus();};Chosen.prototype.test_active_click=function(evt){if($(evt.target).parents("#"+this.container.id).length){return this.active_field=true;}else{return this.close_field();}};Chosen.prototype.results_build=function(){var content,data,startTime,_i,_len,_ref;startTime=new Date();this.parsing=true;this.results_data=SelectParser.select_to_array(this.form_field);if(this.is_multiple&&this.choices>0){this.search_choices.find("li.search-choice").remove();this.choices=0;}else{if(!this.is_multiple){this.selected_item.find("span").text(this.default_text);}}content="";_ref=this.results_data;for(_i=0,_len=_ref.length;_i<_len;_i++){data=_ref[_i];if(data.group){content+=this.result_add_group(data);}else{if(!data.empty){content+=this.result_add_option(data);if(data.selected&&this.is_multiple){this.choice_build(data);}else{if(data.selected&&!this.is_multiple){this.selected_item.find("span").text(data.text);}}}}}this.show_search_field_default();this.search_field_scale();this.search_results.html(content);return this.parsing=false;};Chosen.prototype.result_add_group=function(group){if(!group.disabled){group.dom_id=this.form_field.id+"chzn_g_"+group.array_index;return'<li id="'+group.dom_id+'" class="group-result">'+$("<div />").text(group.label).html()+"</li>";}else{return"";}};Chosen.prototype.result_add_option=function(option){var classes;if(!option.disabled){option.dom_id=this.form_field.id+"chzn_o_"+option.array_index;classes=option.selected&&this.is_multiple?[]:["active-result"];if(option.selected){classes.push("result-selected");}if(option.group_array_index!=null){classes.push("group-option");}return'<li id="'+option.dom_id+'" class="'+classes.join(" ")+'">'+$("<div />").text(option.text).html()+"</li>";}else{return"";}};Chosen.prototype.results_update_field=function(){this.result_clear_highlight();this.result_single_selected=null;return this.results_build();};Chosen.prototype.result_do_highlight=function(el){var high_bottom,high_top,maxHeight,visible_bottom,visible_top;if(el.length){this.result_clear_highlight();this.result_highlight=el;this.result_highlight.addClass("highlighted");maxHeight=parseInt(this.search_results.css("maxHeight"),10);visible_top=this.search_results.scrollTop();visible_bottom=maxHeight+visible_top;high_top=this.result_highlight.position().top+this.search_results.scrollTop();high_bottom=high_top+this.result_highlight.outerHeight();if(high_bottom>=visible_bottom){return this.search_results.scrollTop((high_bottom-maxHeight)>0?high_bottom-maxHeight:0);}else{if(high_top<visible_top){return this.search_results.scrollTop(high_top);}}}};Chosen.prototype.result_clear_highlight=function(){if(this.result_highlight){this.result_highlight.removeClass("highlighted");}return this.result_highlight=null;};Chosen.prototype.results_toggle=function(){if(this.results_showing){return this.results_hide();}else{return this.results_show();}};Chosen.prototype.results_show=function(){var dd_top;if(!this.is_multiple){this.selected_item.addClass("chzn-single-with-drop");if(this.result_single_selected){this.result_do_highlight(this.result_single_selected);}}dd_top=this.is_multiple?this.container.height():this.container.height()-1;this.dropdown.css({top:dd_top+"px",left:0});this.results_showing=true;this.search_field.focus();this.search_field.val(this.search_field.val());return this.winnow_results();};Chosen.prototype.results_hide=function(){if(!this.is_multiple){this.selected_item.removeClass("chzn-single-with-drop");}this.result_clear_highlight();this.dropdown.css({left:"-9000px"});return this.results_showing=false;};Chosen.prototype.set_tab_index=function(el){var ti;if(this.form_field_jq.attr("tabindex")){ti=this.form_field_jq.attr("tabindex");this.form_field_jq.attr("tabindex",-1);if(this.is_multiple){return this.search_field.attr("tabindex",ti);}else{this.selected_item.attr("tabindex",ti);return this.search_field.attr("tabindex",-1);}}};Chosen.prototype.show_search_field_default=function(){if(this.is_multiple&&this.choices<1&&!this.active_field){this.search_field.val(this.default_text);return this.search_field.addClass("default");}else{this.search_field.val("");return this.search_field.removeClass("default");}};Chosen.prototype.search_results_click=function(evt){var target;target=$(evt.target).hasClass("active-result")?$(evt.target):$(evt.target).parents(".active-result").first();if(target.length){this.result_highlight=target;return this.result_select();}};Chosen.prototype.search_results_mouseover=function(evt){var target;target=$(evt.target).hasClass("active-result")?$(evt.target):$(evt.target).parents(".active-result").first();if(target){return this.result_do_highlight(target);}};Chosen.prototype.search_results_mouseout=function(evt){if($(evt.target).hasClass("active-result"||$(evt.target).parents(".active-result").first())){return this.result_clear_highlight();}};Chosen.prototype.choices_click=function(evt){evt.preventDefault();if(this.active_field&&!($(evt.target).hasClass("search-choice"||$(evt.target).parents(".search-choice").first))&&!this.results_showing){return this.results_show();}};Chosen.prototype.choice_build=function(item){var choice_id,link;choice_id=this.form_field.id+"_chzn_c_"+item.array_index;this.choices+=1;this.search_container.before('<li class="search-choice" id="'+choice_id+'"><span>'+item.text+'</span><a href="javascript:void(0)" class="search-choice-close" rel="'+item.array_index+'"></a></li>');link=$("#"+choice_id).find("a").first();return link.click(__bind(function(evt){return this.choice_destroy_link_click(evt);},this));};Chosen.prototype.choice_destroy_link_click=function(evt){evt.preventDefault();this.pending_destroy_click=true;return this.choice_destroy($(evt.target));};Chosen.prototype.choice_destroy=function(link){this.choices-=1;this.show_search_field_default();if(this.is_multiple&&this.choices>0&&this.search_field.val().length<1){this.results_hide();}this.result_deselect(link.attr("rel"));return link.parents("li").first().remove();};Chosen.prototype.result_select=function(){var high,high_id,item,position;if(this.result_highlight){high=this.result_highlight;high_id=high.attr("id");this.result_clear_highlight();high.addClass("result-selected");if(this.is_multiple){this.result_deactivate(high);}else{this.result_single_selected=high;}position=high_id.substr(high_id.lastIndexOf("_")+1);item=this.results_data[position];item.selected=true;this.form_field.options[item.options_index].selected=true;if(this.is_multiple){this.choice_build(item);}else{this.selected_item.find("span").first().text(item.text);}this.results_hide();this.search_field.val("");this.form_field_jq.trigger("change");return this.search_field_scale();}};Chosen.prototype.result_activate=function(el){return el.addClass("active-result").show();};Chosen.prototype.result_deactivate=function(el){return el.removeClass("active-result").hide();};Chosen.prototype.result_deselect=function(pos){var result,result_data;result_data=this.results_data[pos];result_data.selected=false;this.form_field.options[result_data.options_index].selected=false;result=$("#"+this.form_field.id+"chzn_o_"+pos);result.removeClass("result-selected").addClass("active-result").show();this.result_clear_highlight();this.winnow_results();this.form_field_jq.trigger("change");return this.search_field_scale();};Chosen.prototype.results_search=function(evt){if(this.results_showing){return this.winnow_results();}else{return this.results_show();}};Chosen.prototype.winnow_results=function(){var found,option,part,parts,regex,result_id,results,searchText,startTime,startpos,text,zregex,_i,_j,_len,_len2,_ref;startTime=new Date();this.no_results_clear();results=0;searchText=this.search_field.val()===this.default_text?"":$.trim(this.search_field.val());regex=new RegExp("^"+searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i");zregex=new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i");_ref=this.results_data;for(_i=0,_len=_ref.length;_i<_len;_i++){option=_ref[_i];if(!option.disabled&&!option.empty){if(option.group){$("#"+option.dom_id).hide();}else{if(!(this.is_multiple&&option.selected)){found=false;result_id=option.dom_id;if(regex.test(option.text)){found=true;results+=1;}else{if(option.text.indexOf(" ")>=0||option.text.indexOf("[")===0){parts=option.text.replace(/\[|\]/g,"").split(" ");if(parts.length){for(_j=0,_len2=parts.length;_j<_len2;_j++){part=parts[_j];if(regex.test(part)){found=true;results+=1;}}}}}if(found){if(searchText.length){startpos=option.text.search(zregex);text=option.text.substr(0,startpos+searchText.length)+"</em>"+option.text.substr(startpos+searchText.length);text=text.substr(0,startpos)+"<em>"+text.substr(startpos);}else{text=option.text;}if($("#"+result_id).html!==text){$("#"+result_id).html(text);}this.result_activate($("#"+result_id));if(option.group_array_index!=null){$("#"+this.results_data[option.group_array_index].dom_id).show();}}else{if(this.result_highlight&&result_id===this.result_highlight.attr("id")){this.result_clear_highlight();}this.result_deactivate($("#"+result_id));}}}}}if(results<1&&searchText.length){return this.no_results(searchText);}else{return this.winnow_results_set_highlight();}};Chosen.prototype.winnow_results_clear=function(){var li,lis,_i,_len,_results;this.search_field.val("");lis=this.search_results.find("li");_results=[];for(_i=0,_len=lis.length;_i<_len;_i++){li=lis[_i];li=$(li);_results.push(li.hasClass("group-result")?li.show():!this.is_multiple||!li.hasClass("result-selected")?this.result_activate(li):void 0);}return _results;};Chosen.prototype.winnow_results_set_highlight=function(){var do_high;if(!this.result_highlight){do_high=this.search_results.find(".active-result").first();if(do_high){return this.result_do_highlight(do_high);}}};Chosen.prototype.no_results=function(terms){var no_results_html;no_results_html=$('<li class="no-results">No results match "<span></span>"</li>');no_results_html.find("span").first().text(terms);return this.search_results.append(no_results_html);};Chosen.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove();};Chosen.prototype.keydown_arrow=function(){var first_active,next_sib;if(!this.result_highlight){first_active=this.search_results.find("li.active-result").first();if(first_active){this.result_do_highlight($(first_active));}}else{if(this.results_showing){next_sib=this.result_highlight.nextAll("li.active-result").first();if(next_sib){this.result_do_highlight(next_sib);}}}if(!this.results_showing){return this.results_show();}};Chosen.prototype.keyup_arrow=function(){var prev_sibs;if(!this.results_showing&&!this.is_multiple){return this.results_show();}else{if(this.result_highlight){prev_sibs=this.result_highlight.prevAll("li.active-result");if(prev_sibs.length){return this.result_do_highlight(prev_sibs.first());}else{if(this.choices>0){this.results_hide();}return this.result_clear_highlight();}}}};Chosen.prototype.keydown_backstroke=function(){if(this.pending_backstroke){this.choice_destroy(this.pending_backstroke.find("a").first());return this.clear_backstroke();}else{this.pending_backstroke=this.search_container.siblings("li.search-choice").last();return this.pending_backstroke.addClass("search-choice-focus");}};Chosen.prototype.clear_backstroke=function(){if(this.pending_backstroke){this.pending_backstroke.removeClass("search-choice-focus");}return this.pending_backstroke=null;};Chosen.prototype.keyup_checker=function(evt){var stroke,_ref;stroke=(_ref=evt.which)!=null?_ref:evt.keyCode;this.search_field_scale();switch(stroke){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0){return this.keydown_backstroke();}else{if(!this.pending_backstroke){this.result_clear_highlight();return this.results_search();}}break;case 13:evt.preventDefault();if(this.results_showing){return this.result_select();}break;case 27:if(this.results_showing){return this.results_hide();}break;case 9:case 38:case 40:case 16:break;default:return this.results_search();}};Chosen.prototype.keydown_checker=function(evt){var stroke,_ref;stroke=(_ref=evt.which)!=null?_ref:evt.keyCode;this.search_field_scale();if(stroke!==8&&this.pending_backstroke){this.clear_backstroke();}switch(stroke){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.mouse_on_container=false;break;case 13:evt.preventDefault();break;case 38:evt.preventDefault();this.keyup_arrow();break;case 40:this.keydown_arrow();break;}};Chosen.prototype.search_field_scale=function(){var dd_top,div,h,style,style_block,styles,w,_i,_len;if(this.is_multiple){h=0;w=0;style_block="position:absolute; left: -1000px; top: -1000px; display:none;";styles=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(_i=0,_len=styles.length;_i<_len;_i++){style=styles[_i];style_block+=style+":"+this.search_field.css(style)+";";}div=$("<div />",{style:style_block});div.text(this.search_field.val());$("body").append(div);w=div.width()+25;div.remove();if(w>this.f_width-10){w=this.f_width-10;}this.search_field.css({width:w+"px"});dd_top=this.container.height();return this.dropdown.css({top:dd_top+"px"});}};return Chosen;})();get_side_border_padding=function(elmt){var side_border_padding;return side_border_padding=elmt.outerWidth()-elmt.width();};root.get_side_border_padding=get_side_border_padding;SelectParser=(function(){function SelectParser(){this.options_index=0;this.parsed=[];}SelectParser.prototype.add_node=function(child){if(child.nodeName==="OPTGROUP"){return this.add_group(child);}else{return this.add_option(child);}};SelectParser.prototype.add_group=function(group){var group_position,option,_i,_len,_ref,_results;group_position=this.parsed.length;this.parsed.push({array_index:group_position,group:true,label:group.label,children:0,disabled:group.disabled});_ref=group.childNodes;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){option=_ref[_i];_results.push(this.add_option(option,group_position,group.disabled));}return _results;};SelectParser.prototype.add_option=function(option,group_position,group_disabled){if(option.nodeName==="OPTION"){if(option.text!==""){if(group_position!=null){this.parsed[group_position].children+=1;}this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:option.value,text:option.text,selected:option.selected,disabled:group_disabled===true?group_disabled:option.disabled,group_array_index:group_position});}else{this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:true});}return this.options_index+=1;}};return SelectParser;})();SelectParser.select_to_array=function(select){var child,parser,_i,_len,_ref;parser=new SelectParser();_ref=select.childNodes;for(_i=0,_len=_ref.length;_i<_len;_i++){child=_ref[_i];parser.add_node(child);}return parser.parsed;};root.SelectParser=SelectParser;}).call(this); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/chosen/chosen.proto.js b/src/usr/local/www/javascript/chosen/chosen.proto.js
deleted file mode 100644
index e3c0fbd..0000000
--- a/src/usr/local/www/javascript/chosen/chosen.proto.js
+++ /dev/null
@@ -1,765 +0,0 @@
-(function() {
- /*
- Chosen, a Select Box Enhancer for jQuery and Protoype
- by Patrick Filler for Harvest, http://getharvest.com
-
- Available for use under the MIT License, http://en.wikipedia.org/wiki/MIT_License
-
- Copyright (c) 2011 by Harvest
- */ var Chosen, SelectParser, get_side_border_padding, root;
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
- root = typeof exports !== "undefined" && exports !== null ? exports : this;
- Chosen = (function() {
- function Chosen(elmn) {
- this.set_default_values();
- this.form_field = elmn;
- this.is_multiple = this.form_field.multiple;
- this.default_text_default = this.form_field.multiple ? "Select Some Options" : "Select an Option";
- this.set_up_html();
- this.register_observers();
- }
- Chosen.prototype.set_default_values = function() {
- this.click_test_action = __bind(function(evt) {
- return this.test_active_click(evt);
- }, this);
- this.active_field = false;
- this.mouse_on_container = false;
- this.results_showing = false;
- this.result_highlighted = null;
- this.result_single_selected = null;
- this.choices = 0;
- this.single_temp = new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" /></div><ul class="chzn-results"></ul></div>');
- this.multi_temp = new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');
- this.choice_temp = new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>');
- return this.no_results_temp = new Template('<li class="no-results">No results match "<span>#{terms}</span>"</li>');
- };
- Chosen.prototype.set_up_html = function() {
- var base_template, container_props, dd_top, dd_width, sf_width;
- this.container_id = this.form_field.id + "_chzn";
- this.f_width = this.form_field.getStyle("width") ? parseInt(this.form_field.getStyle("width"), 10) : this.form_field.getWidth();
- container_props = {
- 'id': this.container_id,
- 'class': 'chzn-container',
- 'style': 'width: ' + this.f_width + 'px'
- };
- this.default_text = this.form_field.readAttribute('title') ? this.form_field.readAttribute('title') : this.default_text_default;
- base_template = this.is_multiple ? new Element('div', container_props).update(this.multi_temp.evaluate({
- "default": this.default_text
- })) : new Element('div', container_props).update(this.single_temp.evaluate({
- "default": this.default_text
- }));
- this.form_field.hide().insert({
- after: base_template
- });
- this.container = $(this.container_id);
- this.container.addClassName("chzn-container-" + (this.is_multiple ? "multi" : "single"));
- this.dropdown = this.container.down('div.chzn-drop');
- dd_top = this.container.getHeight();
- dd_width = this.f_width - get_side_border_padding(this.dropdown);
- this.dropdown.setStyle({
- "width": dd_width + "px",
- "top": dd_top + "px"
- });
- this.search_field = this.container.down('input');
- this.search_results = this.container.down('ul.chzn-results');
- this.search_field_scale();
- this.search_no_results = this.container.down('li.no-results');
- if (this.is_multiple) {
- this.search_choices = this.container.down('ul.chzn-choices');
- this.search_container = this.container.down('li.search-field');
- } else {
- this.search_container = this.container.down('div.chzn-search');
- this.selected_item = this.container.down('.chzn-single');
- sf_width = dd_width - get_side_border_padding(this.search_container) - get_side_border_padding(this.search_field);
- this.search_field.setStyle({
- "width": sf_width + "px"
- });
- }
- this.results_build();
- return this.set_tab_index();
- };
- Chosen.prototype.register_observers = function() {
- this.container.observe("click", __bind(function(evt) {
- return this.container_click(evt);
- }, this));
- this.container.observe("mouseenter", __bind(function(evt) {
- return this.mouse_enter(evt);
- }, this));
- this.container.observe("mouseleave", __bind(function(evt) {
- return this.mouse_leave(evt);
- }, this));
- this.search_results.observe("click", __bind(function(evt) {
- return this.search_results_click(evt);
- }, this));
- this.search_results.observe("mouseover", __bind(function(evt) {
- return this.search_results_mouseover(evt);
- }, this));
- this.search_results.observe("mouseout", __bind(function(evt) {
- return this.search_results_mouseout(evt);
- }, this));
- this.form_field.observe("liszt:updated", __bind(function(evt) {
- return this.results_update_field(evt);
- }, this));
- this.search_field.observe("blur", __bind(function(evt) {
- return this.input_blur(evt);
- }, this));
- this.search_field.observe("keyup", __bind(function(evt) {
- return this.keyup_checker(evt);
- }, this));
- this.search_field.observe("keydown", __bind(function(evt) {
- return this.keydown_checker(evt);
- }, this));
- if (this.is_multiple) {
- this.search_choices.observe("click", __bind(function(evt) {
- return this.choices_click(evt);
- }, this));
- return this.search_field.observe("focus", __bind(function(evt) {
- return this.input_focus(evt);
- }, this));
- } else {
- return this.selected_item.observe("focus", __bind(function(evt) {
- return this.activate_field(evt);
- }, this));
- }
- };
- Chosen.prototype.container_click = function(evt) {
- if (evt && evt.type === "click") {
- evt.stop();
- }
- if (!this.pending_destroy_click) {
- if (!this.active_field) {
- if (this.is_multiple) {
- this.search_field.clear();
- }
- document.observe("click", this.click_test_action);
- this.results_show();
- } else if (!this.is_multiple && evt && (evt.target === this.selected_item || evt.target.up("a.chzn-single"))) {
- this.results_toggle();
- }
- return this.activate_field();
- } else {
- return this.pending_destroy_click = false;
- }
- };
- Chosen.prototype.mouse_enter = function() {
- return this.mouse_on_container = true;
- };
- Chosen.prototype.mouse_leave = function() {
- return this.mouse_on_container = false;
- };
- Chosen.prototype.input_focus = function(evt) {
- if (!this.active_field) {
- return setTimeout(this.container_click.bind(this), 50);
- }
- };
- Chosen.prototype.input_blur = function(evt) {
- if (!this.mouse_on_container) {
- this.active_field = false;
- return setTimeout(this.blur_test.bind(this), 100);
- }
- };
- Chosen.prototype.blur_test = function(evt) {
- if (!this.active_field && this.container.hasClassName("chzn-container-active")) {
- return this.close_field();
- }
- };
- Chosen.prototype.close_field = function() {
- document.stopObserving("click", this.click_test_action);
- if (!this.is_multiple) {
- this.selected_item.tabIndex = this.search_field.tabIndex;
- this.search_field.tabIndex = -1;
- }
- this.active_field = false;
- this.results_hide();
- this.container.removeClassName("chzn-container-active");
- this.winnow_results_clear();
- this.clear_backstroke();
- this.show_search_field_default();
- return this.search_field_scale();
- };
- Chosen.prototype.activate_field = function() {
- if (!this.is_multiple && !this.active_field) {
- this.search_field.tabIndex = this.selected_item.tabIndex;
- this.selected_item.tabIndex = -1;
- }
- this.container.addClassName("chzn-container-active");
- this.active_field = true;
- this.search_field.value = this.search_field.value;
- return this.search_field.focus();
- };
- Chosen.prototype.test_active_click = function(evt) {
- if (evt.target.up('#' + this.container.id)) {
- return this.active_field = true;
- } else {
- return this.close_field();
- }
- };
- Chosen.prototype.results_build = function() {
- var content, data, startTime, _i, _len, _ref;
- startTime = new Date();
- this.parsing = true;
- this.results_data = SelectParser.select_to_array(this.form_field);
- if (this.is_multiple && this.choices > 0) {
- this.search_choices.select("li.search-choice").invoke("remove");
- this.choices = 0;
- } else if (!this.is_multiple) {
- this.selected_item.down("span").update(this.default_text);
- }
- content = '';
- _ref = this.results_data;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- data = _ref[_i];
- if (data.group) {
- content += this.result_add_group(data);
- } else if (!data.empty) {
- content += this.result_add_option(data);
- if (data.selected && this.is_multiple) {
- this.choice_build(data);
- } else if (data.selected && !this.is_multiple) {
- this.selected_item.down("span").update(data.text);
- }
- }
- }
- this.show_search_field_default();
- this.search_field_scale();
- this.search_results.update(content);
- return this.parsing = false;
- };
- Chosen.prototype.result_add_group = function(group) {
- if (!group.disabled) {
- group.dom_id = this.form_field.id + "chzn_g_" + group.array_index;
- return '<li id="' + group.dom_id + '" class="group-result">' + group.label.escapeHTML() + '</li>';
- } else {
- return "";
- }
- };
- Chosen.prototype.result_add_option = function(option) {
- var classes;
- if (!option.disabled) {
- option.dom_id = this.form_field.id + "chzn_o_" + option.array_index;
- classes = option.selected && this.is_multiple ? [] : ["active-result"];
- if (option.selected) {
- classes.push("result-selected");
- }
- if (option.group_array_index != null) {
- classes.push("group-option");
- }
- return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + option.text.escapeHTML() + '</li>';
- } else {
- return "";
- }
- };
- Chosen.prototype.results_update_field = function() {
- this.result_clear_highlight();
- this.result_single_selected = null;
- return this.results_build();
- };
- Chosen.prototype.result_do_highlight = function(el) {
- var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
- this.result_clear_highlight();
- this.result_highlight = el;
- this.result_highlight.addClassName("highlighted");
- maxHeight = parseInt(this.search_results.getStyle('maxHeight'), 10);
- visible_top = this.search_results.scrollTop;
- visible_bottom = maxHeight + visible_top;
- high_top = this.result_highlight.positionedOffset().top;
- high_bottom = high_top + this.result_highlight.getHeight();
- if (high_bottom >= visible_bottom) {
- return this.search_results.scrollTop = (high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0;
- } else if (high_top < visible_top) {
- return this.search_results.scrollTop = high_top;
- }
- };
- Chosen.prototype.result_clear_highlight = function() {
- if (this.result_highlight) {
- this.result_highlight.removeClassName('highlighted');
- }
- return this.result_highlight = null;
- };
- Chosen.prototype.results_toggle = function() {
- if (this.results_showing) {
- return this.results_hide();
- } else {
- return this.results_show();
- }
- };
- Chosen.prototype.results_show = function() {
- var dd_top;
- if (!this.is_multiple) {
- this.selected_item.addClassName('chzn-single-with-drop');
- if (this.result_single_selected) {
- this.result_do_highlight(this.result_single_selected);
- }
- }
- dd_top = this.is_multiple ? this.container.getHeight() : this.container.getHeight() - 1;
- this.dropdown.setStyle({
- "top": dd_top + "px",
- "left": 0
- });
- this.results_showing = true;
- this.search_field.focus();
- this.search_field.value = this.search_field.value;
- return this.winnow_results();
- };
- Chosen.prototype.results_hide = function() {
- if (!this.is_multiple) {
- this.selected_item.removeClassName('chzn-single-with-drop');
- }
- this.result_clear_highlight();
- this.dropdown.setStyle({
- "left": "-9000px"
- });
- return this.results_showing = false;
- };
- Chosen.prototype.set_tab_index = function(el) {
- var ti;
- if (this.form_field.tabIndex) {
- ti = this.form_field.tabIndex;
- this.form_field.tabIndex = -1;
- if (this.is_multiple) {
- return this.search_field.tabIndex = ti;
- } else {
- this.selected_item.tabIndex = ti;
- return this.search_field.tabIndex = -1;
- }
- }
- };
- Chosen.prototype.show_search_field_default = function() {
- if (this.is_multiple && this.choices < 1 && !this.active_field) {
- this.search_field.value = this.default_text;
- return this.search_field.addClassName("default");
- } else {
- this.search_field.value = "";
- return this.search_field.removeClassName("default");
- }
- };
- Chosen.prototype.search_results_click = function(evt) {
- var target;
- target = evt.target.hasClassName("active-result") ? evt.target : evt.target.up(".active-result");
- if (target) {
- this.result_highlight = target;
- return this.result_select();
- }
- };
- Chosen.prototype.search_results_mouseover = function(evt) {
- var target;
- target = evt.target.hasClassName("active-result") ? evt.target : evt.target.up(".active-result");
- if (target) {
- return this.result_do_highlight(target);
- }
- };
- Chosen.prototype.search_results_mouseout = function(evt) {
- if (evt.target.hasClassName('active-result') || evt.target.up('.active-result')) {
- return this.result_clear_highlight();
- }
- };
- Chosen.prototype.choices_click = function(evt) {
- evt.preventDefault();
- if (this.active_field && !(evt.target.hasClassName('search-choice') || evt.target.up('.search-choice')) && !this.results_showing) {
- return this.results_show();
- }
- };
- Chosen.prototype.choice_build = function(item) {
- var choice_id, link;
- choice_id = this.form_field.id + "_chzn_c_" + item.array_index;
- this.choices += 1;
- this.search_container.insert({
- before: this.choice_temp.evaluate({
- "id": choice_id,
- "choice": item.text,
- "position": item.array_index
- })
- });
- link = $(choice_id).down('a');
- return link.observe("click", __bind(function(evt) {
- return this.choice_destroy_link_click(evt);
- }, this));
- };
- Chosen.prototype.choice_destroy_link_click = function(evt) {
- evt.preventDefault();
- this.pending_destroy_click = true;
- return this.choice_destroy(evt.target);
- };
- Chosen.prototype.choice_destroy = function(link) {
- this.choices -= 1;
- this.show_search_field_default();
- if (this.is_multiple && this.choices > 0 && this.search_field.value.length < 1) {
- this.results_hide();
- }
- this.result_deselect(link.readAttribute("rel"));
- return link.up('li').remove();
- };
- Chosen.prototype.result_select = function() {
- var high, item, position;
- if (this.result_highlight) {
- high = this.result_highlight;
- this.result_clear_highlight();
- high.addClassName("result-selected");
- if (this.is_multiple) {
- this.result_deactivate(high);
- } else {
- this.result_single_selected = high;
- }
- position = high.id.substr(high.id.lastIndexOf("_") + 1);
- item = this.results_data[position];
- item.selected = true;
- this.form_field.options[item.options_index].selected = true;
- if (this.is_multiple) {
- this.choice_build(item);
- } else {
- this.selected_item.down("span").update(item.text);
- }
- this.results_hide();
- this.search_field.value = "";
- if (typeof Event.simulate === 'function') {
- this.form_field.simulate("change");
- }
- return this.search_field_scale();
- }
- };
- Chosen.prototype.result_activate = function(el) {
- return el.addClassName("active-result").show();
- };
- Chosen.prototype.result_deactivate = function(el) {
- return el.removeClassName("active-result").hide();
- };
- Chosen.prototype.result_deselect = function(pos) {
- var result, result_data;
- result_data = this.results_data[pos];
- result_data.selected = false;
- this.form_field.options[result_data.options_index].selected = false;
- result = $(this.form_field.id + "chzn_o_" + pos);
- result.removeClassName("result-selected").addClassName("active-result").show();
- this.result_clear_highlight();
- this.winnow_results();
- if (typeof Event.simulate === 'function') {
- this.form_field.simulate("change");
- }
- return this.search_field_scale();
- };
- Chosen.prototype.results_search = function(evt) {
- if (this.results_showing) {
- return this.winnow_results();
- } else {
- return this.results_show();
- }
- };
- Chosen.prototype.winnow_results = function() {
- var found, option, part, parts, regex, result_id, results, searchText, startTime, startpos, text, zregex, _i, _j, _len, _len2, _ref;
- startTime = new Date();
- this.no_results_clear();
- results = 0;
- searchText = this.search_field.value === this.default_text ? "" : this.search_field.value.strip();
- regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
- zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
- _ref = this.results_data;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- option = _ref[_i];
- if (!option.disabled && !option.empty) {
- if (option.group) {
- $(option.dom_id).hide();
- } else if (!(this.is_multiple && option.selected)) {
- found = false;
- result_id = option.dom_id;
- if (regex.test(option.text)) {
- found = true;
- results += 1;
- } else if (option.text.indexOf(" ") >= 0 || option.text.indexOf("[") === 0) {
- parts = option.text.replace(/\[|\]/g, "").split(" ");
- if (parts.length) {
- for (_j = 0, _len2 = parts.length; _j < _len2; _j++) {
- part = parts[_j];
- if (regex.test(part)) {
- found = true;
- results += 1;
- }
- }
- }
- }
- if (found) {
- if (searchText.length) {
- startpos = option.text.search(zregex);
- text = option.text.substr(0, startpos + searchText.length) + '</em>' + option.text.substr(startpos + searchText.length);
- text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
- } else {
- text = option.text;
- }
- if ($(result_id).innerHTML !== text) {
- $(result_id).update(text);
- }
- this.result_activate($(result_id));
- if (option.group_array_index != null) {
- $(this.results_data[option.group_array_index].dom_id).show();
- }
- } else {
- if ($(result_id) === this.result_highlight) {
- this.result_clear_highlight();
- }
- this.result_deactivate($(result_id));
- }
- }
- }
- }
- if (results < 1 && searchText.length) {
- return this.no_results(searchText);
- } else {
- return this.winnow_results_set_highlight();
- }
- };
- Chosen.prototype.winnow_results_clear = function() {
- var li, lis, _i, _len, _results;
- this.search_field.clear();
- lis = this.search_results.select("li");
- _results = [];
- for (_i = 0, _len = lis.length; _i < _len; _i++) {
- li = lis[_i];
- _results.push(li.hasClassName("group-result") ? li.show() : !this.is_multiple || !li.hasClassName("result-selected") ? this.result_activate(li) : void 0);
- }
- return _results;
- };
- Chosen.prototype.winnow_results_set_highlight = function() {
- var do_high;
- if (!this.result_highlight) {
- do_high = this.search_results.down(".active-result");
- if (do_high) {
- return this.result_do_highlight(do_high);
- }
- }
- };
- Chosen.prototype.no_results = function(terms) {
- return this.search_results.insert(this.no_results_temp.evaluate({
- "terms": terms.escapeHTML()
- }));
- };
- Chosen.prototype.no_results_clear = function() {
- var nr, _results;
- nr = null;
- _results = [];
- while (nr = this.search_results.down(".no-results")) {
- _results.push(nr.remove());
- }
- return _results;
- };
- Chosen.prototype.keydown_arrow = function() {
- var actives, nexts, sibs;
- actives = this.search_results.select("li.active-result");
- if (actives.length) {
- if (!this.result_highlight) {
- this.result_do_highlight(actives.first());
- } else if (this.results_showing) {
- sibs = this.result_highlight.nextSiblings();
- nexts = sibs.intersect(actives);
- if (nexts.length) {
- this.result_do_highlight(nexts.first());
- }
- }
- if (!this.results_showing) {
- return this.results_show();
- }
- }
- };
- Chosen.prototype.keyup_arrow = function() {
- var actives, prevs, sibs;
- if (!this.results_showing && !this.is_multiple) {
- return this.results_show();
- } else if (this.result_highlight) {
- sibs = this.result_highlight.previousSiblings();
- actives = this.search_results.select("li.active-result");
- prevs = sibs.intersect(actives);
- if (prevs.length) {
- return this.result_do_highlight(prevs.first());
- } else {
- if (this.choices > 0) {
- this.results_hide();
- }
- return this.result_clear_highlight();
- }
- }
- };
- Chosen.prototype.keydown_backstroke = function() {
- if (this.pending_backstroke) {
- this.choice_destroy(this.pending_backstroke.down("a"));
- return this.clear_backstroke();
- } else {
- this.pending_backstroke = this.search_container.siblings("li.search-choice").last();
- return this.pending_backstroke.addClassName("search-choice-focus");
- }
- };
- Chosen.prototype.clear_backstroke = function() {
- if (this.pending_backstroke) {
- this.pending_backstroke.removeClassName("search-choice-focus");
- }
- return this.pending_backstroke = null;
- };
- Chosen.prototype.keyup_checker = function(evt) {
- var stroke, _ref;
- stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
- this.search_field_scale();
- switch (stroke) {
- case 8:
- if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
- return this.keydown_backstroke();
- } else if (!this.pending_backstroke) {
- this.result_clear_highlight();
- return this.results_search();
- }
- break;
- case 13:
- evt.preventDefault();
- if (this.results_showing) {
- return this.result_select();
- }
- break;
- case 27:
- if (this.results_showing) {
- return this.results_hide();
- }
- break;
- case 9:
- case 38:
- case 40:
- case 16:
- break;
- default:
- return this.results_search();
- }
- };
- Chosen.prototype.keydown_checker = function(evt) {
- var stroke, _ref;
- stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
- this.search_field_scale();
- if (stroke !== 8 && this.pending_backstroke) {
- this.clear_backstroke();
- }
- switch (stroke) {
- case 8:
- return this.backstroke_length = this.search_field.value.length;
- case 9:
- return this.mouse_on_container = false;
- case 13:
- return evt.preventDefault();
- case 38:
- evt.preventDefault();
- return this.keyup_arrow();
- case 40:
- return this.keydown_arrow();
- }
- };
- Chosen.prototype.search_field_scale = function() {
- var dd_top, div, h, style, style_block, styles, w, _i, _len;
- if (this.is_multiple) {
- h = 0;
- w = 0;
- style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
- styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
- for (_i = 0, _len = styles.length; _i < _len; _i++) {
- style = styles[_i];
- style_block += style + ":" + this.search_field.getStyle(style) + ";";
- }
- div = new Element('div', {
- 'style': style_block
- }).update(this.search_field.value);
- document.body.appendChild(div);
- w = Element.measure(div, 'width') + 25;
- div.remove();
- if (w > this.f_width - 10) {
- w = this.f_width - 10;
- }
- this.search_field.setStyle({
- 'width': w + 'px'
- });
- dd_top = this.container.getHeight();
- return this.dropdown.setStyle({
- "top": dd_top + "px"
- });
- }
- };
- return Chosen;
- })();
- root.Chosen = Chosen;
- document.observe('dom:loaded', function(evt) {
- var select, selects, _i, _len, _results;
- selects = $$(".chzn-select");
- _results = [];
- for (_i = 0, _len = selects.length; _i < _len; _i++) {
- select = selects[_i];
- _results.push(new Chosen(select));
- }
- return _results;
- });
- get_side_border_padding = function(elmt) {
- var layout, side_border_padding;
- layout = new Element.Layout(elmt);
- return side_border_padding = layout.get("border-left") + layout.get("border-right") + layout.get("padding-left") + layout.get("padding-right");
- };
- root.get_side_border_padding = get_side_border_padding;
- root = typeof exports !== "undefined" && exports !== null ? exports : this;
- SelectParser = (function() {
- function SelectParser() {
- this.options_index = 0;
- this.parsed = [];
- }
- SelectParser.prototype.add_node = function(child) {
- if (child.nodeName === "OPTGROUP") {
- return this.add_group(child);
- } else {
- return this.add_option(child);
- }
- };
- SelectParser.prototype.add_group = function(group) {
- var group_position, option, _i, _len, _ref, _results;
- group_position = this.parsed.length;
- this.parsed.push({
- array_index: group_position,
- group: true,
- label: group.label,
- children: 0,
- disabled: group.disabled
- });
- _ref = group.childNodes;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- option = _ref[_i];
- _results.push(this.add_option(option, group_position, group.disabled));
- }
- return _results;
- };
- SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
- if (option.nodeName === "OPTION") {
- if (option.text !== "") {
- if (group_position != null) {
- this.parsed[group_position].children += 1;
- }
- this.parsed.push({
- array_index: this.parsed.length,
- options_index: this.options_index,
- value: option.value,
- text: option.text,
- selected: option.selected,
- disabled: group_disabled === true ? group_disabled : option.disabled,
- group_array_index: group_position
- });
- } else {
- this.parsed.push({
- array_index: this.parsed.length,
- options_index: this.options_index,
- empty: true
- });
- }
- return this.options_index += 1;
- }
- };
- return SelectParser;
- })();
- SelectParser.select_to_array = function(select) {
- var child, parser, _i, _len, _ref;
- parser = new SelectParser();
- _ref = select.childNodes;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- child = _ref[_i];
- parser.add_node(child);
- }
- return parser.parsed;
- };
- root.SelectParser = SelectParser;
-}).call(this);
diff --git a/src/usr/local/www/javascript/chosen/chosen.proto.min.js b/src/usr/local/www/javascript/chosen/chosen.proto.min.js
deleted file mode 100644
index 79109c5..0000000
--- a/src/usr/local/www/javascript/chosen/chosen.proto.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
-Chosen, a Select Box Enhancer for jQuery and Protoype
-by Patrick Filler for Harvest, http://getharvest.com
-
-Available for use under the MIT License, http://en.wikipedia.org/wiki/MIT_License
-
-Copyright (c) 2011 by Harvest
-*/
-(function(){var Chosen,SelectParser,get_side_border_padding,root;var __bind=function(fn,me){return function(){return fn.apply(me,arguments);};};root=typeof exports!=="undefined"&&exports!==null?exports:this;Chosen=(function(){function Chosen(elmn){this.set_default_values();this.form_field=elmn;this.is_multiple=this.form_field.multiple;this.default_text_default=this.form_field.multiple?"Select Some Options":"Select an Option";this.set_up_html();this.register_observers();}Chosen.prototype.set_default_values=function(){this.click_test_action=__bind(function(evt){return this.test_active_click(evt);},this);this.active_field=false;this.mouse_on_container=false;this.results_showing=false;this.result_highlighted=null;this.result_single_selected=null;this.choices=0;this.single_temp=new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" /></div><ul class="chzn-results"></ul></div>');this.multi_temp=new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');this.choice_temp=new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>');return this.no_results_temp=new Template('<li class="no-results">No results match "<span>#{terms}</span>"</li>');};Chosen.prototype.set_up_html=function(){var base_template,container_props,dd_top,dd_width,sf_width;this.container_id=this.form_field.id+"_chzn";this.f_width=this.form_field.getStyle("width")?parseInt(this.form_field.getStyle("width"),10):this.form_field.getWidth();container_props={id:this.container_id,"class":"chzn-container",style:"width: "+this.f_width+"px"};this.default_text=this.form_field.readAttribute("title")?this.form_field.readAttribute("title"):this.default_text_default;base_template=this.is_multiple?new Element("div",container_props).update(this.multi_temp.evaluate({"default":this.default_text})):new Element("div",container_props).update(this.single_temp.evaluate({"default":this.default_text}));this.form_field.hide().insert({after:base_template});this.container=$(this.container_id);this.container.addClassName("chzn-container-"+(this.is_multiple?"multi":"single"));this.dropdown=this.container.down("div.chzn-drop");dd_top=this.container.getHeight();dd_width=this.f_width-get_side_border_padding(this.dropdown);this.dropdown.setStyle({width:dd_width+"px",top:dd_top+"px"});this.search_field=this.container.down("input");this.search_results=this.container.down("ul.chzn-results");this.search_field_scale();this.search_no_results=this.container.down("li.no-results");if(this.is_multiple){this.search_choices=this.container.down("ul.chzn-choices");this.search_container=this.container.down("li.search-field");}else{this.search_container=this.container.down("div.chzn-search");this.selected_item=this.container.down(".chzn-single");sf_width=dd_width-get_side_border_padding(this.search_container)-get_side_border_padding(this.search_field);this.search_field.setStyle({width:sf_width+"px"});}this.results_build();return this.set_tab_index();};Chosen.prototype.register_observers=function(){this.container.observe("click",__bind(function(evt){return this.container_click(evt);},this));this.container.observe("mouseenter",__bind(function(evt){return this.mouse_enter(evt);},this));this.container.observe("mouseleave",__bind(function(evt){return this.mouse_leave(evt);},this));this.search_results.observe("click",__bind(function(evt){return this.search_results_click(evt);},this));this.search_results.observe("mouseover",__bind(function(evt){return this.search_results_mouseover(evt);},this));this.search_results.observe("mouseout",__bind(function(evt){return this.search_results_mouseout(evt);},this));this.form_field.observe("liszt:updated",__bind(function(evt){return this.results_update_field(evt);},this));this.search_field.observe("blur",__bind(function(evt){return this.input_blur(evt);},this));this.search_field.observe("keyup",__bind(function(evt){return this.keyup_checker(evt);},this));this.search_field.observe("keydown",__bind(function(evt){return this.keydown_checker(evt);},this));if(this.is_multiple){this.search_choices.observe("click",__bind(function(evt){return this.choices_click(evt);},this));return this.search_field.observe("focus",__bind(function(evt){return this.input_focus(evt);},this));}else{return this.selected_item.observe("focus",__bind(function(evt){return this.activate_field(evt);},this));}};Chosen.prototype.container_click=function(evt){if(evt&&evt.type==="click"){evt.stop();}if(!this.pending_destroy_click){if(!this.active_field){if(this.is_multiple){this.search_field.clear();}document.observe("click",this.click_test_action);this.results_show();}else{if(!this.is_multiple&&evt&&(evt.target===this.selected_item||evt.target.up("a.chzn-single"))){this.results_toggle();}}return this.activate_field();}else{return this.pending_destroy_click=false;}};Chosen.prototype.mouse_enter=function(){return this.mouse_on_container=true;};Chosen.prototype.mouse_leave=function(){return this.mouse_on_container=false;};Chosen.prototype.input_focus=function(evt){if(!this.active_field){return setTimeout(this.container_click.bind(this),50);}};Chosen.prototype.input_blur=function(evt){if(!this.mouse_on_container){this.active_field=false;return setTimeout(this.blur_test.bind(this),100);}};Chosen.prototype.blur_test=function(evt){if(!this.active_field&&this.container.hasClassName("chzn-container-active")){return this.close_field();}};Chosen.prototype.close_field=function(){document.stopObserving("click",this.click_test_action);if(!this.is_multiple){this.selected_item.tabIndex=this.search_field.tabIndex;this.search_field.tabIndex=-1;}this.active_field=false;this.results_hide();this.container.removeClassName("chzn-container-active");this.winnow_results_clear();this.clear_backstroke();this.show_search_field_default();return this.search_field_scale();};Chosen.prototype.activate_field=function(){if(!this.is_multiple&&!this.active_field){this.search_field.tabIndex=this.selected_item.tabIndex;this.selected_item.tabIndex=-1;}this.container.addClassName("chzn-container-active");this.active_field=true;this.search_field.value=this.search_field.value;return this.search_field.focus();};Chosen.prototype.test_active_click=function(evt){if(evt.target.up("#"+this.container.id)){return this.active_field=true;}else{return this.close_field();}};Chosen.prototype.results_build=function(){var content,data,startTime,_i,_len,_ref;startTime=new Date();this.parsing=true;this.results_data=SelectParser.select_to_array(this.form_field);if(this.is_multiple&&this.choices>0){this.search_choices.select("li.search-choice").invoke("remove");this.choices=0;}else{if(!this.is_multiple){this.selected_item.down("span").update(this.default_text);}}content="";_ref=this.results_data;for(_i=0,_len=_ref.length;_i<_len;_i++){data=_ref[_i];if(data.group){content+=this.result_add_group(data);}else{if(!data.empty){content+=this.result_add_option(data);if(data.selected&&this.is_multiple){this.choice_build(data);}else{if(data.selected&&!this.is_multiple){this.selected_item.down("span").update(data.text);}}}}}this.show_search_field_default();this.search_field_scale();this.search_results.update(content);return this.parsing=false;};Chosen.prototype.result_add_group=function(group){if(!group.disabled){group.dom_id=this.form_field.id+"chzn_g_"+group.array_index;return'<li id="'+group.dom_id+'" class="group-result">'+group.label.escapeHTML()+"</li>";}else{return"";}};Chosen.prototype.result_add_option=function(option){var classes;if(!option.disabled){option.dom_id=this.form_field.id+"chzn_o_"+option.array_index;classes=option.selected&&this.is_multiple?[]:["active-result"];if(option.selected){classes.push("result-selected");}if(option.group_array_index!=null){classes.push("group-option");}return'<li id="'+option.dom_id+'" class="'+classes.join(" ")+'">'+option.text.escapeHTML()+"</li>";}else{return"";}};Chosen.prototype.results_update_field=function(){this.result_clear_highlight();this.result_single_selected=null;return this.results_build();};Chosen.prototype.result_do_highlight=function(el){var high_bottom,high_top,maxHeight,visible_bottom,visible_top;this.result_clear_highlight();this.result_highlight=el;this.result_highlight.addClassName("highlighted");maxHeight=parseInt(this.search_results.getStyle("maxHeight"),10);visible_top=this.search_results.scrollTop;visible_bottom=maxHeight+visible_top;high_top=this.result_highlight.positionedOffset().top;high_bottom=high_top+this.result_highlight.getHeight();if(high_bottom>=visible_bottom){return this.search_results.scrollTop=(high_bottom-maxHeight)>0?high_bottom-maxHeight:0;}else{if(high_top<visible_top){return this.search_results.scrollTop=high_top;}}};Chosen.prototype.result_clear_highlight=function(){if(this.result_highlight){this.result_highlight.removeClassName("highlighted");}return this.result_highlight=null;};Chosen.prototype.results_toggle=function(){if(this.results_showing){return this.results_hide();}else{return this.results_show();}};Chosen.prototype.results_show=function(){var dd_top;if(!this.is_multiple){this.selected_item.addClassName("chzn-single-with-drop");if(this.result_single_selected){this.result_do_highlight(this.result_single_selected);}}dd_top=this.is_multiple?this.container.getHeight():this.container.getHeight()-1;this.dropdown.setStyle({top:dd_top+"px",left:0});this.results_showing=true;this.search_field.focus();this.search_field.value=this.search_field.value;return this.winnow_results();};Chosen.prototype.results_hide=function(){if(!this.is_multiple){this.selected_item.removeClassName("chzn-single-with-drop");}this.result_clear_highlight();this.dropdown.setStyle({left:"-9000px"});return this.results_showing=false;};Chosen.prototype.set_tab_index=function(el){var ti;if(this.form_field.tabIndex){ti=this.form_field.tabIndex;this.form_field.tabIndex=-1;if(this.is_multiple){return this.search_field.tabIndex=ti;}else{this.selected_item.tabIndex=ti;return this.search_field.tabIndex=-1;}}};Chosen.prototype.show_search_field_default=function(){if(this.is_multiple&&this.choices<1&&!this.active_field){this.search_field.value=this.default_text;return this.search_field.addClassName("default");}else{this.search_field.value="";return this.search_field.removeClassName("default");}};Chosen.prototype.search_results_click=function(evt){var target;target=evt.target.hasClassName("active-result")?evt.target:evt.target.up(".active-result");if(target){this.result_highlight=target;return this.result_select();}};Chosen.prototype.search_results_mouseover=function(evt){var target;target=evt.target.hasClassName("active-result")?evt.target:evt.target.up(".active-result");if(target){return this.result_do_highlight(target);}};Chosen.prototype.search_results_mouseout=function(evt){if(evt.target.hasClassName("active-result")||evt.target.up(".active-result")){return this.result_clear_highlight();}};Chosen.prototype.choices_click=function(evt){evt.preventDefault();if(this.active_field&&!(evt.target.hasClassName("search-choice")||evt.target.up(".search-choice"))&&!this.results_showing){return this.results_show();}};Chosen.prototype.choice_build=function(item){var choice_id,link;choice_id=this.form_field.id+"_chzn_c_"+item.array_index;this.choices+=1;this.search_container.insert({before:this.choice_temp.evaluate({id:choice_id,choice:item.text,position:item.array_index})});link=$(choice_id).down("a");return link.observe("click",__bind(function(evt){return this.choice_destroy_link_click(evt);},this));};Chosen.prototype.choice_destroy_link_click=function(evt){evt.preventDefault();this.pending_destroy_click=true;return this.choice_destroy(evt.target);};Chosen.prototype.choice_destroy=function(link){this.choices-=1;this.show_search_field_default();if(this.is_multiple&&this.choices>0&&this.search_field.value.length<1){this.results_hide();}this.result_deselect(link.readAttribute("rel"));return link.up("li").remove();};Chosen.prototype.result_select=function(){var high,item,position;if(this.result_highlight){high=this.result_highlight;this.result_clear_highlight();high.addClassName("result-selected");if(this.is_multiple){this.result_deactivate(high);}else{this.result_single_selected=high;}position=high.id.substr(high.id.lastIndexOf("_")+1);item=this.results_data[position];item.selected=true;this.form_field.options[item.options_index].selected=true;if(this.is_multiple){this.choice_build(item);}else{this.selected_item.down("span").update(item.text);}this.results_hide();this.search_field.value="";if(typeof Event.simulate==="function"){this.form_field.simulate("change");}return this.search_field_scale();}};Chosen.prototype.result_activate=function(el){return el.addClassName("active-result").show();};Chosen.prototype.result_deactivate=function(el){return el.removeClassName("active-result").hide();};Chosen.prototype.result_deselect=function(pos){var result,result_data;result_data=this.results_data[pos];result_data.selected=false;this.form_field.options[result_data.options_index].selected=false;result=$(this.form_field.id+"chzn_o_"+pos);result.removeClassName("result-selected").addClassName("active-result").show();this.result_clear_highlight();this.winnow_results();if(typeof Event.simulate==="function"){this.form_field.simulate("change");}return this.search_field_scale();};Chosen.prototype.results_search=function(evt){if(this.results_showing){return this.winnow_results();}else{return this.results_show();}};Chosen.prototype.winnow_results=function(){var found,option,part,parts,regex,result_id,results,searchText,startTime,startpos,text,zregex,_i,_j,_len,_len2,_ref;startTime=new Date();this.no_results_clear();results=0;searchText=this.search_field.value===this.default_text?"":this.search_field.value.strip();regex=new RegExp("^"+searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i");zregex=new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i");_ref=this.results_data;for(_i=0,_len=_ref.length;_i<_len;_i++){option=_ref[_i];if(!option.disabled&&!option.empty){if(option.group){$(option.dom_id).hide();}else{if(!(this.is_multiple&&option.selected)){found=false;result_id=option.dom_id;if(regex.test(option.text)){found=true;results+=1;}else{if(option.text.indexOf(" ")>=0||option.text.indexOf("[")===0){parts=option.text.replace(/\[|\]/g,"").split(" ");if(parts.length){for(_j=0,_len2=parts.length;_j<_len2;_j++){part=parts[_j];if(regex.test(part)){found=true;results+=1;}}}}}if(found){if(searchText.length){startpos=option.text.search(zregex);text=option.text.substr(0,startpos+searchText.length)+"</em>"+option.text.substr(startpos+searchText.length);text=text.substr(0,startpos)+"<em>"+text.substr(startpos);}else{text=option.text;}if($(result_id).innerHTML!==text){$(result_id).update(text);}this.result_activate($(result_id));if(option.group_array_index!=null){$(this.results_data[option.group_array_index].dom_id).show();}}else{if($(result_id)===this.result_highlight){this.result_clear_highlight();}this.result_deactivate($(result_id));}}}}}if(results<1&&searchText.length){return this.no_results(searchText);}else{return this.winnow_results_set_highlight();}};Chosen.prototype.winnow_results_clear=function(){var li,lis,_i,_len,_results;this.search_field.clear();lis=this.search_results.select("li");_results=[];for(_i=0,_len=lis.length;_i<_len;_i++){li=lis[_i];_results.push(li.hasClassName("group-result")?li.show():!this.is_multiple||!li.hasClassName("result-selected")?this.result_activate(li):void 0);}return _results;};Chosen.prototype.winnow_results_set_highlight=function(){var do_high;if(!this.result_highlight){do_high=this.search_results.down(".active-result");if(do_high){return this.result_do_highlight(do_high);}}};Chosen.prototype.no_results=function(terms){return this.search_results.insert(this.no_results_temp.evaluate({terms:terms.escapeHTML()}));};Chosen.prototype.no_results_clear=function(){var nr,_results;nr=null;_results=[];while(nr=this.search_results.down(".no-results")){_results.push(nr.remove());}return _results;};Chosen.prototype.keydown_arrow=function(){var actives,nexts,sibs;actives=this.search_results.select("li.active-result");if(actives.length){if(!this.result_highlight){this.result_do_highlight(actives.first());}else{if(this.results_showing){sibs=this.result_highlight.nextSiblings();nexts=sibs.intersect(actives);if(nexts.length){this.result_do_highlight(nexts.first());}}}if(!this.results_showing){return this.results_show();}}};Chosen.prototype.keyup_arrow=function(){var actives,prevs,sibs;if(!this.results_showing&&!this.is_multiple){return this.results_show();}else{if(this.result_highlight){sibs=this.result_highlight.previousSiblings();actives=this.search_results.select("li.active-result");prevs=sibs.intersect(actives);if(prevs.length){return this.result_do_highlight(prevs.first());}else{if(this.choices>0){this.results_hide();}return this.result_clear_highlight();}}}};Chosen.prototype.keydown_backstroke=function(){if(this.pending_backstroke){this.choice_destroy(this.pending_backstroke.down("a"));return this.clear_backstroke();}else{this.pending_backstroke=this.search_container.siblings("li.search-choice").last();return this.pending_backstroke.addClassName("search-choice-focus");}};Chosen.prototype.clear_backstroke=function(){if(this.pending_backstroke){this.pending_backstroke.removeClassName("search-choice-focus");}return this.pending_backstroke=null;};Chosen.prototype.keyup_checker=function(evt){var stroke,_ref;stroke=(_ref=evt.which)!=null?_ref:evt.keyCode;this.search_field_scale();switch(stroke){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0){return this.keydown_backstroke();}else{if(!this.pending_backstroke){this.result_clear_highlight();return this.results_search();}}break;case 13:evt.preventDefault();if(this.results_showing){return this.result_select();}break;case 27:if(this.results_showing){return this.results_hide();}break;case 9:case 38:case 40:case 16:break;default:return this.results_search();}};Chosen.prototype.keydown_checker=function(evt){var stroke,_ref;stroke=(_ref=evt.which)!=null?_ref:evt.keyCode;this.search_field_scale();if(stroke!==8&&this.pending_backstroke){this.clear_backstroke();}switch(stroke){case 8:return this.backstroke_length=this.search_field.value.length;case 9:return this.mouse_on_container=false;case 13:return evt.preventDefault();case 38:evt.preventDefault();return this.keyup_arrow();case 40:return this.keydown_arrow();}};Chosen.prototype.search_field_scale=function(){var dd_top,div,h,style,style_block,styles,w,_i,_len;if(this.is_multiple){h=0;w=0;style_block="position:absolute; left: -1000px; top: -1000px; display:none;";styles=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(_i=0,_len=styles.length;_i<_len;_i++){style=styles[_i];style_block+=style+":"+this.search_field.getStyle(style)+";";}div=new Element("div",{style:style_block}).update(this.search_field.value);document.body.appendChild(div);w=Element.measure(div,"width")+25;div.remove();if(w>this.f_width-10){w=this.f_width-10;}this.search_field.setStyle({width:w+"px"});dd_top=this.container.getHeight();return this.dropdown.setStyle({top:dd_top+"px"});}};return Chosen;})();root.Chosen=Chosen;document.observe("dom:loaded",function(evt){var select,selects,_i,_len,_results;selects=$$(".chzn-select");_results=[];for(_i=0,_len=selects.length;_i<_len;_i++){select=selects[_i];_results.push(new Chosen(select));}return _results;});get_side_border_padding=function(elmt){var layout,side_border_padding;layout=new Element.Layout(elmt);return side_border_padding=layout.get("border-left")+layout.get("border-right")+layout.get("padding-left")+layout.get("padding-right");};root.get_side_border_padding=get_side_border_padding;root=typeof exports!=="undefined"&&exports!==null?exports:this;SelectParser=(function(){function SelectParser(){this.options_index=0;this.parsed=[];}SelectParser.prototype.add_node=function(child){if(child.nodeName==="OPTGROUP"){return this.add_group(child);}else{return this.add_option(child);}};SelectParser.prototype.add_group=function(group){var group_position,option,_i,_len,_ref,_results;group_position=this.parsed.length;this.parsed.push({array_index:group_position,group:true,label:group.label,children:0,disabled:group.disabled});_ref=group.childNodes;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){option=_ref[_i];_results.push(this.add_option(option,group_position,group.disabled));}return _results;};SelectParser.prototype.add_option=function(option,group_position,group_disabled){if(option.nodeName==="OPTION"){if(option.text!==""){if(group_position!=null){this.parsed[group_position].children+=1;}this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:option.value,text:option.text,selected:option.selected,disabled:group_disabled===true?group_disabled:option.disabled,group_array_index:group_position});}else{this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:true});}return this.options_index+=1;}};return SelectParser;})();SelectParser.select_to_array=function(select){var child,parser,_i,_len,_ref;parser=new SelectParser();_ref=select.childNodes;for(_i=0,_len=_ref.length;_i<_len;_i++){child=_ref[_i];parser.add_node(child);}return parser.parsed;};root.SelectParser=SelectParser;}).call(this); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/chosen/coffee/chosen.jquery.coffee b/src/usr/local/www/javascript/chosen/coffee/chosen.jquery.coffee
deleted file mode 100644
index 0d6596a..0000000
--- a/src/usr/local/www/javascript/chosen/coffee/chosen.jquery.coffee
+++ /dev/null
@@ -1,633 +0,0 @@
-###
-Chosen, a Select Box Enhancer for jQuery and Protoype
-by Patrick Filler for Harvest, http://getharvest.com
-
-Available for use under the MIT License, http://en.wikipedia.org/wiki/MIT_License
-
-Copyright (c) 2011 by Harvest
-###
-
-root = exports ? this
-$ = jQuery
-
-$.fn.extend({
- chosen: (data, options) ->
- $(this).each((input_field) ->
- new Chosen(this, data, options) unless ($ this).hasClass "chzn-done"
- )
-})
-
-class Chosen
-
- constructor: (elmn) ->
- this.set_default_values()
-
- @form_field = elmn
- @form_field_jq = $ @form_field
- @is_multiple = @form_field.multiple
-
- @default_text_default = if @form_field.multiple then "Select Some Options" else "Select an Option"
-
- this.set_up_html()
- this.register_observers()
- @form_field_jq.addClass "chzn-done"
-
- set_default_values: ->
-
- @click_test_action = (evt) => this.test_active_click(evt)
- @active_field = false
- @mouse_on_container = false
- @results_showing = false
- @result_highlighted = null
- @result_single_selected = null
- @choices = 0
-
- set_up_html: ->
- @container_id = @form_field.id + "_chzn"
-
- @f_width = @form_field_jq.width()
-
- @default_text = if @form_field_jq.attr 'title' then @form_field_jq.attr 'title' else @default_text_default
-
- container_div = ($ "<div />", {
- id: @container_id
- class: 'chzn-container'
- style: 'width: ' + (@f_width) + 'px;' #use parens around @f_width so coffeescript doesn't think + ' px' is a function parameter
- })
-
- if @is_multiple
- container_div.html '<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + @default_text + '" class="default" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>'
- else
- container_div.html '<a href="javascript:void(0)" class="chzn-single"><span>' + @default_text + '</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" /></div><ul class="chzn-results"></ul></div>'
-
- @form_field_jq.hide().after container_div
- @container = ($ '#' + @container_id)
- @container.addClass( "chzn-container-" + (if @is_multiple then "multi" else "single") )
- @dropdown = @container.find('div.chzn-drop').first()
-
- dd_top = @container.height()
- dd_width = (@f_width - get_side_border_padding(@dropdown))
-
- @dropdown.css({"width": dd_width + "px", "top": dd_top + "px"})
-
- @search_field = @container.find('input').first()
- @search_results = @container.find('ul.chzn-results').first()
- this.search_field_scale()
-
- @search_no_results = @container.find('li.no-results').first()
-
- if @is_multiple
- @search_choices = @container.find('ul.chzn-choices').first()
- @search_container = @container.find('li.search-field').first()
- else
- @search_container = @container.find('div.chzn-search').first()
- @selected_item = @container.find('.chzn-single').first()
- sf_width = dd_width - get_side_border_padding(@search_container) - get_side_border_padding(@search_field)
- @search_field.css( {"width" : sf_width + "px"} )
-
- this.results_build()
- this.set_tab_index()
-
-
- register_observers: ->
- @container.click (evt) => this.container_click(evt)
- @container.mouseenter (evt) => this.mouse_enter(evt)
- @container.mouseleave (evt) => this.mouse_leave(evt)
-
- @search_results.click (evt) => this.search_results_click(evt)
- @search_results.mouseover (evt) => this.search_results_mouseover(evt)
- @search_results.mouseout (evt) => this.search_results_mouseout(evt)
-
- @form_field_jq.bind "liszt:updated", (evt) => this.results_update_field(evt)
-
- @search_field.blur (evt) => this.input_blur(evt)
- @search_field.keyup (evt) => this.keyup_checker(evt)
- @search_field.keydown (evt) => this.keydown_checker(evt)
-
- if @is_multiple
- @search_choices.click (evt) => this.choices_click(evt)
- @search_field.focus (evt) => this.input_focus(evt)
- else
- @selected_item.focus (evt) => this.activate_field(evt)
-
- container_click: (evt) ->
- if evt and evt.type is "click"
- evt.stopPropagation()
- if not @pending_destroy_click
- if not @active_field
- @search_field.val "" if @is_multiple
- $(document).click @click_test_action
- this.results_show()
- else if not @is_multiple and evt and ($(evt.target) is @selected_item || $(evt.target).parents("a.chzn-single").length)
- evt.preventDefault()
- this.results_toggle()
-
- this.activate_field()
- else
- @pending_destroy_click = false
-
- mouse_enter: -> @mouse_on_container = true
- mouse_leave: -> @mouse_on_container = false
-
- input_focus: (evt) ->
- setTimeout (=> this.container_click()), 50 unless @active_field
-
- input_blur: (evt) ->
- if not @mouse_on_container
- @active_field = false
- setTimeout (=> this.blur_test()), 100
-
- blur_test: (evt) ->
- this.close_field() if not @active_field and @container.hasClass "chzn-container-active"
-
- close_field: ->
- $(document).unbind "click", @click_test_action
-
- if not @is_multiple
- @selected_item.attr "tabindex", @search_field.attr("tabindex")
- @search_field.attr "tabindex", -1
-
- @active_field = false
- this.results_hide()
-
- @container.removeClass "chzn-container-active"
- this.winnow_results_clear()
- this.clear_backstroke()
-
- this.show_search_field_default()
- this.search_field_scale()
-
- activate_field: ->
- if not @is_multiple and not @active_field
- @search_field.attr "tabindex", (@selected_item.attr "tabindex")
- @selected_item.attr "tabindex", -1
-
- @container.addClass "chzn-container-active"
- @active_field = true
-
- @search_field.val(@search_field.val())
- @search_field.focus()
-
-
- test_active_click: (evt) ->
- if $(evt.target).parents('#' + @container.id).length
- @active_field = true
- else
- this.close_field()
-
- results_build: ->
- startTime = new Date()
- @parsing = true
- @results_data = SelectParser.select_to_array @form_field
-
- if @is_multiple and @choices > 0
- @search_choices.find("li.search-choice").remove()
- @choices = 0
- else if not @is_multiple
- @selected_item.find("span").text @default_text
-
- content = ''
- for data in @results_data
- if data.group
- content += this.result_add_group data
- else if !data.empty
- content += this.result_add_option data
- if data.selected and @is_multiple
- this.choice_build data
- else if data.selected and not @is_multiple
- @selected_item.find("span").text data.text
-
- this.show_search_field_default()
- this.search_field_scale()
-
- @search_results.html content
- @parsing = false
-
-
- result_add_group: (group) ->
- if not group.disabled
- group.dom_id = @form_field.id + "chzn_g_" + group.array_index
- '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>'
- else
- ""
-
- result_add_option: (option) ->
- if not option.disabled
- option.dom_id = @form_field.id + "chzn_o_" + option.array_index
-
- classes = if option.selected and @is_multiple then [] else ["active-result"]
- classes.push "result-selected" if option.selected
- classes.push "group-option" if option.group_array_index?
-
- '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + $("<div />").text(option.text).html() + '</li>'
- else
- ""
-
- results_update_field: ->
- this.result_clear_highlight()
- @result_single_selected = null
- this.results_build()
-
- result_do_highlight: (el) ->
- if el.length
- this.result_clear_highlight()
-
- @result_highlight = el
- @result_highlight.addClass "highlighted"
-
- maxHeight = parseInt @search_results.css("maxHeight"), 10
- visible_top = @search_results.scrollTop()
- visible_bottom = maxHeight + visible_top
-
- high_top = @result_highlight.position().top + @search_results.scrollTop()
- high_bottom = high_top + @result_highlight.outerHeight()
-
- if high_bottom >= visible_bottom
- @search_results.scrollTop if (high_bottom - maxHeight) > 0 then (high_bottom - maxHeight) else 0
- else if high_top < visible_top
- @search_results.scrollTop high_top
-
- result_clear_highlight: ->
- @result_highlight.removeClass "highlighted" if @result_highlight
- @result_highlight = null
-
- results_toggle: ->
- if @results_showing
- this.results_hide()
- else
- this.results_show()
-
- results_show: ->
- if not @is_multiple
- @selected_item.addClass "chzn-single-with-drop"
- if @result_single_selected
- this.result_do_highlight( @result_single_selected )
-
- dd_top = if @is_multiple then @container.height() else (@container.height() - 1)
- @dropdown.css {"top": dd_top + "px", "left":0}
- @results_showing = true
-
- @search_field.focus()
- @search_field.val @search_field.val()
-
- this.winnow_results()
-
- results_hide: ->
- @selected_item.removeClass "chzn-single-with-drop" unless @is_multiple
- this.result_clear_highlight()
- @dropdown.css {"left":"-9000px"}
- @results_showing = false
-
-
- set_tab_index: (el) ->
- if @form_field_jq.attr "tabindex"
- ti = @form_field_jq.attr "tabindex"
- @form_field_jq.attr "tabindex", -1
-
- if @is_multiple
- @search_field.attr "tabindex", ti
- else
- @selected_item.attr "tabindex", ti
- @search_field.attr "tabindex", -1
-
- show_search_field_default: ->
- if @is_multiple and @choices < 1 and not @active_field
- @search_field.val(@default_text)
- @search_field.addClass "default"
- else
- @search_field.val("")
- @search_field.removeClass "default"
-
- search_results_click: (evt) ->
- target = if $(evt.target).hasClass "active-result" then $(evt.target) else $(evt.target).parents(".active-result").first()
- if target.length
- @result_highlight = target
- this.result_select()
-
- search_results_mouseover: (evt) ->
- target = if $(evt.target).hasClass "active-result" then $(evt.target) else $(evt.target).parents(".active-result").first()
- this.result_do_highlight( target ) if target
-
- search_results_mouseout: (evt) ->
- this.result_clear_highlight() if $(evt.target).hasClass "active-result" or $(evt.target).parents('.active-result').first()
-
-
- choices_click: (evt) ->
- evt.preventDefault()
- if( @active_field and not($(evt.target).hasClass "search-choice" or $(evt.target).parents('.search-choice').first) and not @results_showing )
- this.results_show()
-
- choice_build: (item) ->
- choice_id = @form_field.id + "_chzn_c_" + item.array_index
- @choices += 1
- @search_container.before '<li class="search-choice" id="' + choice_id + '"><span>' + item.text + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>'
- link = $('#' + choice_id).find("a").first()
- link.click (evt) => this.choice_destroy_link_click(evt)
-
- choice_destroy_link_click: (evt) ->
- evt.preventDefault()
- @pending_destroy_click = true
- this.choice_destroy $(evt.target)
-
- choice_destroy: (link) ->
- @choices -= 1
- this.show_search_field_default()
-
- this.results_hide() if @is_multiple and @choices > 0 and @search_field.val().length < 1
-
- this.result_deselect (link.attr "rel")
- link.parents('li').first().remove()
-
- result_select: ->
- if @result_highlight
- high = @result_highlight
- high_id = high.attr "id"
-
- this.result_clear_highlight()
-
- high.addClass "result-selected"
-
- if @is_multiple
- this.result_deactivate high
- else
- @result_single_selected = high
-
- position = high_id.substr(high_id.lastIndexOf("_") + 1 )
- item = @results_data[position]
- item.selected = true
-
- @form_field.options[item.options_index].selected = true
-
- if @is_multiple
- this.choice_build item
- else
- @selected_item.find("span").first().text item.text
-
- this.results_hide()
- @search_field.val ""
-
- @form_field_jq.trigger "change"
- this.search_field_scale()
-
- result_activate: (el) ->
- el.addClass("active-result").show()
-
- result_deactivate: (el) ->
- el.removeClass("active-result").hide()
-
- result_deselect: (pos) ->
- result_data = @results_data[pos]
- result_data.selected = false
-
- @form_field.options[result_data.options_index].selected = false
- result = $("#" + @form_field.id + "chzn_o_" + pos)
- result.removeClass("result-selected").addClass("active-result").show()
-
- this.result_clear_highlight()
- this.winnow_results()
-
- @form_field_jq.trigger "change"
- this.search_field_scale()
-
- results_search: (evt) ->
- if @results_showing
- this.winnow_results()
- else
- this.results_show()
-
- winnow_results: ->
- startTime = new Date()
- this.no_results_clear()
-
- results = 0
-
- searchText = if @search_field.val() is @default_text then "" else $.trim @search_field.val()
- regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i')
- zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i')
-
- for option in @results_data
- if not option.disabled and not option.empty
- if option.group
- $('#' + option.dom_id).hide()
- else if not (@is_multiple and option.selected)
- found = false
- result_id = option.dom_id
-
- if regex.test option.text
- found = true
- results += 1
- else if option.text.indexOf(" ") >= 0 or option.text.indexOf("[") == 0
- #TODO: replace this substitution of /\[\]/ with a list of characters to skip.
- parts = option.text.replace(/\[|\]/g, "").split(" ")
- if parts.length
- for part in parts
- if regex.test part
- found = true
- results += 1
-
- if found
- if searchText.length
- startpos = option.text.search zregex
- text = option.text.substr(0, startpos + searchText.length) + '</em>' + option.text.substr(startpos + searchText.length)
- text = text.substr(0, startpos) + '<em>' + text.substr(startpos)
- else
- text = option.text
-
- $("#" + result_id).html text if $("#" + result_id).html != text
-
- this.result_activate $("#" + result_id)
-
- $("#" + @results_data[option.group_array_index].dom_id).show() if option.group_array_index?
- else
- this.result_clear_highlight() if @result_highlight and result_id is @result_highlight.attr 'id'
- this.result_deactivate $("#" + result_id)
-
- if results < 1 and searchText.length
- this.no_results searchText
- else
- this.winnow_results_set_highlight()
-
- winnow_results_clear: ->
- @search_field.val ""
- lis = @search_results.find("li")
-
- for li in lis
- li = $(li)
- if li.hasClass "group-result"
- li.show()
- else if not @is_multiple or not li.hasClass "result-selected"
- this.result_activate li
-
- winnow_results_set_highlight: ->
- if not @result_highlight
- do_high = @search_results.find(".active-result").first()
- if(do_high)
- this.result_do_highlight do_high
-
- no_results: (terms) ->
- no_results_html = $('<li class="no-results">No results match "<span></span>"</li>')
- no_results_html.find("span").first().text(terms)
-
- @search_results.append no_results_html
-
- no_results_clear: ->
- @search_results.find(".no-results").remove()
-
- keydown_arrow: ->
- if not @result_highlight
- first_active = @search_results.find("li.active-result").first()
- this.result_do_highlight $(first_active) if first_active
- else if @results_showing
- next_sib = @result_highlight.nextAll("li.active-result").first()
- this.result_do_highlight next_sib if next_sib
- this.results_show() if not @results_showing
-
- keyup_arrow: ->
- if not @results_showing and not @is_multiple
- this.results_show()
- else if @result_highlight
- prev_sibs = @result_highlight.prevAll("li.active-result")
-
- if prev_sibs.length
- this.result_do_highlight prev_sibs.first()
- else
- this.results_hide() if @choices > 0
- this.result_clear_highlight()
-
- keydown_backstroke: ->
- if @pending_backstroke
- this.choice_destroy @pending_backstroke.find("a").first()
- this.clear_backstroke()
- else
- @pending_backstroke = @search_container.siblings("li.search-choice").last()
- @pending_backstroke.addClass "search-choice-focus"
-
- clear_backstroke: ->
- @pending_backstroke.removeClass "search-choice-focus" if @pending_backstroke
- @pending_backstroke = null
-
- keyup_checker: (evt) ->
- stroke = evt.which ? evt.keyCode
- this.search_field_scale()
-
- switch stroke
- when 8
- if @is_multiple and @backstroke_length < 1 and @choices > 0
- this.keydown_backstroke()
- else if not @pending_backstroke
- this.result_clear_highlight()
- this.results_search()
- when 13
- evt.preventDefault()
- this.result_select() if this.results_showing
- when 27
- this.results_hide() if @results_showing
- when 9, 38, 40, 16
- # don't do anything on these keys
- else this.results_search()
-
-
- keydown_checker: (evt) ->
- stroke = evt.which ? evt.keyCode
- this.search_field_scale()
-
- this.clear_backstroke() if stroke != 8 and this.pending_backstroke
-
- switch stroke
- when 8
- @backstroke_length = this.search_field.val().length
- break
- when 9
- @mouse_on_container = false
- break
- when 13
- evt.preventDefault()
- break
- when 38
- evt.preventDefault()
- this.keyup_arrow()
- break
- when 40
- this.keydown_arrow()
- break
-
-
- search_field_scale: ->
- if @is_multiple
- h = 0
- w = 0
-
- style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"
- styles = ['font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing']
-
- for style in styles
- style_block += style + ":" + @search_field.css(style) + ";"
-
- div = $('<div />', { 'style' : style_block })
- div.text @search_field.val()
- $('body').append div
-
- w = div.width() + 25
- div.remove()
-
- if( w > @f_width-10 )
- w = @f_width - 10
-
- @search_field.css({'width': w + 'px'})
-
- dd_top = @container.height()
- @dropdown.css({"top": dd_top + "px"})
-
-get_side_border_padding = (elmt) ->
- side_border_padding = elmt.outerWidth() - elmt.width()
-
-root.get_side_border_padding = get_side_border_padding
-
-class SelectParser
-
- constructor: ->
- @options_index = 0
- @parsed = []
-
- add_node: (child) ->
- if child.nodeName is "OPTGROUP"
- this.add_group child
- else
- this.add_option child
-
- add_group: (group) ->
- group_position = @parsed.length
- @parsed.push
- array_index: group_position
- group: true
- label: group.label
- children: 0
- disabled: group.disabled
- this.add_option( option, group_position, group.disabled ) for option in group.childNodes
-
- add_option: (option, group_position, group_disabled) ->
- if option.nodeName is "OPTION"
- if option.text != ""
- if group_position?
- @parsed[group_position].children += 1
- @parsed.push
- array_index: @parsed.length
- options_index: @options_index
- value: option.value
- text: option.text
- selected: option.selected
- disabled: if group_disabled is true then group_disabled else option.disabled
- group_array_index: group_position
- else
- @parsed.push
- array_index: @parsed.length
- options_index: @options_index
- empty: true
- @options_index += 1
-
-SelectParser.select_to_array = (select) ->
- parser = new SelectParser()
- parser.add_node( child ) for child in select.childNodes
- parser.parsed
-
-root.SelectParser = SelectParser
diff --git a/src/usr/local/www/javascript/chosen/coffee/chosen.proto.coffee b/src/usr/local/www/javascript/chosen/coffee/chosen.proto.coffee
deleted file mode 100644
index 87a22b6..0000000
--- a/src/usr/local/www/javascript/chosen/coffee/chosen.proto.coffee
+++ /dev/null
@@ -1,629 +0,0 @@
-###
-Chosen, a Select Box Enhancer for jQuery and Protoype
-by Patrick Filler for Harvest, http://getharvest.com
-
-Available for use under the MIT License, http://en.wikipedia.org/wiki/MIT_License
-
-Copyright (c) 2011 by Harvest
-###
-
-root = exports ? this
-
-class Chosen
-
- constructor: (elmn) ->
- this.set_default_values()
-
- @form_field = elmn
- @is_multiple = @form_field.multiple
-
- @default_text_default = if @form_field.multiple then "Select Some Options" else "Select an Option"
-
- this.set_up_html()
- this.register_observers()
-
-
- set_default_values: ->
-
- @click_test_action = (evt) => this.test_active_click(evt)
- @active_field = false
- @mouse_on_container = false
- @results_showing = false
- @result_highlighted = null
- @result_single_selected = null
- @choices = 0
-
- # HTML Templates
- @single_temp = new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" /></div><ul class="chzn-results"></ul></div>')
- @multi_temp = new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>')
- @choice_temp = new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>')
- @no_results_temp = new Template('<li class="no-results">No results match "<span>#{terms}</span>"</li>')
-
-
- set_up_html: ->
- @container_id = @form_field.id + "_chzn"
-
- @f_width = if @form_field.getStyle("width") then parseInt @form_field.getStyle("width"), 10 else @form_field.getWidth()
-
- container_props =
- 'id': @container_id
- 'class': 'chzn-container'
- 'style': 'width: ' + (@f_width) + 'px' #use parens around @f_width so coffeescript doesn't think + ' px' is a function parameter
-
- @default_text = if @form_field.readAttribute 'title' then @form_field.readAttribute 'title' else @default_text_default
-
- base_template = if @is_multiple then new Element('div', container_props).update( @multi_temp.evaluate({ "default": @default_text}) ) else new Element('div', container_props).update( @single_temp.evaluate({ "default":@default_text }) )
-
- @form_field.hide().insert({ after: base_template })
- @container = $(@container_id)
- @container.addClassName( "chzn-container-" + (if @is_multiple then "multi" else "single") )
- @dropdown = @container.down('div.chzn-drop')
-
- dd_top = @container.getHeight()
- dd_width = (@f_width - get_side_border_padding(@dropdown))
-
- @dropdown.setStyle({"width": dd_width + "px", "top": dd_top + "px"})
-
- @search_field = @container.down('input')
- @search_results = @container.down('ul.chzn-results')
- this.search_field_scale()
-
- @search_no_results = @container.down('li.no-results')
-
- if @is_multiple
- @search_choices = @container.down('ul.chzn-choices')
- @search_container = @container.down('li.search-field')
- else
- @search_container = @container.down('div.chzn-search')
- @selected_item = @container.down('.chzn-single')
- sf_width = dd_width - get_side_border_padding(@search_container) - get_side_border_padding(@search_field)
- @search_field.setStyle( {"width" : sf_width + "px"} )
-
- this.results_build()
- this.set_tab_index()
-
-
- register_observers: ->
- @container.observe "click", (evt) => this.container_click(evt)
- @container.observe "mouseenter", (evt) => this.mouse_enter(evt)
- @container.observe "mouseleave", (evt) => this.mouse_leave(evt)
-
- @search_results.observe "click", (evt) => this.search_results_click(evt)
- @search_results.observe "mouseover", (evt) => this.search_results_mouseover(evt)
- @search_results.observe "mouseout", (evt) => this.search_results_mouseout(evt)
-
- @form_field.observe "liszt:updated", (evt) => this.results_update_field(evt)
-
- @search_field.observe "blur", (evt) => this.input_blur(evt)
- @search_field.observe "keyup", (evt) => this.keyup_checker(evt)
- @search_field.observe "keydown", (evt) => this.keydown_checker(evt)
-
- if @is_multiple
- @search_choices.observe "click", (evt) => this.choices_click(evt)
- @search_field.observe "focus", (evt) => this.input_focus(evt)
- else
- @selected_item.observe "focus", (evt) => this.activate_field(evt)
-
-
- container_click: (evt) ->
- if evt and evt.type is "click"
- evt.stop()
- if not @pending_destroy_click
- if not @active_field
- @search_field.clear() if @is_multiple
- document.observe "click", @click_test_action
- this.results_show()
- else if not @is_multiple and evt and (evt.target is @selected_item || evt.target.up("a.chzn-single"))
- this.results_toggle()
-
- this.activate_field()
- else
- @pending_destroy_click = false
-
- mouse_enter: -> @mouse_on_container = true
- mouse_leave: -> @mouse_on_container = false
-
- input_focus: (evt) ->
- setTimeout this.container_click.bind(this), 50 unless @active_field
-
- input_blur: (evt) ->
- if not @mouse_on_container
- @active_field = false
- setTimeout this.blur_test.bind(this), 100
-
- blur_test: (evt) ->
- this.close_field() if not @active_field and @container.hasClassName("chzn-container-active")
-
- close_field: ->
- document.stopObserving "click", @click_test_action
-
- if not @is_multiple
- @selected_item.tabIndex = @search_field.tabIndex
- @search_field.tabIndex = -1
-
- @active_field = false
- this.results_hide()
-
- @container.removeClassName "chzn-container-active"
- this.winnow_results_clear()
- this.clear_backstroke()
-
- this.show_search_field_default()
- this.search_field_scale()
-
- activate_field: ->
- if not @is_multiple and not @active_field
- @search_field.tabIndex = @selected_item.tabIndex
- @selected_item.tabIndex = -1
-
- @container.addClassName "chzn-container-active"
- @active_field = true
-
- @search_field.value = @search_field.value
- @search_field.focus()
-
-
- test_active_click: (evt) ->
- if evt.target.up('#' + @container.id)
- @active_field = true
- else
- this.close_field()
-
- results_build: ->
- startTime = new Date()
- @parsing = true
- @results_data = SelectParser.select_to_array @form_field
-
- if @is_multiple and @choices > 0
- @search_choices.select("li.search-choice").invoke("remove")
- @choices = 0
- else if not @is_multiple
- @selected_item.down("span").update(@default_text)
-
- content = ''
- for data in @results_data
- if data.group
- content += this.result_add_group data
- else if !data.empty
- content += this.result_add_option data
- if data.selected and @is_multiple
- this.choice_build data
- else if data.selected and not @is_multiple
- @selected_item.down("span").update( data.text )
-
- this.show_search_field_default()
- this.search_field_scale()
-
- @search_results.update content
- @parsing = false
-
-
- result_add_group: (group) ->
- if not group.disabled
- group.dom_id = @form_field.id + "chzn_g_" + group.array_index
- '<li id="' + group.dom_id + '" class="group-result">' + group.label.escapeHTML() + '</li>'
- else
- ""
-
- result_add_option: (option) ->
- if not option.disabled
- option.dom_id = @form_field.id + "chzn_o_" + option.array_index
-
- classes = if option.selected and @is_multiple then [] else ["active-result"]
- classes.push "result-selected" if option.selected
- classes.push "group-option" if option.group_array_index?
-
- '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + option.text.escapeHTML() + '</li>'
- else
- ""
-
- results_update_field: ->
- this.result_clear_highlight()
- @result_single_selected = null
- this.results_build()
-
- result_do_highlight: (el) ->
- this.result_clear_highlight()
-
- @result_highlight = el
- @result_highlight.addClassName "highlighted"
-
- maxHeight = parseInt @search_results.getStyle('maxHeight'), 10
- visible_top = @search_results.scrollTop
- visible_bottom = maxHeight + visible_top
-
- high_top = @result_highlight.positionedOffset().top
- high_bottom = high_top + @result_highlight.getHeight()
-
- if high_bottom >= visible_bottom
- @search_results.scrollTop = if (high_bottom - maxHeight) > 0 then (high_bottom - maxHeight) else 0
- else if high_top < visible_top
- @search_results.scrollTop = high_top
-
- result_clear_highlight: ->
- @result_highlight.removeClassName('highlighted') if @result_highlight
- @result_highlight = null
-
- results_toggle: ->
- if @results_showing
- this.results_hide()
- else
- this.results_show()
-
- results_show: ->
- if not @is_multiple
- @selected_item.addClassName('chzn-single-with-drop')
- if @result_single_selected
- this.result_do_highlight( @result_single_selected )
-
- dd_top = if @is_multiple then @container.getHeight() else (@container.getHeight() - 1)
- @dropdown.setStyle {"top": dd_top + "px", "left":0}
- @results_showing = true
-
- @search_field.focus()
- @search_field.value = @search_field.value
-
- this.winnow_results()
-
- results_hide: ->
- @selected_item.removeClassName('chzn-single-with-drop') unless @is_multiple
- this.result_clear_highlight()
- @dropdown.setStyle({"left":"-9000px"})
- @results_showing = false
-
-
- set_tab_index: (el) ->
- if @form_field.tabIndex
- ti = @form_field.tabIndex
- @form_field.tabIndex = -1
-
- if @is_multiple
- @search_field.tabIndex = ti
- else
- @selected_item.tabIndex = ti
- @search_field.tabIndex = -1
-
- show_search_field_default: ->
- if @is_multiple and @choices < 1 and not @active_field
- @search_field.value = @default_text
- @search_field.addClassName "default"
- else
- @search_field.value = ""
- @search_field.removeClassName "default"
-
- search_results_click: (evt) ->
- target = if evt.target.hasClassName("active-result") then evt.target else evt.target.up(".active-result")
- if target
- @result_highlight = target
- this.result_select()
-
- search_results_mouseover: (evt) ->
- target = if evt.target.hasClassName("active-result") then evt.target else evt.target.up(".active-result")
- this.result_do_highlight( target ) if target
-
- search_results_mouseout: (evt) ->
- this.result_clear_highlight() if evt.target.hasClassName('active-result') or evt.target.up('.active-result')
-
-
- choices_click: (evt) ->
- evt.preventDefault()
- if( @active_field and not(evt.target.hasClassName('search-choice') or evt.target.up('.search-choice')) and not @results_showing )
- this.results_show()
-
- choice_build: (item) ->
- choice_id = @form_field.id + "_chzn_c_" + item.array_index
- @choices += 1
- @search_container.insert { before: @choice_temp.evaluate({"id":choice_id, "choice":item.text, "position":item.array_index}) }
- link = $(choice_id).down('a')
- link.observe "click", (evt) => this.choice_destroy_link_click(evt)
-
- choice_destroy_link_click: (evt) ->
- evt.preventDefault()
- @pending_destroy_click = true
- this.choice_destroy evt.target
-
- choice_destroy: (link) ->
- @choices -= 1
- this.show_search_field_default()
-
- this.results_hide() if @is_multiple and @choices > 0 and @search_field.value.length < 1
-
- this.result_deselect link.readAttribute("rel")
- link.up('li').remove()
-
- result_select: ->
- if @result_highlight
- high = @result_highlight
- this.result_clear_highlight()
-
- high.addClassName("result-selected")
-
- if @is_multiple
- this.result_deactivate high
- else
- @result_single_selected = high
-
- position = high.id.substr(high.id.lastIndexOf("_") + 1 )
- item = @results_data[position]
- item.selected = true
-
- @form_field.options[item.options_index].selected = true
-
- if @is_multiple
- this.choice_build item
- else
- @selected_item.down("span").update(item.text)
-
- this.results_hide()
- @search_field.value = ""
-
- @form_field.simulate("change") if typeof Event.simulate is 'function'
- this.search_field_scale()
-
- result_activate: (el) ->
- el.addClassName("active-result").show()
-
- result_deactivate: (el) ->
- el.removeClassName("active-result").hide()
-
- result_deselect: (pos) ->
- result_data = @results_data[pos]
- result_data.selected = false
-
- @form_field.options[result_data.options_index].selected = false
- result = $(@form_field.id + "chzn_o_" + pos)
- result.removeClassName("result-selected").addClassName("active-result").show()
-
- this.result_clear_highlight()
- this.winnow_results()
-
- @form_field.simulate("change") if typeof Event.simulate is 'function'
- this.search_field_scale()
-
- results_search: (evt) ->
- if @results_showing
- this.winnow_results()
- else
- this.results_show()
-
- winnow_results: ->
- startTime = new Date()
- this.no_results_clear()
-
- results = 0
-
- searchText = if @search_field.value is @default_text then "" else @search_field.value.strip()
- regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i')
- zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i')
-
- for option in @results_data
- if not option.disabled and not option.empty
- if option.group
- $(option.dom_id).hide()
- else if not (@is_multiple and option.selected)
- found = false
- result_id = option.dom_id
-
- if regex.test option.text
- found = true
- results += 1
- else if option.text.indexOf(" ") >= 0 or option.text.indexOf("[") == 0
- #TODO: replace this substitution of /\[\]/ with a list of characters to skip.
- parts = option.text.replace(/\[|\]/g, "").split(" ")
- if parts.length
- for part in parts
- if regex.test part
- found = true
- results += 1
-
- if found
- if searchText.length
- startpos = option.text.search zregex
- text = option.text.substr(0, startpos + searchText.length) + '</em>' + option.text.substr(startpos + searchText.length)
- text = text.substr(0, startpos) + '<em>' + text.substr(startpos)
- else
- text = option.text
-
- $(result_id).update text if $(result_id).innerHTML != text
-
- this.result_activate $(result_id)
-
- $(@results_data[option.group_array_index].dom_id).show() if option.group_array_index?
- else
- this.result_clear_highlight() if $(result_id) is @result_highlight
- this.result_deactivate $(result_id)
-
- if results < 1 and searchText.length
- this.no_results(searchText)
- else
- this.winnow_results_set_highlight()
-
- winnow_results_clear: ->
- @search_field.clear()
- lis = @search_results.select("li")
-
- for li in lis
- if li.hasClassName("group-result")
- li.show()
- else if not @is_multiple or not li.hasClassName("result-selected")
- this.result_activate li
-
- winnow_results_set_highlight: ->
- if not @result_highlight
- do_high = @search_results.down(".active-result")
- if(do_high)
- this.result_do_highlight do_high
-
- no_results: (terms) ->
- @search_results.insert @no_results_temp.evaluate({"terms":terms.escapeHTML()})
-
- no_results_clear: ->
- nr = null
- nr.remove() while nr = @search_results.down(".no-results")
-
-
- keydown_arrow: ->
- actives = @search_results.select("li.active-result")
- if actives.length
- if not @result_highlight
- this.result_do_highlight actives.first()
- else if @results_showing
- sibs = @result_highlight.nextSiblings()
- nexts = sibs.intersect(actives)
- this.result_do_highlight nexts.first() if nexts.length
- this.results_show() if not @results_showing
-
- keyup_arrow: ->
- if not @results_showing and not @is_multiple
- this.results_show()
- else if @result_highlight
- sibs = @result_highlight.previousSiblings()
- actives = @search_results.select("li.active-result")
- prevs = sibs.intersect(actives)
-
- if prevs.length
- this.result_do_highlight prevs.first()
- else
- this.results_hide() if @choices > 0
- this.result_clear_highlight()
-
- keydown_backstroke: ->
- if @pending_backstroke
- this.choice_destroy @pending_backstroke.down("a")
- this.clear_backstroke()
- else
- @pending_backstroke = @search_container.siblings("li.search-choice").last()
- @pending_backstroke.addClassName("search-choice-focus")
-
- clear_backstroke: ->
- @pending_backstroke.removeClassName("search-choice-focus") if @pending_backstroke
- @pending_backstroke = null
-
- keyup_checker: (evt) ->
- stroke = evt.which ? evt.keyCode
- this.search_field_scale()
-
- switch stroke
- when 8
- if @is_multiple and @backstroke_length < 1 and @choices > 0
- this.keydown_backstroke()
- else if not @pending_backstroke
- this.result_clear_highlight()
- this.results_search()
- when 13
- evt.preventDefault()
- this.result_select() if this.results_showing
- when 27
- this.results_hide() if @results_showing
- when 9, 38, 40, 16
- # don't do anything on these keys
- else this.results_search()
-
-
- keydown_checker: (evt) ->
- stroke = evt.which ? evt.keyCode
- this.search_field_scale()
-
- this.clear_backstroke() if stroke != 8 and this.pending_backstroke
-
- switch stroke
- when 8
- @backstroke_length = this.search_field.value.length
- when 9
- @mouse_on_container = false
- when 13
- evt.preventDefault()
- when 38
- evt.preventDefault()
- this.keyup_arrow()
- when 40
- this.keydown_arrow()
-
-
- search_field_scale: ->
- if @is_multiple
- h = 0
- w = 0
-
- style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"
- styles = ['font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing']
-
- for style in styles
- style_block += style + ":" + @search_field.getStyle(style) + ";"
-
- div = new Element('div', { 'style' : style_block }).update(@search_field.value)
- document.body.appendChild(div)
-
- w = Element.measure(div, 'width') + 25
- div.remove()
-
- if( w > @f_width-10 )
- w = @f_width - 10
-
- @search_field.setStyle({'width': w + 'px'})
-
- dd_top = @container.getHeight()
- @dropdown.setStyle({"top": dd_top + "px"})
-
-root.Chosen = Chosen
-
-document.observe 'dom:loaded', (evt) ->
- selects = $$(".chzn-select")
- new Chosen select for select in selects
-
-get_side_border_padding = (elmt) ->
- layout = new Element.Layout(elmt)
- side_border_padding = layout.get("border-left") + layout.get("border-right") + layout.get("padding-left") + layout.get("padding-right")
-
-root.get_side_border_padding = get_side_border_padding
-
-root = exports ? this
-
-class SelectParser
-
- constructor: ->
- @options_index = 0
- @parsed = []
-
- add_node: (child) ->
- if child.nodeName is "OPTGROUP"
- this.add_group child
- else
- this.add_option child
-
- add_group: (group) ->
- group_position = @parsed.length
- @parsed.push
- array_index: group_position
- group: true
- label: group.label
- children: 0
- disabled: group.disabled
- this.add_option( option, group_position, group.disabled ) for option in group.childNodes
-
- add_option: (option, group_position, group_disabled) ->
- if option.nodeName is "OPTION"
- if option.text != ""
- if group_position?
- @parsed[group_position].children += 1
- @parsed.push
- array_index: @parsed.length
- options_index: @options_index
- value: option.value
- text: option.text
- selected: option.selected
- disabled: if group_disabled is true then group_disabled else option.disabled
- group_array_index: group_position
- else
- @parsed.push
- array_index: @parsed.length
- options_index: @options_index
- empty: true
- @options_index += 1
-
-SelectParser.select_to_array = (select) ->
- parser = new SelectParser()
- parser.add_node( child ) for child in select.childNodes
- parser.parsed
-
-root.SelectParser = SelectParser
diff --git a/src/usr/local/www/javascript/datepicker/css/datepicker.css b/src/usr/local/www/javascript/datepicker/css/datepicker.css
deleted file mode 100644
index 0773fa6..0000000
--- a/src/usr/local/www/javascript/datepicker/css/datepicker.css
+++ /dev/null
@@ -1,178 +0,0 @@
-/* This is a very basic stylesheet for the date-picker. Feel free to create your own. */
-
-/* The wrapper div */
-.datePicker
- {
- position:absolute;
- min-width:21em;
- width:21em;
- z-index:9999;
- text-align:center;
- font:900 0.8em/0.8em Verdana, Sans-Serif;
- background:transparent;
- }
-/*
- Quirksmode necessity
- --------------------
-
- If your HTML document renders in quirksmode (i.e. has no doctype declaration)
- then uncomment the following CSS rule or the datePicker will be HUGE...
-
-.datePicker th,
-.datePicker td
- {
- font-size:11px;
- }
-*/
-/* The iframe hack to cover selectlists in Internet Explorer <= v6 */
-.iehack
- {
- position:absolute;
- background:#fff;
- z-index:9998;
- padding:0;
- border:0;
- display:none;
- }
-/* The button created beside each input */
-.date-picker-control
- {
- border:0 none;
- padding:0;
- margin-left:4px;
- background:transparent url(../media/cal.gif) no-repeat 0 0;
- width:16px;
- height:16px;
- margin-top:0;
- vertical-align:top;
- cursor:pointer;
- }
-/* The next & previous buttons */
-.datePicker th button
- {
- display:inline;
- padding:0;
- margin:0;
- color:#000;
- height:1em;
- width:0.8em;
- line-height:0.8em;
- border-width:0;
- font-family: georgia, times new roman, palatino, times, bookman, serif;
- background:transparent;
- font-weight:bold;
- cursor:pointer;
- }
-.datePicker th button:active,
-.datePicker th button:focus,
-.date-picker-control:active,
-.date-picker-control:focus
- {
- outline:none;
- }
-.datePicker th button.prev-but
- {
- text-align:left;
- }
-.datePicker th button.next-but
- {
- text-align:right;
- }
-/* The mon, tue, wed etc day buttons */
-.datePicker th button.fd-day-header
- {
- text-align:center;
- margin:0 auto;
- font:900 1em Verdana, Sans-Serif;
- height:auto;
- width:auto;
- text-decoration:none;
- line-height:1.4em;
- }
-/* The table */
-.datePicker table
- {
- position:relative;
- margin:0;
- padding:0;
- border:1px solid #ccc;
- background:#fff url(../media/gradient-e5e5e5-ffffff.gif) repeat-x 0 -20px;
- text-align:center;
- width:100%;
- }
-.datePicker table tfoot td
- {
- background:#fff url(../media/gradient-e5e5e5-ffffff.gif) repeat-x 0 -40px;
- }
-/* Common TD & TH styling */
-.datePicker table td
- {
- border: 1px solid #ccc;
- padding:0.6em 0.5em 0.5em 0.5em;
- /* Opera requires a line-height bigger than 1em in order to redraw properly */
- line-height:1.2em;
- cursor:default;
- background:#fff url(../media/gradient-e5e5e5-ffffff.gif) repeat-x 0 -50px;
- }
-.datePicker table th
- {
- border:0 none;
- padding:0;
- line-height:1em;
- font-weight:bold;
- color:#222;
- text-align:center;
- }
-/* The "mon tue wed etc" day header button styles */
-.datePicker table th.date-picker-day-header
- {
- text-transform:lowercase;
- cursor:help;
- }
-/* The "todays date" style */
-.datePicker table td.date-picker-today
- {
- background:#fff url(../media/bullet2.gif) no-repeat 0 0;
- color:rgb(100,100,100) !important;
- }
-/* The "selected date" style */
-.datePicker table td.date-picker-selected-date
- {
- color:#333 !important;
- border-color:#333 !important;
- }
-/* the "highlight days" style */
-td.date-picker-highlight
- {
- color:#a86666;
- }
-/* The date "out of range" style */
-.datePicker table td.out-of-range
- {
- color:#ccc !important;
- font-style:oblique;
- background:transparent !important;
- cursor:default !important;
- }
-/* The "disabled days" style */
-.datePicker table td.day-disabled
- {
- color:#aaa !important;
- background:transparent !important;
- cursor:default !important;
- }
-/* The "active cursor" style */
-.datePicker table td#date-picker-hover
- {
- background:#fff url(../media/bg_header.jpg) no-repeat 0 0;
- cursor:pointer;
- border-color:rgb(100,130,170);
- color:rgb(100,130,170);
- }
-/* Remove the images for Internet Explorer <= v6 using the "* html" hack */
-* html .datePicker table td.date-picker-selected,
-* html .datePicker table td.date-picker-hover,
-* html .datePicker table td
- {
- background-image:none;
- }
diff --git a/src/usr/local/www/javascript/datepicker/js/blank.html b/src/usr/local/www/javascript/datepicker/js/blank.html
deleted file mode 100644
index 53a7f24..0000000
--- a/src/usr/local/www/javascript/datepicker/js/blank.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<html>
-<head>
-</head>
-<body>
-</body>
-</html>
diff --git a/src/usr/local/www/javascript/datepicker/js/datepicker.js b/src/usr/local/www/javascript/datepicker/js/datepicker.js
deleted file mode 100644
index 3d6dbd3..0000000
--- a/src/usr/local/www/javascript/datepicker/js/datepicker.js
+++ /dev/null
@@ -1,1111 +0,0 @@
-/*
- DatePicker v2.5 by frequency-decoder.com (2006/12/01)
-
- Released under a creative commons Attribution-ShareAlike 2.5 license (http://creativecommons.org/licenses/by-sa/2.5/)
-
- Please credit frequency-decoder in any derivative work - thanks.
-
- You are free:
-
- * to copy, distribute, display, and perform the work
- * to make derivative works
- * to make commercial use of the work
-
- Under the following conditions:
-
- by Attribution.
- --------------
- You must attribute the work in the manner specified by the author or licensor.
-
- sa
- --
- Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under a license identical to this one.
-
- * For any reuse or distribution, you must make clear to others the license terms of this work.
- * Any of these conditions can be waived if you get permission from the copyright holder.
-*/
-var datePickerController;
-
-(function() {
-
-datePicker.isSupported = typeof document.createElement != "undefined" &&
- typeof document.documentElement != "undefined" &&
- typeof document.documentElement.offsetWidth == "number";
-
-// Detect the users language
-datePicker.languageinfo = navigator.language ? navigator.language : navigator.userLanguage;
-datePicker.languageinfo = datePicker.languageinfo ? datePicker.languageinfo.toLowerCase().replace(/-[a-z]+$/, "") : 'en';
-
-if(datePicker.languageinfo != 'en') {
- // Load the appropriate language file
- var scriptFiles = document.getElementsByTagName('head')[0].getElementsByTagName('script');
- var loc = "";
-
- for(var i = 0, scriptFile; scriptFile = scriptFiles[i]; i++) {
- if(scriptFile.src && scriptFile.src.match(/datepicker/)) {
- loc = scriptFile.src.replace("datepicker", "lang/" + datePicker.languageinfo);
- break;
- };
- };
-
- if(loc != "") {
- var script = document.createElement('script');
- script.type = "text/javascript";
- script.src = loc;
- // Hopefully this allows a UTF-8 js file to be imported into a non-UTF HTML document
- script.setAttribute("charset", "utf-8");
- document.getElementsByTagName('head')[0].appendChild(script);
- };
-};
-
-// Defaults for the language should the locale file not load
-datePicker.months = [
- "January",
- "February",
- "March",
- "April",
- "May",
- "June",
- "July",
- "August",
- "September",
- "October",
- "November",
- "December"];
-datePicker.fullDay = [
- "Monday",
- "Tuesday",
- "Wednesday",
- "Thursday",
- "Friday",
- "Saturday",
- "Sunday"];
-datePicker.titles = [
- "Previous month",
- "Next month",
- "Previous year",
- "Next year"];
-datePicker.daysPerMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
-
-datePicker.getDaysPerMonth = function (nMonth, nYear) {
- nMonth = (nMonth + 12) % 12;
- var res = datePicker.daysPerMonth[nMonth];
- if(((0 == (nYear%4)) && ((0 != (nYear%100)) || (0 == (nYear%400)))) && nMonth == 1) {
- res = 29;
- };
- return res;
-};
-
-function datePicker(options) {
-
- this.defaults = {};
-
- for(opt in options) {
- this[opt] = this.defaults[opt] = options[opt];
- };
-
- this.date = new Date();
- this.yearinc = 1;
- this.timer = null;
- this.pause = 1000;
- this.timerSet = false;
- this.opacity = 0;
- this.opacityTo = 0;
- this.fadeTimer = null;
- this.interval = new Date();
- this.firstDayOfWeek = this.defaults.firstDayOfWeek = 0;
- this.dateSet = null;
- this.visible = false;
- this.div;
- this.table;
-
- var o = this;
-
- o.reset = function() {
- for(def in o.defaults) {
- o[def] = o.defaults[def];
- };
- };
- o.setOpacity = function(op) {
- o.div.style.opacity = + op/100;
- o.div.style.filter = 'alpha(opacity=' + op + ')';
- o.opacity = op;
- };
- o.fade = function() {
-
- window.clearTimeout(o.fadeTimer);
- var diff = Math.round(o.opacity + ((o.opacityTo - o.opacity) / 4));
-
- o.setOpacity(diff);
-
- if(Math.abs(o.opacityTo - diff) > 3) {
- o.fadeTimer = window.setTimeout(function () { o.fade(); }, 50);
- } else {
- o.setOpacity(o.opacityTo);
- if(o.opacityTo == 0) o.div.style.display = "none";
- };
- };
- o.killEvent = function(e) {
- if (e == null) e = document.parentWindow.event;
-
- if (e.stopPropagation) {
- e.stopPropagation();
- e.preventDefault();
- }
- /*@cc_on@*/
- /*@if(@_win32)
- e.cancelBubble = true;
- e.returnValue = false;
- /*@end@*/
- return false;
- };
- o.startTimer = function () {
- if (o.timerSet) o.stopTimer();
- o.timer = window.setTimeout(function () { o.onTimer(); }, o.timerInc);
- o.timerSet = true;
- };
- o.stopTimer = function () {
- if (o.timer != null) window.clearTimeout(o.timer);
- o.timerSet = false;
- };
- o.events = {
- onkeydown: function (e) {
-
- if(!o.visible) return false;
-
- if (e == null) e = document.parentWindow.event;
- var kc = e.keyCode ? e.keyCode : e.charCode;
-
- if ( kc == 13 ) {
- // close with update
- o.returnFormattedDate();
- o.hide();
- return o.killEvent(e);
- } else if ( kc == 27 ) {
- // close
- o.hide();
- return o.killEvent(e);
- } else if ( kc == 32 || kc == 0 ) {
- // close
- o.date = new Date( );
- o.updateTable();
- return o.killEvent(e);
- };
-
- // Internet Explorer fires the keydown event faster than the JavaScript engine can
- // update the interface. The following attempts to fix this.
-
- /*@cc_on@*/
- /*@if(@_win32)
- if(new Date().getTime() - o.interval.getTime() < 100) return o.killEvent(e);
- o.interval = new Date();
- /*@end@*/
-
- if ((kc > 49 && kc < 56) || (kc > 97 && kc < 104)) {
- if (kc > 96) kc -= (96-48);
- kc -= 49;
- o.firstDayOfWeek = (o.firstDayOfWeek + kc) % 7;
- o.updateTable();
- return o.killEvent(e);
- };
-
- if ( kc < 37 || kc > 40 ) return true;
-
- var d = new Date( o.date ).valueOf();
-
- if ( kc == 37 ) {
- // ctrl + left = previous month
- if( e.ctrlKey ) {
- d = new Date( o.date );
- d.setDate( Math.min(d.getDate(), datePicker.getDaysPerMonth(d.getMonth() - 1,d.getFullYear())) ); // no need to catch dec -> jan for the year
- d.setMonth( d.getMonth() - 1 );
- } else {
- d -= 24 * 60 * 60 * 1000;
- };
- } else if ( kc == 39 ) {
- // ctrl + right = next month
- if( e.ctrlKey ) {
- d = new Date( o.date );
- d.setDate( Math.min(d.getDate(), datePicker.getDaysPerMonth(d.getMonth() + 1,d.getFullYear())) ); // no need to catch dec -> jan for the year
- d.setMonth( d.getMonth() + 1 );
- } else {
- d += 24 * 60 * 60 * 1000;
- };
- } else if ( kc == 38 ) {
- // ctrl + up = next year
- if( e.ctrlKey ) {
- d = new Date( o.date );
- d.setDate( Math.min(d.getDate(), datePicker.getDaysPerMonth(d.getMonth(),d.getFullYear() + 1)) ); // no need to catch dec -> jan for the year
- d.setFullYear( d.getFullYear() + 1 );
- } else {
- d -= 7 * 24 * 60 * 60 * 1000;
- };
- } else if ( kc == 40 ) {
- // ctrl + down = prev year
- if( e.ctrlKey ) {
- d = new Date( o.date );
- d.setDate( Math.min(d.getDate(), datePicker.getDaysPerMonth(d.getMonth(),d.getFullYear() - 1)) ); // no need to catch dec -> jan for the year
- d.setFullYear( d.getFullYear() - 1 );
- } else {
- d += 7 * 24 * 60 * 60 * 1000;
- };
- };
-
- var tmpDate = new Date( d );
- if(!o.outOfRange(tmpDate)) {
- o.date = tmpDate;
- };
-
- o.updateTable();
-
- return o.killEvent(e);
- },
- onmousedown: function(e) {
- if ( e == null ) e = document.parentWindow.event;
- var el = e.target != null ? e.target : e.srcElement;
-
- var found = false;
-
- while(el.parentNode) {
- if(el.id && (el.id == "fd-"+o.id || el.id == "fd-but-"+o.id)) {
- found = true;
- break;
- }
- try {
- el = el.parentNode;
- } catch(err) {
- break;
- }
- }
- if(found) return true;
- datePickerController.hideAll();
- },
- onmouseover: function(e) {
- if(document.getElementById("date-picker-hover")) {
- document.getElementById("date-picker-hover").id = "";
- };
-
- this.id = "date-picker-hover";
-
- o.date.setDate(this.firstChild.nodeValue);
- },
- onclick: function (e) {
- if(o.opacity != o.opacityTo) return false;
- if ( e == null ) e = document.parentWindow.event;
- var el = e.target != null ? e.target : e.srcElement;
- while ( el.nodeType != 1 ) el = el.parentNode;
-
- var d = new Date( o.date );
- var n = Number( el.firstChild.data );
-
- if(isNaN(n)) { return true; };
-
- d.setDate( n );
- o.date = d;
-
- o.returnFormattedDate();
- o.hide();
- return o.killEvent(e);
- },
- incDec:function(e) {
- if(o.timerSet) {
- o.stopTimer();
- };
-
- datePickerController.addEvent(document, "mouseup", o.events.clearTimer);
-
- o.timerInc = 1000;
- o.dayInc = arguments[1];
- o.yearInc = arguments[2];
- o.monthInc = arguments[3];
- o.onTimer();
- return o.killEvent(e);
- },
- clearTimer:function() {
- o.stopped = true;
- o.timerInc = 1000;
- o.yearInc = 0;
- o.monthInc = 0;
- o.dayInc = 0;
- try {
- datePickerController.removeEvent(document, "mouseup", o.events.clearTimer);
- } catch(e) { };
- o.stopTimer();
- }
- };
- o.onTimer = function() {
- var d = new Date( o.date );
-
- d.setDate( Math.min(d.getDate()+o.dayInc, datePicker.getDaysPerMonth(d.getMonth()+o.monthInc,d.getFullYear()+o.yearInc)) ); // no need to catch dec -> jan for the year
- d.setMonth( d.getMonth() + o.monthInc );
- d.setFullYear( d.getFullYear() + o.yearInc );
-
- o.date = d;
-
- if(o.timerInc > 50) {
- o.timerInc = 50 + Math.round(((o.timerInc - 50) / 1.8));
- };
- o.startTimer();
- o.updateTable();
- };
- o.getElem = function() {
- return document.getElementById(o.id.replace(/^fd-/, '')) || false;
- };
- o.setRangeLow = function(range) {
- if(String(range).search(/^(\d\d?\d\d)(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$/) == -1) range = '';
- o.low = o.defaults.low = range;
- };
- o.setRangeHigh = function(range) {
- if(String(range).search(/^(\d\d?\d\d)(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$/) == -1) range = '';
- o.high = o.defaults.high = range;
- };
- o.setDisabledDays = function(dayArray) {
- o.disableDays = o.defaults.disableDays = dayArray;
- };
- o.setFirstDayOfWeek = function(e) {
- if ( e == null ) e = document.parentWindow.event;
- var elem = e.target != null ? e.target : e.srcElement;
-
- if(elem.tagName.toLowerCase() != "th") {
- while(elem.tagName.toLowerCase() != "th") elem = elem.parentNode;
- }
-
- var cnt = 0;
-
- while(elem.previousSibling) {
- elem = elem.previousSibling;
- if(elem.tagName.toLowerCase() == "th") cnt++;
- }
-
- o.firstDayOfWeek = (o.firstDayOfWeek + cnt) % 7;
- o.updateTable();
-
- return o.killEvent(e);
- };
- o.trueBody = function() {
- return;
- };
- o.resize = function() {
- if(!o.created || !o.getElem()) return;
-
- o.div.style.visibility = "hidden";
- o.div.style.display = "block";
-
- var osh = o.div.offsetHeight;
- var osw = o.div.offsetWidth;
-
- o.div.style.visibility = "visible";
- o.div.style.display = "none";
-
- var elem = document.getElementById('fd-but-' + o.id);
- var pos = datePickerController.findPosition(elem);
- var trueBody = (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body;
-
- if ( parseInt(trueBody.clientWidth+trueBody.scrollLeft) < parseInt(osw+pos[0])) {
- o.div.style.left = Math.abs(parseInt((trueBody.clientWidth+trueBody.scrollLeft) - osw)) + "px";
- } else {
- o.div.style.left = pos[0] + "px";
- };
-
- if ( parseInt(trueBody.clientHeight+trueBody.scrollTop) < parseInt(osh+pos[1]+elem.offsetHeight+2)) {
- o.div.style.top = Math.abs(parseInt(pos[1] - (osh + 2))) + "px";
- } else {
- o.div.style.top = Math.abs(parseInt(pos[1] + elem.offsetHeight + 2)) + "px";
- };
- };
- o.equaliseDates = function() {
- var clearDayFound = false;
- var tmpDate;
- for(var i = o.low; i <= o.high; i++) {
- tmpDate = String(i);
- if(!o.disableDays[new Date(tmpDate.substr(4,2) + '/' + tmpDate.substr(6,2) + '/' + tmpDate.substr(0,4)).getDay() - 1]) {
- clearDayFound = true;
- break;
- };
- };
- if(!clearDayFound) o.disableDays = o.defaults.disableDays = [0,0,0,0,0,0,0];
- };
- o.outOfRange = function(tmpDate) {
- if(!o.low && !o.high) return false;
-
- var level = false;
- if(!tmpDate) {
- level = true;
- tmpDate = o.date;
- };
-
- var d = (tmpDate.getDate() < 10) ? "0" + tmpDate.getDate() : tmpDate.getDate();
- var m = ((tmpDate.getMonth() + 1) < 10) ? "0" + (tmpDate.getMonth() + 1) : tmpDate.getMonth() + 1;
- var y = tmpDate.getFullYear();
- var dt = (y+' '+m+' '+d).replace(/ /g,'');
-
- if(o.low) {
- if(parseInt(dt) < parseInt(o.low)) {
- if(!level) return true;
- o.date = new Date( o.low.substr(4,2) + '/' + o.low.substr(6,2) + '/' + o.low.substr(0,4) );
- return false;
- };
- };
- if(o.high) {
- if(parseInt(dt) > parseInt(o.high)) {
- if(!level) return true;
- o.date = new Date( o.high.substr(4,2) + '/' + o.high.substr(6,2) + '/' + o.high.substr(0,4) );
- };
- };
- return false;
- };
- o.create = function() {
-
- /*@cc_on@*/
- /*@if(@_jscript_version <= 5.6)
- if(!document.getElementById("iePopUpHack")) {
- var loc = "./blank.html";
- var scriptFiles = document.getElementsByTagName('head')[0].getElementsByTagName('script');
- for(var i = 0, scriptFile; scriptFile = scriptFiles[i]; i++) {
- if(scriptFile.src && scriptFile.src.match(/datepicker.js$/)) {
- loc = scriptFile.src.replace("datepicker.js", "blank.html");
- break;
- };
- };
-
- o.iePopUp = document.createElement('iframe');
- o.iePopUp.src = loc;
- o.iePopUp.setAttribute('className','iehack');
- o.iePopUp.scrolling="no";
- o.iePopUp.frameBorder="0";
- o.iePopUp.name = o.iePopUp.id = "iePopUpHack";
- document.body.appendChild(o.iePopUp);
- } else {
- o.iePopUp = document.getElementById("iePopUpHack");
- };
- /*@end@*/
-
- if(typeof(fdLocale) == "object" && o.locale) {
- datePicker.titles = fdLocale.titles;
- datePicker.months = fdLocale.months;
- datePicker.fullDay = fdLocale.fullDay;
- // Optional parameters
- if(fdLocale.dayAbbr) datePicker.dayAbbr = fdLocale.dayAbbr;
- if(fdLocale.firstDayOfWeek) o.firstDayOfWeek = o.defaults.firstDayOfWeek = fdLocale.firstDayOfWeek;
- };
-
- o.div = document.createElement('div');
- o.div.style.zIndex = 9999;
- o.div.id = "fd-"+o.id;
- var tableBody = document.createElement('tbody');
- var tableHead = document.createElement('thead');
- var nbsp = String.fromCharCode( 160 );
-
- o.table = document.createElement('table');
- o.div.className = "datePicker";
-
- var tr = document.createElement('tr');
- var th = document.createElement('th');
-
- // previous year
- var tmpelem = document.createElement('button');
- tmpelem.setAttribute("type", "button");
- tmpelem.className = "prev-but";
- tmpelem.appendChild(document.createTextNode('\u00AB'));
- tmpelem.title = datePicker.titles[2];
- tmpelem.onmousedown = function(e) { this.blur(); o.events.incDec(e,0,-1,0); };
- tmpelem.onmouseup = o.events.clearTimer;
- th.appendChild( tmpelem );
-
- // previous month
- var tmpelem = document.createElement('button');
- tmpelem.setAttribute("type", "button");
- tmpelem.className = "prev-but";
- tmpelem.appendChild(document.createTextNode("\u2039"));
- tmpelem.title = datePicker.titles[0];
- tmpelem.onmousedown = function(e) { this.blur(); o.events.incDec(e,0,0,-1); };
- tmpelem.onmouseup = o.events.clearTimer;
- th.appendChild( tmpelem );
- tr.appendChild( th );
-
- // title bar
- o.titleBar = document.createElement('th');
-
- /*@cc_on
- /*@if (@_win32)
- o.titleBar.setAttribute('colSpan','5');
- @else @*/
- o.titleBar.setAttribute('colspan','5');
- /*@end
- @*/
-
- o.titleBar.setAttribute('text-align','center');
- tr.appendChild( o.titleBar );
-
- th = document.createElement('th');
-
- // next month
- var tmpelem = document.createElement('button');
- tmpelem.setAttribute("type", "button");
- tmpelem.className = "next-but";
- tmpelem.appendChild(document.createTextNode('\u203A'));
- tmpelem.title = datePicker.titles[1];
- tmpelem.onmousedown = function(e) { this.blur(); o.events.incDec(e,0,0,1); };
- tmpelem.onmouseup = o.events.clearTimer;
-
- th.appendChild( tmpelem );
-
- // next year
- var tmpelem = document.createElement('button');
- tmpelem.setAttribute("type", "button");
- tmpelem.className = "next-but";
- tmpelem.appendChild(document.createTextNode('\u00BB'));
- tmpelem.title = datePicker.titles[3];
- tmpelem.onmousedown = function(e) { this.blur(); o.events.incDec(e,0,1,0); };
- tmpelem.onmouseup = o.events.clearTimer;
- th.appendChild( tmpelem );
-
- tr.appendChild( th );
-
- tableHead.appendChild(tr);
-
- var row, col;
-
- for(var rows = 0; rows < 7; rows++) {
- row = document.createElement('tr');
- for(var cols = 0; cols < 7; cols++) {
- col = (rows == 0) ? document.createElement('th') : document.createElement('td');
- if(rows != 0) {
- col.appendChild(document.createTextNode(nbsp));
- } else {
- col.className = "date-picker-day-header";
- col.scope = "col";
- };
-
- row.appendChild(col);
- }
- if(rows != 0) tableBody.appendChild(row);
- else tableHead.appendChild(row);
- };
- o.table.appendChild( tableHead );
- o.table.appendChild( tableBody );
-
- o.div.appendChild( o.table );
- o.created = true;
-
- document.getElementsByTagName('body')[0].appendChild( o.div );
- };
- o.setDateFromInput = function() {
- o.dateSet = null;
-
- var elem = o.getElem();
- if(!elem) return;
-
- var date = elem.value;
-
- var d,m,y,dt,dates;
-
- d = o.format.replace(/-/g,'').indexOf('d');
- m = o.format.replace(/-/g,'').indexOf('m');
- y = o.format.replace(/-/g,'').indexOf('y');
-
- if(o.splitDate) {
- dates = [];
-
- dates[m] = document.getElementById(o.id+'-mm').value;
- if(dates[m] < 1 || dates[m] > 12) dates[m] = "";
-
- dates[d] = document.getElementById(o.id+'-dd').value;
- if(dates[d] < 1 || dates[d] > datePicker.daysPerMonth[dates[m]-1]) dates[d] = "";
-
- dates[y] = date;
- } else {
- if(date.match(/^[0-9]{4}$/)) {
- if(date > 1600 && date < 2030) {
- o.date.setFullYear(date);
- return;
- };
- };
-
- dates = date.split(o.divider);
-
- if(dates.length != 3) {
- o.date = new Date();
- return;
- };
- };
-
- var check = new Date( dates[y] + "/" + dates[m] + "/" + dates[d] );
- if(check == 'Invalid Date' /*@cc_on@*/ /*@if(@_win32) || check == 'NaN' /*@end@*/) {
- o.date = new Date();
- return;
- };
-
- o.date.setMonth(dates[m]-1);
- o.date.setFullYear(dates[y]);
- o.date.setDate(dates[d]);
-
- o.dateSet = new Date(o.date);
- };
- o.returnFormattedDate = function() {
- var elem = o.getElem();
- if(!elem) return;
-
- var d = (o.date.getDate() < 10) ? "0" + o.date.getDate() : o.date.getDate();
- var m = ((o.date.getMonth() + 1) < 10) ? "0" + (o.date.getMonth() + 1) : o.date.getMonth() + 1;
- var yyyy = o.date.getFullYear();
-
- var weekDay = ( o.date.getDay() + 6 ) % 7;
-
- if(!(o.disableDays[weekDay])) {
- if(o.splitDate) {
- document.getElementById(o.id+"-dd").value = d;
- document.getElementById(o.id+"-mm").value = m;
- elem.value = yyyy;
-
- document.getElementById(o.id+"-dd").focus();
- if(document.getElementById(o.id+"-dd").onchange) document.getElementById(o.id+"-dd").onchange();
- if(document.getElementById(o.id+"-mm").onchange) document.getElementById(o.id+"-mm").onchange();
- } else {
- elem.value = o.format.replace('y',yyyy).replace('m',m).replace('d',d).replace(/-/g,o.divider);
- elem.focus();
- };
- if(elem.onchange) elem.onchange();
- };
- };
- // Credit where credit's due:
-
- // Most of the logic for this method from the webfx date-picker
- // http://webfx.eae.net/
-
- o.updateTable = function() {
-
- if(document.getElementById("date-picker-hover")) {
- document.getElementById("date-picker-hover").id = "";
- };
-
- var i;
- var str = "";
- var rows = 6;
- var cols = 7;
- var currentWeek = 0;
- var nbsp = String.fromCharCode( 160 );
-
- var cells = new Array( rows );
-
- for ( i = 0; i < rows; i++ ) {
- cells[i] = new Array( cols );
- };
-
- o.outOfRange();
-
- // Set the tmpDate to this month
- var tmpDate = new Date( o.date.getFullYear(), o.date.getMonth(), 1 );
- var today = new Date();
-
- // titleBar
- var titleText = datePicker.months[o.date.getMonth()] + nbsp + o.date.getFullYear();
- while(o.titleBar.firstChild) o.titleBar.removeChild(o.titleBar.firstChild);
- o.titleBar.appendChild(document.createTextNode(titleText));
-
- for ( i = 1; i < 32; i++ ) {
-
- tmpDate.setDate( i );
- var weekDay = ( tmpDate.getDay() + 6 ) % 7;
- var colIndex = ( (weekDay - o.firstDayOfWeek) + 7 ) % 7;
- var cell = { text:"", className:"", id:"" };
-
- if ( tmpDate.getMonth() == o.date.getMonth() ) {
-
- cells[currentWeek][colIndex] = { text:"", className:"", id:"" };
-
- var isToday = tmpDate.getDate() == today.getDate() &&
- tmpDate.getMonth() == today.getMonth() &&
- tmpDate.getFullYear() == today.getFullYear();
-
- if ( o.dateSet != null && o.dateSet.getDate() == tmpDate.getDate() && o.dateSet.getMonth() == tmpDate.getMonth() && o.dateSet.getFullYear() == tmpDate.getFullYear()) {
- cells[currentWeek][colIndex].className = "date-picker-selected-date";
- };
- if ( o.date.getDate() == tmpDate.getDate() && o.date.getFullYear() == tmpDate.getFullYear()) {
- cells[currentWeek][colIndex].id = "date-picker-hover";
- };
-
- if(o.highlightDays[weekDay]) {
- cells[currentWeek][colIndex].className += " date-picker-highlight";
- };
- if ( isToday ) {
- cells[currentWeek][colIndex].className = "date-picker-today";
- };
- if(o.outOfRange(tmpDate)) {
- cells[currentWeek][colIndex].className = "out-of-range";
- } else if(o.disableDays[weekDay]) {
- cells[currentWeek][colIndex].className = "day-disabled";
- };
- cells[currentWeek][colIndex].text = tmpDate.getDate();
- if ( colIndex == 6 ) currentWeek++;
- };
- };
-
- // Table headers
- var lnk, d;
- var ths = o.table.getElementsByTagName('thead')[0].getElementsByTagName('tr')[1].getElementsByTagName('th');
- for ( var y = 0; y < 7; y++ ) {
- d = (o.firstDayOfWeek + y) % 7;
-
- while(ths[y].firstChild) ths[y].removeChild(ths[y].firstChild);
-
- ths[y].title = datePicker.fullDay[d];
-
- // Don't create a button for the first day header
- if(y > 0) {
- but = document.createElement("BUTTON");
- but.className = "fd-day-header";
- but.onclick = but.onkeypress = ths[y].onclick = o.setFirstDayOfWeek;
- but.appendChild(document.createTextNode(datePicker.dayAbbr ? datePicker.dayAbbr[d] : datePicker.fullDay[d].charAt(0)));
- ths[y].appendChild(but);
- but.title = datePicker.fullDay[d];
- } else {
- ths[y].appendChild(document.createTextNode(datePicker.dayAbbr ? datePicker.dayAbbr[d] : datePicker.fullDay[d].charAt(0)));
- ths[y].onclick = null;
- };
- };
-
-
- var trs = o.table.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
-
- var tmpCell;
-
- for ( var y = 0; y < rows; y++ ) {
- var tds = trs[y].getElementsByTagName('td');
- for (var x = 0; x < cols; x++) {
- tmpCell = tds[x];
-
- while(tmpCell.firstChild) tmpCell.removeChild(tmpCell.firstChild);
-
- if ( typeof cells[y][x] != "undefined" ) {
- tmpCell.className = cells[y][x].className;
- tmpCell.id = cells[y][x].id;
-
- tmpCell.appendChild(document.createTextNode(cells[y][x].text));
-
- if(cells[y][x].className != "out-of-range") {
- tmpCell.onmouseover = o.events.onmouseover;
- tmpCell.onclick = cells[y][x].className == "day-disabled" ? o.killEvent : o.events.onclick;
- tmpCell.title = datePicker.months[o.date.getMonth()] + nbsp + cells[y][x].text + "," + nbsp + o.date.getFullYear();
- } else {
- tmpCell.onmouseover = null;
- tmpCell.onclick = o.killEvent;
- tmpCell.title = "";
- };
- } else {
- tmpCell.className = "";
- tmpCell.id = "";
- tmpCell.onmouseover = null;
- tmpCell.onclick = function(e) { return o.killEvent(e); };
- tmpCell.appendChild(document.createTextNode(nbsp));
- tmpCell.title = "";
- };
- };
- };
- };
- o.init = function() {
- if(o.low && o.high && (o.high - o.low < 7)) {
- o.equaliseDates();
- };
- o.resize();
- o.setDateFromInput();
- o.fade();
- o.ieHack(true);
- };
- o.ieHack = function(cleanup) {
- // IE hack
- if(o.iePopUp) {
- o.iePopUp.style.display = "block";
- o.iePopUp.style.top = (o.div.offsetTop + 2) + "px";
- o.iePopUp.style.left = o.div.offsetLeft + "px";
- o.iePopUp.style.width = o.div.clientWidth + "px";
- o.iePopUp.style.height = (o.div.clientHeight - 2) + "px";
- if(cleanup) o.iePopUp.style.display = "none";
- }
- };
- o.show = function() {
- var elem = o.getElem();
- if(!elem || o.visible || elem.disabled) return;
-
- o.reset();
- o.setDateFromInput();
- o.updateTable();
- o.resize();
- o.ieHack(false);
-
- datePickerController.addEvent(document, "mousedown", o.events.onmousedown);
- datePickerController.addEvent(document, "keypress", o.events.onkeydown);
-
- // Internet Explorer requires the keydown event in order to catch arrow keys
-
- /*@cc_on@*/
- /*@if(@_win32)
- datePickerController.removeEvent(document, "keypress", o.events.onkeydown);
- datePickerController.addEvent(document, "keydown", o.events.onkeydown);
- /*@end@*/
-
- o.opacityTo = 90;
- o.div.style.display = "block";
- o.ieHack(false);
- o.fade();
- o.visible = true;
-
- };
- o.hide = function() {
- try {
- datePickerController.removeEvent(document, "mousedown", o.events.onmousedown);
- datePickerController.removeEvent(document, "keypress", o.events.onkeydown);
- datePickerController.removeEvent(document, "keydown", o.events.onkeydown);
- } catch(e) {
-
- };
- if(o.iePopUp) {
- o.iePopUp.style.display = "none";
- };
- o.opacityTo = 0;
- o.fade();
- o.visible = false;
- };
- o.create();
- o.init();
-};
-
-datePickerController = {
- datePickers: {},
- addEvent: function(obj, type, fn, tmp) {
- tmp || (tmp = true);
- if( obj.attachEvent ) {
- obj["e"+type+fn] = fn;
- obj[type+fn] = function(){obj["e"+type+fn]( window.event );};
- obj.attachEvent( "on"+type, obj[type+fn] );
- } else {
- obj.addEventListener( type, fn, true );
- };
- },
- removeEvent: function(obj, type, fn, tmp) {
- tmp || (tmp = true);
- if( obj.detachEvent ) {
- obj.detachEvent( "on"+type, obj[type+fn] );
- obj[type+fn] = null;
- } else {
- obj.removeEventListener( type, fn, true );
- };
- },
- findPosition: function(obj) {
- var curleft = 0;
- var curtop = 0;
- var orig = obj;
-
- if(obj.offsetParent) {
- while(obj.offsetParent) {
- curleft += obj.offsetLeft;
- curtop += obj.offsetTop;
- obj = obj.offsetParent;
- };
- } else if (obj.x) {
- curleft += obj.x;
- curtop += obj.y;
- };
- return [ curleft, curtop ];
- },
- hideAll: function(exception) {
- for(dp in datePickerController.datePickers) {
- if(exception && exception == datePickerController.datePickers[dp].id) continue;
- datePickerController.datePickers[dp].hide();
- };
- },
- cleanUp: function() {
- var dp;
- for(dp in datePickerController.datePickers) {
- if(!document.getElementById(datePickerController.datePickers[dp].id)) {
- dpElem = document.getElementById("fd-"+datePickerController.datePickers[dp].id);
- if(dpElem) {
- dpElem.parentNode.removeChild(dpElem);
- };
- datePickerController.datePickers[dp] = null;
- delete datePickerController.datePickers[dp];
- };
- };
- },
- dateFormat: function(dateIn, favourMDY) {
- var dateTest = [
- { regExp:/^(0[1-9]|[12][0-9]|3[01])([- \/.])(0[1-9]|1[012])([- \/.])(\d\d?\d\d)$/, d:1, m:3, y:5 }, // dmy
- { regExp:/^(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])([- \/.])(\d\d?\d\d)$/, d:3, m:1, y:5 }, // mdy
- { regExp:/^(\d\d?\d\d)([- \/.])(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])$/, d:5, m:3, y:1 } // ymd
- ];
-
- var start;
- var cnt = 0;
-
- while(cnt < 3) {
- start = (cnt + (favourMDY ? 4 : 3)) % 3;
-
- if(dateIn.match(dateTest[start].regExp)) {
- res = dateIn.match(dateTest[start].regExp);
- y = res[dateTest[start].y];
- m = res[dateTest[start].m];
- d = res[dateTest[start].d];
- if(m.length == 1) m = "0" + m;
- if(d.length == 1) d = "0" + d;
- if(y.length != 4) y = (parseInt(y) < 50) ? '20' + y : '19' + y;
-
- return y+m+d;
- };
-
- cnt++;
- };
-
- return 0;
- },
- create: function() {
- if(!datePicker.isSupported) return;
-
- datePickerController.cleanUp();
-
- var inputs = document.getElementsByTagName('input');
-
- var regExp1 = /disable-days-([1-7]){1,6}/g; // the days to disable
- var regExp3 = /highlight-days-([1-7]){1,7}/g; // the days to highlight in red
- var regExp4 = /range-low-([0-9\-]){10}/g; // the lowest selectable date
- var regExp5 = /range-high-([0-9\-]){10}/g; // the highest selectable date
- var regExp6 = /format-([dmy\-]{5})/g; // the input/output date format
- var regExp7 = /divider-(dot|slash|space|dash)/g; // the character used to divide the date
- var regExp8 = /no-locale/g; // do not attempt to detect the browser language
-
- for(var i=0, inp; inp = inputs[i]; i++) {
- if(inp.className && (inp.className.search(regExp6) != -1 || inp.className.search(/split-date/) != -1) && inp.type == "text" && inp.name) {
-
- if(!inp.id) {
- // Internet explorer requires you to give each input a unique ID attribute.
- if(document.getElementById(inp.name)) continue;
- inp.id = inp.name;
- };
-
- var options = {
- id:inp.id,
- low:"",
- high:"",
- divider:"/",
- format:"d-m-y",
- highlightDays:[0,0,0,0,0,1,1],
- disableDays:[0,0,0,0,0,0,0],
- locale:inp.className.search(regExp8) == -1,
- splitDate:0
- };
-
- // Split the date into three parts ?
- if(inp.className.search(/split-date/) != -1) {
- if(document.getElementById(inp.id+'-dd') && document.getElementById(inp.id+'-mm') && document.getElementById(inp.id+'-dd').tagName.toLowerCase() == "input" && document.getElementById(inp.id+'-mm').tagName.toLowerCase() == "input") {
- options.splitDate = 1;
- };
- };
-
- // Date format(variations of d-m-y)
- if(inp.className.search(regExp6) != -1) {
- options.format = inp.className.match(regExp6)[0].replace('format-','');
- };
-
- // What divider to use, a "/", "-", "." or " "
- if(inp.className.search(regExp7) != -1) {
- var divider = inp.className.match(regExp7)[0].replace('divider-','');
- switch(divider.toLowerCase()) {
- case "dot":
- options.divider = ".";
- break;
- case "space":
- options.divider = " ";
- break;
- case "dash":
- options.divider = "-";
- break;
- default:
- options.divider = "/";
- };
- };
-
- // The days to highlight
- if(inp.className.search(regExp3) != -1) {
- var tmp = inp.className.match(regExp3)[0].replace(/highlight-days-/, '');
- options.highlightDays = [0,0,0,0,0,0,0];
- for(var j = 0; j < tmp.length; j++) {
- options.highlightDays[tmp.charAt(j) - 1] = 1;
- };
- };
-
- // The days to disable
- if(inp.className.search(regExp1) != -1) {
- var tmp = inp.className.match(regExp1)[0].replace(/disable-days-/, '');
- options.disableDays = [0,0,0,0,0,0,0];
- for(var j = 0; j < tmp.length; j++) {
- options.disableDays[tmp.charAt(j) - 1] = 1;
- };
- };
-
- // The lower limit
- if(inp.className.search(regExp4) != -1) {
- options.low = datePickerController.dateFormat(inp.className.match(regExp4)[0].replace(/range-low-/, ''), options.format.charAt(0) == "m");
- if(options.low == 0) {
- options.low = '';
- };
- };
-
- // The higher limit
- if(inp.className.search(regExp5) != -1) {
- options.high = datePickerController.dateFormat(inp.className.match(regExp5)[0].replace(/range-high-/, ''), options.format.charAt(0) == "m");
- if(options.high == 0) {
- options.high = '';
- };
- };
-
- // Datepicker is already created so reset it's defaults
- if(document.getElementById('fd-'+inp.id)) {
- for(var opt in options) {
- datePickerController.datePickers[inp.id].defaults[opt] = options[opt];
- };
- };
-
- // Create the button (if needs be)
- if(!document.getElementById("fd-but-" + inp.id)) {
- var but = document.createElement('button');
- but.setAttribute("type", "button");
- but.className = "date-picker-control";
-
- but.id = "fd-but-" + inp.id;
- but.appendChild(document.createTextNode(String.fromCharCode( 160 )));
-
- if(inp.nextSibling) {
- inp.parentNode.insertBefore(but, inp.nextSibling);
- } else {
- inp.parentNode.appendChild(but);
- };
-
- } else {
- var but = document.getElementById("fd-but-" + inp.id);
- };
-
- // Add button events
- but.onclick = but.onpress = function() {
- var inpId = this.id.replace('fd-but-','');
-
- datePickerController.hideAll(inpId);
- if(inpId in datePickerController.datePickers && !datePickerController.datePickers[inpId].visible) {
- datePickerController.datePickers[inpId].show();
- };
- return false;
- };
-
- // Create the datePicker (if needs be)
- if(!document.getElementById('fd-'+inp.id)) {
- datePickerController.datePickers[inp.id] = new datePicker(options);
- };
- };
- };
- }
-
-};
-
-
-})();
-
-datePickerController.addEvent(window, 'load', datePickerController.create);
-
diff --git a/src/usr/local/www/javascript/datepicker/media/bg_header.jpg b/src/usr/local/www/javascript/datepicker/media/bg_header.jpg
deleted file mode 100755
index 10dbd74..0000000
--- a/src/usr/local/www/javascript/datepicker/media/bg_header.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/datepicker/media/bullet1.gif b/src/usr/local/www/javascript/datepicker/media/bullet1.gif
deleted file mode 100755
index ae352c2..0000000
--- a/src/usr/local/www/javascript/datepicker/media/bullet1.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/datepicker/media/bullet2.gif b/src/usr/local/www/javascript/datepicker/media/bullet2.gif
deleted file mode 100755
index 04b293d..0000000
--- a/src/usr/local/www/javascript/datepicker/media/bullet2.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/datepicker/media/cal.gif b/src/usr/local/www/javascript/datepicker/media/cal.gif
deleted file mode 100755
index 8526cf5..0000000
--- a/src/usr/local/www/javascript/datepicker/media/cal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/datepicker/media/gradient-e5e5e5-ffffff.gif b/src/usr/local/www/javascript/datepicker/media/gradient-e5e5e5-ffffff.gif
deleted file mode 100755
index 72a0d3e..0000000
--- a/src/usr/local/www/javascript/datepicker/media/gradient-e5e5e5-ffffff.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/domTT/LICENSE b/src/usr/local/www/javascript/domTT/LICENSE
deleted file mode 100644
index d645695..0000000
--- a/src/usr/local/www/javascript/domTT/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/src/usr/local/www/javascript/domTT/behaviour.js b/src/usr/local/www/javascript/domTT/behaviour.js
deleted file mode 100644
index 21b28d7..0000000
--- a/src/usr/local/www/javascript/domTT/behaviour.js
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work
- of Simon Willison (see comments by Simon below).
-
- Description:
-
- Uses css selectors to apply javascript behaviours to enable
- unobtrusive javascript in html documents.
-
- Usage:
-
- var myrules = {
- 'b.someclass' : function(element){
- element.onclick = function(){
- alert(this.innerHTML);
- }
- },
- '#someid u' : function(element){
- element.onmouseover = function(){
- this.innerHTML = "BLAH!";
- }
- }
- };
-
- Behaviour.register(myrules);
-
- // Call Behaviour.apply() to re-apply the rules (if you
- // update the dom, etc).
-
- License:
-
- This file is entirely BSD licensed.
-
- More information:
-
- http://ripcord.co.nz/behaviour/
-
-*/
-
-var Behaviour = {
- list : new Array,
-
- register : function(sheet){
- Behaviour.list.push(sheet);
- },
-
- start : function(){
- Behaviour.addLoadEvent(function(){
- Behaviour.apply();
- });
- },
-
- apply : function(){
- for (h=0;sheet=Behaviour.list[h];h++){
- for (selector in sheet){
- list = document.getElementsBySelector(selector);
-
- if (!list){
- continue;
- }
-
- for (i=0;element=list[i];i++){
- sheet[selector](element);
- }
- }
- }
- },
-
- addLoadEvent : function(func){
- var oldonload = window.onload;
-
- if (typeof window.onload != 'function') {
- window.onload = func;
- } else {
- window.onload = function() {
- oldonload();
- func();
- };
- }
- }
-};
-
-Behaviour.start();
-
-/*
- The following code is Copyright (C) Simon Willison 2004.
-
- document.getElementsBySelector(selector)
- - returns an array of element objects from the current document
- matching the CSS selector. Selectors can contain element names,
- class names and ids and can be nested. For example:
-
- elements = document.getElementsBySelect('div#main p a.external')
-
- Will return an array of all 'a' elements with 'external' in their
- class attribute that are contained inside 'p' elements that are
- contained inside the 'div' element which has id="main"
-
- New in version 0.4: Support for CSS2 and CSS3 attribute selectors:
- See http://www.w3.org/TR/css3-selectors/#attribute-selectors
-
- Version 0.4 - Simon Willison, March 25th 2003
- -- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows
- -- Opera 7 fails
-*/
-
-function getAllChildren(e) {
- // Returns all children of element. Workaround required for IE5/Windows. Ugh.
- return e.all ? e.all : e.getElementsByTagName('*');
-}
-
-document.getElementsBySelector = function(selector) {
- // Attempt to fail gracefully in lesser browsers
- if (!document.getElementsByTagName) {
- return new Array();
- }
- // Split selector in to tokens
- var tokens = selector.split(' ');
- var currentContext = new Array(document);
- for (var i = 0; i < tokens.length; i++) {
- token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');
- if (token.indexOf('#') > -1) {
- // Token is an ID selector
- var bits = token.split('#');
- var tagName = bits[0];
- var id = bits[1];
- var element = document.getElementById(id);
- if (tagName && element.nodeName.toLowerCase() != tagName) {
- // tag with that ID not found, return false
- return new Array();
- }
- // Set currentContext to contain just this element
- currentContext = new Array(element);
- continue; // Skip to next token
- }
- if (token.indexOf('.') > -1) {
- // Token contains a class selector
- var bits = token.split('.');
- var tagName = bits[0];
- var className = bits[1];
- if (!tagName) {
- tagName = '*';
- }
- // Get elements matching tag, filter them for class selector
- var found = new Array;
- var foundCount = 0;
- for (var h = 0; h < currentContext.length; h++) {
- var elements;
- if (tagName == '*') {
- elements = getAllChildren(currentContext[h]);
- } else {
- elements = currentContext[h].getElementsByTagName(tagName);
- }
- for (var j = 0; j < elements.length; j++) {
- found[foundCount++] = elements[j];
- }
- }
- currentContext = new Array;
- var currentContextIndex = 0;
- for (var k = 0; k < found.length; k++) {
- if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) {
- currentContext[currentContextIndex++] = found[k];
- }
- }
- continue; // Skip to next token
- }
- // Code to deal with attribute selectors
- if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
- var tagName = RegExp.$1;
- var attrName = RegExp.$2;
- var attrOperator = RegExp.$3;
- var attrValue = RegExp.$4;
- if (!tagName) {
- tagName = '*';
- }
- // Grab all of the tagName elements within current context
- var found = new Array;
- var foundCount = 0;
- for (var h = 0; h < currentContext.length; h++) {
- var elements;
- if (tagName == '*') {
- elements = getAllChildren(currentContext[h]);
- } else {
- elements = currentContext[h].getElementsByTagName(tagName);
- }
- for (var j = 0; j < elements.length; j++) {
- found[foundCount++] = elements[j];
- }
- }
- currentContext = new Array;
- var currentContextIndex = 0;
- var checkFunction; // This function will be used to filter the elements
- switch (attrOperator) {
- case '=': // Equality
- checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
- break;
- case '~': // Match one of space separated words
- checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
- break;
- case '|': // Match start with value followed by optional hyphen
- checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
- break;
- case '^': // Match starts with value
- checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
- break;
- case '$': // Match ends with value - fails with "Warning" in Opera 7
- checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
- break;
- case '*': // Match ends with value
- checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
- break;
- default :
- // Just test for existence of attribute
- checkFunction = function(e) { return e.getAttribute(attrName); };
- }
- currentContext = new Array;
- var currentContextIndex = 0;
- for (var k = 0; k < found.length; k++) {
- if (checkFunction(found[k])) {
- currentContext[currentContextIndex++] = found[k];
- }
- }
- // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);
- continue; // Skip to next token
- }
-
- if (!currentContext[0]){
- return;
- }
-
- // If we get here, token is JUST an element (not a class or ID selector)
- tagName = token;
- var found = new Array;
- var foundCount = 0;
- for (var h = 0; h < currentContext.length; h++) {
- var elements = currentContext[h].getElementsByTagName(tagName);
- for (var j = 0; j < elements.length; j++) {
- found[foundCount++] = elements[j];
- }
- }
- currentContext = found;
- }
- return currentContext;
-}
-
-/* That revolting regular expression explained
-/^(\w+)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/
- \---/ \---/\-------------/ \-------/
- | | | |
- | | | The value
- | | ~,|,^,$,* or =
- | Attribute
- Tag
-*/
diff --git a/src/usr/local/www/javascript/domTT/domLib.js b/src/usr/local/www/javascript/domTT/domLib.js
deleted file mode 100644
index 9a51a34..0000000
--- a/src/usr/local/www/javascript/domTT/domLib.js
+++ /dev/null
@@ -1,706 +0,0 @@
-/** $Id: domLib.js 2321 2006-06-12 06:45:41Z dallen $ */
-// {{{ license
-
-/*
- * Copyright 2002-2005 Dan Allen, Mojavelinux.com (dan.allen@mojavelinux.com)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// }}}
-// {{{ intro
-
-/**
- * Title: DOM Library Core
- * Version: 0.70
- *
- * Summary:
- * A set of commonly used functions that make it easier to create javascript
- * applications that rely on the DOM.
- *
- * Updated: 2005/05/17
- *
- * Maintainer: Dan Allen <dan.allen@mojavelinux.com>
- * Maintainer: Jason Rust <jrust@rustyparts.com>
- *
- * License: Apache 2.0
- */
-
-// }}}
-// {{{ global constants (DO NOT EDIT)
-
-// -- Browser Detection --
-var domLib_userAgent = navigator.userAgent.toLowerCase();
-var domLib_isMac = navigator.appVersion.indexOf('Mac') != -1;
-var domLib_isWin = domLib_userAgent.indexOf('windows') != -1;
-// NOTE: could use window.opera for detecting Opera
-var domLib_isOpera = domLib_userAgent.indexOf('opera') != -1;
-var domLib_isOpera7up = domLib_userAgent.match(/opera.(7|8)/i);
-var domLib_isSafari = domLib_userAgent.indexOf('safari') != -1;
-var domLib_isKonq = domLib_userAgent.indexOf('konqueror') != -1;
-// Both konqueror and safari use the khtml rendering engine
-var domLib_isKHTML = (domLib_isKonq || domLib_isSafari || domLib_userAgent.indexOf('khtml') != -1);
-var domLib_isIE = (!domLib_isKHTML && !domLib_isOpera && (domLib_userAgent.indexOf('msie 5') != -1 || domLib_userAgent.indexOf('msie 6') != -1 || domLib_userAgent.indexOf('msie 7') != -1 || domLib_userAgent.indexOf('msie 8') != -1));
-var domLib_isIE5up = domLib_isIE;
-var domLib_isIE50 = (domLib_isIE && domLib_userAgent.indexOf('msie 5.0') != -1);
-var domLib_isIE55 = (domLib_isIE && domLib_userAgent.indexOf('msie 5.5') != -1);
-var domLib_isIE5 = (domLib_isIE50 || domLib_isIE55);
-// safari and konq may use string "khtml, like gecko", so check for destinctive /
-var domLib_isGecko = domLib_userAgent.indexOf('gecko/') != -1;
-var domLib_isMacIE = (domLib_isIE && domLib_isMac);
-var domLib_isIE55up = domLib_isIE5up && !domLib_isIE50 && !domLib_isMacIE;
-var domLib_isIE6up = domLib_isIE55up && !domLib_isIE55;
-
-// -- Browser Abilities --
-var domLib_standardsMode = (document.compatMode && document.compatMode == 'CSS1Compat');
-var domLib_useLibrary = (domLib_isOpera7up || domLib_isKHTML || domLib_isIE5up || domLib_isGecko || domLib_isMacIE || document.defaultView);
-// fixed in Konq3.2
-var domLib_hasBrokenTimeout = (domLib_isMacIE || (domLib_isKonq && domLib_userAgent.match(/konqueror\/3.([2-9])/) == null));
-var domLib_canFade = (domLib_isGecko || domLib_isIE || domLib_isSafari || domLib_isOpera);
-var domLib_canDrawOverSelect = (domLib_isMac || domLib_isOpera || domLib_isGecko);
-var domLib_canDrawOverFlash = (domLib_isMac || domLib_isWin);
-
-// -- Event Variables --
-var domLib_eventTarget = domLib_isIE ? 'srcElement' : 'currentTarget';
-var domLib_eventButton = domLib_isIE ? 'button' : 'which';
-var domLib_eventTo = domLib_isIE ? 'toElement' : 'relatedTarget';
-var domLib_stylePointer = domLib_isIE ? 'hand' : 'pointer';
-// NOTE: a bug exists in Opera that prevents maxWidth from being set to 'none', so we make it huge
-var domLib_styleNoMaxWidth = domLib_isOpera ? '10000px' : 'none';
-var domLib_hidePosition = '-1000px';
-var domLib_scrollbarWidth = 14;
-var domLib_autoId = 1;
-var domLib_zIndex = 1010;
-
-// -- Detection --
-var domLib_collisionElements;
-var domLib_collisionsCached = false;
-
-var domLib_timeoutStateId = 0;
-var domLib_timeoutStates = new domTT_Hash();
-
-// }}}
-// {{{ DOM enhancements
-
-if (!document.ELEMENT_NODE)
-{
- document.ELEMENT_NODE = 1;
- document.ATTRIBUTE_NODE = 2;
- document.TEXT_NODE = 3;
- document.DOCUMENT_NODE = 9;
- document.DOCUMENT_FRAGMENT_NODE = 11;
-}
-
-function domLib_clone(obj)
-{
- var copy = {};
- for (var i in obj)
- {
- var value = obj[i];
- try
- {
- if (value != null && typeof(value) == 'object' && value != window && !value.nodeType)
- {
- copy[i] = domLib_clone(value);
- }
- else
- {
- copy[i] = value;
- }
- }
- catch(e)
- {
- copy[i] = value;
- }
- }
-
- return copy;
-}
-
-// }}}
-// {{{ class domTT_Hash()
-
-function domTT_Hash()
-{
- this.length = 0;
- this.numericLength = 0;
- this.elementData = [];
- for (var i = 0; i < arguments.length; i += 2)
- {
- if (typeof(arguments[i + 1]) != 'undefined')
- {
- this.elementData[arguments[i]] = arguments[i + 1];
- this.length++;
- if (arguments[i] == parseInt(arguments[i]))
- {
- this.numericLength++;
- }
- }
- }
-}
-
-// using prototype as opposed to inner functions saves on memory
-domTT_Hash.prototype.get = function(in_key)
-{
- if (typeof(this.elementData[in_key]) != 'undefined') {
- return this.elementData[in_key];
- }
-
- return null;
-};
-
-domTT_Hash.prototype.set = function(in_key, in_value)
-{
- if (typeof(in_value) != 'undefined')
- {
- if (typeof(this.elementData[in_key]) == 'undefined')
- {
- this.length++;
- if (in_key == parseInt(in_key))
- {
- this.numericLength++;
- }
- }
-
- return this.elementData[in_key] = in_value;
- }
-
- return false;
-};
-
-domTT_Hash.prototype.remove = function(in_key)
-{
- var tmp_value;
- if (typeof(this.elementData[in_key]) != 'undefined')
- {
- this.length--;
- if (in_key == parseInt(in_key))
- {
- this.numericLength--;
- }
-
- tmp_value = this.elementData[in_key];
- delete this.elementData[in_key];
- }
-
- return tmp_value;
-};
-
-domTT_Hash.prototype.size = function()
-{
- return this.length;
-};
-
-domTT_Hash.prototype.has = function(in_key)
-{
- return typeof(this.elementData[in_key]) != 'undefined';
-};
-
-domTT_Hash.prototype.find = function(in_obj)
-{
- for (var tmp_key in this.elementData)
- {
- if (this.elementData[tmp_key] == in_obj)
- {
- return tmp_key;
- }
- }
-
- return null;
-};
-
-domTT_Hash.prototype.merge = function(in_hash)
-{
- for (var tmp_key in in_hash.elementData)
- {
- if (typeof(this.elementData[tmp_key]) == 'undefined')
- {
- this.length++;
- if (tmp_key == parseInt(tmp_key))
- {
- this.numericLength++;
- }
- }
-
- this.elementData[tmp_key] = in_hash.elementData[tmp_key];
- }
-};
-
-domTT_Hash.prototype.compare = function(in_hash)
-{
- if (this.length != in_hash.length)
- {
- return false;
- }
-
- for (var tmp_key in this.elementData)
- {
- if (this.elementData[tmp_key] != in_hash.elementData[tmp_key])
- {
- return false;
- }
- }
-
- return true;
-};
-
-// }}}
-// {{{ domLib_isDescendantOf()
-
-function domLib_isDescendantOf(in_object, in_ancestor, in_bannedTags)
-{
- if (in_object == null)
- {
- return false;
- }
-
- if (in_object == in_ancestor)
- {
- return true;
- }
-
- if (typeof(in_bannedTags) != 'undefined' &&
- (',' + in_bannedTags.join(',') + ',').indexOf(',' + in_object.tagName + ',') != -1)
- {
- return false;
- }
-
- while (in_object != document.documentElement)
- {
- try
- {
- if ((tmp_object = in_object.offsetParent) && tmp_object == in_ancestor)
- {
- return true;
- }
- else if ((tmp_object = in_object.parentNode) == in_ancestor)
- {
- return true;
- }
- else
- {
- in_object = tmp_object;
- }
- }
- // in case we get some wierd error, assume we left the building
- catch(e)
- {
- return false;
- }
- }
-
- return false;
-}
-
-// }}}
-// {{{ domLib_detectCollisions()
-
-/**
- * For any given target element, determine if elements on the page
- * are colliding with it that do not obey the rules of z-index.
- */
-function domLib_detectCollisions(in_object, in_recover, in_useCache)
-{
- // the reason for the cache is that if the root menu is built before
- // the page is done loading, then it might not find all the elements.
- // so really the only time you don't use cache is when building the
- // menu as part of the page load
- if (!domLib_collisionsCached)
- {
- var tags = [];
-
- if (!domLib_canDrawOverFlash)
- {
- tags[tags.length] = 'object';
- }
-
- if (!domLib_canDrawOverSelect)
- {
- tags[tags.length] = 'select';
- }
-
- domLib_collisionElements = domLib_getElementsByTagNames(tags, true);
- domLib_collisionsCached = in_useCache;
- }
-
- // if we don't have a tip, then unhide selects
- if (in_recover)
- {
- for (var cnt = 0; cnt < domLib_collisionElements.length; cnt++)
- {
- var thisElement = domLib_collisionElements[cnt];
-
- if (!thisElement.hideList)
- {
- thisElement.hideList = new domTT_Hash();
- }
-
- thisElement.hideList.remove(in_object.id);
- if (!thisElement.hideList.length)
- {
- domLib_collisionElements[cnt].style.visibility = 'visible';
- if (domLib_isKonq)
- {
- domLib_collisionElements[cnt].style.display = '';
- }
- }
- }
-
- return;
- }
- else if (domLib_collisionElements.length == 0)
- {
- return;
- }
-
- // okay, we have a tip, so hunt and destroy
- var objectOffsets = domLib_getOffsets(in_object);
-
- for (var cnt = 0; cnt < domLib_collisionElements.length; cnt++)
- {
- var thisElement = domLib_collisionElements[cnt];
-
- // if collision element is in active element, move on
- // WARNING: is this too costly?
- if (domLib_isDescendantOf(thisElement, in_object))
- {
- continue;
- }
-
- // konqueror only has trouble with multirow selects
- if (domLib_isKonq &&
- thisElement.tagName == 'SELECT' &&
- (thisElement.size <= 1 && !thisElement.multiple))
- {
- continue;
- }
-
- if (!thisElement.hideList)
- {
- thisElement.hideList = new domTT_Hash();
- }
-
- var selectOffsets = domLib_getOffsets(thisElement);
- var center2centerDistance = Math.sqrt(Math.pow(selectOffsets.get('leftCenter') - objectOffsets.get('leftCenter'), 2) + Math.pow(selectOffsets.get('topCenter') - objectOffsets.get('topCenter'), 2));
- var radiusSum = selectOffsets.get('radius') + objectOffsets.get('radius');
- // the encompassing circles are overlapping, get in for a closer look
- if (center2centerDistance < radiusSum)
- {
- // tip is left of select
- if ((objectOffsets.get('leftCenter') <= selectOffsets.get('leftCenter') && objectOffsets.get('right') < selectOffsets.get('left')) ||
- // tip is right of select
- (objectOffsets.get('leftCenter') > selectOffsets.get('leftCenter') && objectOffsets.get('left') > selectOffsets.get('right')) ||
- // tip is above select
- (objectOffsets.get('topCenter') <= selectOffsets.get('topCenter') && objectOffsets.get('bottom') < selectOffsets.get('top')) ||
- // tip is below select
- (objectOffsets.get('topCenter') > selectOffsets.get('topCenter') && objectOffsets.get('top') > selectOffsets.get('bottom')))
- {
- thisElement.hideList.remove(in_object.id);
- if (!thisElement.hideList.length)
- {
- thisElement.style.visibility = 'visible';
- if (domLib_isKonq)
- {
- thisElement.style.display = '';
- }
- }
- }
- else
- {
- thisElement.hideList.set(in_object.id, true);
- thisElement.style.visibility = 'hidden';
- if (domLib_isKonq)
- {
- thisElement.style.display = 'none';
- }
- }
- }
- }
-}
-
-// }}}
-// {{{ domLib_getOffsets()
-
-function domLib_getOffsets(in_object, in_preserveScroll)
-{
- if (typeof(in_preserveScroll) == 'undefined') {
- in_preserveScroll = false;
- }
-
- var originalObject = in_object;
- var originalWidth = in_object.offsetWidth;
- var originalHeight = in_object.offsetHeight;
- var offsetLeft = 0;
- var offsetTop = 0;
-
- while (in_object)
- {
- offsetLeft += in_object.offsetLeft;
- offsetTop += in_object.offsetTop;
- in_object = in_object.offsetParent;
- // consider scroll offset of parent elements
- if (in_object && !in_preserveScroll)
- {
- offsetLeft -= in_object.scrollLeft;
- offsetTop -= in_object.scrollTop;
- }
- }
-
- // MacIE misreports the offsets (even with margin: 0 in body{}), still not perfect
- if (domLib_isMacIE) {
- offsetLeft += 10;
- offsetTop += 10;
- }
-
- return new domTT_Hash(
- 'left', offsetLeft,
- 'top', offsetTop,
- 'right', offsetLeft + originalWidth,
- 'bottom', offsetTop + originalHeight,
- 'leftCenter', offsetLeft + originalWidth/2,
- 'topCenter', offsetTop + originalHeight/2,
- 'radius', Math.max(originalWidth, originalHeight)
- );
-}
-
-// }}}
-// {{{ domLib_setTimeout()
-
-function domLib_setTimeout(in_function, in_timeout, in_args)
-{
- if (typeof(in_args) == 'undefined')
- {
- in_args = [];
- }
-
- if (in_timeout == -1)
- {
- // timeout event is disabled
- return 0;
- }
- else if (in_timeout == 0)
- {
- in_function(in_args);
- return 0;
- }
-
- // must make a copy of the arguments so that we release the reference
- var args = domLib_clone(in_args);
-
- if (!domLib_hasBrokenTimeout)
- {
- return setTimeout(function() { in_function(args); }, in_timeout);
- }
- else
- {
- var id = domLib_timeoutStateId++;
- var data = new domTT_Hash();
- data.set('function', in_function);
- data.set('args', args);
- domLib_timeoutStates.set(id, data);
-
- data.set('timeoutId', setTimeout('domLib_timeoutStates.get(' + id + ').get(\'function\')(domLib_timeoutStates.get(' + id + ').get(\'args\')); domLib_timeoutStates.remove(' + id + ');', in_timeout));
- return id;
- }
-}
-
-// }}}
-// {{{ domLib_clearTimeout()
-
-function domLib_clearTimeout(in_id)
-{
- if (!domLib_hasBrokenTimeout)
- {
- if (in_id > 0) {
- clearTimeout(in_id);
- }
- }
- else
- {
- if (domLib_timeoutStates.has(in_id))
- {
- clearTimeout(domLib_timeoutStates.get(in_id).get('timeoutId'));
- domLib_timeoutStates.remove(in_id);
- }
- }
-}
-
-// }}}
-// {{{ domLib_getEventPosition()
-
-function domLib_getEventPosition(in_eventObj)
-{
- var eventPosition = new domTT_Hash('x', 0, 'y', 0, 'scrollX', 0, 'scrollY', 0);
-
- // IE varies depending on standard compliance mode
- if (domLib_isIE)
- {
- var doc = (domLib_standardsMode ? document.documentElement : document.body);
- // NOTE: events may fire before the body has been loaded
- if (doc)
- {
- eventPosition.set('x', in_eventObj.clientX + doc.scrollLeft);
- eventPosition.set('y', in_eventObj.clientY + doc.scrollTop);
- eventPosition.set('scrollX', doc.scrollLeft);
- eventPosition.set('scrollY', doc.scrollTop);
- }
- }
- else
- {
- eventPosition.set('x', in_eventObj.pageX);
- eventPosition.set('y', in_eventObj.pageY);
- eventPosition.set('scrollX', in_eventObj.pageX - in_eventObj.clientX);
- eventPosition.set('scrollY', in_eventObj.pageY - in_eventObj.clientY);
- }
-
- return eventPosition;
-}
-
-// }}}
-// {{{ domLib_cancelBubble()
-
-function domLib_cancelBubble(in_event)
-{
- var eventObj = in_event ? in_event : window.event;
- eventObj.cancelBubble = true;
-}
-
-// }}}
-// {{{ domLib_getIFrameReference()
-
-function domLib_getIFrameReference(in_frame)
-{
- if (domLib_isGecko || domLib_isIE)
- {
- return in_frame.frameElement;
- }
- else
- {
- // we could either do it this way or require an id on the frame
- // equivalent to the name
- var name = in_frame.name;
- if (!name || !in_frame.parent)
- {
- return null;
- }
-
- var candidates = in_frame.parent.document.getElementsByTagName('iframe');
- for (var i = 0; i < candidates.length; i++)
- {
- if (candidates[i].name == name)
- {
- return candidates[i];
- }
- }
-
- return null;
- }
-}
-
-// }}}
-// {{{ domLib_getElementsByClass()
-
-function domLib_getElementsByClass(in_class)
-{
- var elements = domLib_isIE5 ? document.all : document.getElementsByTagName('*');
- var matches = [];
- var cnt = 0;
- for (var i = 0; i < elements.length; i++)
- {
- if ((" " + elements[i].className + " ").indexOf(" " + in_class + " ") != -1)
- {
- matches[cnt++] = elements[i];
- }
- }
-
- return matches;
-}
-
-// }}}
-// {{{ domLib_getElementsByTagNames()
-
-function domLib_getElementsByTagNames(in_list, in_excludeHidden)
-{
- var elements = [];
- for (var i = 0; i < in_list.length; i++)
- {
- var matches = document.getElementsByTagName(in_list[i]);
- for (var j = 0; j < matches.length; j++)
- {
- // skip objects that have nested embeds, or else we get "flashing"
- if (matches[j].tagName == 'OBJECT' && domLib_isGecko)
- {
- var kids = matches[j].childNodes;
- var skip = false;
- for (var k = 0; k < kids.length; k++)
- {
- if (kids[k].tagName == 'EMBED')
- {
- skip = true;
- break;
- }
- }
- if (skip) continue;
- }
-
- if (in_excludeHidden && domLib_getComputedStyle(matches[j], 'visibility') == 'hidden')
- {
- continue;
- }
-
- elements[elements.length] = matches[j];
- }
- }
-
- return elements;
-}
-
-// }}}
-// {{{ domLib_getComputedStyle()
-
-function domLib_getComputedStyle(in_obj, in_property)
-{
- if (domLib_isIE)
- {
- var humpBackProp = in_property.replace(/-(.)/, function (a, b) { return b.toUpperCase(); });
- return eval('in_obj.currentStyle.' + humpBackProp);
- }
- // getComputedStyle() is broken in konqueror, so let's go for the style object
- else if (domLib_isKonq)
- {
- //var humpBackProp = in_property.replace(/-(.)/, function (a, b) { return b.toUpperCase(); });
- return eval('in_obj.style.' + in_property);
- }
- else
- {
- return document.defaultView.getComputedStyle(in_obj, null).getPropertyValue(in_property);
- }
-}
-
-// }}}
-// {{{ makeTrue()
-
-function makeTrue()
-{
- return true;
-}
-
-// }}}
-// {{{ makeFalse()
-
-function makeFalse()
-{
- return false;
-}
-
-// }}}
diff --git a/src/usr/local/www/javascript/domTT/domTT.js b/src/usr/local/www/javascript/domTT/domTT.js
deleted file mode 100644
index fc9bf6a..0000000
--- a/src/usr/local/www/javascript/domTT/domTT.js
+++ /dev/null
@@ -1,1132 +0,0 @@
-/** $Id: domTT.js 2324 2006-06-12 07:06:39Z dallen $ */
-// {{{ license
-
-/*
- * Copyright 2002-2005 Dan Allen, Mojavelinux.com (dan.allen@mojavelinux.com)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// }}}
-// {{{ intro
-
-/**
- * Title: DOM Tooltip Library
- * Version: 0.7.3
- *
- * Summary:
- * Allows developers to add custom tooltips to the webpages. Tooltips are
- * generated using the domTT_activate() function and customized by setting
- * a handful of options.
- *
- * Maintainer: Dan Allen <dan.allen@mojavelinux.com>
- * Contributors:
- * Josh Gross <josh@jportalhome.com>
- * Jason Rust <jason@rustyparts.com>
- *
- * License: Apache 2.0
- * However, if you use this library, you earn the position of official bug
- * reporter :) Please post questions or problem reports to the newsgroup:
- *
- * http://groups-beta.google.com/group/dom-tooltip
- *
- * If you are doing this for commercial work, perhaps you could send me a few
- * Starbucks Coffee gift dollars or PayPal bucks to encourage future
- * developement (NOT REQUIRED). E-mail me for my snail mail address.
-
- *
- * Homepage: http://www.mojavelinux.com/projects/domtooltip/
- *
- * Newsgroup: http://groups-beta.google.com/group/dom-tooltip
- *
- * Freshmeat Project: http://freshmeat.net/projects/domtt/?topic_id=92
- *
- * Updated: 2005/07/16
- *
- * Supported Browsers:
- * Mozilla (Gecko), IE 5.5+, IE on Mac, Safari, Konqueror, Opera 7
- *
- * Usage:
- * Please see the HOWTO documentation.
-**/
-
-// }}}
-// {{{ settings (editable)
-
-// IE mouse events seem to be off by 2 pixels
-var domTT_offsetX = (domLib_isIE ? -2 : 0);
-var domTT_offsetY = (domLib_isIE ? 4 : 2);
-var domTT_direction = 'southeast';
-var domTT_mouseHeight = domLib_isIE ? 13 : 19;
-var domTT_closeLink = 'X';
-var domTT_closeAction = 'hide';
-var domTT_activateDelay = 500;
-var domTT_maxWidth = false;
-var domTT_styleClass = 'domTT';
-var domTT_fade = 'neither';
-var domTT_lifetime = 0;
-var domTT_grid = 0;
-var domTT_trailDelay = 200;
-var domTT_useGlobalMousePosition = true;
-var domTT_postponeActivation = false;
-var domTT_tooltipIdPrefix = '[domTT]';
-var domTT_screenEdgeDetection = true;
-var domTT_screenEdgePadding = 4;
-var domTT_oneOnly = false;
-var domTT_cloneNodes = false;
-var domTT_detectCollisions = true;
-var domTT_bannedTags = ['OPTION'];
-var domTT_draggable = false;
-if (typeof(domTT_dragEnabled) == 'undefined')
-{
- domTT_dragEnabled = false;
-}
-
-// }}}
-// {{{ globals (DO NOT EDIT)
-
-var domTT_predefined = new domTT_Hash();
-// tooltips are keyed on both the tip id and the owner id,
-// since events can originate on either object
-var domTT_tooltips = new domTT_Hash();
-var domTT_lastOpened = 0;
-var domTT_documentLoaded = false;
-var domTT_mousePosition = null;
-
-// }}}
-// {{{ document.onmousemove
-
-if (domLib_useLibrary && domTT_useGlobalMousePosition)
-{
- document.onmousemove = function(in_event)
- {
- if (typeof(in_event) == 'undefined') { in_event = window.event; }
-
- domTT_mousePosition = domLib_getEventPosition(in_event);
- if (domTT_dragEnabled && domTT_dragMouseDown)
- {
- domTT_dragUpdate(in_event);
- }
- };
-}
-
-// }}}
-// {{{ domTT_activate()
-
-function domTT_activate(in_this, in_event)
-{
- if (!domLib_useLibrary || (domTT_postponeActivation && !domTT_documentLoaded)) { return false; }
-
- // make sure in_event is set (for IE, some cases we have to use window.event)
- if (typeof(in_event) == 'undefined') { in_event = window.event; }
-
- // don't allow tooltips on banned tags (such as OPTION)
- if (in_event != null) {
- var target = in_event.srcElement ? in_event.srcElement : in_event.target;
- if (target != null && (',' + domTT_bannedTags.join(',') + ',').indexOf(',' + target.tagName + ',') != -1)
- {
- return false;
- }
- }
-
- var owner = document.body;
- // we have an active event so get the owner
- if (in_event != null && in_event.type.match(/key|mouse|click|contextmenu/i))
- {
- // make sure we have nothing higher than the body element
- if (in_this.nodeType && in_this.nodeType != document.DOCUMENT_NODE)
- {
- owner = in_this;
- }
- }
- // non active event (make sure we were passed a string id)
- else
- {
- if (typeof(in_this) != 'object' && !(owner = domTT_tooltips.get(in_this)))
- {
- // NOTE: two steps to avoid "flashing" in gecko
- var embryo = document.createElement('div');
- owner = document.body.appendChild(embryo);
- owner.style.display = 'none';
- owner.id = in_this;
- }
- }
-
- // make sure the owner has a unique id
- if (!owner.id)
- {
- owner.id = '__autoId' + domLib_autoId++;
- }
-
- // see if we should only be opening one tip at a time
- // NOTE: this is not "perfect" yet since it really steps on any other
- // tip working on fade out or delayed close, but it get's the job done
- if (domTT_oneOnly && domTT_lastOpened)
- {
- domTT_deactivate(domTT_lastOpened);
- }
-
- domTT_lastOpened = owner.id;
-
- var tooltip = domTT_tooltips.get(owner.id);
- if (tooltip)
- {
- if (tooltip.get('eventType') != in_event.type)
- {
- if (tooltip.get('type') == 'greasy')
- {
- tooltip.set('closeAction', 'destroy');
- domTT_deactivate(owner.id);
- }
- else if (tooltip.get('status') != 'inactive')
- {
- return owner.id;
- }
- }
- else
- {
- if (tooltip.get('status') == 'inactive')
- {
- tooltip.set('status', 'pending');
- tooltip.set('activateTimeout', domLib_setTimeout(domTT_runShow, tooltip.get('delay'), [owner.id, in_event]));
-
- return owner.id;
- }
- // either pending or active, let it be
- else
- {
- return owner.id;
- }
- }
- }
-
- // setup the default options hash
- var options = new domTT_Hash(
- 'caption', '',
- 'content', '',
- 'clearMouse', true,
- 'closeAction', domTT_closeAction,
- 'closeLink', domTT_closeLink,
- 'delay', domTT_activateDelay,
- 'direction', domTT_direction,
- 'draggable', domTT_draggable,
- 'fade', domTT_fade,
- 'fadeMax', 100,
- 'grid', domTT_grid,
- 'id', domTT_tooltipIdPrefix + owner.id,
- 'inframe', false,
- 'lifetime', domTT_lifetime,
- 'offsetX', domTT_offsetX,
- 'offsetY', domTT_offsetY,
- 'parent', document.body,
- 'position', 'absolute',
- 'styleClass', domTT_styleClass,
- 'type', 'greasy',
- 'trail', false,
- 'lazy', false
- );
-
- // load in the options from the function call
- for (var i = 2; i < arguments.length; i += 2)
- {
- // load in predefined
- if (arguments[i] == 'predefined')
- {
- var predefinedOptions = domTT_predefined.get(arguments[i + 1]);
- for (var j in predefinedOptions.elementData)
- {
- options.set(j, predefinedOptions.get(j));
- }
- }
- // set option
- else
- {
- options.set(arguments[i], arguments[i + 1]);
- }
- }
-
- options.set('eventType', in_event != null ? in_event.type : null);
-
- // immediately set the status text if provided
- if (options.has('statusText'))
- {
- try { window.status = options.get('statusText'); } catch(e) {}
- }
-
- // if we didn't give content...assume we just wanted to change the status and return
- if (!options.has('content') || options.get('content') == '' || options.get('content') == null)
- {
- if (typeof(owner.onmouseout) != 'function')
- {
- owner.onmouseout = function(in_event) { domTT_mouseout(this, in_event); };
- }
-
- return owner.id;
- }
-
- options.set('owner', owner);
-
- domTT_create(options);
-
- // determine the show delay
- options.set('delay', (in_event != null && in_event.type.match(/click|mousedown|contextmenu/i)) ? 0 : parseInt(options.get('delay')));
- domTT_tooltips.set(owner.id, options);
- domTT_tooltips.set(options.get('id'), options);
- options.set('status', 'pending');
- options.set('activateTimeout', domLib_setTimeout(domTT_runShow, options.get('delay'), [owner.id, in_event]));
-
- return owner.id;
-}
-
-// }}}
-// {{{ domTT_create()
-
-function domTT_create(in_options)
-{
- var tipOwner = in_options.get('owner');
- var parentObj = in_options.get('parent');
- var parentDoc = parentObj.ownerDocument || parentObj.document;
-
- // create the tooltip and hide it
- // NOTE: two steps to avoid "flashing" in gecko
- var embryo = parentDoc.createElement('div');
- var tipObj = parentObj.appendChild(embryo);
- tipObj.style.position = 'absolute';
- tipObj.style.left = '0px';
- tipObj.style.top = '0px';
- tipObj.style.visibility = 'hidden';
- tipObj.id = in_options.get('id');
- tipObj.className = in_options.get('styleClass');
-
- var contentBlock;
- var tableLayout = false;
-
- if (in_options.get('caption') || (in_options.get('type') == 'sticky' && in_options.get('caption') !== false))
- {
- tableLayout = true;
- // layout the tip with a hidden formatting table
- var tipLayoutTable = tipObj.appendChild(parentDoc.createElement('table'));
- tipLayoutTable.style.borderCollapse = 'collapse';
- if (domLib_isKHTML)
- {
- tipLayoutTable.cellSpacing = 0;
- }
-
- var tipLayoutTbody = tipLayoutTable.appendChild(parentDoc.createElement('tbody'));
-
- var numCaptionCells = 0;
- var captionRow = tipLayoutTbody.appendChild(parentDoc.createElement('tr'));
- var captionCell = captionRow.appendChild(parentDoc.createElement('td'));
- captionCell.style.padding = '0px';
- var caption = captionCell.appendChild(parentDoc.createElement('div'));
- caption.className = 'caption';
- if (domLib_isIE50)
- {
- caption.style.height = '100%';
- }
-
- if (in_options.get('caption').nodeType)
- {
- caption.appendChild(domTT_cloneNodes ? in_options.get('caption').cloneNode(1) : in_options.get('caption'));
- }
- else
- {
- caption.innerHTML = in_options.get('caption');
- }
-
- if (in_options.get('type') == 'sticky')
- {
- var numCaptionCells = 2;
- var closeLinkCell = captionRow.appendChild(parentDoc.createElement('td'));
- closeLinkCell.style.padding = '0px';
- var closeLink = closeLinkCell.appendChild(parentDoc.createElement('div'));
- closeLink.className = 'caption';
- if (domLib_isIE50)
- {
- closeLink.style.height = '100%';
- }
-
- closeLink.style.textAlign = 'right';
- closeLink.style.cursor = domLib_stylePointer;
- // merge the styles of the two cells
- closeLink.style.borderLeftWidth = caption.style.borderRightWidth = '0px';
- closeLink.style.paddingLeft = caption.style.paddingRight = '0px';
- closeLink.style.marginLeft = caption.style.marginRight = '0px';
- if (in_options.get('closeLink').nodeType)
- {
- closeLink.appendChild(in_options.get('closeLink').cloneNode(1));
- }
- else
- {
- closeLink.innerHTML = in_options.get('closeLink');
- }
-
- closeLink.onclick = function()
- {
- domTT_deactivate(tipOwner.id);
- };
- closeLink.onmousedown = function(in_event)
- {
- if (typeof(in_event) == 'undefined') { in_event = window.event; }
- in_event.cancelBubble = true;
- };
- // MacIE has to have a newline at the end and must be made with createTextNode()
- if (domLib_isMacIE)
- {
- closeLinkCell.appendChild(parentDoc.createTextNode("\n"));
- }
- }
-
- // MacIE has to have a newline at the end and must be made with createTextNode()
- if (domLib_isMacIE)
- {
- captionCell.appendChild(parentDoc.createTextNode("\n"));
- }
-
- var contentRow = tipLayoutTbody.appendChild(parentDoc.createElement('tr'));
- var contentCell = contentRow.appendChild(parentDoc.createElement('td'));
- contentCell.style.padding = '0px';
- if (numCaptionCells)
- {
- if (domLib_isIE || domLib_isOpera)
- {
- contentCell.colSpan = numCaptionCells;
- }
- else
- {
- contentCell.setAttribute('colspan', numCaptionCells);
- }
- }
-
- contentBlock = contentCell.appendChild(parentDoc.createElement('div'));
- if (domLib_isIE50)
- {
- contentBlock.style.height = '100%';
- }
- }
- else
- {
- contentBlock = tipObj.appendChild(parentDoc.createElement('div'));
- }
-
- contentBlock.className = 'contents';
-
- var content = in_options.get('content');
- // allow content has a function to return the actual content
- if (typeof(content) == 'function') {
- content = content(in_options.get('id'));
- }
-
- if (content != null && content.nodeType)
- {
- contentBlock.appendChild(domTT_cloneNodes ? content.cloneNode(1) : content);
- }
- else
- {
- contentBlock.innerHTML = content;
- }
-
- // adjust the width if specified
- if (in_options.has('width'))
- {
- tipObj.style.width = parseInt(in_options.get('width')) + 'px';
- }
-
- // check if we are overridding the maxWidth
- // if the browser supports maxWidth, the global setting will be ignored (assume stylesheet)
- var maxWidth = domTT_maxWidth;
- if (in_options.has('maxWidth'))
- {
- if ((maxWidth = in_options.get('maxWidth')) === false)
- {
- tipObj.style.maxWidth = domLib_styleNoMaxWidth;
- }
- else
- {
- maxWidth = parseInt(in_options.get('maxWidth'));
- tipObj.style.maxWidth = maxWidth + 'px';
- }
- }
-
- // HACK: fix lack of maxWidth in CSS for KHTML and IE
- if (maxWidth !== false && (domLib_isIE || domLib_isKHTML) && tipObj.offsetWidth > maxWidth)
- {
- tipObj.style.width = maxWidth + 'px';
- }
-
- in_options.set('offsetWidth', tipObj.offsetWidth);
- in_options.set('offsetHeight', tipObj.offsetHeight);
-
- // konqueror miscalcuates the width of the containing div when using the layout table based on the
- // border size of the containing div
- if (domLib_isKonq && tableLayout && !tipObj.style.width)
- {
- var left = document.defaultView.getComputedStyle(tipObj, '').getPropertyValue('border-left-width');
- var right = document.defaultView.getComputedStyle(tipObj, '').getPropertyValue('border-right-width');
-
- left = left.substring(left.indexOf(':') + 2, left.indexOf(';'));
- right = right.substring(right.indexOf(':') + 2, right.indexOf(';'));
- var correction = 2 * ((left ? parseInt(left) : 0) + (right ? parseInt(right) : 0));
- tipObj.style.width = (tipObj.offsetWidth - correction) + 'px';
- }
-
- // if a width is not set on an absolutely positioned object, both IE and Opera
- // will attempt to wrap when it spills outside of body...we cannot have that
- if (domLib_isIE || domLib_isOpera)
- {
- if (!tipObj.style.width)
- {
- // HACK: the correction here is for a border
- tipObj.style.width = (tipObj.offsetWidth - 2) + 'px';
- }
-
- // HACK: the correction here is for a border
- tipObj.style.height = (tipObj.offsetHeight - 2) + 'px';
- }
-
- // store placement offsets from event position
- var offsetX, offsetY;
-
- // tooltip floats
- if (in_options.get('position') == 'absolute' && !(in_options.has('x') && in_options.has('y')))
- {
- // determine the offset relative to the pointer
- switch (in_options.get('direction'))
- {
- case 'northeast':
- offsetX = in_options.get('offsetX');
- offsetY = 0 - tipObj.offsetHeight - in_options.get('offsetY');
- break;
- case 'northwest':
- offsetX = 0 - tipObj.offsetWidth - in_options.get('offsetX');
- offsetY = 0 - tipObj.offsetHeight - in_options.get('offsetY');
- break;
- case 'north':
- offsetX = 0 - parseInt(tipObj.offsetWidth/2);
- offsetY = 0 - tipObj.offsetHeight - in_options.get('offsetY');
- break;
- case 'southwest':
- offsetX = 0 - tipObj.offsetWidth - in_options.get('offsetX');
- offsetY = in_options.get('offsetY');
- break;
- case 'southeast':
- offsetX = in_options.get('offsetX');
- offsetY = in_options.get('offsetY');
- break;
- case 'south':
- offsetX = 0 - parseInt(tipObj.offsetWidth/2);
- offsetY = in_options.get('offsetY');
- break;
- }
-
- // if we are in an iframe, get the offsets of the iframe in the parent document
- if (in_options.get('inframe'))
- {
- var iframeObj = domLib_getIFrameReference(window);
- if (iframeObj)
- {
- var frameOffsets = domLib_getOffsets(iframeObj);
- offsetX += frameOffsets.get('left');
- offsetY += frameOffsets.get('top');
- }
- }
- }
- // tooltip is fixed
- else
- {
- offsetX = 0;
- offsetY = 0;
- in_options.set('trail', false);
- }
-
- // set the direction-specific offsetX/Y
- in_options.set('offsetX', offsetX);
- in_options.set('offsetY', offsetY);
- if (in_options.get('clearMouse') && in_options.get('direction').indexOf('south') != -1)
- {
- in_options.set('mouseOffset', domTT_mouseHeight);
- }
- else
- {
- in_options.set('mouseOffset', 0);
- }
-
- if (domLib_canFade && typeof(Fadomatic) == 'function')
- {
- if (in_options.get('fade') != 'neither')
- {
- var fadeHandler = new Fadomatic(tipObj, 10, 0, 0, in_options.get('fadeMax'));
- in_options.set('fadeHandler', fadeHandler);
- }
- }
- else
- {
- in_options.set('fade', 'neither');
- }
-
- // setup mouse events
- if (in_options.get('trail') && typeof(tipOwner.onmousemove) != 'function')
- {
- tipOwner.onmousemove = function(in_event) { domTT_mousemove(this, in_event); };
- }
-
- if (typeof(tipOwner.onmouseout) != 'function')
- {
- tipOwner.onmouseout = function(in_event) { domTT_mouseout(this, in_event); };
- }
-
- if (in_options.get('type') == 'sticky')
- {
- if (in_options.get('position') == 'absolute' && domTT_dragEnabled && in_options.get('draggable'))
- {
- if (domLib_isIE)
- {
- captionRow.onselectstart = function() { return false; };
- }
-
- // setup drag
- captionRow.onmousedown = function(in_event) { domTT_dragStart(tipObj, in_event); };
- captionRow.onmousemove = function(in_event) { domTT_dragUpdate(in_event); };
- captionRow.onmouseup = function() { domTT_dragStop(); };
- }
- }
- else if (in_options.get('type') == 'velcro')
- {
- /* can use once we have deactivateDelay
- tipObj.onmouseover = function(in_event)
- {
- if (typeof(in_event) == 'undefined') { in_event = window.event; }
- var tooltip = domTT_tooltips.get(tipObj.id);
- if (in_options.get('lifetime')) {
- domLib_clearTimeout(in_options.get('lifetimeTimeout');
- }
- };
- */
- tipObj.onmouseout = function(in_event)
- {
- if (typeof(in_event) == 'undefined') { in_event = window.event; }
- if (!domLib_isDescendantOf(in_event[domLib_eventTo], tipObj, domTT_bannedTags)) {
- domTT_deactivate(tipOwner.id);
- }
- };
- // NOTE: this might interfere with links in the tip
- tipObj.onclick = function(in_event)
- {
- domTT_deactivate(tipOwner.id);
- };
- }
-
- if (in_options.get('position') == 'relative')
- {
- tipObj.style.position = 'relative';
- }
-
- in_options.set('node', tipObj);
- in_options.set('status', 'inactive');
-}
-
-// }}}
-// {{{ domTT_show()
-
-// in_id is either tip id or the owner id
-function domTT_show(in_id, in_event)
-{
-
- // should always find one since this call would be cancelled if tip was killed
- var tooltip = domTT_tooltips.get(in_id);
- var status = tooltip.get('status');
- var tipObj = tooltip.get('node');
-
- if (tooltip.get('position') == 'absolute')
- {
- var mouseX, mouseY;
-
- if (tooltip.has('x') && tooltip.has('y'))
- {
- mouseX = tooltip.get('x');
- mouseY = tooltip.get('y');
- }
- else if (!domTT_useGlobalMousePosition || domTT_mousePosition == null || status == 'active' || tooltip.get('delay') == 0)
- {
- var eventPosition = domLib_getEventPosition(in_event);
- var eventX = eventPosition.get('x');
- var eventY = eventPosition.get('y');
- if (tooltip.get('inframe'))
- {
- eventX -= eventPosition.get('scrollX');
- eventY -= eventPosition.get('scrollY');
- }
-
- // only move tip along requested trail axis when updating position
- if (status == 'active' && tooltip.get('trail') !== true)
- {
- var trail = tooltip.get('trail');
- if (trail == 'x')
- {
- mouseX = eventX;
- mouseY = tooltip.get('mouseY');
- }
- else if (trail == 'y')
- {
- mouseX = tooltip.get('mouseX');
- mouseY = eventY;
- }
- }
- else
- {
- mouseX = eventX;
- mouseY = eventY;
- }
- }
- else
- {
- mouseX = domTT_mousePosition.get('x');
- mouseY = domTT_mousePosition.get('y');
- if (tooltip.get('inframe'))
- {
- mouseX -= domTT_mousePosition.get('scrollX');
- mouseY -= domTT_mousePosition.get('scrollY');
- }
- }
-
- // we are using a grid for updates
- if (tooltip.get('grid'))
- {
- // if this is not a mousemove event or it is a mousemove event on an active tip and
- // the movement is bigger than the grid
- if (in_event.type != 'mousemove' || (status == 'active' && (Math.abs(tooltip.get('lastX') - mouseX) > tooltip.get('grid') || Math.abs(tooltip.get('lastY') - mouseY) > tooltip.get('grid'))))
- {
- tooltip.set('lastX', mouseX);
- tooltip.set('lastY', mouseY);
- }
- // did not satisfy the grid movement requirement
- else
- {
- return false;
- }
- }
-
- // mouseX and mouseY store the last acknowleged mouse position,
- // good for trailing on one axis
- tooltip.set('mouseX', mouseX);
- tooltip.set('mouseY', mouseY);
-
- var coordinates;
- if (domTT_screenEdgeDetection)
- {
- coordinates = domTT_correctEdgeBleed(
- tooltip.get('offsetWidth'),
- tooltip.get('offsetHeight'),
- mouseX,
- mouseY,
- tooltip.get('offsetX'),
- tooltip.get('offsetY'),
- tooltip.get('mouseOffset'),
- tooltip.get('inframe') ? window.parent : window
- );
- }
- else
- {
- coordinates = {
- 'x' : mouseX + tooltip.get('offsetX'),
- 'y' : mouseY + tooltip.get('offsetY') + tooltip.get('mouseOffset')
- };
- }
-
- // update the position
- tipObj.style.left = coordinates.x + 'px';
- tipObj.style.top = coordinates.y + 'px';
-
- // increase the tip zIndex so it goes over previously shown tips
- tipObj.style.zIndex = domLib_zIndex++;
- }
-
- // if tip is not active, active it now and check for a fade in
- if (status == 'pending')
- {
- // unhide the tooltip
- tooltip.set('status', 'active');
- tipObj.style.display = '';
- tipObj.style.visibility = 'visible';
-
- var fade = tooltip.get('fade');
- if (fade != 'neither')
- {
- var fadeHandler = tooltip.get('fadeHandler');
- if (fade == 'out' || fade == 'both')
- {
- fadeHandler.haltFade();
- if (fade == 'out')
- {
- fadeHandler.halt();
- }
- }
-
- if (fade == 'in' || fade == 'both')
- {
- fadeHandler.fadeIn();
- }
- }
-
- if (tooltip.get('type') == 'greasy' && tooltip.get('lifetime') != 0)
- {
- tooltip.set('lifetimeTimeout', domLib_setTimeout(domTT_runDeactivate, tooltip.get('lifetime'), [tipObj.id]));
- }
- }
-
- if (tooltip.get('position') == 'absolute' && domTT_detectCollisions)
- {
- // utilize original collision element cache
- domLib_detectCollisions(tipObj, false, true);
- }
-}
-
-// }}}
-// {{{ domTT_close()
-
-// in_handle can either be an child object of the tip, the tip id or the owner id
-function domTT_close(in_handle)
-{
- var id;
- if (typeof(in_handle) == 'object' && in_handle.nodeType)
- {
- var obj = in_handle;
- while (!obj.id || !domTT_tooltips.get(obj.id))
- {
- obj = obj.parentNode;
-
- if (obj.nodeType != document.ELEMENT_NODE) { return; }
- }
-
- id = obj.id;
- }
- else
- {
- id = in_handle;
- }
-
- domTT_deactivate(id);
-}
-
-// }}}
-// {{{ domTT_closeAll()
-
-// run through the tooltips and close them all
-function domTT_closeAll()
-{
- // NOTE: this will iterate 2x # of tooltips
- for (var id in domTT_tooltips.elementData) {
- domTT_close(id);
- }
-}
-
-// }}}
-// {{{ domTT_deactivate()
-
-// in_id is either the tip id or the owner id
-function domTT_deactivate(in_id)
-{
- var tooltip = domTT_tooltips.get(in_id);
- if (tooltip)
- {
- var status = tooltip.get('status');
- if (status == 'pending')
- {
- // cancel the creation of this tip if it is still pending
- domLib_clearTimeout(tooltip.get('activateTimeout'));
- tooltip.set('status', 'inactive');
- }
- else if (status == 'active')
- {
- if (tooltip.get('lifetime'))
- {
- domLib_clearTimeout(tooltip.get('lifetimeTimeout'));
- }
-
- var tipObj = tooltip.get('node');
- if (tooltip.get('closeAction') == 'hide')
- {
- var fade = tooltip.get('fade');
- if (fade != 'neither')
- {
- var fadeHandler = tooltip.get('fadeHandler');
- if (fade == 'out' || fade == 'both')
- {
- fadeHandler.fadeOut();
- }
- else
- {
- fadeHandler.hide();
- }
- }
- else
- {
- tipObj.style.display = 'none';
- }
- }
- else
- {
- tooltip.get('parent').removeChild(tipObj);
- domTT_tooltips.remove(tooltip.get('owner').id);
- domTT_tooltips.remove(tooltip.get('id'));
- }
-
- tooltip.set('status', 'inactive');
- if (domTT_detectCollisions) {
- // unhide all of the selects that are owned by this object
- // utilize original collision element cache
- domLib_detectCollisions(tipObj, true, true);
- }
- }
- }
-}
-
-// }}}
-// {{{ domTT_mouseout()
-
-function domTT_mouseout(in_owner, in_event)
-{
- if (!domLib_useLibrary) { return false; }
-
- if (typeof(in_event) == 'undefined') { in_event = window.event; }
-
- var toChild = domLib_isDescendantOf(in_event[domLib_eventTo], in_owner, domTT_bannedTags);
- var tooltip = domTT_tooltips.get(in_owner.id);
- if (tooltip && (tooltip.get('type') == 'greasy' || tooltip.get('status') != 'active'))
- {
- // deactivate tip if exists and we moved away from the owner
- if (!toChild)
- {
- domTT_deactivate(in_owner.id);
- try { window.status = window.defaultStatus; } catch(e) {}
- }
- }
- else if (!toChild)
- {
- try { window.status = window.defaultStatus; } catch(e) {}
- }
-}
-
-// }}}
-// {{{ domTT_mousemove()
-
-function domTT_mousemove(in_owner, in_event)
-{
- if (!domLib_useLibrary) { return false; }
-
- if (typeof(in_event) == 'undefined') { in_event = window.event; }
-
- var tooltip = domTT_tooltips.get(in_owner.id);
- if (tooltip && tooltip.get('trail') && tooltip.get('status') == 'active')
- {
- // see if we are trailing lazy
- if (tooltip.get('lazy'))
- {
- domLib_setTimeout(domTT_runShow, domTT_trailDelay, [in_owner.id, in_event]);
- }
- else
- {
- domTT_show(in_owner.id, in_event);
- }
- }
-}
-
-// }}}
-// {{{ domTT_addPredefined()
-
-function domTT_addPredefined(in_id)
-{
- var options = new domTT_Hash();
- for (var i = 1; i < arguments.length; i += 2)
- {
- options.set(arguments[i], arguments[i + 1]);
- }
-
- domTT_predefined.set(in_id, options);
-}
-
-// }}}
-// {{{ domTT_correctEdgeBleed()
-
-function domTT_correctEdgeBleed(in_width, in_height, in_x, in_y, in_offsetX, in_offsetY, in_mouseOffset, in_window)
-{
- var win, doc;
- var bleedRight, bleedBottom;
- var pageHeight, pageWidth, pageYOffset, pageXOffset;
-
- var x = in_x + in_offsetX;
- var y = in_y + in_offsetY + in_mouseOffset;
-
- win = (typeof(in_window) == 'undefined' ? window : in_window);
-
- // Gecko and IE swaps values of clientHeight, clientWidth properties when
- // in standards compliance mode from documentElement to document.body
- doc = ((domLib_standardsMode && (domLib_isIE || domLib_isGecko)) ? win.document.documentElement : win.document.body);
-
- // for IE in compliance mode
- if (domLib_isIE)
- {
- pageHeight = doc.clientHeight;
- pageWidth = doc.clientWidth;
- pageYOffset = doc.scrollTop;
- pageXOffset = doc.scrollLeft;
- }
- else
- {
- pageHeight = doc.clientHeight;
- pageWidth = doc.clientWidth;
-
- if (domLib_isKHTML)
- {
- pageHeight = win.innerHeight;
- }
-
- pageYOffset = win.pageYOffset;
- pageXOffset = win.pageXOffset;
- }
-
- // we are bleeding off the right, move tip over to stay on page
- // logic: take x position, add width and subtract from effective page width
- if ((bleedRight = (x - pageXOffset) + in_width - (pageWidth - domTT_screenEdgePadding)) > 0)
- {
- x -= bleedRight;
- }
-
- // we are bleeding to the left, move tip over to stay on page
- // if tip doesn't fit, we will go back to bleeding off the right
- // logic: take x position and check if less than edge padding
- if ((x - pageXOffset) < domTT_screenEdgePadding)
- {
- x = domTT_screenEdgePadding + pageXOffset;
- }
-
- // if we are bleeding off the bottom, flip to north
- // logic: take y position, add height and subtract from effective page height
- if ((bleedBottom = (y - pageYOffset) + in_height - (pageHeight - domTT_screenEdgePadding)) > 0)
- {
- y = in_y - in_height - in_offsetY;
- }
-
- // if we are bleeding off the top, flip to south
- // if tip doesn't fit, we will go back to bleeding off the bottom
- // logic: take y position and check if less than edge padding
- if ((y - pageYOffset) < domTT_screenEdgePadding)
- {
- y = in_y + domTT_mouseHeight + in_offsetY;
- }
-
- return {'x' : x, 'y' : y};
-}
-
-// }}}
-// {{{ domTT_isActive()
-
-// in_id is either the tip id or the owner id
-function domTT_isActive(in_id)
-{
- var tooltip = domTT_tooltips.get(in_id);
- if (!tooltip || tooltip.get('status') != 'active')
- {
- return false;
- }
- else
- {
- return true;
- }
-}
-
-// }}}
-// {{{ domTT_runXXX()
-
-// All of these domMenu_runXXX() methods are used by the event handling sections to
-// avoid the circular memory leaks caused by inner functions
-function domTT_runDeactivate(args) { domTT_deactivate(args[0]); }
-function domTT_runShow(args) { domTT_show(args[0], args[1]); }
-
-// }}}
-// {{{ domTT_replaceTitles()
-
-function domTT_replaceTitles(in_decorator)
-{
- var elements = domLib_getElementsByClass('tooltip');
- for (var i = 0; i < elements.length; i++)
- {
- if (elements[i].title)
- {
- var content;
- if (typeof(in_decorator) == 'function')
- {
- content = in_decorator(elements[i]);
- }
- else
- {
- content = elements[i].title;
- }
-
- content = content.replace(new RegExp('\'', 'g'), '\\\'');
- elements[i].onmouseover = new Function('in_event', "domTT_activate(this, in_event, 'content', '" + content + "')");
- elements[i].title = '';
- }
- }
-}
-
-// }}}
-// {{{ domTT_update()
-
-// Allow authors to update the contents of existing tips using the DOM
-// Unfortunately, the tip must already exist, or else no work is done.
-// TODO: make getting at content or caption cleaner
-function domTT_update(handle, content, type)
-{
- // type defaults to 'content', can also be 'caption'
- if (typeof(type) == 'undefined')
- {
- type = 'content';
- }
-
- var tip = domTT_tooltips.get(handle);
- if (!tip)
- {
- return;
- }
-
- var tipObj = tip.get('node');
- var updateNode;
- if (type == 'content')
- {
- // <div class="contents">...
- updateNode = tipObj.firstChild;
- if (updateNode.className != 'contents')
- {
- // <table><tbody><tr>...</tr><tr><td><div class="contents">...
- updateNode = updateNode.firstChild.firstChild.nextSibling.firstChild.firstChild;
- }
- }
- else
- {
- updateNode = tipObj.firstChild;
- if (updateNode.className == 'contents')
- {
- // missing caption
- return;
- }
-
- // <table><tbody><tr><td><div class="caption">...
- updateNode = updateNode.firstChild.firstChild.firstChild.firstChild;
- }
-
- // TODO: allow for a DOM node as content
- updateNode.innerHTML = content;
-}
-
-// }}}
diff --git a/src/usr/local/www/javascript/domTT/fadomatic.js b/src/usr/local/www/javascript/domTT/fadomatic.js
deleted file mode 100644
index 2c67d0b..0000000
--- a/src/usr/local/www/javascript/domTT/fadomatic.js
+++ /dev/null
@@ -1,180 +0,0 @@
-/** $Id$ */
-// Title: Fadomatic
-// Version: 1.2
-// Homepage: http://chimpen.com/fadomatic
-// Author: Philip McCarthy <fadomatic@chimpen.com>
-
-// Fade interval in milliseconds
-// Make this larger if you experience performance issues
-Fadomatic.INTERVAL_MILLIS = 50;
-
-// Creates a fader
-// element - The element to fade
-// speed - The speed to fade at, from 0.0 to 100.0
-// initialOpacity (optional, default 100) - element's starting opacity, 0 to 100
-// minOpacity (optional, default 0) - element's minimum opacity, 0 to 100
-// maxOpacity (optional, default 0) - element's minimum opacity, 0 to 100
-function Fadomatic (element, rate, initialOpacity, minOpacity, maxOpacity) {
- this._element = element;
- this._intervalId = null;
- this._rate = rate;
- this._isFadeOut = true;
-
- // Set initial opacity and bounds
- // NB use 99 instead of 100 to avoid flicker at start of fade
- this._minOpacity = 0;
- this._maxOpacity = 99;
- this._opacity = 99;
-
- if (typeof minOpacity != 'undefined') {
- if (minOpacity < 0) {
- this._minOpacity = 0;
- } else if (minOpacity > 99) {
- this._minOpacity = 99;
- } else {
- this._minOpacity = minOpacity;
- }
- }
-
- if (typeof maxOpacity != 'undefined') {
- if (maxOpacity < 0) {
- this._maxOpacity = 0;
- } else if (maxOpacity > 99) {
- this._maxOpacity = 99;
- } else {
- this._maxOpacity = maxOpacity;
- }
-
- if (this._maxOpacity < this._minOpacity) {
- this._maxOpacity = this._minOpacity;
- }
- }
-
- if (typeof initialOpacity != 'undefined') {
- if (initialOpacity > this._maxOpacity) {
- this._opacity = this._maxOpacity;
- } else if (initialOpacity < this._minOpacity) {
- this._opacity = this._minOpacity;
- } else {
- this._opacity = initialOpacity;
- }
- }
-
- // See if we're using W3C opacity, MSIE filter, or just
- // toggling visiblity
- if(typeof element.style.opacity != 'undefined') {
-
- this._updateOpacity = this._updateOpacityW3c;
-
- } else if(typeof element.style.filter != 'undefined') {
-
- // If there's not an alpha filter on the element already,
- // add one
- if (element.style.filter.indexOf("alpha") == -1) {
-
- // Attempt to preserve existing filters
- var existingFilters="";
- if (element.style.filter) {
- existingFilters = element.style.filter+" ";
- }
- element.style.filter = existingFilters+"alpha(opacity="+this._opacity+")";
- }
-
- this._updateOpacity = this._updateOpacityMSIE;
-
- } else {
-
- this._updateOpacity = this._updateVisibility;
- }
-
- this._updateOpacity();
-}
-
-// Initiates a fade out
-Fadomatic.prototype.fadeOut = function () {
- this._isFadeOut = true;
- this._beginFade();
-};
-
-// Initiates a fade in
-Fadomatic.prototype.fadeIn = function () {
- this._isFadeOut = false;
- this._beginFade();
-};
-
-// Makes the element completely opaque, stops any fade in progress
-Fadomatic.prototype.show = function () {
- this.haltFade();
- this._opacity = this._maxOpacity;
- this._updateOpacity();
-};
-
-// Makes the element completely transparent, stops any fade in progress
-Fadomatic.prototype.hide = function () {
- this.haltFade();
- this._opacity = 0;
- this._updateOpacity();
-};
-
-// Halts any fade in progress
-Fadomatic.prototype.haltFade = function () {
-
- clearInterval(this._intervalId);
-};
-
-// Resumes a fade where it was halted
-Fadomatic.prototype.resumeFade = function () {
-
- this._beginFade();
-};
-
-// Pseudo-private members
-
-Fadomatic.prototype._beginFade = function () {
-
- this.haltFade();
- var objref = this;
- this._intervalId = setInterval(function() { objref._tickFade(); },Fadomatic.INTERVAL_MILLIS);
-};
-
-Fadomatic.prototype._tickFade = function () {
-
- if (this._isFadeOut) {
- this._opacity -= this._rate;
- if (this._opacity < this._minOpacity) {
- this._opacity = this._minOpacity;
- this.haltFade();
- }
- } else {
- this._opacity += this._rate;
- if (this._opacity > this._maxOpacity ) {
- this._opacity = this._maxOpacity;
- this.haltFade();
- }
- }
-
- this._updateOpacity();
-};
-
-Fadomatic.prototype._updateVisibility = function () {
-
- if (this._opacity > 0) {
- this._element.style.visibility = 'visible';
- } else {
- this._element.style.visibility = 'hidden';
- }
-};
-
-Fadomatic.prototype._updateOpacityW3c = function () {
-
- this._element.style.opacity = this._opacity/100;
- this._updateVisibility();
-};
-
-Fadomatic.prototype._updateOpacityMSIE = function () {
-
- this._element.filters.alpha.opacity = this._opacity;
- this._updateVisibility();
-};
-
-Fadomatic.prototype._updateOpacity = null;
diff --git a/src/usr/local/www/javascript/filter_log.js b/src/usr/local/www/javascript/filter_log.js
deleted file mode 100644
index 66a7309..0000000
--- a/src/usr/local/www/javascript/filter_log.js
+++ /dev/null
@@ -1,168 +0,0 @@
-if (typeof getURL == 'undefined') {
- getURL = function(url, callback) {
- if (!url)
- throw 'No URL for getURL';
- try {
- if (typeof callback.operationComplete == 'function')
- callback = callback.operationComplete;
- } catch (e) {}
- if (typeof callback != 'function')
- throw 'No callback function for getURL';
- var http_request = null;
- if (typeof XMLHttpRequest != 'undefined') {
- http_request = new XMLHttpRequest();
- }
- else if (typeof ActiveXObject != 'undefined') {
- try {
- http_request = new ActiveXObject('Msxml2.XMLHTTP');
- } catch (e) {
- try {
- http_request = new ActiveXObject('Microsoft.XMLHTTP');
- } catch (e) {}
- }
- }
- if (!http_request)
- throw 'Both getURL and XMLHttpRequest are undefined';
- http_request.onreadystatechange = function() {
- if (http_request.readyState == 4) {
- callback( { success : true,
- content : http_request.responseText,
- contentType : http_request.getResponseHeader("Content-Type") } );
- }
- };
- http_request.open('GET', url, true);
- http_request.send(null);
- };
-}
-
-function outputrule(req) {
- alert(req.content);
-}
-function fetch_new_rules() {
- if(isPaused)
- return;
- if(isBusy)
- return;
- isBusy = true;
- getURL('diag_logs_filter_dynamic.php?lastsawtime=' + lastsawtime, fetch_new_rules_callback);
-}
-function fetch_new_rules_callback(callback_data) {
- if(isPaused)
- return;
-
- var data_split;
- var new_data_to_add = Array();
- var data = callback_data.content;
-
- data_split = data.split("\n");
-
- for(var x=0; x<data_split.length-1; x++) {
- /* loop through rows */
- row_split = data_split[x].split("||");
- lastsawtime = row_split[9];
-
- var tmp = format_log_line(row_split);
- if ( !(tmp) ) continue;
-
- new_data_to_add[new_data_to_add.length] = tmp;
- }
- update_table_rows(new_data_to_add);
- isBusy = false;
-}
-
-function in_arrayi(needle, haystack) {
- var i = haystack.length;
- while (i--) {
- if (haystack[i].toLowerCase() === needle.toLowerCase()) {
- return true;
- }
- }
- return false;
-}
-
-function update_table_rows(data) {
- if(isPaused)
- return;
-
- var isIE = navigator.appName.indexOf('Microsoft') != -1;
- var isSafari = navigator.userAgent.indexOf('Safari') != -1;
- var isOpera = navigator.userAgent.indexOf('Opera') != -1;
- var showanim = 1;
- if (isIE) {
- showanim = 0;
- }
-
- var startat = data.length - nentries;
- if (startat < 0) {
- startat = 0;
- }
- data = data.slice(startat, data.length);
-
- var rows = jQuery('#filter-log-entries>tr');
-
- // Number of rows to move by
- var move = rows.length + data.length - nentries;
- if (move < 0)
- move = 0;
-
- if (isReverse == false) {
- for (var i = move; i < rows.length; i++) {
- jQuery(rows[i - move]).html(jQuery(rows[i]).html());
- }
-
- var tbody = jQuery('#filter-log-entries');
- for (var i = 0; i < data.length; i++) {
- var rowIndex = rows.length - move + i;
- if (rowIndex < rows.length) {
- jQuery(rows[rowIndex]).html(data[i]);
- } else {
- jQuery(tbody).append('<tr>' + data[i] + '</tr>');
- }
- }
- } else {
- for (var i = rows.length - 1; i >= move; i--) {
- jQuery(rows[i]).html(jQuery(rows[i - move]).html());
- }
-
- var tbody = jQuery('#filter-log-entries');
- for (var i = 0; i < data.length; i++) {
- var rowIndex = move - 1 - i;
- if (rowIndex >= 0) {
- jQuery(rows[rowIndex]).html(data[i]);
- } else {
- jQuery(tbody).prepend('<tr>' + data[i] + '</tr>');
- }
- }
- }
-
- // Much easier to go through each of the rows once they've all be added.
- rows = jQuery('#filter-log-entries>tr');
- for (var i = 0; i < rows.length; i++) {
- rows[i].className = i % 2 == 0 ? 'listMRodd' : 'listMReven';
- }
-}
-
-function toggle_pause() {
- if(isPaused) {
- isPaused = false;
- fetch_new_rules();
- } else {
- isPaused = true;
- }
-}
-/* start local AJAX engine */
-if (typeof updateDelay != 'undefined') {
- timer = setInterval('fetch_new_rules()', updateDelay);
-}
-
-function toggleListDescriptions(){
- var ss = document.styleSheets;
- for (var i=0; i<ss.length; i++) {
- var rules = ss[i].cssRules || ss[i].rules;
- for (var j=0; j<rules.length; j++) {
- if (rules[j].selectorText === ".listMRDescriptionL" || rules[j].selectorText === ".listMRDescriptionR") {
- rules[j].style.display = rules[j].style.display === "none" ? "table-cell" : "none";
- }
- }
- }
-}
diff --git a/src/usr/local/www/javascript/firebug-lite.js b/src/usr/local/www/javascript/firebug-lite.js
deleted file mode 100644
index 135b9e6..0000000
--- a/src/usr/local/www/javascript/firebug-lite.js
+++ /dev/null
@@ -1,1000 +0,0 @@
-/**
- * firebug lite <http://www.getfirebug.com/lite.html>
- * v1.0
- * 04.11.2008, 8:25 PM ~
- * v1.0a
- * 03.27.2008, 5:44 AM ~ 04.01.2008, 21:32 PM
- * Azer Koçulu <http://azer.kodfabrik.com>
- */
-
-var firebug = {
- env:{ "cache":{}, "ctmp":[], "dIndex":"console", "init":false, "ml":false, "objCn":[] },
- init:function(){
- firebug.el = {}; // elements
- firebug.el.content = {};
- with(firebug){
-
- document.documentElement.childNodes[0].appendChild(
- new pi.element("link").attribute.set("rel","stylesheet").attribute.set("href","http://firebuglite.appspot.com/firebug-lite.css").environment.getElement()
- );
-
- /*
- * main interface
- */
- el.main = new pi.element("DIV").attribute.set("id","Firebug").environment.addStyle({ "width":pi.util.GetWindowSize().width+"px" }).insert(document.body);
- el.header = new pi.element("DIV").attribute.addClass("Header").insert(el.main);
- el.left = {};
- el.left.container = new pi.element("DIV").attribute.addClass("Left").insert(el.main);
- el.right = {};
- el.right.container = new pi.element("DIV").attribute.addClass("Right").insert(el.main);
- el.main.child.add(new pi.element("DIV").environment.addStyle({ "clear":"both" }));
-
- /*
- * buttons
- */
- el.button = {};
- el.button.container = new pi.element("DIV").attribute.addClass("ButtonContainer").insert(el.header);
- el.button.logo = new pi.element("A").attribute.set("title","Firebug Lite").attribute.set("target","_blank").attribute.set("href","http://getfirebug.com/lite.html").update("&nbsp;").attribute.addClass("Button Logo").insert(el.button.container);
- el.button.inspect = new pi.element("A").attribute.addClass("Button").event.addListener("click",d.inspector.toggle).update("Inspect").insert(el.button.container);
- el.button.maximize = new pi.element("A").attribute.addClass("Button Maximize").event.addListener("click",win.maximize).insert(el.button.container);
- el.button.minimize = new pi.element("A").attribute.addClass("Button Minimize").event.addListener("click",win.minimize).insert(el.button.container);
- el.button.close = new pi.element("A").attribute.addClass("Button Close").event.addListener("click",win.close).insert(el.button.container);
-
- if(pi.env.ie||pi.env.webkit){
- el.button.container.environment.addStyle({ "paddingTop":"12px" });
- }
-
- /*
- * navigation
- */
- el.nav = {};
- el.nav.container = new pi.element("DIV").attribute.addClass("Nav").insert(el.left.container);
- el.nav.console = new pi.element("A").attribute.addClass("Tab Selected").event.addListener("click",d.navigate.curry(window,"console")).update("Console").insert(el.nav.container);
- el.nav.html = new pi.element("A").attribute.addClass("Tab").update("HTML").event.addListener("click",d.navigate.curry(window,"html")).insert(el.nav.container);
- el.nav.css = new pi.element("A").attribute.addClass("Tab").update("CSS").event.addListener("click",d.navigate.curry(window,"css")).insert(el.nav.container);
- el.nav.scripts = new pi.element("A").attribute.addClass("Tab").update("Script").event.addListener("click",d.navigate.curry(window,"scripts")).insert(el.nav.container);
- el.nav.dom = new pi.element("A").attribute.addClass("Tab").update("DOM").event.addListener("click",d.navigate.curry(window,"dom")).insert(el.nav.container);
- el.nav.xhr = new pi.element("A").attribute.addClass("Tab").update("XHR").event.addListener("click",d.navigate.curry(window,"xhr")).insert(el.nav.container);
-
- /*
- * inspector
- */
-
- el.borderInspector = new pi.element("DIV").attribute.set("id","FirebugBorderInspector").event.addListener("click",listen.inspector).insert(document.body);
- el.bgInspector = new pi.element("DIV").attribute.set("id","FirebugBGInspector").insert(document.body);
-
- /*
- * console
- */
- el.left.console = {};
- el.left.console.container = new pi.element("DIV").attribute.addClass("Console").insert(el.left.container);
- el.left.console.mlButton = new pi.element("A").attribute.addClass("MLButton").event.addListener("click",d.console.toggleML).insert(el.left.console.container);
- el.left.console.monitor = new pi.element("DIV").insert(
- new pi.element("DIV").attribute.addClass("Monitor").insert(el.left.console.container)
- );
- el.left.console.container.child.add(
- new pi.element("DIV").attribute.addClass("InputArrow").update(">>>")
- );
- el.left.console.input = new pi.element("INPUT").attribute.set("type","text").attribute.addClass("Input").event.addListener("keydown",listen.consoleTextbox).insert(
- new pi.element("DIV").attribute.addClass("InputContainer").insert(el.left.console.container)
- );
-
- el.right.console = {};
- el.right.console.container = new pi.element("DIV").attribute.addClass("Console Container").insert(el.right.container);
- el.right.console.mlButton = new pi.element("A").attribute.addClass("MLButton CloseML").event.addListener("click",d.console.toggleML).insert(el.right.console.container);
- el.right.console.input = new pi.element("TEXTAREA").attribute.addClass("Input").insert(el.right.console.container);
- el.right.console.run = new pi.element("A").attribute.addClass("Button").event.addListener("click",listen.runMultiline).update("Run").insert(el.right.console.container);
-
- el.right.console.clear = new pi.element("A").attribute.addClass("Button").event.addListener("click",d.clean.curry(window,el.right.console.input)).update("Clear").insert(el.right.console.container);
-
- el.button.console = {};
- el.button.console.container = new pi.element("DIV").attribute.addClass("ButtonSet").insert(el.button.container);
- el.button.console.clear = new pi.element("A").attribute.addClass("Button").event.addListener("click",d.clean.curry(window,el.left.console.monitor)).update("Clear").insert(el.button.console.container);
-
- /*
- * html
- */
-
- el.left.html = {};
- el.left.html.container = new pi.element("DIV").attribute.addClass("HTML").insert(el.left.container);
-
- el.right.html = {};
- el.right.html.container = new pi.element("DIV").attribute.addClass("HTML Container").insert(el.right.container);
-
- el.right.html.nav = {};
- el.right.html.nav.container = new pi.element("DIV").attribute.addClass("Nav").insert(el.right.html.container);
- el.right.html.nav.computedStyle = new pi.element("A").attribute.addClass("Tab Selected").event.addListener("click",d.html.navigate.curry(firebug,"computedStyle")).update("Computed Style").insert(el.right.html.nav.container);
- if(!pi.env.ie6)
- el.right.html.nav.dom = new pi.element("A").attribute.addClass("Tab").event.addListener("click",d.html.navigate.curry(firebug,"dom")).update("DOM").insert(el.right.html.nav.container);
-
- el.right.html.content = new pi.element("DIV").attribute.addClass("Content").insert(el.right.html.container);
-
- el.button.html = {};
- el.button.html.container = new pi.element("DIV").attribute.addClass("ButtonSet HTML").insert(el.button.container);
-
- /*
- * css
- */
-
- el.left.css = {};
- el.left.css.container = new pi.element("DIV").attribute.addClass("CSS").insert(el.left.container);
-
- el.right.css = {};
- el.right.css.container = new pi.element("DIV").attribute.addClass("CSS Container").insert(el.right.container);
-
- el.right.css.nav = {};
- el.right.css.nav.container = new pi.element("DIV").attribute.addClass("Nav").insert(el.right.css.container);
- el.right.css.nav.runCSS = new pi.element("A").attribute.addClass("Tab Selected").update("Run CSS").insert(el.right.css.nav.container);
-
- el.right.css.mlButton = new pi.element("A").attribute.addClass("MLButton CloseML").event.addListener("click",d.console.toggleML).insert(el.right.css.container);
- el.right.css.input = new pi.element("TEXTAREA").attribute.addClass("Input").insert(el.right.css.container);
- el.right.css.run = new pi.element("A").attribute.addClass("Button").event.addListener("click",listen.runCSS).update("Run").insert(el.right.css.container);
- el.right.css.clear = new pi.element("A").attribute.addClass("Button").event.addListener("click",d.clean.curry(window,el.right.css.input)).update("Clear").insert(el.right.css.container);
-
- el.button.css = {};
- el.button.css.container = new pi.element("DIV").attribute.addClass("ButtonSet CSS").insert(el.button.container);
- el.button.css.selectbox = new pi.element("SELECT").event.addListener("change",listen.cssSelectbox).insert(el.button.css.container);
-
- /*
- * scripts
- */
-
- el.left.scripts = {};
- el.left.scripts.container = new pi.element("DIV").attribute.addClass("Scripts").insert(el.left.container);
-
- el.right.scripts = {};
- el.right.scripts.container = new pi.element("DIV").attribute.addClass("Scripts Container").insert(el.right.container);
-
- el.button.scripts = {};
- el.button.scripts.container = new pi.element("DIV").attribute.addClass("ButtonSet Scripts").insert(el.button.container);
- el.button.scripts.selectbox = new pi.element("SELECT").event.addListener("change",listen.scriptsSelectbox).insert(el.button.scripts.container);
- el.button.scripts.lineNumbers = new pi.element("A").attribute.addClass("Button").event.addListener("click",d.scripts.toggleLineNumbers).update("Show Line Numbers").insert(el.button.scripts.container);
-
- /*
- * dom
- */
-
- el.left.dom = {};
- el.left.dom.container = new pi.element("DIV").attribute.addClass("DOM").insert(el.left.container);
-
- el.right.dom = {};
- el.right.dom.container = new pi.element("DIV").attribute.addClass("DOM Container").insert(el.right.container);
-
- el.button.dom = {};
- el.button.dom.container = new pi.element("DIV").attribute.addClass("ButtonSet DOM").insert(el.button.container);
- el.button.dom.label = new pi.element("LABEL").update("Object Path:").insert(el.button.dom.container);
- el.button.dom.textbox = new pi.element("INPUT").event.addListener("keydown",listen.domTextbox).update("window").insert(el.button.dom.container);
-
- /*
- * str
- */
-
- el.left.str = {};
- el.left.str.container = new pi.element("DIV").attribute.addClass("STR").insert(el.left.container);
-
- el.right.str = {};
- el.right.str.container = new pi.element("DIV").attribute.addClass("STR").insert(el.left.container);
-
- el.button.str = {};
- el.button.str.container = new pi.element("DIV").attribute.addClass("ButtonSet XHR").insert(el.button.container);
- el.button.str.watch = new pi.element("A").attribute.addClass("Button").event.addListener("click",d.navigate.curry(window,"xhr")).update("Back").insert(el.button.str.container);
-
- /*
- * xhr
- */
-
- el.left.xhr = {};
- el.left.xhr.container = new pi.element("DIV").attribute.addClass("XHR").insert(el.left.container);
-
- el.right.xhr = {};
- el.right.xhr.container = new pi.element("DIV").attribute.addClass("XHR").insert(el.left.container);
-
-
- el.button.xhr = {};
- el.button.xhr.container = new pi.element("DIV").attribute.addClass("ButtonSet XHR").insert(el.button.container);
- el.button.xhr.label = new pi.element("LABEL").update("XHR Path:").insert(el.button.xhr.container);
- el.button.xhr.textbox = new pi.element("INPUT").event.addListener("keydown",listen.xhrTextbox).insert(el.button.xhr.container);
- el.button.xhr.watch = new pi.element("A").attribute.addClass("Button").event.addListener("click",listen.addXhrObject).update("Watch").insert(el.button.xhr.container);
-
- // fix ie6 a:hover bug
- if(pi.env.ie6)
- {
- var buttons = [
- el.button.inspect,
- el.button.close,
- el.button.inspect,
- el.button.console.clear,
- el.right.console.run,
- el.right.console.clear,
- el.right.css.run,
- el.right.css.clear
- ];
- for(var i=0; i<buttons.length; i++)
- buttons[i].attribute.set("href","#");
- }
- //
-
- env.init = true;
-
- for(var i=0; i<env.ctmp.length; i++)
- {
- d.console.log.apply(window,env.ctmp[i]);
- }
- }
- },
- win:{
- close:function(){
- with(firebug){
- el.main.update("");
- el.main.remove();
- }
- },
- minimize:function(){
- with(firebug){
- el.main.environment.addStyle({ "height":"35px" });
- el.button.maximize.environment.addStyle({ "display":"block" });
- el.button.minimize.environment.addStyle({ "display":"none" });
- d.refreshSize();
- }
- },
- maximize:function(){
- with(firebug){
- el.main.environment.addStyle({ "height":"295px" });
- el.button.minimize.environment.addStyle({ "display":"block" });
- el.button.maximize.environment.addStyle({ "display":"none" });
- d.refreshSize();
- }
- }
- },
- watchXHR:function(){
- with(firebug){
- d.xhr.addObject.apply(window,arguments);
- if(env.dIndex!="xhr"){
- d.navigate("xhr");
- }
- }
- },
- d: {
- clean:function(_element){
- with(firebug){
- _element.update("");
- }
- },
- console:{
- dir:function(_value){
- with(firebug){
- d.console.addLine().attribute.addClass("Arrow").update(">>> console.dir("+_value+")");
- d.dom.open(_value,d.console.addLine());
- }
- },
- addLine:function(){
- with (firebug) {
- return new pi.element("DIV").attribute.addClass("Row").insert(el.left.console.monitor);
- }
- },
- openObject:function(_index){
- with (firebug) {
- d.dom.open(env.objCn[_index], el.left.dom.container, pi.env.ie);
- d.navigate("dom");
- }
- },
- historyIndex:0,
- history:[],
- log:function(_values){
- with (firebug) {
- if(env.init==false){
- env.ctmp.push(arguments);
- return;
- }
-
- var value = "";
- for(var i=0; i<arguments.length; i++){
- value += (i>0?" ":"")+d.highlight(arguments[i],false,false,true);
- }
-
- d.console.addLine().update(value);
- d.console.scroll();
-
- }
- },
- print: function(_cmd,_text){
- with (firebug){
- d.console.addLine().attribute.addClass("Arrow").update(">>> "+_cmd);
- d.console.addLine().update(d.highlight(_text,false,false,true));
- d.console.scroll();
- d.console.historyIndex = d.console.history.push(_cmd);
- }
- },
- run:function(cmd){
- with(firebug){
- if(cmd.length==0)return;
- el.left.console.input.environment.getElement().value = "";
- try {
- var result = eval.call(window,cmd);
- d.console.print(cmd,result);
- } catch(e){
- d.console.addLine().attribute.addClass("Arrow").update(">>> "+cmd);
- if(!pi.env.ff){
- d.console.scroll();
- return d.console.addLine().attribute.addClass("Error").update("<strong>Error: </strong>"+(e.description||e),true);
- }
- if(e.fileName==null){
- d.console.addLine().attribute.addClass("Error").update("<strong>Error: </strong>"+e.message,true);
- }
- var fileName = e.fileName.split("\/").getLastItem();
- d.console.addLine().attribute.addClass("Error").update("<strong>Error: </strong>"+e.message+" (<em>"+fileName+"</em>,"+e.lineNumber+")",true);
- d.console.scroll();
- }
- d.console.scroll();
- }
- },
- scroll:function(){
- with(firebug){
- el.left.console.monitor.environment.getElement().parentNode.scrollTop = Math.abs(el.left.console.monitor.environment.getSize().offsetHeight-200);
- }
- },
- toggleML:function(){
- with(firebug){
- var open = !env.ml;
- env.ml = !env.ml;
- d.navigateRightColumn("console",open);
- el[open?"left":"right"].console.mlButton.environment.addStyle({ display:"none" });
- el[!open?"left":"right"].console.mlButton.environment.addStyle({ display:"block" });
- el.left.console.monitor.environment.addStyle({ "height":(open?233:210)+"px" });
- el.left.console.mlButton.attribute[(open?"add":"remove")+"Class"]("CloseML");
- }
- }
- },
- css:{
- index:-1,
- open:function(_index){
- with (firebug) {
- var item = document.styleSheets[_index];
- var uri = item.href;
- if(uri.indexOf("http:\/\/")>-1&&getDomain(uri)!=document.domain){
- el.left.css.container.update("<em>Access to restricted URI denied</em>");
- return;
- }
- var rules = item[pi.env.ie ? "rules" : "cssRules"];
- var str = "";
- for (var i=0; i<rules.length; i++) {
- var item = rules[i];
- var selector = item.selectorText;
- var cssText = pi.env.ie?item.style.cssText:item.cssText.match(/\{(.*)\}/)[1];
- str+=d.css.printRule(selector, cssText.split(";"), el.left.css.container);
- }
- el.left.css.container.update(str);
- }
- },
- printRule:function(_selector,_css,_layer){
- with(firebug){
- var str = "<div class='Selector'>"+_selector+" {</div>";
- for(var i=0; i<_css.length; i++){
- var item = _css[i];
- str += "<div class='CSSText'>"+item.replace(/(.+\:)(.+)/,"<span class='CSSProperty'>$1</span><span class='CSSValue'>$2;</span>")+"</div>";
- }
- str+="<div class='Selector'>}</div>";
- return str;
- }
- },
- refresh:function(){
- with(firebug){
- el.button.css.selectbox.update("");
- var collection = document.styleSheets;
- for(var i=0; i<collection.length; i++){
- var uri = collection[i].href;
- d.css.index=d.css.index<0?i:d.css.index;
- el.button.css.selectbox.child.add(
- new pi.element("OPTION").attribute.set("value",i).update(uri)
- );
- };
- d.css.open(d.css.index);
- }
- }
- },
- dom: {
- open: function(_object,_layer){
- with (firebug) {
- _layer.clean();
- var container = new pi.element("DIV").attribute.addClass("DOMContent").insert(_layer);
- d.dom.print(_object, container);
- }
- },
- print:function(_object,_parent, _inTree){
- with (firebug) {
- var obj = _object || window, parentElement = _parent;
- parentElement.update("");
-
- if(parentElement.opened&&parentElement!=el.left.dom.container){
- parentElement.environment.getParent().pi.child.get()[0].pi.child.get()[0].pi.attribute.removeClass("Opened");
- parentElement.opened = false;
- parentElement.environment.addStyle({ "display":"none" });
- return;
- }
- if(_inTree)
- parentElement.environment.getParent().pi.child.get()[0].pi.child.get()[0].pi.attribute.addClass("Opened");
- parentElement.opened = true;
-
- for (var key in obj) {
- try {
-
- var value = obj[key], property = key, container = new pi.element("DIV").attribute.addClass("DOMRow").insert(parentElement),
- left = new pi.element("DIV").attribute.addClass("DOMRowLeft").insert(container), right = new pi.element("DIV").attribute.addClass("DOMRowRight").insert(container);
-
- container.child.add(
- new pi.element("DIV").environment.addStyle({ "clear":"both" })
- );
-
- var link = new pi.element("A").attribute.addClass(
- typeof value=="object"&&Boolean(value)?"Property Object":"Property"
- ).update(property).insert(left);
-
- right.update(
- d.highlight(value,false,true)
- );
-
- var subContainer = new pi.element("DIV").attribute.addClass("DOMRowSubContainer").insert(container);
-
- if(typeof value!="object"||Boolean(value)==false)
- continue;
-
- link.event.addListener("click",d.dom.print.curry(window,value, subContainer, true));
- }catch(e){
- }
- }
- parentElement.environment.addStyle({ "display":"block" });
- }
- }
- },
- highlight:function(_value,_inObject,_inArray,_link){
- with(firebug){
- var isArray = false, isElement = false;
- try {
- isArray = pi.util.IsArray(_value);
- isElement = _value!=undefined&&Boolean(_value.nodeName)&&Boolean(_value.nodeType);
- }catch(e){};
-
- // number, string, boolean, null, function
- if(_value==null||["boolean","function","number","string"].indexOf(typeof _value)>-1){
- // NULL
- if(_value==null){
- return "<span class='Null'>null</span>";
- }
-
- // BOOLEAN & NUMBER
- if (["boolean", "number"].indexOf(typeof _value) > -1) {
- return "<span class='DarkBlue'>" + _value + "</span>";
- }
-
- // FUNCTION
- if(typeof _value=="function"){
- return "<span class='"+(_inObject?"Italic Gray":"Green")+"'>function()</span>";
- }
-
- // STRING
- return "<span class='Red'>\""+( !_inObject&&!_inArray?_value : _value.substring(0,35) ).replace(/\n/g,"\\n").replace(/\s/g,"&nbsp;").replace(/>/g,"&#62;").replace(/</g,"&#60;")+"\"</span>";
- }
- // element
- else if(isElement){
- if(_value.nodeType==3)return d.highlight(_value.nodeValue);
-
- if(_inArray||_inObject){
- var result = "<span class='Blue'>"+_value.nodeName.toLowerCase();
- if(_value.getAttribute&&_value.getAttribute("id"))result += "<span class='DarkBlue'>#"+_value.getAttribute("id")+"</span>";
- var elClass = _value.getAttribute?_value.getAttribute(pi.env.ie?"className":"class"):"";
- if(elClass)result += "<span class='Red'>."+elClass.split(" ")[0]+"</span>";
- return result+"</span>";
- }
-
- var result = "<span class='Blue'>&#60;"+_value.nodeName.toLowerCase()+"";
- if(_value.attributes)
- for(var i=0; i<_value.attributes.length; i++){
- var item = _value.attributes[i];
- if(pi.env.ie&&Boolean(item.nodeValue)==false)continue;
- result += " <span class='DarkBlue'>"+item.nodeName+"=\"<span class='Red'>"+item.nodeValue+"</span>\"</span>";
- }
- result += "&#62;</span>";
- return result;
- }
- // array & object
- else if(isArray||["object","array"].indexOf(typeof _value)>-1){
- var result = "";
- if(isArray||_value instanceof Array){
- if(_inObject)return "<span class='Gray Italic'>["+_value.length+"]</span>";
- result += "<span class='Strong'>[ ";
-
- for(var i=0; i<_value.length; i++){
- if((_inObject||_inArray)&&pi.env.ie&&i>3)break;
- result += (i > 0 ? ", " : "") + d.highlight(_value[i], false, true, true);
- }
- result += " ]</span>";
- return result;
- }
- if(_inObject)return "<span class='Gray Italic'>Object</span>";
- result += "<span class='Strong Green"+ ( !_link?"'":" ObjectLink' onmouseover='this.className=this.className.replace(\"ObjectLink\",\"ObjectLinkHover\")' onmouseout='this.className=this.className.replace(\"ObjectLinkHover\",\"ObjectLink\")' onclick='firebug.d.console.openObject(" +( env.objCn.push( _value ) -1 )+")'" ) + ">Object";
- var i=0;
- for(var key in _value){
- var value = _value[key];
- if((_inObject||_inArray)&&pi.env.ie&&i>3)
- break;
- result += " "+key+"="+d.highlight(value,true);
- i++;
- };
- result += "</span>";
- return result;
- } else {
- if(_inObject)
- return "<span class='Gray Italic'>"+_value+"</span>";
- return _value;
- }
-
- }
- },
- html:{
- nIndex:"computedStyle",
- current:null,
- highlight:function(_element,_clear,_event){
- with(firebug){
- if(_clear){
- el.bgInspector.environment.addStyle({ "display":"none" });
- return;
- }
- d.inspector.inspect(_element,true);
- }
- },
- inspect:function(_element){
- var el = _element, map = [], parent = _element;
- while(parent){
- map.push(parent);
- if(parent==document.body)break;
- parent = parent.parentNode;
- }
- map = map.reverse();
- with(firebug){
- d.inspector.toggle();
- var parentLayer = el.left.html.container.child.get()[1].childNodes[1].pi;
- for(var t=0; map[t];){
- if(t==map.length-1){
-
- var link = parentLayer.environment.getElement().previousSibling.pi;
- link.attribute.addClass("Selected");
-
- if(d.html.current)d.html.current[1].attribute.removeClass("Selected");
-
- d.html.current = [_element,link];
-
- return t;
- }
- parentLayer = d.html.openHtmlTree(map[t],parentLayer,map[t+1]);
- t++;
- }
- }
- },
- navigate:function(_index,_element){
- with(firebug){
- el.right.html.nav[d.html.nIndex].attribute.removeClass("Selected");
- el.right.html.nav[_index].attribute.addClass("Selected");
- d.html.nIndex = _index;
- d.html.openProperties();
-
- }
- },
- openHtmlTree:function(_element,_parent,_returnParentElementByElement,_event){
- with(firebug){
- var element = _element || document.documentElement,
- parent = _parent || el.left.html.container,
- returnParentEl = _returnParentElementByElement || null,
- returnParentVal = null;
-
- if(parent!=el.left.html.container){
- var nodeLink = parent.environment.getParent().pi.child.get()[0].pi;
- if(d.html.current)d.html.current[1].attribute.removeClass("Selected");
- nodeLink.attribute.addClass("Selected");
-
- d.html.current = [_element,nodeLink];
- d.html.openProperties();
- }
-
- if(element.childNodes&&(element.childNodes.length==0||(element.childNodes.length==1&&element.childNodes[0].nodeType==3)))return;
- parent.clean();
-
- if(parent.opened&&Boolean(_returnParentElementByElement)==false){
- parent.opened = false;
- parent.environment.getParent().pi.child.get()[0].pi.attribute.removeClass("Open");
- return;
- }
- if (parent != el.left.html.container) {
- parent.environment.getParent().pi.child.get()[0].pi.attribute.addClass("Open");
- parent.opened = true;
-
- }
-
- for(var i=0; i<element.childNodes.length; i++){
- var item = element.childNodes[i];
-
- if(item.nodeType==3)continue;
- var container = new pi.element().attribute.addClass("Block").insert(parent);
- var link = new pi.element("A").attribute.addClass("Link").update(d.highlight(item)).insert(container);
- var subContainer = new pi.element("DIV").attribute.addClass("SubContainer").insert(container);
- link.event.addListener("click",d.html.openHtmlTree.curry(window,item,subContainer,false));
- link.event.addListener("mouseover",d.html.highlight.curry(window,item, false));
- link.event.addListener("mouseout",d.html.highlight.curry(window,item,true));
-
- returnParentVal = returnParentEl==item?subContainer:returnParentVal;
-
- if(d.html.current==null&&item==document.body){
- link.attribute.addClass("Selected");
- d.html.current = [item,link];
- d.html.openHtmlTree(item,subContainer);
- }
-
- if(item.childNodes&&item.childNodes.length==1&&item.childNodes[0].nodeType==3){
- link.child.get()[0].appendChild(document.createTextNode(item.childNodes[0].nodeValue.substring(0,100)));
- link.child.get()[0].appendChild(document.createTextNode("</"));
- link.child.get()[0].appendChild(new pi.element("span").attribute.addClass("Blue").update(item.nodeName.toLowerCase()).environment.getElement());
- link.child.get()[0].appendChild(document.createTextNode(">"));
- continue;
- }
- else if(item.childNodes&&item.childNodes.length==0)continue;
- link.attribute.addClass("ParentLink");
-
- }
- return returnParentVal;
- }
- },
- openProperties:function(){
- with(firebug){
-
- var index = d.html.nIndex;
- var node = d.html.current[0];
- d.clean(el.right.html.content);
- var str = "";
- switch(index){
- case "computedStyle":
- var property = ["opacity","filter","azimuth","background","backgroundAttachment","backgroundColor","backgroundImage","backgroundPosition","backgroundRepeat","border","borderCollapse","borderColor","borderSpacing","borderStyle","borderTop","borderRight","borderBottom","borderLeft","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","borderTopStyle","borderRightStyle","borderBottomStyle","borderLeftStyle","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderWidth","bottom","captionSide","clear","clip","color","content","counterIncrement","counterReset","cue","cueAfter","cueBefore","cursor","direction","display","elevation","emptyCells","cssFloat","font","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","height","left","letterSpacing","lineHeight","listStyle","listStyleImage","listStylePosition","listStyleType","margin","marginTop","marginRight","marginBottom","marginLeft","markerOffset","marks","maxHeight","maxWidth","minHeight","minWidth","orphans","outline","outlineColor","outlineStyle","outlineWidth","overflow","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","page","pageBreakAfter","pageBreakBefore","pageBreakInside","pause","pauseAfter","pauseBefore","pitch","pitchRange","playDuring","position","quotes","richness","right","size","speak","speakHeader","speakNumeral","speakPunctuation","speechRate","stress","tableLayout","textAlign","textDecoration","textIndent","textShadow","textTransform","top","unicodeBidi","verticalAlign","visibility","voiceFamily","volume","whiteSpace","widows","width","wordSpacing","zIndex"].sort();
- var view = document.defaultView?document.defaultView.getComputedStyle(node,null):node.currentStyle;
- for(var i=0; i<property.length; i++){
- var item = property[i];
- if(!view[item])continue;
- str+="<div class='CSSItem'><div class='CSSProperty'>"+item+"</div><div class='CSSValue'>"+d.highlight(view[item])+"</div></div>";
- }
- el.right.html.content.update(str);
- break;
- case "dom":
- d.dom.open(node,el.right.html.content,pi.env.ie);
- break;
- }
- }
- }
- },
- inspector:{
- enabled:false,
- el:null,
- inspect:function(_element,_bgInspector){
- var el = _element, top = el.offsetTop, left = el.offsetLeft, parent = _element.offsetParent;
- while(Boolean(parent)&&parent!=document.firstChild){
- top += parent.offsetTop;
- left += parent.offsetLeft;
- parent = parent.offsetParent;
- if(parent==document.body)break;
- };
-
- with(firebug){
- el[_bgInspector?"bgInspector":"borderInspector"].environment.addStyle({
- "width":_element.offsetWidth+"px", "height":_element.offsetHeight+"px",
- "top":top-(_bgInspector?0:2)+"px", "left":left-(_bgInspector?0:2)+"px",
- "display":"block"
- });
-
- if(!_bgInspector){
- d.inspector.el = _element;
- }
- };
- },
- toggle:function(){
- with (firebug) {
- d.inspector.enabled = !d.inspector.enabled;
- el.button.inspect.attribute[(d.inspector.enabled ? "add" : "remove") + "Class"]("Enabled");
- if(d.inspector.enabled==false){
- el.borderInspector.environment.addStyle({ "display":"none" });
- d.inspector.el = null;
- } else if(pi.env.dIndex!="html") {
- d.navigate("html");
- }
- }
- }
- },
- scripts:{
- index:-1,
- lineNumbers:false,
- open:function(_index){
- with(firebug){
- d.scripts.index = _index;
- el.left.scripts.container.update("");
- var script = document.getElementsByTagName("script")[_index],uri = script.src||document.location.href,source;
-
- if(uri.indexOf("http:\/\/")>-1&&getDomain(uri)!=document.domain){
- el.left.scripts.container.update("<em>Access to restricted URI denied</em>");
- return;
- }
-
- if(uri!=document.location.href){
- source = env.cache[uri]||pi.xhr.get(uri).responseText;
- env.cache[uri] = source;
- } else
- source = script.innerHTML;
- source = source.replace(/\n|\t|<|>/g,function(_ch){
- return ({"<":"&#60;",">":"&#62;","\t":"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;","\n":"<br />"})[_ch];
- });
-
- if (!d.scripts.lineNumbers)
- el.left.scripts.container.child.add(
- new pi.element("DIV").attribute.addClass("CodeContainer").update(source)
- );
- else {
- source = source.split("<br />");
- for (var i = 0; i < source.length; i++) {
- el.left.scripts.container.child.add(new pi.element("DIV").child.add(new pi.element("DIV").attribute.addClass("LineNumber").update(i + 1), new pi.element("DIV").attribute.addClass("Code").update("&nbsp;" + source[i]), new pi.element("DIV").environment.addStyle({
- "clear": "both"
- })));
- };
- };
- }
- },
- toggleLineNumbers:function(){
- with(firebug){
- d.scripts.lineNumbers = !d.scripts.lineNumbers;
- el.button.scripts.lineNumbers.attribute[(d.scripts.lineNumbers ? "add" : "remove") + "Class"]("Enabled");
- d.scripts.open( d.scripts.index );
-
- }
- },
- refresh:function(){
- with(firebug){
- el.button.scripts.selectbox.clean();
- var collection = document.getElementsByTagName("script");
- for(var i=0; i<collection.length; i++){
- var item = collection[i];
- d.scripts.index=d.scripts.index<0?i:d.scripts.index;
- el.button.scripts.selectbox.child.add(
- new pi.element("OPTION").attribute.set("value",i).update(item.src||item.baseURI||"..")
- );
- }
- d.scripts.open( d.scripts.index );
- }
- }
- },
- str: {
- open:function(_str){
- with(firebug){
- d.navigate("str");
- el.left.str.container.update(_str.replace(/\n/g,"<br />"))
- }
- }
- },
- xhr:{
- objects:[],
- addObject:function(){
- with(firebug){
- for(var i=0; i<arguments.length; i++){
- try {
- var item = arguments[i];
- var val = eval(item);
- d.xhr.objects.push([
- item, val
- ]);
- } catch(e){
- continue;
- }
- }
- }
- },
- open:function(){
- with(firebug){
- el.left.xhr.container.update("");
- el.left.xhr.name = new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").attribute.addClass("Block").environment.addStyle({ "width":"20%" }).insert(el.left.xhr.container));
- el.left.xhr.nameTitle = new pi.element("STRONG").update("Object Name:").insert(el.left.xhr.name);
- el.left.xhr.nameContent = new pi.element("DIV").insert(el.left.xhr.name);
- el.left.xhr.status = new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").attribute.addClass("Block").environment.addStyle({ "width":"10%" }).insert(el.left.xhr.container));
- el.left.xhr.statusTitle = new pi.element("STRONG").update("Status:").insert(el.left.xhr.status);
- el.left.xhr.statusContent = new pi.element("DIV").insert(el.left.xhr.status);
- el.left.xhr.readystate = new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").environment.addStyle({ "width":"15%" }).attribute.addClass("Block").insert(el.left.xhr.container));
- el.left.xhr.readystateTitle =el.left.xhr.nameTitle = new pi.element("STRONG").update("Ready State:").insert(el.left.xhr.readystate);
- el.left.xhr.readystateContent = new pi.element("DIV").insert(el.left.xhr.readystate);
- el.left.xhr.response = new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").environment.addStyle({ "width":(pi.env.ie?"50":"55")+"%" }).attribute.addClass("Block").insert(el.left.xhr.container));
- el.left.xhr.responseTitle = new pi.element("STRONG").update("Response:").insert(el.left.xhr.response);
- el.left.xhr.responseContent = new pi.element("DIV").insert(el.left.xhr.response);
- setTimeout(d.xhr.refresh,500);
- }
- },
- refresh:function(){
- with(firebug){
- el.left.xhr.nameContent.update("");
- el.left.xhr.statusContent.update("");
- el.left.xhr.readystateContent.update("");
- el.left.xhr.responseContent.update("");
- for(var i=0; i<d.xhr.objects.length; i++){
- var item = d.xhr.objects[i];
- var response = item[1].responseText;
- if(Boolean(item[1])==false)continue;
- el.left.xhr.nameContent.child.add(new pi.element("span").update(item[0]));
- try { 
- el.left.xhr.statusContent.child.add(new pi.element("span").update(item[1].status));
- } catch(e){ el.left.xhr.statusContent.child.add(new pi.element("span").update("&nbsp;")); }
- el.left.xhr.readystateContent.child.add(new pi.element("span").update(item[1].readyState));
-
- el.left.xhr.responseContent.child.add(new pi.element("span").child.add(
- new pi.element("A").event.addListener("click",d.str.open.curry(window,response)).update("&nbsp;"+response.substring(0,50))
- ));
- };
- if(env.dIndex=="xhr")
- setTimeout(d.xhr.refresh,500);
- }
- }
- },
- navigateRightColumn:function(_index,_open){
- with(firebug){
- el.left.container.environment.addStyle({ "width":_open?"70%":"100%" });
- el.right.container.environment.addStyle({ "display":_open?"block":"none" });
- }
- },
- navigate:function(_index){
- with(firebug){
-
- var open = _index, close = env.dIndex;
- env.dIndex = open;
-
- el.button[close].container.environment.addStyle({ "display":"none" });
- el.left[close].container.environment.addStyle({ "display":"none" });
- el.right[close].container.environment.addStyle({ "display":"none" });
-
- el.button[open].container.environment.addStyle({ "display":"inline" });
- el.left[open].container.environment.addStyle({ "display":"block" });
- el.right[open].container.environment.addStyle({ "display":"block" });
-
- if(el.nav[close])
- el.nav[close].attribute.removeClass("Selected");
- if(el.nav[open])
- el.nav[open].attribute.addClass("Selected");
-
- switch(open){
- case "console":
- d.navigateRightColumn(_index);
- break;
- case "html":
- d.navigateRightColumn(_index,true);
- d.html.openHtmlTree();
- break;
- case "css":
- d.navigateRightColumn(_index,true);
- d.css.refresh();
- break;
- case "scripts":
- d.navigateRightColumn(_index);
- d.scripts.refresh();
- break;
- case "dom":
- d.navigateRightColumn(_index);
- if(el.left.dom.container.environment.getElement().innerHTML=="")
- d.dom.open(eval(el.button.dom.textbox.environment.getElement().value),el.left.dom.container);
- break;
- case "xhr":
- d.navigateRightColumn(_index);
- d.xhr.open();
- break;
- }
-
- }
- },
- refreshSize:function(){
- with(firebug){
- el.main.environment.addStyle({ "width":pi.util.GetWindowSize().width+"px"});
- if(pi.env.ie6)
- el.main.environment.addStyle({ "top":pi.util.GetWindowSize().height-el.main.environment.getSize().offsetHeight+"px" });
- }
- }
- },
- getDomain:function(_url){
- return _url.match(/http:\/\/(www.)?([\.\w]+)/)[2];
- },
- listen: {
- addXhrObject:function(){
- with(firebug){
- d.xhr.addObject.apply(window, el.button.xhr.textbox.environment.getElement().value.split(","));
- }
- },
- consoleTextbox:function(_event){
- with(firebug){
- if(_event.keyCode==13&&(env.multilinemode==false||_event.shiftKey==false)){
- d.console.historyIndex = d.console.history.length;
- d.console.run(el.left.console.input.environment.getElement().value);
- return false;
- }
- if([13,38,40].indexOf(_event.keyCode)==-1)
- return;
- d.console.historyIndex+=_event.keyCode!=40?0:d.console.historyIndex==d.console.history.length?0:1;
- d.console.historyIndex-=_event.keyCode!=38?0:d.console.historyIndex==0?0:1;
- el.left.console.input.update(
- d.console.history.length > d.console.historyIndex ?
- d.console.history[d.console.historyIndex] :
- ""
- );
- }
- },
- cssSelectbox:function(){
- with(firebug){
- d.css.open(el.button.css.selectbox.environment.getElement().selectedIndex);
- }
- },
- domTextbox:function(_event){
- with(firebug){
- if(_event.keyCode==13){
- d.dom.open(eval(el.button.dom.textbox.environment.getElement().value),el.left.dom.container);
- }
- }
- },
- inspector:function(){
- with(firebug){
- d.html.inspect(d.inspector.el);
- }
- },
- keyboard:function(_event){
- with(firebug){
- if(_event.keyCode==27&&d.inspector.enabled)
- d.inspector.toggle();
- }
- },
- mouse:function(_event){
- with(firebug){
- var target = _event[pi.env.ie?"srcElement":"target"];
- if(
- d.inspector.enabled&&
- target!=document.body&&
- target!=document.firstChild&&
- target!=document.childNodes[1]&&
- target!=el.borderInspector.environment.getElement()&&
- target!=el.main.environment.getElement()&&
- target.offsetParent!=el.main.environment.getElement()
- )
- d.inspector.inspect(target);
- }
- },
- runMultiline:function(){
- with(firebug){
- d.console.run.call(window,el.right.console.input.environment.getElement().value);
- }
- },
- runCSS:function(){
- with(firebug){
- var source = el.right.css.input.environment.getElement().value.replace(/\n|\t/g,"").split("}");
- for(var i=0; i<source.length; i++){
- var item = source[i]+"}", rule = !pi.env.ie?item:item.split(/{|}/), collection = document.getElementsByTagName("style"),
- style = collection.length>0?collection[0]:document.body.appendChild( document.createElement("style") );
- if(!item.match(/.+\{.+\}/))continue;
- if(pi.env.ie)
- style.styleSheet.addRule(rule[0],rule[1]);
- else
- style.sheet.insertRule( rule, style.sheet.cssRules.length );
- }
- }
- },
- scriptsSelectbox:function(){
- with(firebug){
- d.scripts.open(parseInt(el.button.scripts.selectbox.environment.getElement().value));
- }
- },
- xhrTextbox:function(_event){
- with(firebug){
- if(_event.keyCode==13){
- d.xhr.addObject.apply(window, el.button.xhr.textbox.environment.getElement().value.split(","));
- }
- }
- }
- }
-};
-
-window.console = firebug.d.console;
-pi.util.AddEvent(window,"resize",firebug.d.refreshSize);
-pi.util.AddEvent(document,"mousemove",firebug.listen.mouse);
-pi.util.AddEvent(document,"keydown",firebug.listen.keyboard);
-pi.util.DOMContentLoaded.push(firebug.init); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/firewall_nat_edit/autosuggest.js b/src/usr/local/www/javascript/firewall_nat_edit/autosuggest.js
deleted file mode 100644
index d9b5ac0..0000000
--- a/src/usr/local/www/javascript/firewall_nat_edit/autosuggest.js
+++ /dev/null
@@ -1,337 +0,0 @@
-
-/**
- * An autosuggest textbox control.
- * @class
- * @scope public
- */
-function AutoSuggestControl(oTextbox /*:HTMLInputElement*/,
- oProvider /*:SuggestionProvider*/) {
-
- /**
- * The currently selected suggestions.
- * @scope private
- */
- this.cur /*:int*/ = -1;
-
- /**
- * The dropdown list layer.
- * @scope private
- */
- this.layer = null;
-
- /**
- * Suggestion provider for the autosuggest feature.
- * @scope private.
- */
- this.provider /*:SuggestionProvider*/ = oProvider;
-
- /**
- * The textbox to capture.
- * @scope private
- */
- this.textbox /*:HTMLInputElement*/ = oTextbox;
-
- //initialize the control
- this.init();
-
-}
-
-/**
- * Autosuggests one or more suggestions for what the user has typed.
- * If no suggestions are passed in, then no autosuggest occurs.
- * @scope private
- * @param aSuggestions An array of suggestion strings.
- * @param bTypeAhead If the control should provide a type ahead suggestion.
- */
-AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/,
- bTypeAhead /*:boolean*/) {
-
- //make sure there's at least one suggestion
- if (aSuggestions.length > 0) {
- if (bTypeAhead) {
- this.typeAhead(aSuggestions[0]);
- }
-
- this.showSuggestions(aSuggestions);
- } else {
- this.hideSuggestions();
- }
-};
-
-/**
- * Creates the dropdown layer to display multiple suggestions.
- * @scope private
- */
-AutoSuggestControl.prototype.createDropDown = function () {
-
- var oThis = this;
-
- //create the layer and assign styles
- this.layer = document.createElement("div");
- this.layer.className = "suggestions";
- this.layer.style.visibility = "hidden";
- this.layer.style.width = this.textbox.offsetWidth;
-
- //when the user clicks on the a suggestion, get the text (innerHTML)
- //and place it into a textbox
- this.layer.onmousedown =
- this.layer.onmouseup =
- this.layer.onmouseover = function (oEvent) {
- oEvent = oEvent || window.event;
- oTarget = oEvent.target || oEvent.srcElement;
-
- if (oEvent.type == "mousedown") {
- oThis.textbox.value = oTarget.firstChild.nodeValue;
- oThis.hideSuggestions();
- } else if (oEvent.type == "mouseover") {
- oThis.highlightSuggestion(oTarget);
- } else {
- oThis.textbox.focus();
- }
- };
-
-
- document.body.appendChild(this.layer);
-};
-
-/**
- * Gets the left coordinate of the textbox.
- * @scope private
- * @return The left coordinate of the textbox in pixels.
- */
-AutoSuggestControl.prototype.getLeft = function () /*:int*/ {
-
- var oNode = this.textbox;
- var iLeft = 0;
-
- while(oNode.tagName != "BODY") {
- iLeft += oNode.offsetLeft;
- oNode = oNode.offsetParent;
- }
-
- return iLeft;
-};
-
-/**
- * Gets the top coordinate of the textbox.
- * @scope private
- * @return The top coordinate of the textbox in pixels.
- */
-AutoSuggestControl.prototype.getTop = function () /*:int*/ {
-
- var oNode = this.textbox;
- var iTop = 0;
-
- while(oNode.tagName != "BODY") {
- iTop += oNode.offsetTop;
- oNode = oNode.offsetParent;
- }
-
- return iTop;
-};
-
-/**
- * Handles three keydown events.
- * @scope private
- * @param oEvent The event object for the keydown event.
- */
-AutoSuggestControl.prototype.handleKeyDown = function (oEvent /*:Event*/) {
-
- switch(oEvent.keyCode) {
- case 38: //up arrow
- this.previousSuggestion();
- break;
- case 40: //down arrow
- this.nextSuggestion();
- break;
- case 13: //enter
- this.hideSuggestions();
- break;
- }
-
-};
-
-/**
- * Handles keyup events.
- * @scope private
- * @param oEvent The event object for the keyup event.
- */
-AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) {
-
- var iKeyCode = oEvent.keyCode;
-
- //for backspace (8) and delete (46), shows suggestions without typeahead
- if (iKeyCode == 8 || iKeyCode == 46) {
- this.provider.requestSuggestions(this, false);
-
- //make sure not to interfere with non-character keys
- } else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) {
- //ignore
- } else {
- //request suggestions from the suggestion provider with typeahead
- this.provider.requestSuggestions(this, true);
- }
-};
-
-/**
- * Hides the suggestion dropdown.
- * @scope private
- */
-AutoSuggestControl.prototype.hideSuggestions = function () {
- this.layer.style.visibility = "hidden";
-};
-
-/**
- * Highlights the given node in the suggestions dropdown.
- * @scope private
- * @param oSuggestionNode The node representing a suggestion in the dropdown.
- */
-AutoSuggestControl.prototype.highlightSuggestion = function (oSuggestionNode) {
-
- for (var i=0; i < this.layer.childNodes.length; i++) {
- var oNode = this.layer.childNodes[i];
- if (oNode == oSuggestionNode) {
- oNode.className = "current";
- } else if (oNode.className == "current") {
- oNode.className = "";
- }
- }
-};
-
-/**
- * Initializes the textbox with event handlers for
- * auto suggest functionality.
- * @scope private
- */
-AutoSuggestControl.prototype.init = function () {
-
- //save a reference to this object
- var oThis = this;
-
- //assign the onkeyup event handler
- this.textbox.onkeyup = function (oEvent) {
-
- //check for the proper location of the event object
- if (!oEvent) {
- oEvent = window.event;
- }
-
- //call the handleKeyUp() method with the event object
- oThis.handleKeyUp(oEvent);
- };
-
- //assign onkeydown event handler
- this.textbox.onkeydown = function (oEvent) {
-
- //check for the proper location of the event object
- if (!oEvent) {
- oEvent = window.event;
- }
-
- //call the handleKeyDown() method with the event object
- oThis.handleKeyDown(oEvent);
- };
-
- //assign onblur event handler (hides suggestions)
- this.textbox.onblur = function () {
- oThis.hideSuggestions();
- };
-
- //create the suggestions dropdown
- this.createDropDown();
-};
-
-/**
- * Highlights the next suggestion in the dropdown and
- * places the suggestion into the textbox.
- * @scope private
- */
-AutoSuggestControl.prototype.nextSuggestion = function () {
- var cSuggestionNodes = this.layer.childNodes;
-
- if (cSuggestionNodes.length > 0 && this.cur < cSuggestionNodes.length-1) {
- var oNode = cSuggestionNodes[++this.cur];
- this.highlightSuggestion(oNode);
- this.textbox.value = oNode.firstChild.nodeValue;
- }
-};
-
-/**
- * Highlights the previous suggestion in the dropdown and
- * places the suggestion into the textbox.
- * @scope private
- */
-AutoSuggestControl.prototype.previousSuggestion = function () {
- var cSuggestionNodes = this.layer.childNodes;
-
- if (cSuggestionNodes.length > 0 && this.cur > 0) {
- var oNode = cSuggestionNodes[--this.cur];
- this.highlightSuggestion(oNode);
- this.textbox.value = oNode.firstChild.nodeValue;
- }
-};
-
-/**
- * Selects a range of text in the textbox.
- * @scope public
- * @param iStart The start index (base 0) of the selection.
- * @param iLength The number of characters to select.
- */
-AutoSuggestControl.prototype.selectRange = function (iStart /*:int*/, iLength /*:int*/) {
-
- //use text ranges for Internet Explorer
- if (this.textbox.createTextRange) {
- var oRange = this.textbox.createTextRange();
- oRange.moveStart("character", iStart);
- oRange.moveEnd("character", iLength - this.textbox.value.length);
- oRange.select();
-
- //use setSelectionRange() for Mozilla
- } else if (this.textbox.setSelectionRange) {
- this.textbox.setSelectionRange(iStart, iLength);
- }
-
- //set focus back to the textbox
- this.textbox.focus();
-};
-
-/**
- * Builds the suggestion layer contents, moves it into position,
- * and displays the layer.
- * @scope private
- * @param aSuggestions An array of suggestions for the control.
- */
-AutoSuggestControl.prototype.showSuggestions = function (aSuggestions /*:Array*/) {
-
- var oDiv = null;
- this.layer.innerHTML = ""; //clear contents of the layer
-
- for (var i=0; i < aSuggestions.length; i++) {
- oDiv = document.createElement("div");
- oDiv.appendChild(document.createTextNode(aSuggestions[i]));
- this.layer.appendChild(oDiv);
- }
-
- this.layer.style.left = this.getLeft() + "px";
- this.layer.style.top = (this.getTop()+this.textbox.offsetHeight) + "px";
- this.layer.style.width = this.textbox.offsetWidth + "px";
- this.layer.style.visibility = "visible";
-
-};
-
-/**
- * Inserts a suggestion into the textbox, highlighting the
- * suggested part of the text.
- * @scope private
- * @param sSuggestion The suggestion for the textbox.
- */
-AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) {
-
- //check for support of typeahead functionality
- if (this.textbox.createTextRange || this.textbox.setSelectionRange){
- var iLen = this.textbox.value.length;
- this.textbox.value = sSuggestion;
- this.selectRange(iLen, sSuggestion.length);
- }
-};
-
diff --git a/src/usr/local/www/javascript/firewall_nat_edit/disablekeys.js b/src/usr/local/www/javascript/firewall_nat_edit/disablekeys.js
deleted file mode 100644
index 5d6c87a..0000000
--- a/src/usr/local/www/javascript/firewall_nat_edit/disablekeys.js
+++ /dev/null
@@ -1,6 +0,0 @@
-function kH(e) {
- var pK = document.all? window.event.keyCode:e.which;
- return pK != 13;
-}
-document.onkeypress = kH;
-if (document.layers) document.captureEvents(Event.KEYPRESS); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/firewall_nat_edit/firewall_nat_edit.js b/src/usr/local/www/javascript/firewall_nat_edit/firewall_nat_edit.js
deleted file mode 100644
index 7007b40..0000000
--- a/src/usr/local/www/javascript/firewall_nat_edit/firewall_nat_edit.js
+++ /dev/null
@@ -1,203 +0,0 @@
-//<![CDATA[
-var portsenabled = 1;
-var dstenabled = 1;
-var showsource = 0;
-
-function ext_change() {
- if ((document.iform.srcbeginport.selectedIndex == 0) && portsenabled) {
- document.iform.srcbeginport_cust.disabled = 0;
- } else {
- document.iform.srcbeginport_cust.value = "";
- document.iform.srcbeginport_cust.disabled = 1;
- }
- if ((document.iform.srcendport.selectedIndex == 0) && portsenabled) {
- document.iform.srcendport_cust.disabled = 0;
- } else {
- document.iform.srcendport_cust.value = "";
- document.iform.srcendport_cust.disabled = 1;
- }
- if ((document.iform.dstbeginport.selectedIndex == 0) && portsenabled && dstenabled) {
- document.iform.dstbeginport_cust.disabled = 0;
- } else {
- document.iform.dstbeginport_cust.value = "";
- document.iform.dstbeginport_cust.disabled = 1;
- }
- if ((document.iform.dstendport.selectedIndex == 0) && portsenabled && dstenabled) {
- document.iform.dstendport_cust.disabled = 0;
- } else {
- document.iform.dstendport_cust.value = "";
- document.iform.dstendport_cust.disabled = 1;
- }
-
- if ((document.iform.localbeginport.selectedIndex == 0) && portsenabled) {
- document.iform.localbeginport_cust.disabled = 0;
- } else {
- document.iform.localbeginport_cust.value = "";
- document.iform.localbeginport_cust.disabled = 1;
- }
-
- if (!portsenabled) {
- document.iform.srcbeginport.disabled = 1;
- document.iform.srcendport.disabled = 1;
- document.iform.dstbeginport.disabled = 1;
- document.iform.dstendport.disabled = 1;
- document.iform.localbeginport_cust.disabled = 1;
- } else {
- document.iform.srcbeginport.disabled = 0;
- document.iform.srcendport.disabled = 0;
- document.iform.localbeginport_cust.disabled = 0;
- if( dstenabled ) {
- document.iform.dstbeginport.disabled = 0;
- document.iform.dstendport.disabled = 0;
- }
- }
-}
-
-function nordr_change() {
- if (document.iform.nordr.checked) {
- document.getElementById("localiptable").style.display = 'none';
- document.getElementById("lprtr").style.display = 'none';
- document.getElementById("assoctable").style.display = 'none';
- } else {
- document.getElementById("localiptable").style.display = '';
- document.getElementById("lprtr").style.display = portsenabled ? '' : 'none';
- document.getElementById("assoctable").style.display = '';
- }
-}
-
-function show_source() {
- if(portsenabled)
- document.getElementById("sprtable").style.display = '';
-
- document.getElementById("srctable").style.display = '';
- document.getElementById("showadvancedboxsrc").style.display = 'none';
- showsource = 1;
-}
-
-function check_for_aliases() {
- /* if External port range is an alias, then disallow
- * entry of Local port
- */
- for(i=0; i<customarray.length; i++) {
- if(document.iform.dstbeginport_cust.value == customarray[i]) {
- document.iform.dstendport_cust.value = customarray[i];
- document.iform.localbeginport_cust.value = customarray[i];
- document.iform.dstendport_cust.disabled = 1;
- document.iform.localbeginport.disabled = 1;
- document.iform.localbeginport_cust.disabled = 1;
- document.iform.dstendport_cust.disabled = 0;
- document.iform.localbeginport.disabled = 0;
- document.iform.localbeginport_cust.disabled = 0;
- }
- if(document.iform.dstbeginport.value == customarray[i]) {
- document.iform.dstendport_cust.value = customarray[i];
- document.iform.localbeginport_cust.value = customarray[i];
- document.iform.dstendport_cust.disabled = 1;
- document.iform.localbeginport.disabled = 1;
- document.iform.localbeginport_cust.disabled = 1;
- document.iform.dstendport_cust.disabled = 0;
- document.iform.localbeginport.disabled = 0;
- document.iform.localbeginport_cust.disabled = 0;
- }
- if(document.iform.dstendport_cust.value == customarray[i]) {
- document.iform.dstendport_cust.value = customarray[i];
- document.iform.localbeginport_cust.value = customarray[i];
- document.iform.dstendport_cust.disabled = 1;
- document.iform.localbeginport.disabled = 1;
- document.iform.localbeginport_cust.disabled = 1;
- document.iform.dstendport_cust.disabled = 0;
- document.iform.localbeginport.disabled = 0;
- document.iform.localbeginport_cust.disabled = 0;
- }
- if(document.iform.dstendport.value == customarray[i]) {
- document.iform.dstendport_cust.value = customarray[i];
- document.iform.localbeginport_cust.value = customarray[i];
- document.iform.dstendport_cust.disabled = 1;
- document.iform.localbeginport.disabled = 1;
- document.iform.localbeginport_cust.disabled = 1;
- document.iform.dstendport_cust.disabled = 0;
- document.iform.localbeginport.disabled = 0;
- document.iform.localbeginport_cust.disabled = 0;
- }
-
- }
-}
-
-function proto_change() {
- if (document.iform.proto.selectedIndex >= 0 && document.iform.proto.selectedIndex <= 2) {
- portsenabled = 1;
- } else {
- portsenabled = 0;
- }
-
- if (portsenabled) {
- document.getElementById("sprtable").style.display = showsource == 1 ? '':'none';
- document.getElementById("dprtr").style.display = '';
- document.getElementById("lprtr").style.display = document.iform.nordr.checked ? 'none' : '';
- } else {
- document.getElementById("sprtable").style.display = 'none';
- document.getElementById("dprtr").style.display = 'none';
- document.getElementById("lprtr").style.display = 'none';
- document.getElementById("dstbeginport").selectedIndex = 0;
- document.getElementById("dstbeginport_cust").value = "";
- document.getElementById("dstendport").selectedIndex = 0;
- document.getElementById("dstendport_cust").value = "";
- document.getElementById("localbeginport").selectedIndex = 0;
- document.getElementById("localbeginport_cust").value = "";
- }
-}
-
-function typesel_change() {
- switch (document.iform.srctype.selectedIndex) {
- case 1: /* single */
- document.iform.src.disabled = 0;
- document.iform.srcmask.value = "";
- document.iform.srcmask.disabled = 1;
- break;
- case 2: /* network */
- document.iform.src.disabled = 0;
- document.iform.srcmask.disabled = 0;
- break;
- default:
- document.iform.src.value = "";
- document.iform.src.disabled = 1;
- document.iform.srcmask.value = "";
- document.iform.srcmask.disabled = 1;
- break;
- }
- if( dstenabled )
- {
- switch (document.iform.dsttype.selectedIndex) {
- case 1: /* single */
- document.iform.dst.disabled = 0;
- document.iform.dstmask.value = "";
- document.iform.dstmask.disabled = 1;
- break;
- case 2: /* network */
- document.iform.dst.disabled = 0;
- document.iform.dstmask.disabled = 0;
- break;
- default:
- document.iform.dst.value = "";
- document.iform.dst.disabled = 1;
- document.iform.dstmask.value = "";
- document.iform.dstmask.disabled = 1;
- break;
- }
- }
-}
-
-function src_rep_change() {
- document.iform.srcendport.selectedIndex = document.iform.srcbeginport.selectedIndex;
-}
-
-function dst_rep_change() {
- document.iform.dstendport.selectedIndex = document.iform.dstbeginport.selectedIndex;
-}
-
-function dst_change( iface, old_iface, old_dst ) {
- if ( ( old_dst == "" ) || ( old_iface.concat("ip") == old_dst ) ) {
- document.iform.dsttype.value = iface.concat("ip");
- }
-}
-//]]>
diff --git a/src/usr/local/www/javascript/firewall_nat_edit/suggestions.js b/src/usr/local/www/javascript/firewall_nat_edit/suggestions.js
deleted file mode 100644
index 4d1e127..0000000
--- a/src/usr/local/www/javascript/firewall_nat_edit/suggestions.js
+++ /dev/null
@@ -1,33 +0,0 @@
-
-/**
- * Provides suggestions for state names (USA).
- * @class
- * @scope public
- */
-function StateSuggestions(text) {
- this.states = text;
-}
-
-/**
- * Request suggestions for the given autosuggest control.
- * @scope protected
- * @param oAutoSuggestControl The autosuggest control to provide suggestions for.
- */
-StateSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:AutoSuggestControl*/,
- bTypeAhead /*:boolean*/) {
- var aSuggestions = [];
- var sTextboxValue = oAutoSuggestControl.textbox.value;
-
- if (sTextboxValue.length > 0){
-
- //search for matching states
- for (var i=0; i < this.states.length; i++) {
- if (this.states[i].toLowerCase().indexOf(sTextboxValue.toLowerCase()) == 0) {
- aSuggestions.push(this.states[i]);
- }
- }
- }
-
- //provide suggestions to the control
- oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead);
-};
diff --git a/src/usr/local/www/javascript/firewall_rules_edit/autosuggest.js b/src/usr/local/www/javascript/firewall_rules_edit/autosuggest.js
deleted file mode 100644
index d9b5ac0..0000000
--- a/src/usr/local/www/javascript/firewall_rules_edit/autosuggest.js
+++ /dev/null
@@ -1,337 +0,0 @@
-
-/**
- * An autosuggest textbox control.
- * @class
- * @scope public
- */
-function AutoSuggestControl(oTextbox /*:HTMLInputElement*/,
- oProvider /*:SuggestionProvider*/) {
-
- /**
- * The currently selected suggestions.
- * @scope private
- */
- this.cur /*:int*/ = -1;
-
- /**
- * The dropdown list layer.
- * @scope private
- */
- this.layer = null;
-
- /**
- * Suggestion provider for the autosuggest feature.
- * @scope private.
- */
- this.provider /*:SuggestionProvider*/ = oProvider;
-
- /**
- * The textbox to capture.
- * @scope private
- */
- this.textbox /*:HTMLInputElement*/ = oTextbox;
-
- //initialize the control
- this.init();
-
-}
-
-/**
- * Autosuggests one or more suggestions for what the user has typed.
- * If no suggestions are passed in, then no autosuggest occurs.
- * @scope private
- * @param aSuggestions An array of suggestion strings.
- * @param bTypeAhead If the control should provide a type ahead suggestion.
- */
-AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/,
- bTypeAhead /*:boolean*/) {
-
- //make sure there's at least one suggestion
- if (aSuggestions.length > 0) {
- if (bTypeAhead) {
- this.typeAhead(aSuggestions[0]);
- }
-
- this.showSuggestions(aSuggestions);
- } else {
- this.hideSuggestions();
- }
-};
-
-/**
- * Creates the dropdown layer to display multiple suggestions.
- * @scope private
- */
-AutoSuggestControl.prototype.createDropDown = function () {
-
- var oThis = this;
-
- //create the layer and assign styles
- this.layer = document.createElement("div");
- this.layer.className = "suggestions";
- this.layer.style.visibility = "hidden";
- this.layer.style.width = this.textbox.offsetWidth;
-
- //when the user clicks on the a suggestion, get the text (innerHTML)
- //and place it into a textbox
- this.layer.onmousedown =
- this.layer.onmouseup =
- this.layer.onmouseover = function (oEvent) {
- oEvent = oEvent || window.event;
- oTarget = oEvent.target || oEvent.srcElement;
-
- if (oEvent.type == "mousedown") {
- oThis.textbox.value = oTarget.firstChild.nodeValue;
- oThis.hideSuggestions();
- } else if (oEvent.type == "mouseover") {
- oThis.highlightSuggestion(oTarget);
- } else {
- oThis.textbox.focus();
- }
- };
-
-
- document.body.appendChild(this.layer);
-};
-
-/**
- * Gets the left coordinate of the textbox.
- * @scope private
- * @return The left coordinate of the textbox in pixels.
- */
-AutoSuggestControl.prototype.getLeft = function () /*:int*/ {
-
- var oNode = this.textbox;
- var iLeft = 0;
-
- while(oNode.tagName != "BODY") {
- iLeft += oNode.offsetLeft;
- oNode = oNode.offsetParent;
- }
-
- return iLeft;
-};
-
-/**
- * Gets the top coordinate of the textbox.
- * @scope private
- * @return The top coordinate of the textbox in pixels.
- */
-AutoSuggestControl.prototype.getTop = function () /*:int*/ {
-
- var oNode = this.textbox;
- var iTop = 0;
-
- while(oNode.tagName != "BODY") {
- iTop += oNode.offsetTop;
- oNode = oNode.offsetParent;
- }
-
- return iTop;
-};
-
-/**
- * Handles three keydown events.
- * @scope private
- * @param oEvent The event object for the keydown event.
- */
-AutoSuggestControl.prototype.handleKeyDown = function (oEvent /*:Event*/) {
-
- switch(oEvent.keyCode) {
- case 38: //up arrow
- this.previousSuggestion();
- break;
- case 40: //down arrow
- this.nextSuggestion();
- break;
- case 13: //enter
- this.hideSuggestions();
- break;
- }
-
-};
-
-/**
- * Handles keyup events.
- * @scope private
- * @param oEvent The event object for the keyup event.
- */
-AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) {
-
- var iKeyCode = oEvent.keyCode;
-
- //for backspace (8) and delete (46), shows suggestions without typeahead
- if (iKeyCode == 8 || iKeyCode == 46) {
- this.provider.requestSuggestions(this, false);
-
- //make sure not to interfere with non-character keys
- } else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) {
- //ignore
- } else {
- //request suggestions from the suggestion provider with typeahead
- this.provider.requestSuggestions(this, true);
- }
-};
-
-/**
- * Hides the suggestion dropdown.
- * @scope private
- */
-AutoSuggestControl.prototype.hideSuggestions = function () {
- this.layer.style.visibility = "hidden";
-};
-
-/**
- * Highlights the given node in the suggestions dropdown.
- * @scope private
- * @param oSuggestionNode The node representing a suggestion in the dropdown.
- */
-AutoSuggestControl.prototype.highlightSuggestion = function (oSuggestionNode) {
-
- for (var i=0; i < this.layer.childNodes.length; i++) {
- var oNode = this.layer.childNodes[i];
- if (oNode == oSuggestionNode) {
- oNode.className = "current";
- } else if (oNode.className == "current") {
- oNode.className = "";
- }
- }
-};
-
-/**
- * Initializes the textbox with event handlers for
- * auto suggest functionality.
- * @scope private
- */
-AutoSuggestControl.prototype.init = function () {
-
- //save a reference to this object
- var oThis = this;
-
- //assign the onkeyup event handler
- this.textbox.onkeyup = function (oEvent) {
-
- //check for the proper location of the event object
- if (!oEvent) {
- oEvent = window.event;
- }
-
- //call the handleKeyUp() method with the event object
- oThis.handleKeyUp(oEvent);
- };
-
- //assign onkeydown event handler
- this.textbox.onkeydown = function (oEvent) {
-
- //check for the proper location of the event object
- if (!oEvent) {
- oEvent = window.event;
- }
-
- //call the handleKeyDown() method with the event object
- oThis.handleKeyDown(oEvent);
- };
-
- //assign onblur event handler (hides suggestions)
- this.textbox.onblur = function () {
- oThis.hideSuggestions();
- };
-
- //create the suggestions dropdown
- this.createDropDown();
-};
-
-/**
- * Highlights the next suggestion in the dropdown and
- * places the suggestion into the textbox.
- * @scope private
- */
-AutoSuggestControl.prototype.nextSuggestion = function () {
- var cSuggestionNodes = this.layer.childNodes;
-
- if (cSuggestionNodes.length > 0 && this.cur < cSuggestionNodes.length-1) {
- var oNode = cSuggestionNodes[++this.cur];
- this.highlightSuggestion(oNode);
- this.textbox.value = oNode.firstChild.nodeValue;
- }
-};
-
-/**
- * Highlights the previous suggestion in the dropdown and
- * places the suggestion into the textbox.
- * @scope private
- */
-AutoSuggestControl.prototype.previousSuggestion = function () {
- var cSuggestionNodes = this.layer.childNodes;
-
- if (cSuggestionNodes.length > 0 && this.cur > 0) {
- var oNode = cSuggestionNodes[--this.cur];
- this.highlightSuggestion(oNode);
- this.textbox.value = oNode.firstChild.nodeValue;
- }
-};
-
-/**
- * Selects a range of text in the textbox.
- * @scope public
- * @param iStart The start index (base 0) of the selection.
- * @param iLength The number of characters to select.
- */
-AutoSuggestControl.prototype.selectRange = function (iStart /*:int*/, iLength /*:int*/) {
-
- //use text ranges for Internet Explorer
- if (this.textbox.createTextRange) {
- var oRange = this.textbox.createTextRange();
- oRange.moveStart("character", iStart);
- oRange.moveEnd("character", iLength - this.textbox.value.length);
- oRange.select();
-
- //use setSelectionRange() for Mozilla
- } else if (this.textbox.setSelectionRange) {
- this.textbox.setSelectionRange(iStart, iLength);
- }
-
- //set focus back to the textbox
- this.textbox.focus();
-};
-
-/**
- * Builds the suggestion layer contents, moves it into position,
- * and displays the layer.
- * @scope private
- * @param aSuggestions An array of suggestions for the control.
- */
-AutoSuggestControl.prototype.showSuggestions = function (aSuggestions /*:Array*/) {
-
- var oDiv = null;
- this.layer.innerHTML = ""; //clear contents of the layer
-
- for (var i=0; i < aSuggestions.length; i++) {
- oDiv = document.createElement("div");
- oDiv.appendChild(document.createTextNode(aSuggestions[i]));
- this.layer.appendChild(oDiv);
- }
-
- this.layer.style.left = this.getLeft() + "px";
- this.layer.style.top = (this.getTop()+this.textbox.offsetHeight) + "px";
- this.layer.style.width = this.textbox.offsetWidth + "px";
- this.layer.style.visibility = "visible";
-
-};
-
-/**
- * Inserts a suggestion into the textbox, highlighting the
- * suggested part of the text.
- * @scope private
- * @param sSuggestion The suggestion for the textbox.
- */
-AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) {
-
- //check for support of typeahead functionality
- if (this.textbox.createTextRange || this.textbox.setSelectionRange){
- var iLen = this.textbox.value.length;
- this.textbox.value = sSuggestion;
- this.selectRange(iLen, sSuggestion.length);
- }
-};
-
diff --git a/src/usr/local/www/javascript/firewall_rules_edit/disablekeys.js b/src/usr/local/www/javascript/firewall_rules_edit/disablekeys.js
deleted file mode 100644
index 5d6c87a..0000000
--- a/src/usr/local/www/javascript/firewall_rules_edit/disablekeys.js
+++ /dev/null
@@ -1,6 +0,0 @@
-function kH(e) {
- var pK = document.all? window.event.keyCode:e.which;
- return pK != 13;
-}
-document.onkeypress = kH;
-if (document.layers) document.captureEvents(Event.KEYPRESS); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/firewall_rules_edit/firewall_rules_edit.js b/src/usr/local/www/javascript/firewall_rules_edit/firewall_rules_edit.js
deleted file mode 100644
index de1ff0c..0000000
--- a/src/usr/local/www/javascript/firewall_rules_edit/firewall_rules_edit.js
+++ /dev/null
@@ -1,237 +0,0 @@
-//<![CDATA[
-var portsenabled = 1;
-var editenabled = 1;
-
-function ext_change() {
- if ((document.iform.srcbeginport.selectedIndex == 0) && portsenabled && editenabled) {
- document.iform.srcbeginport_cust.disabled = 0;
- } else {
- if (editenabled)
- document.iform.srcbeginport_cust.value = "";
- document.iform.srcbeginport_cust.disabled = 1;
- }
- if ((document.iform.srcendport.selectedIndex == 0) && portsenabled && editenabled) {
- document.iform.srcendport_cust.disabled = 0;
- } else {
- if (editenabled)
- document.iform.srcendport_cust.value = "";
- document.iform.srcendport_cust.disabled = 1;
- }
- if ((document.iform.dstbeginport.selectedIndex == 0) && portsenabled && editenabled) {
- document.iform.dstbeginport_cust.disabled = 0;
- } else {
- if (editenabled)
- document.iform.dstbeginport_cust.value = "";
- document.iform.dstbeginport_cust.disabled = 1;
- }
- if ((document.iform.dstendport.selectedIndex == 0) && portsenabled && editenabled) {
- document.iform.dstendport_cust.disabled = 0;
- } else {
- if (editenabled)
- document.iform.dstendport_cust.value = "";
- document.iform.dstendport_cust.disabled = 1;
- }
-
- if (!portsenabled) {
- document.iform.srcbeginport.disabled = 1;
- document.iform.srcendport.disabled = 1;
- document.iform.dstbeginport.disabled = 1;
- document.iform.dstendport.disabled = 1;
- } else {
- if( editenabled ) {
- document.iform.srcbeginport.disabled = 0;
- document.iform.srcendport.disabled = 0;
- document.iform.dstbeginport.disabled = 0;
- document.iform.dstendport.disabled = 0;
- }
- }
-}
-
-function show_source_port_range() {
- if (portsenabled) {
- document.getElementById("sprtable").style.display = '';
- document.getElementById("showadvancedboxspr").style.display = 'none';
- }
-}
-
-function typesel_change() {
- if( editenabled ) {
- switch (document.iform.srctype.selectedIndex) {
- case 1: /* single */
- document.iform.src.disabled = 0;
- document.iform.srcmask.value = "";
- document.iform.srcmask.disabled = 1;
- break;
- case 2: /* network */
- document.iform.src.disabled = 0;
- document.iform.srcmask.disabled = 0;
- break;
- default:
- document.iform.src.value = "";
- document.iform.src.disabled = 1;
- document.iform.srcmask.value = "";
- document.iform.srcmask.disabled = 1;
- break;
- }
- switch (document.iform.dsttype.selectedIndex) {
- case 1: /* single */
- document.iform.dst.disabled = 0;
- document.iform.dstmask.value = "";
- document.iform.dstmask.disabled = 1;
- break;
- case 2: /* network */
- document.iform.dst.disabled = 0;
- document.iform.dstmask.disabled = 0;
- break;
- default:
- document.iform.dst.value = "";
- document.iform.dst.disabled = 1;
- document.iform.dstmask.value = "";
- document.iform.dstmask.disabled = 1;
- break;
- }
- }
-}
-
-function proto_change() {
- if (document.iform.proto.selectedIndex < 3) {
- portsenabled = 1;
- document.getElementById("tcpflags").style.display = '';
- } else {
- portsenabled = 0;
- document.getElementById("tcpflags").style.display = 'none';
- }
-
- /* Disable OS knob if the proto is not TCP. */
- if (document.iform.proto.selectedIndex < 1) {
- document.forms[0].os.disabled = 0;
- } else {
- document.forms[0].os.disabled = 1;
- }
-
- if (document.iform.proto.selectedIndex == 3) {
- document.iform.icmptype.disabled = 0;
- document.iform.icmp6type.disabled = 0;
- } else {
- document.iform.icmptype.disabled = 1;
- document.iform.icmp6type.disabled = 1;
- }
-
- ext_change();
-
- if(document.iform.proto.selectedIndex == 3 || document.iform.proto.selectedIndex == 4) {
- if(document.iform.ipprotocol.selectedIndex == 0) { // IPv4
- document.getElementById("icmpbox").style.display = '';
- document.getElementById("icmp6box").style.display = 'none';
- } else if(document.iform.ipprotocol.selectedIndex == 1) { // IPv6
- document.getElementById("icmpbox").style.display = 'none';
- document.getElementById("icmp6box").style.display = '';
- } else { // IPv4 + IPv6
- document.getElementById("icmpbox").style.display = 'none';
- document.getElementById("icmp6box").style.display = 'none';
- }
- } else {
- document.getElementById("icmpbox").style.display = 'none';
- document.getElementById("icmp6box").style.display = 'none';
- }
-
- if(document.iform.proto.selectedIndex >= 0 && document.iform.proto.selectedIndex <= 2) {
- document.getElementById("dprtr").style.display = '';
- if (editenabled) {
- document.getElementById("showadvancedboxspr").style.display = 'table-row';
- }
- } else {
- document.getElementById("sprtable").style.display = 'none';
- document.getElementById("dprtr").style.display = 'none';
- document.getElementById("showadvancedboxspr").style.display = 'none';
- }
-}
-
-function show_aodiv() {
- document.getElementById("aoadv").innerHTML='';
- aodiv = document.getElementById('aodivmain');
- aodiv.style.display = "block";
-}
-
-function show_dsdiv() {
- document.getElementById("dsadv").innerHTML='';
- dsdiv = document.getElementById('dsdivmain');
- dsdiv.style.display = "block";
-}
-
-function show_advanced_noxmlrpc() {
- document.getElementById("showadvnoxmlrpcsyncbox").innerHTML='';
- aodiv = document.getElementById('shownoxmlrpcadv');
- aodiv.style.display = "block";
-}
-
-function show_advanced_vlanprio() {
- document.getElementById("showadvvlanpriobox").innerHTML='';
- aodiv = document.getElementById('showvlanprioadv');
- aodiv.style.display = "block";
-}
-
-function show_advanced_schedule() {
- document.getElementById("showadvschedulebox").innerHTML='';
- aodiv = document.getElementById('showscheduleadv');
- aodiv.style.display = "block";
-}
-
-function show_advanced_gateway() {
- document.getElementById("showadvgatewaybox").innerHTML='';
- aodiv = document.getElementById('showgatewayadv');
- aodiv.style.display = "block";
-}
-
-function show_advanced_sourceos() {
- document.getElementById("showadvsourceosbox").innerHTML='';
- aodiv = document.getElementById('showsourceosadv');
- aodiv.style.display = "block";
-}
-
-function show_advanced_ackqueue() {
- document.getElementById("showadvackqueuebox").innerHTML='';
- aodiv = document.getElementById('showackqueueadv');
- aodiv.style.display = "block";
-}
-
-function show_advanced_inout() {
- document.getElementById("showadvinoutbox").innerHTML='';
- aodiv = document.getElementById('showinoutadv');
- aodiv.style.display = "block";
-}
-
-function show_advanced_state() {
- document.getElementById("showadvstatebox").innerHTML='';
- aodiv = document.getElementById('showstateadv');
- aodiv.style.display = "block";
-}
-
-function show_advanced_tcpflags() {
- document.getElementById("showtcpflagsbox").innerHTML='';
- aodiv = document.getElementById('showtcpflagsadv');
- aodiv.style.display = "block";
-}
-
-function show_advanced_layer7() {
- document.getElementById("showadvlayer7box").innerHTML='';
- aodiv = document.getElementById('showlayer7adv');
- aodiv.style.display = "block";
-}
-
-function src_rep_change() {
- document.iform.srcendport.selectedIndex = document.iform.srcbeginport.selectedIndex;
-}
-
-function dst_rep_change() {
- document.iform.dstendport.selectedIndex = document.iform.dstbeginport.selectedIndex;
-}
-
-function tcpflags_anyclick(obj) {
- if (obj.checked) {
- document.getElementById('tcpheader').style.display= 'none';
- } else {
- document.getElementById('tcpheader').style.display= "";
- }
-}
-//]]>
diff --git a/src/usr/local/www/javascript/firewall_rules_edit/suggestions.js b/src/usr/local/www/javascript/firewall_rules_edit/suggestions.js
deleted file mode 100644
index 4d1e127..0000000
--- a/src/usr/local/www/javascript/firewall_rules_edit/suggestions.js
+++ /dev/null
@@ -1,33 +0,0 @@
-
-/**
- * Provides suggestions for state names (USA).
- * @class
- * @scope public
- */
-function StateSuggestions(text) {
- this.states = text;
-}
-
-/**
- * Request suggestions for the given autosuggest control.
- * @scope protected
- * @param oAutoSuggestControl The autosuggest control to provide suggestions for.
- */
-StateSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:AutoSuggestControl*/,
- bTypeAhead /*:boolean*/) {
- var aSuggestions = [];
- var sTextboxValue = oAutoSuggestControl.textbox.value;
-
- if (sTextboxValue.length > 0){
-
- //search for matching states
- for (var i=0; i < this.states.length; i++) {
- if (this.states[i].toLowerCase().indexOf(sTextboxValue.toLowerCase()) == 0) {
- aSuggestions.push(this.states[i]);
- }
- }
- }
-
- //provide suggestions to the control
- oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead);
-};
diff --git a/src/usr/local/www/javascript/firewall_shaper_edit/autosuggest.js b/src/usr/local/www/javascript/firewall_shaper_edit/autosuggest.js
deleted file mode 100644
index d9b5ac0..0000000
--- a/src/usr/local/www/javascript/firewall_shaper_edit/autosuggest.js
+++ /dev/null
@@ -1,337 +0,0 @@
-
-/**
- * An autosuggest textbox control.
- * @class
- * @scope public
- */
-function AutoSuggestControl(oTextbox /*:HTMLInputElement*/,
- oProvider /*:SuggestionProvider*/) {
-
- /**
- * The currently selected suggestions.
- * @scope private
- */
- this.cur /*:int*/ = -1;
-
- /**
- * The dropdown list layer.
- * @scope private
- */
- this.layer = null;
-
- /**
- * Suggestion provider for the autosuggest feature.
- * @scope private.
- */
- this.provider /*:SuggestionProvider*/ = oProvider;
-
- /**
- * The textbox to capture.
- * @scope private
- */
- this.textbox /*:HTMLInputElement*/ = oTextbox;
-
- //initialize the control
- this.init();
-
-}
-
-/**
- * Autosuggests one or more suggestions for what the user has typed.
- * If no suggestions are passed in, then no autosuggest occurs.
- * @scope private
- * @param aSuggestions An array of suggestion strings.
- * @param bTypeAhead If the control should provide a type ahead suggestion.
- */
-AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/,
- bTypeAhead /*:boolean*/) {
-
- //make sure there's at least one suggestion
- if (aSuggestions.length > 0) {
- if (bTypeAhead) {
- this.typeAhead(aSuggestions[0]);
- }
-
- this.showSuggestions(aSuggestions);
- } else {
- this.hideSuggestions();
- }
-};
-
-/**
- * Creates the dropdown layer to display multiple suggestions.
- * @scope private
- */
-AutoSuggestControl.prototype.createDropDown = function () {
-
- var oThis = this;
-
- //create the layer and assign styles
- this.layer = document.createElement("div");
- this.layer.className = "suggestions";
- this.layer.style.visibility = "hidden";
- this.layer.style.width = this.textbox.offsetWidth;
-
- //when the user clicks on the a suggestion, get the text (innerHTML)
- //and place it into a textbox
- this.layer.onmousedown =
- this.layer.onmouseup =
- this.layer.onmouseover = function (oEvent) {
- oEvent = oEvent || window.event;
- oTarget = oEvent.target || oEvent.srcElement;
-
- if (oEvent.type == "mousedown") {
- oThis.textbox.value = oTarget.firstChild.nodeValue;
- oThis.hideSuggestions();
- } else if (oEvent.type == "mouseover") {
- oThis.highlightSuggestion(oTarget);
- } else {
- oThis.textbox.focus();
- }
- };
-
-
- document.body.appendChild(this.layer);
-};
-
-/**
- * Gets the left coordinate of the textbox.
- * @scope private
- * @return The left coordinate of the textbox in pixels.
- */
-AutoSuggestControl.prototype.getLeft = function () /*:int*/ {
-
- var oNode = this.textbox;
- var iLeft = 0;
-
- while(oNode.tagName != "BODY") {
- iLeft += oNode.offsetLeft;
- oNode = oNode.offsetParent;
- }
-
- return iLeft;
-};
-
-/**
- * Gets the top coordinate of the textbox.
- * @scope private
- * @return The top coordinate of the textbox in pixels.
- */
-AutoSuggestControl.prototype.getTop = function () /*:int*/ {
-
- var oNode = this.textbox;
- var iTop = 0;
-
- while(oNode.tagName != "BODY") {
- iTop += oNode.offsetTop;
- oNode = oNode.offsetParent;
- }
-
- return iTop;
-};
-
-/**
- * Handles three keydown events.
- * @scope private
- * @param oEvent The event object for the keydown event.
- */
-AutoSuggestControl.prototype.handleKeyDown = function (oEvent /*:Event*/) {
-
- switch(oEvent.keyCode) {
- case 38: //up arrow
- this.previousSuggestion();
- break;
- case 40: //down arrow
- this.nextSuggestion();
- break;
- case 13: //enter
- this.hideSuggestions();
- break;
- }
-
-};
-
-/**
- * Handles keyup events.
- * @scope private
- * @param oEvent The event object for the keyup event.
- */
-AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) {
-
- var iKeyCode = oEvent.keyCode;
-
- //for backspace (8) and delete (46), shows suggestions without typeahead
- if (iKeyCode == 8 || iKeyCode == 46) {
- this.provider.requestSuggestions(this, false);
-
- //make sure not to interfere with non-character keys
- } else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) {
- //ignore
- } else {
- //request suggestions from the suggestion provider with typeahead
- this.provider.requestSuggestions(this, true);
- }
-};
-
-/**
- * Hides the suggestion dropdown.
- * @scope private
- */
-AutoSuggestControl.prototype.hideSuggestions = function () {
- this.layer.style.visibility = "hidden";
-};
-
-/**
- * Highlights the given node in the suggestions dropdown.
- * @scope private
- * @param oSuggestionNode The node representing a suggestion in the dropdown.
- */
-AutoSuggestControl.prototype.highlightSuggestion = function (oSuggestionNode) {
-
- for (var i=0; i < this.layer.childNodes.length; i++) {
- var oNode = this.layer.childNodes[i];
- if (oNode == oSuggestionNode) {
- oNode.className = "current";
- } else if (oNode.className == "current") {
- oNode.className = "";
- }
- }
-};
-
-/**
- * Initializes the textbox with event handlers for
- * auto suggest functionality.
- * @scope private
- */
-AutoSuggestControl.prototype.init = function () {
-
- //save a reference to this object
- var oThis = this;
-
- //assign the onkeyup event handler
- this.textbox.onkeyup = function (oEvent) {
-
- //check for the proper location of the event object
- if (!oEvent) {
- oEvent = window.event;
- }
-
- //call the handleKeyUp() method with the event object
- oThis.handleKeyUp(oEvent);
- };
-
- //assign onkeydown event handler
- this.textbox.onkeydown = function (oEvent) {
-
- //check for the proper location of the event object
- if (!oEvent) {
- oEvent = window.event;
- }
-
- //call the handleKeyDown() method with the event object
- oThis.handleKeyDown(oEvent);
- };
-
- //assign onblur event handler (hides suggestions)
- this.textbox.onblur = function () {
- oThis.hideSuggestions();
- };
-
- //create the suggestions dropdown
- this.createDropDown();
-};
-
-/**
- * Highlights the next suggestion in the dropdown and
- * places the suggestion into the textbox.
- * @scope private
- */
-AutoSuggestControl.prototype.nextSuggestion = function () {
- var cSuggestionNodes = this.layer.childNodes;
-
- if (cSuggestionNodes.length > 0 && this.cur < cSuggestionNodes.length-1) {
- var oNode = cSuggestionNodes[++this.cur];
- this.highlightSuggestion(oNode);
- this.textbox.value = oNode.firstChild.nodeValue;
- }
-};
-
-/**
- * Highlights the previous suggestion in the dropdown and
- * places the suggestion into the textbox.
- * @scope private
- */
-AutoSuggestControl.prototype.previousSuggestion = function () {
- var cSuggestionNodes = this.layer.childNodes;
-
- if (cSuggestionNodes.length > 0 && this.cur > 0) {
- var oNode = cSuggestionNodes[--this.cur];
- this.highlightSuggestion(oNode);
- this.textbox.value = oNode.firstChild.nodeValue;
- }
-};
-
-/**
- * Selects a range of text in the textbox.
- * @scope public
- * @param iStart The start index (base 0) of the selection.
- * @param iLength The number of characters to select.
- */
-AutoSuggestControl.prototype.selectRange = function (iStart /*:int*/, iLength /*:int*/) {
-
- //use text ranges for Internet Explorer
- if (this.textbox.createTextRange) {
- var oRange = this.textbox.createTextRange();
- oRange.moveStart("character", iStart);
- oRange.moveEnd("character", iLength - this.textbox.value.length);
- oRange.select();
-
- //use setSelectionRange() for Mozilla
- } else if (this.textbox.setSelectionRange) {
- this.textbox.setSelectionRange(iStart, iLength);
- }
-
- //set focus back to the textbox
- this.textbox.focus();
-};
-
-/**
- * Builds the suggestion layer contents, moves it into position,
- * and displays the layer.
- * @scope private
- * @param aSuggestions An array of suggestions for the control.
- */
-AutoSuggestControl.prototype.showSuggestions = function (aSuggestions /*:Array*/) {
-
- var oDiv = null;
- this.layer.innerHTML = ""; //clear contents of the layer
-
- for (var i=0; i < aSuggestions.length; i++) {
- oDiv = document.createElement("div");
- oDiv.appendChild(document.createTextNode(aSuggestions[i]));
- this.layer.appendChild(oDiv);
- }
-
- this.layer.style.left = this.getLeft() + "px";
- this.layer.style.top = (this.getTop()+this.textbox.offsetHeight) + "px";
- this.layer.style.width = this.textbox.offsetWidth + "px";
- this.layer.style.visibility = "visible";
-
-};
-
-/**
- * Inserts a suggestion into the textbox, highlighting the
- * suggested part of the text.
- * @scope private
- * @param sSuggestion The suggestion for the textbox.
- */
-AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) {
-
- //check for support of typeahead functionality
- if (this.textbox.createTextRange || this.textbox.setSelectionRange){
- var iLen = this.textbox.value.length;
- this.textbox.value = sSuggestion;
- this.selectRange(iLen, sSuggestion.length);
- }
-};
-
diff --git a/src/usr/local/www/javascript/firewall_shaper_edit/disablekeys.js b/src/usr/local/www/javascript/firewall_shaper_edit/disablekeys.js
deleted file mode 100644
index 5d6c87a..0000000
--- a/src/usr/local/www/javascript/firewall_shaper_edit/disablekeys.js
+++ /dev/null
@@ -1,6 +0,0 @@
-function kH(e) {
- var pK = document.all? window.event.keyCode:e.which;
- return pK != 13;
-}
-document.onkeypress = kH;
-if (document.layers) document.captureEvents(Event.KEYPRESS); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/firewall_shaper_edit/firewall_shaper_edit.js b/src/usr/local/www/javascript/firewall_shaper_edit/firewall_shaper_edit.js
deleted file mode 100644
index b1b8df0..0000000
--- a/src/usr/local/www/javascript/firewall_shaper_edit/firewall_shaper_edit.js
+++ /dev/null
@@ -1,37 +0,0 @@
-//<![CDATA[
-function ext_change() {
- if (document.iform.beginport.selectedIndex == 0) {
- document.iform.beginport_cust.disabled = 0;
- } else {
- document.iform.beginport_cust.value = "";
- document.iform.beginport_cust.disabled = 1;
- }
- if (document.iform.endport.selectedIndex == 0) {
- document.iform.endport_cust.disabled = 0;
- } else {
- document.iform.endport_cust.value = "";
- document.iform.endport_cust.disabled = 1;
- }
- if (document.iform.localbeginport.selectedIndex == 0) {
- document.iform.localbeginport_cust.disabled = 0;
- } else {
- document.iform.localbeginport_cust.value = "";
- document.iform.localbeginport_cust.disabled = 1;
- }
-};
-function ext_rep_change() {
- document.iform.endport.selectedIndex = document.iform.beginport.selectedIndex;
- document.iform.localbeginport.selectedIndex = document.iform.beginport.selectedIndex;
-}
-
-
-window.onload = function () {
- var oTextbox1 = new AutoSuggestControl(document.getElementById("src"), new StateSuggestions(addressarray));
- var oTextbox2 = new AutoSuggestControl(document.getElementById("srcbeginport_cust"), new StateSuggestions(customarray));
- var oTextbox3 = new AutoSuggestControl(document.getElementById("srcendport_cust"), new StateSuggestions(customarray));
- var oTextbox1 = new AutoSuggestControl(document.getElementById("dst"), new StateSuggestions(addressarray));
- var oTextbox2 = new AutoSuggestControl(document.getElementById("dstbeginport_cust"), new StateSuggestions(customarray));
- var oTextbox3 = new AutoSuggestControl(document.getElementById("dstendport_cust"), new StateSuggestions(customarray));
-};
-
-//]]> \ No newline at end of file
diff --git a/src/usr/local/www/javascript/firewall_shaper_edit/suggestions.js b/src/usr/local/www/javascript/firewall_shaper_edit/suggestions.js
deleted file mode 100644
index 4d1e127..0000000
--- a/src/usr/local/www/javascript/firewall_shaper_edit/suggestions.js
+++ /dev/null
@@ -1,33 +0,0 @@
-
-/**
- * Provides suggestions for state names (USA).
- * @class
- * @scope public
- */
-function StateSuggestions(text) {
- this.states = text;
-}
-
-/**
- * Request suggestions for the given autosuggest control.
- * @scope protected
- * @param oAutoSuggestControl The autosuggest control to provide suggestions for.
- */
-StateSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:AutoSuggestControl*/,
- bTypeAhead /*:boolean*/) {
- var aSuggestions = [];
- var sTextboxValue = oAutoSuggestControl.textbox.value;
-
- if (sTextboxValue.length > 0){
-
- //search for matching states
- for (var i=0; i < this.states.length; i++) {
- if (this.states[i].toLowerCase().indexOf(sTextboxValue.toLowerCase()) == 0) {
- aSuggestions.push(this.states[i]);
- }
- }
- }
-
- //provide suggestions to the control
- oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead);
-};
diff --git a/src/usr/local/www/javascript/global.js b/src/usr/local/www/javascript/global.js
deleted file mode 100644
index 0b67f58..0000000
--- a/src/usr/local/www/javascript/global.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var AjaxQueue = {
- batchSize: 1, //No.of simultaneous AJAX requests allowed, Default : 1
- urlQueue: [], //Request URLs will be pushed into this array
- elementsQueue: [], //Element IDs of elements to be updated on completion of a request
- optionsQueue: [], //Request options will be pushed into this array
- currentRequest: null,
- setBatchSize: function(bSize){ //Method to set a different batch size. Recommended: Set batchSize before making requests
- this.batchSize = bSize;
- },
- push: function(url, options, elementID){ //Push the request in the queue. elementID is optional and required only for Ajax requests that updates the element
- this.urlQueue.push(url);
- this.optionsQueue.push(options);
- if(elementID!=null){
- this.elementsQueue.push(elementID);
- } else {
- this.elementsQueue.push("NOTSPECIFIED");
- }
-
- this._processNext();
- },
- _processNext: function() { // Method for processing the requests in the queue. Private method. Don't call it explicitly
- if(this.currentRequest == null && this.urlQueue.length > 0) // Check if the currently processing request count is less than batch size
- {
- // Call jQuery.ajax on the first item in the queue and remove it from the queue
- AjaxQueue.currentRequest = jQuery.ajax(AjaxQueue.urlQueue.shift(), AjaxQueue.optionsQueue.shift());
- AjaxQueue.currentRequest.complete( function() {
- //Call AjaxQueue._processNext on completion ( success / failure) of this AJAX request.
- AjaxQueue.currentRequest = null;
- AjaxQueue._processNext();
- });
- if(this.elementsQueue[0]=="NOTSPECIFIED") { //Check if an elementID was specified
- // If no ElementID was specified remove the first item from the queue
- var junk = AjaxQueue.elementsQueue.shift();
- } else {
- // If ElementID was specified update the first item in the queue and remove it from the queue
- AjaxQueue.currentRequest.success( function(data) {
- jQuery(AjaxQueue.elementsQueue.shift()).html(data);
- });
- }
- }
- }
-};
-
diff --git a/src/usr/local/www/javascript/index/ajax.js b/src/usr/local/www/javascript/index/ajax.js
deleted file mode 100644
index 274b8c0..0000000
--- a/src/usr/local/www/javascript/index/ajax.js
+++ /dev/null
@@ -1,196 +0,0 @@
-/* Most widgets update their backend data every 10 seconds. 11 seconds
- * will ensure that we update the GUI right after the stats are updated.
- * Seconds * 1000 = value
- */
-var Seconds = 11;
-var update_interval = (Math.abs(Math.ceil(Seconds))-1)*1000 + 990;
-
-function updateMeters() {
- url = '/getstats.php';
-
- jQuery.ajax(url, {
- type: 'get',
- success: function(data) {
- response = data || "";
- if (response != "")
- stats(data);
- }
- });
- setTimer();
-}
-
-function setTimer() {
- timeout = window.setTimeout('updateMeters()', update_interval);
-}
-
-function stats(x) {
- var values = x.split("|");
- if (jQuery.each(values,function(key,value){
- if (value == 'undefined' || value == null)
- return true;
- else
- return false;
- }))
-
- updateUptime(values[2]);
- updateDateTime(values[5]);
- updateCPU(values[0]);
- updateMemory(values[1]);
- updateState(values[3]);
- updateTemp(values[4]);
- updateInterfaceStats(values[6]);
- updateInterfaces(values[7]);
- updateGatewayStats(values[8]);
- updateCpuFreq(values[9]);
- updateLoadAverage(values[10]);
- updateMbuf(values[11]);
- updateMbufMeter(values[12]);
- updateStateMeter(values[13]);
-}
-
-function updateMemory(x) {
- if(jQuery('#memusagemeter'))
- jQuery("#memusagemeter").html(x + '%');
- if(jQuery('#memUsagePB'))
- jQuery('#memUsagePB').progressbar( { value: parseInt(x) } );
-}
-
-function updateMbuf(x) {
- if(jQuery('#mbuf'))
- jQuery("#mbuf").html(x);
-}
-
-function updateMbufMeter(x) {
- if(jQuery('#mbufusagemeter'))
- jQuery("#mbufusagemeter").html(x + '%');
- if(jQuery('#mbufPB'))
- jQuery('#mbufPB').progressbar( { value: parseInt(x) } );
-}
-
-function updateCPU(x) {
- if(jQuery('#cpumeter'))
- jQuery("#cpumeter").html(x + '%');
- if(jQuery('#cpuPB'))
- jQuery('#cpuPB').progressbar( { value: parseInt(x) } );
- /* Load CPU Graph widget if enabled */
- if(widgetActive('cpu_graphs')) {
- GraphValue(graph[0], x);
- }
-}
-
-function updateTemp(x) {
- if(jQuery("#tempmeter"))
- jQuery("#tempmeter").html(x + '\u00B0' + 'C');
- if(jQuery('#tempPB'))
- jQuery("#tempPB").progressbar( { value: parseInt(x) } );
-}
-
-function updateDateTime(x) {
- if(jQuery('#datetime'))
- jQuery("#datetime").html(x);
-}
-
-function updateUptime(x) {
- if(jQuery('#uptime'))
- jQuery("#uptime").html(x);
-}
-
-function updateState(x) {
- if(jQuery('#pfstate'))
- jQuery("#pfstate").html(x);
-}
-
-function updateStateMeter(x) {
- if(jQuery('#pfstateusagemeter'))
- jQuery("#pfstateusagemeter").html(x + '%');
- if(jQuery('#statePB'))
- jQuery('#statePB').progressbar( { value: parseInt(x) } );
-}
-
-function updateGatewayStats(x){
- if (widgetActive("gateways")){
- gateways_split = x.split(",");
- for (var y=0; y<gateways_split.length; y++){
- gateways_field_split = gateways_split[y].split("^");
- if(jQuery('#gateway' + (y + 1))) {
- jQuery('#gateway' + (y + 1)).html(gateways_field_split[0]);
- if(gateways_field_split[1]) {
- jQuery('#gateway' + (y + 1)).css('background-color',gateways_field_split[1]);
- }
- }
- }
- }
-}
-
-function updateCpuFreq(x) {
- if(jQuery('#cpufreq'))
- jQuery("#cpufreq").html(x);
-}
-
-function updateLoadAverage(x) {
- if(jQuery('#load_average'))
- jQuery("#load_average").html(x);
-}
-
-function updateInterfaceStats(x){
- if (widgetActive("interface_statistics")){
- statistics_split = x.split(",");
- var counter = 1;
- for (var y=0; y<statistics_split.length-1; y++){
- if(jQuery('#stat' + counter)) {
- jQuery('#stat' + counter).html(statistics_split[y]);
- counter++;
- }
- }
- }
-}
-
-function updateInterfaces(x){
- if (widgetActive("interfaces")){
- interfaces_split = x.split("~");
- interfaces_split.each(function(iface){
- details = iface.split("^");
- if (details[2] == '')
- ipv4_details = '';
- else
- ipv4_details = details[2] + '<br />';
- switch(details[1]) {
- case "up":
- jQuery('#' + details[0] + '-up').css("display","inline");
- jQuery('#' + details[0] + '-down').css("display","none");
- jQuery('#' + details[0] + '-block').css("display","none");
- jQuery('#' + details[0] + '-ip').html(ipv4_details);
- jQuery('#' + details[0] + '-ipv6').html(details[3]);
- jQuery('#' + details[0] + '-media').html(details[4]);
- break;
- case "down":
- jQuery('#' + details[0] + '-down').css("display","inline");
- jQuery('#' + details[0] + '-up').css("display","none");
- jQuery('#' + details[0] + '-block').css("display","none");
- jQuery('#' + details[0] + '-ip').html(ipv4_details);
- jQuery('#' + details[0] + '-ipv6').html(details[3]);
- jQuery('#' + details[0] + '-media').html(details[4]);
- break;
- case "block":
- jQuery('#' + details[0] + '-block').css("display","inline");
- jQuery('#' + details[0] + '-down').css("display","none");
- jQuery('#' + details[0] + '-up').css("display","none");
- break;
- }
- });
- }
-}
-
-function widgetActive(x) {
- var widget = jQuery('#' + x + '-container');
- if ((widget != null) && (widget.css('display') != null) && (widget.css('display') != "none"))
- return true;
- else
- return false;
-}
-
-/* start updater */
-jQuery(document).ready(function(){
- setTimer();
-});
-
diff --git a/src/usr/local/www/javascript/interfaces_ppps_edit/ppps_edit.js b/src/usr/local/www/javascript/interfaces_ppps_edit/ppps_edit.js
deleted file mode 100644
index 45b529b..0000000
--- a/src/usr/local/www/javascript/interfaces_ppps_edit/ppps_edit.js
+++ /dev/null
@@ -1,253 +0,0 @@
-/*jslint white: true, sloppy: true, vars: true, eqeq: true */
-/*jslint browser: true, devel: true */
-/*global show_hide_linkfields, jQuery, country_list */
-
-function update_select_list(new_options, select_list){
- var option_array = new_options.split("|");
- var i = 0;
- var j;
- select_list.length = 0;
- for(j=0; j < option_array.length-1; j++){
- var option = option_array[j].split(",");
- var selected = Boolean(parseInt(option[2], 10));
- select_list[j] = new Option(option[0], option[1], false, selected);
- //for testing and debugging
- //select_list.options[option_array.length-1+j] = new Option(option[2].toString() +" "+ selected.toString());
- //select_list.options[option_array.length-1+j] = new Option("Link Label: " + linklabel + " Label Text:" + label_text);
- }
- show_hide_linkfields(select_list);
-}
-
-function show_advanced(hide){
- var select_list = document.iform["interfaces[]"].options;
- var adv_rows = parseInt(jQuery('#adv_rows').html(), 10);
- var adv_show = Boolean(parseInt(jQuery('#adv_show').html(), 10));
- var status = Boolean(parseInt(hide, 10));
- var j, advanced;
- if (status){
- jQuery('#advanced_').hide();
- for(j=0; j < adv_rows; j++){
- advanced = "#advanced_" + j.toString();
- jQuery(advanced).show();
- }
- jQuery('#adv_show').html("1");
- show_hide_linkfields(select_list);
- } else {
- jQuery('#advanced_').show();
- for(j=0; j < adv_rows; j++){
- advanced = "#advanced_" + j.toString();
- jQuery(advanced).hide();
- }
- jQuery('#adv_show').html("0");
- show_hide_linkfields(select_list);
- }
-}
-
-function show_hide_linkfields(options){
- var i = 0;
- var port_count = parseInt(jQuery('#port_count').html(), 10);
- var adv_show = Boolean(parseInt(jQuery('#adv_show').html(), 10));
- var j, count, type, link, lnklabel, bw, bwlabel, mtu, mru, mrru, ipfields, gwfields, localip,
- localiplabel, subnet, gateway, gatewaylabel;
- for(j=0; j < port_count; j++){
- count = j.toString();
- type = jQuery('#type').val();
- link = "#link" + count;
- lnklabel = "#linklabel" + count;
- bw = "#bandwidth" + count;
- bwlabel = "#bwlabel" + count;
- mtu = "#mtu" + count;
- mru = "#mru" + count;
- mrru = "#mrru" + count;
- ipfields = "#ip_fields" + count;
- gwfields = "#gw_fields" + count;
- localip = "#localip" + count;
- localiplabel = "#localiplabel" + count;
- subnet = "#subnet" + count;
- gateway = "#gateway" + count;
- gatewaylabel = "#gatewaylabel" + count;
-
- jQuery(ipfields + ',' + gwfields + ',' + link).hide();
- jQuery(subnet).prop('disabled',true);
-
- jQuery(bw).attr("name","bandwidth[]");
- jQuery(mtu).attr("name","mtu[]");
- jQuery(mru).attr("name","mru[]");
- jQuery(mrru).attr("name","mrru[]");
- jQuery(localip).attr("name","localip[]");
- jQuery(subnet).attr("name","subnet[]");
- jQuery(gateway).attr("name","gateway[]");
-
- while(i < options.length){
- if (options[i].selected ){
- jQuery(lnklabel).html("Link Parameters (" + options[i].value + ")");
- jQuery(bwlabel).html("Bandwidth (" + options[i].value + ")");
- jQuery(bw).attr("name","bandwidth[" + options[i].value + "]");
- jQuery(mtu).attr("name","mtu[" + options[i].value + "]");
- jQuery(mru).attr("name","mru[" + options[i].value + "]");
- jQuery(mrru).attr("name","mrru[" + options[i].value + "]");
- jQuery(localiplabel).html("Local IP (" + options[i].value + ")");
- jQuery(gatewaylabel).html("Gateway (" + options[i].value + ")");
- jQuery(localip).attr("name","localip[" + options[i].value + "]");
- jQuery(subnet).attr("name","subnet[" + options[i].value + "]");
- jQuery(gateway).attr("name","gateway[" + options[i].value + "]");
- if (type == 'ppp' && adv_show){
- jQuery(ipfields + ',' + gwfields).show();
- }
- if (type == 'pptp' || type == 'l2tp'){
- jQuery(subnet).prop("disabled",false);
- jQuery(ipfields + ',' + gwfields).show();
- }
- if (adv_show){
- jQuery(link).show();
- }
- i++;
- break;
- }
- i++;
- }
- }
-}
-
-
-function updateType(t){
- var serialports = jQuery('#serialports').html();
- var ports = jQuery('#ports').html();
- var select_list = document.iform["interfaces[]"].options;
- jQuery('#adv_show').html("0");
- show_advanced('0');
- jQuery("#select").show();
- switch(t) {
- case "select":
- jQuery('#ppp,#pppoe,#ppp_provider,#phone_num,#apn_').hide();
- select_list.length = 0;
- select_list[0] = new Option("Select Link Type First","");
- break;
- case "ppp":
- update_select_list(serialports, select_list);
- jQuery('#select,#pppoe').hide();
- jQuery('#ppp_provider,#phone_num,#apn_').show();
- country_list();
- break;
- case "pppoe":
- update_select_list(ports, select_list);
- jQuery('#select,#ppp,#ppp_provider,#phone_num,#apn_').hide();
- break;
- case "l2tp":
- case "pptp":
- update_select_list(ports, select_list);
- jQuery('#select,#ppp,#pppoe,#ppp_provider,#phone_num,#apn_').hide();
- break;
- default:
- select_list.length = 0;
- select_list[0] = new Option("Select Link Type First","");
- break;
- }
- if (t == "pppoe" || t == "ppp"){
- jQuery("#" + t).show();
- }
-}
-
-function show_reset_settings(reset_type) {
- if (reset_type == 'preset') {
- jQuery('#pppoepresetwrap').show(0);
- jQuery('#pppoecustomwrap').hide(0);
- }
- else if (reset_type == 'custom') {
- jQuery('#pppoecustomwrap').show(0);
- jQuery('#pppoepresetwrap').hide(0);
- } else {
- jQuery('#pppoecustomwrap').hide(0);
- jQuery('#pppoepresetwrap').hide(0);
- }
-}
-
-function country_list() {
- jQuery('#country option').remove();
- jQuery('#provider option').remove();
- jQuery('#providerplan option').remove();
- jQuery('#country').append(new Option('', ''));
- jQuery.ajax("getserviceproviders.php",{
- success: function(responseText) {
- var responseTextArr = responseText.split("\n");
- var value, i, country;
- responseTextArr.sort();
- for (i = 0; i < responseTextArr.length; i += 1) {
- value = responseTextArr[i];
- if (/\S/.test(value)) {
- country = value.split(":");
- jQuery('#country').append(new Option(country[0],country[1]));
- }
- }
- }
- });
- jQuery('#trcountry').css("display","table-row");
-}
-
-function providers_list() {
- jQuery('#provider option').remove();
- jQuery('#providerplan option').remove();
- jQuery('#provider').append(new Option('', ''));
- jQuery.ajax("getserviceproviders.php",{
- type: 'POST',
- data: {country : jQuery('#country').val()},
- success: function(responseText) {
- var responseTextArr = responseText.split("\n");
- var value, i;
- responseTextArr.sort();
- for (i = 0; i < responseTextArr.length; i += 1) {
- value = responseTextArr[i];
- if (/\S/.test(value)) {
- jQuery('#provider').append(new Option(value, value));
- }
- }
- }
- });
- jQuery('#trprovider').css("display","table-row");
- jQuery('#trproviderplan').css("display","none");
-}
-
-function providerplan_list() {
- jQuery('#providerplan option').remove();
- jQuery('#providerplan').append( new Option('','') );
- jQuery.ajax("getserviceproviders.php",{
- type: 'POST',
- data: {country : jQuery('#country').val(), provider : jQuery('#provider').val()},
- success: function(responseText) {
- var responseTextArr = responseText.split("\n");
- var value, providerplan, i;
- responseTextArr.sort();
- for (i = 0; i < responseTextArr.length; i += 1) {
- value = responseTextArr[i];
- if (/\S/.test(value)) {
- providerplan = value.split(":");
- jQuery('#providerplan').append(new Option(providerplan[0] + " - " + providerplan[1],
- providerplan[1]));
- }
- }
- }
- });
- jQuery('#trproviderplan').css("display","table-row");
-}
-
-function prefill_provider() {
- jQuery.ajax("getserviceproviders.php",{
- type: "POST",
- data: {country : jQuery('#country').val(), provider : jQuery('#provider').val(), plan : jQuery('#providerplan').val()},
- success: function(responseXML) {
- var xmldoc = responseXML;
- var provider = xmldoc.getElementsByTagName('connection')[0];
- jQuery('#username').val('');
- jQuery('#password').val('');
- if(provider.getElementsByTagName('apn')[0].firstChild.data == "CDMA") {
- jQuery('#phone').val('#777');
- jQuery('#apn').val('');
- } else {
- jQuery('#phone').val('*99#');
- jQuery('#apn').val(provider.getElementsByTagName('apn')[0].firstChild.data);
- }
- jQuery('#username').val(provider.getElementsByTagName('username')[0].firstChild.data);
- jQuery('#password').val(provider.getElementsByTagName('password')[0].firstChild.data);
- }
- });
-}
diff --git a/src/usr/local/www/javascript/jquery-1.11.1.min.js b/src/usr/local/www/javascript/jquery-1.11.1.min.js
deleted file mode 100644
index ab28a24..0000000
--- a/src/usr/local/www/javascript/jquery-1.11.1.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;
-if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")
-},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/src/usr/local/www/javascript/jquery-migrate-1.2.1.min.js b/src/usr/local/www/javascript/jquery-migrate-1.2.1.min.js
deleted file mode 100644
index 62149c2..0000000
--- a/src/usr/local/www/javascript/jquery-migrate-1.2.1.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery Migrate v1.2.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */
-jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){var r=t.console;i[n]||(i[n]=!0,e.migrateWarnings.push(n),r&&r.warn&&!e.migrateMute&&(r.warn("JQMIGRATE: "+n),e.migrateTrace&&r.trace&&r.trace()))}function a(t,a,i,o){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(o),i},set:function(e){r(o),i=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=i}var i={};e.migrateWarnings=[],!e.migrateMute&&t.console&&t.console.log&&t.console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){i={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var o=e("<input/>",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",o||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,i,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(o?a in o:e.isFunction(e.fn[a])))?e(t)[a](i):("type"===a&&i!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,i=e.prop(t,r);return i===!0||"boolean"!=typeof i&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,i))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^([^<]*)(<[\w\W]+>)([^>]*)$/;e.fn.init=function(t,n,a){var i;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(i=y.exec(e.trim(t)))&&i[0]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),i[3]&&r("$(html) HTML text after last tag is ignored"),"#"===i[0].charAt(0)&&(r("HTML string cannot start with a '#' character"),e.error("JQMIGRATE: Invalid selector string (XSS)")),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(i[2],n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,i,o=this[0];return!o||"events"!==t||1!==arguments.length||(a=e.data(o,t),i=e._data(o,t),a!==n&&a!==i||i===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),i)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,i,o){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),i)for(c=function(e){return!e.type||j.test(e.type)?o?o.push(e.parentNode?e.parentNode.removeChild(e):e):i.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(i.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,T=e.fn.live,M=e.fn.die,S="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",C=RegExp("\\b(?:"+S+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,i){e!==document&&C.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,i)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,i=t.guid||e.guid++,o=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%o;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=i;a.length>o;)a[o++].guid=i;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),T?T.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),M?M.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||C.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(S.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/jquery-ui-timepicker-addon/css/jquery-ui-timepicker-addon.css b/src/usr/local/www/javascript/jquery-ui-timepicker-addon/css/jquery-ui-timepicker-addon.css
deleted file mode 100644
index 1af3008..0000000
--- a/src/usr/local/www/javascript/jquery-ui-timepicker-addon/css/jquery-ui-timepicker-addon.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/* css for timepicker */
-.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }
-.ui-timepicker-div dl { text-align: left; }
-.ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; }
-.ui-timepicker-div dl dd { margin: 0 10px 10px 65px; }
-.ui-timepicker-div td { font-size: 90%; }
-.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }
diff --git a/src/usr/local/www/javascript/jquery-ui-timepicker-addon/js/jquery-ui-timepicker-addon.js b/src/usr/local/www/javascript/jquery-ui-timepicker-addon/js/jquery-ui-timepicker-addon.js
deleted file mode 100644
index 33cd3ae..0000000
--- a/src/usr/local/www/javascript/jquery-ui-timepicker-addon/js/jquery-ui-timepicker-addon.js
+++ /dev/null
@@ -1,1326 +0,0 @@
-/*
-* jQuery timepicker addon
-* By: Trent Richardson [http://trentrichardson.com]
-* Version 0.9.9
-* Last Modified: 02/05/2012
-*
-* Copyright 2012 Trent Richardson
-* Dual licensed under the MIT and GPL licenses.
-* http://trentrichardson.com/Impromptu/GPL-LICENSE.txt
-* http://trentrichardson.com/Impromptu/MIT-LICENSE.txt
-*
-* HERES THE CSS:
-* .ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }
-* .ui-timepicker-div dl { text-align: left; }
-* .ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; }
-* .ui-timepicker-div dl dd { margin: 0 10px 10px 65px; }
-* .ui-timepicker-div td { font-size: 90%; }
-* .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }
-*/
-
-(function($) {
-
-$.extend($.ui, { timepicker: { version: "0.9.9" } });
-
-/* Time picker manager.
- Use the singleton instance of this class, $.timepicker, to interact with the time picker.
- Settings for (groups of) time pickers are maintained in an instance object,
- allowing multiple different settings on the same page. */
-
-function Timepicker() {
- this.regional = []; // Available regional settings, indexed by language code
- this.regional[''] = { // Default regional settings
- currentText: 'Now',
- closeText: 'Done',
- ampm: false,
- amNames: ['AM', 'A'],
- pmNames: ['PM', 'P'],
- timeFormat: 'hh:mm tt',
- timeSuffix: '',
- timeOnlyTitle: 'Choose Time',
- timeText: 'Time',
- hourText: 'Hour',
- minuteText: 'Minute',
- secondText: 'Second',
- millisecText: 'Millisecond',
- timezoneText: 'Time Zone'
- };
- this._defaults = { // Global defaults for all the datetime picker instances
- showButtonPanel: true,
- timeOnly: false,
- showHour: true,
- showMinute: true,
- showSecond: false,
- showMillisec: false,
- showTimezone: false,
- showTime: true,
- stepHour: 1,
- stepMinute: 1,
- stepSecond: 1,
- stepMillisec: 1,
- hour: 0,
- minute: 0,
- second: 0,
- millisec: 0,
- timezone: '+0000',
- hourMin: 0,
- minuteMin: 0,
- secondMin: 0,
- millisecMin: 0,
- hourMax: 23,
- minuteMax: 59,
- secondMax: 59,
- millisecMax: 999,
- minDateTime: null,
- maxDateTime: null,
- onSelect: null,
- hourGrid: 0,
- minuteGrid: 0,
- secondGrid: 0,
- millisecGrid: 0,
- alwaysSetTime: true,
- separator: ' ',
- altFieldTimeOnly: true,
- showTimepicker: true,
- timezoneIso8609: false,
- timezoneList: null,
- addSliderAccess: false,
- sliderAccessArgs: null
- };
- $.extend(this._defaults, this.regional['']);
-};
-
-$.extend(Timepicker.prototype, {
- $input: null,
- $altInput: null,
- $timeObj: null,
- inst: null,
- hour_slider: null,
- minute_slider: null,
- second_slider: null,
- millisec_slider: null,
- timezone_select: null,
- hour: 0,
- minute: 0,
- second: 0,
- millisec: 0,
- timezone: '+0000',
- hourMinOriginal: null,
- minuteMinOriginal: null,
- secondMinOriginal: null,
- millisecMinOriginal: null,
- hourMaxOriginal: null,
- minuteMaxOriginal: null,
- secondMaxOriginal: null,
- millisecMaxOriginal: null,
- ampm: '',
- formattedDate: '',
- formattedTime: '',
- formattedDateTime: '',
- timezoneList: null,
-
- /* Override the default settings for all instances of the time picker.
- @param settings object - the new settings to use as defaults (anonymous object)
- @return the manager object */
- setDefaults: function(settings) {
- extendRemove(this._defaults, settings || {});
- return this;
- },
-
- //########################################################################
- // Create a new Timepicker instance
- //########################################################################
- _newInst: function($input, o) {
- var tp_inst = new Timepicker(),
- inlineSettings = {};
-
- for (var attrName in this._defaults) {
- var attrValue = $input.attr('time:' + attrName);
- if (attrValue) {
- try {
- inlineSettings[attrName] = eval(attrValue);
- } catch (err) {
- inlineSettings[attrName] = attrValue;
- }
- }
- }
- tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, o, {
- beforeShow: function(input, dp_inst) {
- if ($.isFunction(o.beforeShow))
- return o.beforeShow(input, dp_inst, tp_inst);
- },
- onChangeMonthYear: function(year, month, dp_inst) {
- // Update the time as well : this prevents the time from disappearing from the $input field.
- tp_inst._updateDateTime(dp_inst);
- if ($.isFunction(o.onChangeMonthYear))
- o.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst);
- },
- onClose: function(dateText, dp_inst) {
- if (tp_inst.timeDefined === true && $input.val() != '')
- tp_inst._updateDateTime(dp_inst);
- if ($.isFunction(o.onClose))
- o.onClose.call($input[0], dateText, dp_inst, tp_inst);
- },
- timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker');
- });
- tp_inst.amNames = $.map(tp_inst._defaults.amNames, function(val) { return val.toUpperCase() ;});
- tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function(val) { return val.toUpperCase() ;});
-
- if (tp_inst._defaults.timezoneList === null) {
- var timezoneList = [];
- for (var i = -11; i <= 12; i++)
- timezoneList.push((i >= 0 ? '+' : '-') + ('0' + Math.abs(i).toString()).slice(-2) + '00');
- if (tp_inst._defaults.timezoneIso8609)
- timezoneList = $.map(timezoneList, function(val) {
- return val == '+0000' ? 'Z' : (val.substring(0, 3) + ':' + val.substring(3));
- });
- tp_inst._defaults.timezoneList = timezoneList;
- }
-
- tp_inst.hour = tp_inst._defaults.hour;
- tp_inst.minute = tp_inst._defaults.minute;
- tp_inst.second = tp_inst._defaults.second;
- tp_inst.millisec = tp_inst._defaults.millisec;
- tp_inst.ampm = '';
- tp_inst.$input = $input;
-
- if (o.altField)
- tp_inst.$altInput = $(o.altField)
- .css({ cursor: 'pointer' })
- .focus(function(){ $input.trigger("focus"); });
-
- if(tp_inst._defaults.minDate==0 || tp_inst._defaults.minDateTime==0)
- {
- tp_inst._defaults.minDate=new Date();
- }
- if(tp_inst._defaults.maxDate==0 || tp_inst._defaults.maxDateTime==0)
- {
- tp_inst._defaults.maxDate=new Date();
- }
-
- // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..
- if(tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date)
- tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime());
- if(tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date)
- tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());
- if(tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date)
- tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime());
- if(tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date)
- tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());
- return tp_inst;
- },
-
- //########################################################################
- // add our sliders to the calendar
- //########################################################################
- _addTimePicker: function(dp_inst) {
- var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ?
- this.$input.val() + ' ' + this.$altInput.val() :
- this.$input.val();
-
- this.timeDefined = this._parseTime(currDT);
- this._limitMinMaxDateTime(dp_inst, false);
- this._injectTimePicker();
- },
-
- //########################################################################
- // parse the time string from input value or _setTime
- //########################################################################
- _parseTime: function(timeString, withDate) {
- var regstr = this._defaults.timeFormat.toString()
- .replace(/h{1,2}/ig, '(\\d?\\d)')
- .replace(/m{1,2}/ig, '(\\d?\\d)')
- .replace(/s{1,2}/ig, '(\\d?\\d)')
- .replace(/l{1}/ig, '(\\d?\\d?\\d)')
- .replace(/t{1,2}/ig, this._getPatternAmpm())
- .replace(/z{1}/ig, '(z|[-+]\\d\\d:?\\d\\d)?')
- .replace(/\s/g, '\\s?') + this._defaults.timeSuffix + '$',
- order = this._getFormatPositions(),
- ampm = '',
- treg;
-
- if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]);
-
- if (withDate || !this._defaults.timeOnly) {
- // the time should come after x number of characters and a space.
- // x = at least the length of text specified by the date format
- var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat');
- // escape special regex characters in the separator
- var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g");
- regstr = '^.{' + dp_dateFormat.length + ',}?' + this._defaults.separator.replace(specials, "\\$&") + regstr;
- }
-
- treg = timeString.match(new RegExp(regstr, 'i'));
-
- if (treg) {
- if (order.t !== -1) {
- if (treg[order.t] === undefined || treg[order.t].length === 0) {
- ampm = '';
- this.ampm = '';
- } else {
- ampm = $.inArray(treg[order.t].toUpperCase(), this.amNames) !== -1 ? 'AM' : 'PM';
- this.ampm = this._defaults[ampm == 'AM' ? 'amNames' : 'pmNames'][0];
- }
- }
-
- if (order.h !== -1) {
- if (ampm == 'AM' && treg[order.h] == '12')
- this.hour = 0; // 12am = 0 hour
- else if (ampm == 'PM' && treg[order.h] != '12')
- this.hour = (parseFloat(treg[order.h]) + 12).toFixed(0); // 12pm = 12 hour, any other pm = hour + 12
- else this.hour = Number(treg[order.h]);
- }
-
- if (order.m !== -1) this.minute = Number(treg[order.m]);
- if (order.s !== -1) this.second = Number(treg[order.s]);
- if (order.l !== -1) this.millisec = Number(treg[order.l]);
- if (order.z !== -1 && treg[order.z] !== undefined) {
- var tz = treg[order.z].toUpperCase();
- switch (tz.length) {
- case 1: // Z
- tz = this._defaults.timezoneIso8609 ? 'Z' : '+0000';
- break;
- case 5: // +hhmm
- if (this._defaults.timezoneIso8609)
- tz = tz.substring(1) == '0000'
- ? 'Z'
- : tz.substring(0, 3) + ':' + tz.substring(3);
- break;
- case 6: // +hh:mm
- if (!this._defaults.timezoneIso8609)
- tz = tz == 'Z' || tz.substring(1) == '00:00'
- ? '+0000'
- : tz.replace(/:/, '');
- else if (tz.substring(1) == '00:00')
- tz = 'Z';
- break;
- }
- this.timezone = tz;
- }
-
- return true;
-
- }
- return false;
- },
-
- //########################################################################
- // pattern for standard and localized AM/PM markers
- //########################################################################
- _getPatternAmpm: function() {
- var markers = [];
- o = this._defaults;
- if (o.amNames)
- $.merge(markers, o.amNames);
- if (o.pmNames)
- $.merge(markers, o.pmNames);
- markers = $.map(markers, function(val) { return val.replace(/[.*+?|()\[\]{}\\]/g, '\\$&') });
- return '(' + markers.join('|') + ')?';
- },
-
- //########################################################################
- // figure out position of time elements.. cause js cant do named captures
- //########################################################################
- _getFormatPositions: function() {
- var finds = this._defaults.timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|t{1,2}|z)/g),
- orders = { h: -1, m: -1, s: -1, l: -1, t: -1, z: -1 };
-
- if (finds)
- for (var i = 0; i < finds.length; i++)
- if (orders[finds[i].toString().charAt(0)] == -1)
- orders[finds[i].toString().charAt(0)] = i + 1;
-
- return orders;
- },
-
- //########################################################################
- // generate and inject html for timepicker into ui datepicker
- //########################################################################
- _injectTimePicker: function() {
- var $dp = this.inst.dpDiv,
- o = this._defaults,
- tp_inst = this,
- // Added by Peter Medeiros:
- // - Figure out what the hour/minute/second max should be based on the step values.
- // - Example: if stepMinute is 15, then minMax is 45.
- hourMax = parseInt((o.hourMax - ((o.hourMax - o.hourMin) % o.stepHour)) ,10),
- minMax = parseInt((o.minuteMax - ((o.minuteMax - o.minuteMin) % o.stepMinute)) ,10),
- secMax = parseInt((o.secondMax - ((o.secondMax - o.secondMin) % o.stepSecond)) ,10),
- millisecMax = parseInt((o.millisecMax - ((o.millisecMax - o.millisecMin) % o.stepMillisec)) ,10),
- dp_id = this.inst.id.toString().replace(/([^A-Za-z0-9_])/g, '');
-
- // Prevent displaying twice
- //if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0) {
- if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0 && o.showTimepicker) {
- var noDisplay = ' style="display:none;"',
- html = '<div class="ui-timepicker-div" id="ui-timepicker-div-' + dp_id + '"><dl>' +
- '<dt class="ui_tpicker_time_label" id="ui_tpicker_time_label_' + dp_id + '"' +
- ((o.showTime) ? '' : noDisplay) + '>' + o.timeText + '</dt>' +
- '<dd class="ui_tpicker_time" id="ui_tpicker_time_' + dp_id + '"' +
- ((o.showTime) ? '' : noDisplay) + '></dd>' +
- '<dt class="ui_tpicker_hour_label" id="ui_tpicker_hour_label_' + dp_id + '"' +
- ((o.showHour) ? '' : noDisplay) + '>' + o.hourText + '</dt>',
- hourGridSize = 0,
- minuteGridSize = 0,
- secondGridSize = 0,
- millisecGridSize = 0,
- size;
-
- // Hours
- html += '<dd class="ui_tpicker_hour"><div id="ui_tpicker_hour_' + dp_id + '"' +
- ((o.showHour) ? '' : noDisplay) + '></div>';
- if (o.showHour && o.hourGrid > 0) {
- html += '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';
-
- for (var h = o.hourMin; h <= hourMax; h += parseInt(o.hourGrid,10)) {
- hourGridSize++;
- var tmph = (o.ampm && h > 12) ? h-12 : h;
- if (tmph < 10) tmph = '0' + tmph;
- if (o.ampm) {
- if (h == 0) tmph = 12 +'a';
- else if (h < 12) tmph += 'a';
- else tmph += 'p';
- }
- html += '<td>' + tmph + '</td>';
- }
-
- html += '</tr></table></div>';
- }
- html += '</dd>';
-
- // Minutes
- html += '<dt class="ui_tpicker_minute_label" id="ui_tpicker_minute_label_' + dp_id + '"' +
- ((o.showMinute) ? '' : noDisplay) + '>' + o.minuteText + '</dt>'+
- '<dd class="ui_tpicker_minute"><div id="ui_tpicker_minute_' + dp_id + '"' +
- ((o.showMinute) ? '' : noDisplay) + '></div>';
-
- if (o.showMinute && o.minuteGrid > 0) {
- html += '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';
-
- for (var m = o.minuteMin; m <= minMax; m += parseInt(o.minuteGrid,10)) {
- minuteGridSize++;
- html += '<td>' + ((m < 10) ? '0' : '') + m + '</td>';
- }
-
- html += '</tr></table></div>';
- }
- html += '</dd>';
-
- // Seconds
- html += '<dt class="ui_tpicker_second_label" id="ui_tpicker_second_label_' + dp_id + '"' +
- ((o.showSecond) ? '' : noDisplay) + '>' + o.secondText + '</dt>'+
- '<dd class="ui_tpicker_second"><div id="ui_tpicker_second_' + dp_id + '"'+
- ((o.showSecond) ? '' : noDisplay) + '></div>';
-
- if (o.showSecond && o.secondGrid > 0) {
- html += '<div style="padding-left: 1px"><table><tr>';
-
- for (var s = o.secondMin; s <= secMax; s += parseInt(o.secondGrid,10)) {
- secondGridSize++;
- html += '<td>' + ((s < 10) ? '0' : '') + s + '</td>';
- }
-
- html += '</tr></table></div>';
- }
- html += '</dd>';
-
- // Milliseconds
- html += '<dt class="ui_tpicker_millisec_label" id="ui_tpicker_millisec_label_' + dp_id + '"' +
- ((o.showMillisec) ? '' : noDisplay) + '>' + o.millisecText + '</dt>'+
- '<dd class="ui_tpicker_millisec"><div id="ui_tpicker_millisec_' + dp_id + '"'+
- ((o.showMillisec) ? '' : noDisplay) + '></div>';
-
- if (o.showMillisec && o.millisecGrid > 0) {
- html += '<div style="padding-left: 1px"><table><tr>';
-
- for (var l = o.millisecMin; l <= millisecMax; l += parseInt(o.millisecGrid,10)) {
- millisecGridSize++;
- html += '<td>' + ((l < 10) ? '0' : '') + l + '</td>';
- }
-
- html += '</tr></table></div>';
- }
- html += '</dd>';
-
- // Timezone
- html += '<dt class="ui_tpicker_timezone_label" id="ui_tpicker_timezone_label_' + dp_id + '"' +
- ((o.showTimezone) ? '' : noDisplay) + '>' + o.timezoneText + '</dt>';
- html += '<dd class="ui_tpicker_timezone" id="ui_tpicker_timezone_' + dp_id + '"' +
- ((o.showTimezone) ? '' : noDisplay) + '></dd>';
-
- html += '</dl></div>';
- $tp = $(html);
-
- // if we only want time picker...
- if (o.timeOnly === true) {
- $tp.prepend(
- '<div class="ui-widget-header ui-helper-clearfix ui-corner-all">' +
- '<div class="ui-datepicker-title">' + o.timeOnlyTitle + '</div>' +
- '</div>');
- $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide();
- }
-
- this.hour_slider = $tp.find('#ui_tpicker_hour_'+ dp_id).slider({
- orientation: "horizontal",
- value: this.hour,
- min: o.hourMin,
- max: hourMax,
- step: o.stepHour,
- slide: function(event, ui) {
- tp_inst.hour_slider.slider( "option", "value", ui.value);
- tp_inst._onTimeChange();
- }
- });
-
-
- // Updated by Peter Medeiros:
- // - Pass in Event and UI instance into slide function
- this.minute_slider = $tp.find('#ui_tpicker_minute_'+ dp_id).slider({
- orientation: "horizontal",
- value: this.minute,
- min: o.minuteMin,
- max: minMax,
- step: o.stepMinute,
- slide: function(event, ui) {
- tp_inst.minute_slider.slider( "option", "value", ui.value);
- tp_inst._onTimeChange();
- }
- });
-
- this.second_slider = $tp.find('#ui_tpicker_second_'+ dp_id).slider({
- orientation: "horizontal",
- value: this.second,
- min: o.secondMin,
- max: secMax,
- step: o.stepSecond,
- slide: function(event, ui) {
- tp_inst.second_slider.slider( "option", "value", ui.value);
- tp_inst._onTimeChange();
- }
- });
-
- this.millisec_slider = $tp.find('#ui_tpicker_millisec_'+ dp_id).slider({
- orientation: "horizontal",
- value: this.millisec,
- min: o.millisecMin,
- max: millisecMax,
- step: o.stepMillisec,
- slide: function(event, ui) {
- tp_inst.millisec_slider.slider( "option", "value", ui.value);
- tp_inst._onTimeChange();
- }
- });
-
- this.timezone_select = $tp.find('#ui_tpicker_timezone_'+ dp_id).append('<select></select>').find("select");
- $.fn.append.apply(this.timezone_select,
- $.map(o.timezoneList, function(val, idx) {
- return $("<option />")
- .val(typeof val == "object" ? val.value : val)
- .text(typeof val == "object" ? val.label : val);
- })
- );
- this.timezone_select.val((typeof this.timezone != "undefined" && this.timezone != null && this.timezone != "") ? this.timezone : o.timezone);
- this.timezone_select.change(function() {
- tp_inst._onTimeChange();
- });
-
- // Add grid functionality
- if (o.showHour && o.hourGrid > 0) {
- size = 100 * hourGridSize * o.hourGrid / (hourMax - o.hourMin);
-
- $tp.find(".ui_tpicker_hour table").css({
- width: size + "%",
- marginLeft: (size / (-2 * hourGridSize)) + "%",
- borderCollapse: 'collapse'
- }).find("td").each( function(index) {
- $(this).click(function() {
- var h = $(this).html();
- if(o.ampm) {
- var ap = h.substring(2).toLowerCase(),
- aph = parseInt(h.substring(0,2), 10);
- if (ap == 'a') {
- if (aph == 12) h = 0;
- else h = aph;
- } else if (aph == 12) h = 12;
- else h = aph + 12;
- }
- tp_inst.hour_slider.slider("option", "value", h);
- tp_inst._onTimeChange();
- tp_inst._onSelectHandler();
- }).css({
- cursor: 'pointer',
- width: (100 / hourGridSize) + '%',
- textAlign: 'center',
- overflow: 'hidden'
- });
- });
- }
-
- if (o.showMinute && o.minuteGrid > 0) {
- size = 100 * minuteGridSize * o.minuteGrid / (minMax - o.minuteMin);
- $tp.find(".ui_tpicker_minute table").css({
- width: size + "%",
- marginLeft: (size / (-2 * minuteGridSize)) + "%",
- borderCollapse: 'collapse'
- }).find("td").each(function(index) {
- $(this).click(function() {
- tp_inst.minute_slider.slider("option", "value", $(this).html());
- tp_inst._onTimeChange();
- tp_inst._onSelectHandler();
- }).css({
- cursor: 'pointer',
- width: (100 / minuteGridSize) + '%',
- textAlign: 'center',
- overflow: 'hidden'
- });
- });
- }
-
- if (o.showSecond && o.secondGrid > 0) {
- $tp.find(".ui_tpicker_second table").css({
- width: size + "%",
- marginLeft: (size / (-2 * secondGridSize)) + "%",
- borderCollapse: 'collapse'
- }).find("td").each(function(index) {
- $(this).click(function() {
- tp_inst.second_slider.slider("option", "value", $(this).html());
- tp_inst._onTimeChange();
- tp_inst._onSelectHandler();
- }).css({
- cursor: 'pointer',
- width: (100 / secondGridSize) + '%',
- textAlign: 'center',
- overflow: 'hidden'
- });
- });
- }
-
- if (o.showMillisec && o.millisecGrid > 0) {
- $tp.find(".ui_tpicker_millisec table").css({
- width: size + "%",
- marginLeft: (size / (-2 * millisecGridSize)) + "%",
- borderCollapse: 'collapse'
- }).find("td").each(function(index) {
- $(this).click(function() {
- tp_inst.millisec_slider.slider("option", "value", $(this).html());
- tp_inst._onTimeChange();
- tp_inst._onSelectHandler();
- }).css({
- cursor: 'pointer',
- width: (100 / millisecGridSize) + '%',
- textAlign: 'center',
- overflow: 'hidden'
- });
- });
- }
-
- var $buttonPanel = $dp.find('.ui-datepicker-buttonpane');
- if ($buttonPanel.length) $buttonPanel.before($tp);
- else $dp.append($tp);
-
- this.$timeObj = $tp.find('#ui_tpicker_time_'+ dp_id);
-
- if (this.inst !== null) {
- var timeDefined = this.timeDefined;
- this._onTimeChange();
- this.timeDefined = timeDefined;
- }
-
- //Emulate datepicker onSelect behavior. Call on slidestop.
- var onSelectDelegate = function() {
- tp_inst._onSelectHandler();
- };
- this.hour_slider.bind('slidestop',onSelectDelegate);
- this.minute_slider.bind('slidestop',onSelectDelegate);
- this.second_slider.bind('slidestop',onSelectDelegate);
- this.millisec_slider.bind('slidestop',onSelectDelegate);
-
- // slideAccess integration: http://trentrichardson.com/2011/11/11/jquery-ui-sliders-and-touch-accessibility/
- if (this._defaults.addSliderAccess){
- var sliderAccessArgs = this._defaults.sliderAccessArgs;
- setTimeout(function(){ // fix for inline mode
- if($tp.find('.ui-slider-access').length == 0){
- $tp.find('.ui-slider:visible').sliderAccess(sliderAccessArgs);
-
- // fix any grids since sliders are shorter
- var sliderAccessWidth = $tp.find('.ui-slider-access:eq(0)').outerWidth(true);
- if(sliderAccessWidth){
- $tp.find('table:visible').each(function(){
- var $g = $(this),
- oldWidth = $g.outerWidth(),
- oldMarginLeft = $g.css('marginLeft').toString().replace('%',''),
- newWidth = oldWidth - sliderAccessWidth,
- newMarginLeft = ((oldMarginLeft * newWidth)/oldWidth) + '%';
-
- $g.css({ width: newWidth, marginLeft: newMarginLeft });
- });
- }
- }
- },0);
- }
- // end slideAccess integration
-
- }
- },
-
- //########################################################################
- // This function tries to limit the ability to go outside the
- // min/max date range
- //########################################################################
- _limitMinMaxDateTime: function(dp_inst, adjustSliders){
- var o = this._defaults,
- dp_date = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay);
-
- if(!this._defaults.showTimepicker) return; // No time so nothing to check here
-
- if($.datepicker._get(dp_inst, 'minDateTime') !== null && $.datepicker._get(dp_inst, 'minDateTime') !== undefined && dp_date){
- var minDateTime = $.datepicker._get(dp_inst, 'minDateTime'),
- minDateTimeDate = new Date(minDateTime.getFullYear(), minDateTime.getMonth(), minDateTime.getDate(), 0, 0, 0, 0);
-
- if(this.hourMinOriginal === null || this.minuteMinOriginal === null || this.secondMinOriginal === null || this.millisecMinOriginal === null){
- this.hourMinOriginal = o.hourMin;
- this.minuteMinOriginal = o.minuteMin;
- this.secondMinOriginal = o.secondMin;
- this.millisecMinOriginal = o.millisecMin;
- }
-
- if(dp_inst.settings.timeOnly || minDateTimeDate.getTime() == dp_date.getTime()) {
- this._defaults.hourMin = minDateTime.getHours();
- if (this.hour <= this._defaults.hourMin) {
- this.hour = this._defaults.hourMin;
- this._defaults.minuteMin = minDateTime.getMinutes();
- if (this.minute <= this._defaults.minuteMin) {
- this.minute = this._defaults.minuteMin;
- this._defaults.secondMin = minDateTime.getSeconds();
- } else if (this.second <= this._defaults.secondMin){
- this.second = this._defaults.secondMin;
- this._defaults.millisecMin = minDateTime.getMilliseconds();
- } else {
- if(this.millisec < this._defaults.millisecMin)
- this.millisec = this._defaults.millisecMin;
- this._defaults.millisecMin = this.millisecMinOriginal;
- }
- } else {
- this._defaults.minuteMin = this.minuteMinOriginal;
- this._defaults.secondMin = this.secondMinOriginal;
- this._defaults.millisecMin = this.millisecMinOriginal;
- }
- }else{
- this._defaults.hourMin = this.hourMinOriginal;
- this._defaults.minuteMin = this.minuteMinOriginal;
- this._defaults.secondMin = this.secondMinOriginal;
- this._defaults.millisecMin = this.millisecMinOriginal;
- }
- }
-
- if($.datepicker._get(dp_inst, 'maxDateTime') !== null && $.datepicker._get(dp_inst, 'maxDateTime') !== undefined && dp_date){
- var maxDateTime = $.datepicker._get(dp_inst, 'maxDateTime'),
- maxDateTimeDate = new Date(maxDateTime.getFullYear(), maxDateTime.getMonth(), maxDateTime.getDate(), 0, 0, 0, 0);
-
- if(this.hourMaxOriginal === null || this.minuteMaxOriginal === null || this.secondMaxOriginal === null){
- this.hourMaxOriginal = o.hourMax;
- this.minuteMaxOriginal = o.minuteMax;
- this.secondMaxOriginal = o.secondMax;
- this.millisecMaxOriginal = o.millisecMax;
- }
-
- if(dp_inst.settings.timeOnly || maxDateTimeDate.getTime() == dp_date.getTime()){
- this._defaults.hourMax = maxDateTime.getHours();
- if (this.hour >= this._defaults.hourMax) {
- this.hour = this._defaults.hourMax;
- this._defaults.minuteMax = maxDateTime.getMinutes();
- if (this.minute >= this._defaults.minuteMax) {
- this.minute = this._defaults.minuteMax;
- this._defaults.secondMax = maxDateTime.getSeconds();
- } else if (this.second >= this._defaults.secondMax) {
- this.second = this._defaults.secondMax;
- this._defaults.millisecMax = maxDateTime.getMilliseconds();
- } else {
- if(this.millisec > this._defaults.millisecMax) this.millisec = this._defaults.millisecMax;
- this._defaults.millisecMax = this.millisecMaxOriginal;
- }
- } else {
- this._defaults.minuteMax = this.minuteMaxOriginal;
- this._defaults.secondMax = this.secondMaxOriginal;
- this._defaults.millisecMax = this.millisecMaxOriginal;
- }
- }else{
- this._defaults.hourMax = this.hourMaxOriginal;
- this._defaults.minuteMax = this.minuteMaxOriginal;
- this._defaults.secondMax = this.secondMaxOriginal;
- this._defaults.millisecMax = this.millisecMaxOriginal;
- }
- }
-
- if(adjustSliders !== undefined && adjustSliders === true){
- var hourMax = parseInt((this._defaults.hourMax - ((this._defaults.hourMax - this._defaults.hourMin) % this._defaults.stepHour)) ,10),
- minMax = parseInt((this._defaults.minuteMax - ((this._defaults.minuteMax - this._defaults.minuteMin) % this._defaults.stepMinute)) ,10),
- secMax = parseInt((this._defaults.secondMax - ((this._defaults.secondMax - this._defaults.secondMin) % this._defaults.stepSecond)) ,10),
- millisecMax = parseInt((this._defaults.millisecMax - ((this._defaults.millisecMax - this._defaults.millisecMin) % this._defaults.stepMillisec)) ,10);
-
- if(this.hour_slider)
- this.hour_slider.slider("option", { min: this._defaults.hourMin, max: hourMax }).slider('value', this.hour);
- if(this.minute_slider)
- this.minute_slider.slider("option", { min: this._defaults.minuteMin, max: minMax }).slider('value', this.minute);
- if(this.second_slider)
- this.second_slider.slider("option", { min: this._defaults.secondMin, max: secMax }).slider('value', this.second);
- if(this.millisec_slider)
- this.millisec_slider.slider("option", { min: this._defaults.millisecMin, max: millisecMax }).slider('value', this.millisec);
- }
-
- },
-
-
- //########################################################################
- // when a slider moves, set the internal time...
- // on time change is also called when the time is updated in the text field
- //########################################################################
- _onTimeChange: function() {
- var hour = (this.hour_slider) ? this.hour_slider.slider('value') : false,
- minute = (this.minute_slider) ? this.minute_slider.slider('value') : false,
- second = (this.second_slider) ? this.second_slider.slider('value') : false,
- millisec = (this.millisec_slider) ? this.millisec_slider.slider('value') : false,
- timezone = (this.timezone_select) ? this.timezone_select.val() : false,
- o = this._defaults;
-
- if (typeof(hour) == 'object') hour = false;
- if (typeof(minute) == 'object') minute = false;
- if (typeof(second) == 'object') second = false;
- if (typeof(millisec) == 'object') millisec = false;
- if (typeof(timezone) == 'object') timezone = false;
-
- if (hour !== false) hour = parseInt(hour,10);
- if (minute !== false) minute = parseInt(minute,10);
- if (second !== false) second = parseInt(second,10);
- if (millisec !== false) millisec = parseInt(millisec,10);
-
- var ampm = o[hour < 12 ? 'amNames' : 'pmNames'][0];
-
- // If the update was done in the input field, the input field should not be updated.
- // If the update was done using the sliders, update the input field.
- var hasChanged = (hour != this.hour || minute != this.minute
- || second != this.second || millisec != this.millisec
- || (this.ampm.length > 0
- && (hour < 12) != ($.inArray(this.ampm.toUpperCase(), this.amNames) !== -1))
- || timezone != this.timezone);
-
- if (hasChanged) {
-
- if (hour !== false)this.hour = hour;
- if (minute !== false) this.minute = minute;
- if (second !== false) this.second = second;
- if (millisec !== false) this.millisec = millisec;
- if (timezone !== false) this.timezone = timezone;
-
- if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]);
-
- this._limitMinMaxDateTime(this.inst, true);
- }
- if (o.ampm) this.ampm = ampm;
-
- //this._formatTime();
- this.formattedTime = $.datepicker.formatTime(this._defaults.timeFormat, this, this._defaults);
- if (this.$timeObj) this.$timeObj.text(this.formattedTime + o.timeSuffix);
- this.timeDefined = true;
- if (hasChanged) this._updateDateTime();
- },
-
- //########################################################################
- // call custom onSelect.
- // bind to sliders slidestop, and grid click.
- //########################################################################
- _onSelectHandler: function() {
- var onSelect = this._defaults.onSelect;
- var inputEl = this.$input ? this.$input[0] : null;
- if (onSelect && inputEl) {
- onSelect.apply(inputEl, [this.formattedDateTime, this]);
- }
- },
-
- //########################################################################
- // left for any backwards compatibility
- //########################################################################
- _formatTime: function(time, format) {
- time = time || { hour: this.hour, minute: this.minute, second: this.second, millisec: this.millisec, ampm: this.ampm, timezone: this.timezone };
- var tmptime = (format || this._defaults.timeFormat).toString();
-
- tmptime = $.datepicker.formatTime(tmptime, time, this._defaults);
-
- if (arguments.length) return tmptime;
- else this.formattedTime = tmptime;
- },
-
- //########################################################################
- // update our input with the new date time..
- //########################################################################
- _updateDateTime: function(dp_inst) {
- dp_inst = this.inst || dp_inst;
- var dt = $.datepicker._daylightSavingAdjust(new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay)),
- dateFmt = $.datepicker._get(dp_inst, 'dateFormat'),
- formatCfg = $.datepicker._getFormatConfig(dp_inst),
- timeAvailable = dt !== null && this.timeDefined;
- this.formattedDate = $.datepicker.formatDate(dateFmt, (dt === null ? new Date() : dt), formatCfg);
- var formattedDateTime = this.formattedDate;
- if (dp_inst.lastVal !== undefined && (dp_inst.lastVal.length > 0 && this.$input.val().length === 0))
- return;
-
- if (this._defaults.timeOnly === true) {
- formattedDateTime = this.formattedTime;
- } else if (this._defaults.timeOnly !== true && (this._defaults.alwaysSetTime || timeAvailable)) {
- formattedDateTime += this._defaults.separator + this.formattedTime + this._defaults.timeSuffix;
- }
-
- this.formattedDateTime = formattedDateTime;
-
- if(!this._defaults.showTimepicker) {
- this.$input.val(this.formattedDate);
- } else if (this.$altInput && this._defaults.altFieldTimeOnly === true) {
- this.$altInput.val(this.formattedTime);
- this.$input.val(this.formattedDate);
- } else if(this.$altInput) {
- this.$altInput.val(formattedDateTime);
- this.$input.val(formattedDateTime);
- } else {
- this.$input.val(formattedDateTime);
- }
-
- this.$input.trigger("change");
- }
-
-});
-
-$.fn.extend({
- //########################################################################
- // shorthand just to use timepicker..
- //########################################################################
- timepicker: function(o) {
- o = o || {};
- var tmp_args = arguments;
-
- if (typeof o == 'object') tmp_args[0] = $.extend(o, { timeOnly: true });
-
- return $(this).each(function() {
- $.fn.datetimepicker.apply($(this), tmp_args);
- });
- },
-
- //########################################################################
- // extend timepicker to datepicker
- //########################################################################
- datetimepicker: function(o) {
- o = o || {};
- var $input = this,
- tmp_args = arguments;
-
- if (typeof(o) == 'string'){
- if(o == 'getDate')
- return $.fn.datepicker.apply($(this[0]), tmp_args);
- else
- return this.each(function() {
- var $t = $(this);
- $t.datepicker.apply($t, tmp_args);
- });
- }
- else
- return this.each(function() {
- var $t = $(this);
- $t.datepicker($.timepicker._newInst($t, o)._defaults);
- });
- }
-});
-
-//########################################################################
-// format the time all pretty...
-// format = string format of the time
-// time = a {}, not a Date() for timezones
-// options = essentially the regional[].. amNames, pmNames, ampm
-//########################################################################
-$.datepicker.formatTime = function(format, time, options) {
- options = options || {};
- options = $.extend($.timepicker._defaults, options);
- time = $.extend({hour:0, minute:0, second:0, millisec:0, timezone:'+0000'}, time);
-
- var tmptime = format;
- var ampmName = options['amNames'][0];
-
- var hour = parseInt(time.hour, 10);
- if (options.ampm) {
- if (hour > 11){
- ampmName = options['pmNames'][0];
- if(hour > 12)
- hour = hour % 12;
- }
- if (hour === 0)
- hour = 12;
- }
- tmptime = tmptime.replace(/(?:hh?|mm?|ss?|[tT]{1,2}|[lz])/g, function(match) {
- switch (match.toLowerCase()) {
- case 'hh': return ('0' + hour).slice(-2);
- case 'h': return hour;
- case 'mm': return ('0' + time.minute).slice(-2);
- case 'm': return time.minute;
- case 'ss': return ('0' + time.second).slice(-2);
- case 's': return time.second;
- case 'l': return ('00' + time.millisec).slice(-3);
- case 'z': return time.timezone;
- case 't': case 'tt':
- if (options.ampm) {
- if (match.length == 1)
- ampmName = ampmName.charAt(0);
- return match.charAt(0) == 'T' ? ampmName.toUpperCase() : ampmName.toLowerCase();
- }
- return '';
- }
- });
-
- tmptime = $.trim(tmptime);
- return tmptime;
-};
-
-//########################################################################
-// the bad hack :/ override datepicker so it doesnt close on select
-// inspired: http://stackoverflow.com/questions/1252512/jquery-datepicker-prevent-closing-picker-when-clicking-a-date/1762378#1762378
-//########################################################################
-$.datepicker._base_selectDate = $.datepicker._selectDate;
-$.datepicker._selectDate = function (id, dateStr) {
- var inst = this._getInst($(id)[0]),
- tp_inst = this._get(inst, 'timepicker');
-
- if (tp_inst) {
- tp_inst._limitMinMaxDateTime(inst, true);
- inst.inline = inst.stay_open = true;
- //This way the onSelect handler called from calendarpicker get the full dateTime
- this._base_selectDate(id, dateStr);
- inst.inline = inst.stay_open = false;
- this._notifyChange(inst);
- this._updateDatepicker(inst);
- }
- else this._base_selectDate(id, dateStr);
-};
-
-//#############################################################################################
-// second bad hack :/ override datepicker so it triggers an event when changing the input field
-// and does not redraw the datepicker on every selectDate event
-//#############################################################################################
-$.datepicker._base_updateDatepicker = $.datepicker._updateDatepicker;
-$.datepicker._updateDatepicker = function(inst) {
-
- // don't popup the datepicker if there is another instance already opened
- var input = inst.input[0];
- if($.datepicker._curInst &&
- $.datepicker._curInst != inst &&
- $.datepicker._datepickerShowing &&
- $.datepicker._lastInput != input) {
- return;
- }
-
- if (typeof(inst.stay_open) !== 'boolean' || inst.stay_open === false) {
-
- this._base_updateDatepicker(inst);
-
- // Reload the time control when changing something in the input text field.
- var tp_inst = this._get(inst, 'timepicker');
- if(tp_inst) tp_inst._addTimePicker(inst);
- }
-};
-
-//#######################################################################################
-// third bad hack :/ override datepicker so it allows spaces and colon in the input field
-//#######################################################################################
-$.datepicker._base_doKeyPress = $.datepicker._doKeyPress;
-$.datepicker._doKeyPress = function(event) {
- var inst = $.datepicker._getInst(event.target),
- tp_inst = $.datepicker._get(inst, 'timepicker');
-
- if (tp_inst) {
- if ($.datepicker._get(inst, 'constrainInput')) {
- var ampm = tp_inst._defaults.ampm,
- dateChars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')),
- datetimeChars = tp_inst._defaults.timeFormat.toString()
- .replace(/[hms]/g, '')
- .replace(/TT/g, ampm ? 'APM' : '')
- .replace(/Tt/g, ampm ? 'AaPpMm' : '')
- .replace(/tT/g, ampm ? 'AaPpMm' : '')
- .replace(/T/g, ampm ? 'AP' : '')
- .replace(/tt/g, ampm ? 'apm' : '')
- .replace(/t/g, ampm ? 'ap' : '') +
- " " +
- tp_inst._defaults.separator +
- tp_inst._defaults.timeSuffix +
- (tp_inst._defaults.showTimezone ? tp_inst._defaults.timezoneList.join('') : '') +
- (tp_inst._defaults.amNames.join('')) +
- (tp_inst._defaults.pmNames.join('')) +
- dateChars,
- chr = String.fromCharCode(event.charCode === undefined ? event.keyCode : event.charCode);
- return event.ctrlKey || (chr < ' ' || !dateChars || datetimeChars.indexOf(chr) > -1);
- }
- }
-
- return $.datepicker._base_doKeyPress(event);
-};
-
-//#######################################################################################
-// Override key up event to sync manual input changes.
-//#######################################################################################
-$.datepicker._base_doKeyUp = $.datepicker._doKeyUp;
-$.datepicker._doKeyUp = function (event) {
- var inst = $.datepicker._getInst(event.target),
- tp_inst = $.datepicker._get(inst, 'timepicker');
-
- if (tp_inst) {
- if (tp_inst._defaults.timeOnly && (inst.input.val() != inst.lastVal)) {
- try {
- $.datepicker._updateDatepicker(inst);
- }
- catch (err) {
- $.datepicker.log(err);
- }
- }
- }
-
- return $.datepicker._base_doKeyUp(event);
-};
-
-//#######################################################################################
-// override "Today" button to also grab the time.
-//#######################################################################################
-$.datepicker._base_gotoToday = $.datepicker._gotoToday;
-$.datepicker._gotoToday = function(id) {
- var inst = this._getInst($(id)[0]),
- $dp = inst.dpDiv;
- this._base_gotoToday(id);
- var now = new Date();
- var tp_inst = this._get(inst, 'timepicker');
- if (tp_inst && tp_inst._defaults.showTimezone && tp_inst.timezone_select) {
- var tzoffset = now.getTimezoneOffset(); // If +0100, returns -60
- var tzsign = tzoffset > 0 ? '-' : '+';
- tzoffset = Math.abs(tzoffset);
- var tzmin = tzoffset % 60;
- tzoffset = tzsign + ('0' + (tzoffset - tzmin) / 60).slice(-2) + ('0' + tzmin).slice(-2);
- if (tp_inst._defaults.timezoneIso8609)
- tzoffset = tzoffset.substring(0, 3) + ':' + tzoffset.substring(3);
- tp_inst.timezone_select.val(tzoffset);
- }
- this._setTime(inst, now);
- $( '.ui-datepicker-today', $dp).click();
-};
-
-//#######################################################################################
-// Disable & enable the Time in the datetimepicker
-//#######################################################################################
-$.datepicker._disableTimepickerDatepicker = function(target, date, withDate) {
- var inst = this._getInst(target),
- tp_inst = this._get(inst, 'timepicker');
- $(target).datepicker('getDate'); // Init selected[Year|Month|Day]
- if (tp_inst) {
- tp_inst._defaults.showTimepicker = false;
- tp_inst._updateDateTime(inst);
- }
-};
-
-$.datepicker._enableTimepickerDatepicker = function(target, date, withDate) {
- var inst = this._getInst(target),
- tp_inst = this._get(inst, 'timepicker');
- $(target).datepicker('getDate'); // Init selected[Year|Month|Day]
- if (tp_inst) {
- tp_inst._defaults.showTimepicker = true;
- tp_inst._addTimePicker(inst); // Could be disabled on page load
- tp_inst._updateDateTime(inst);
- }
-};
-
-//#######################################################################################
-// Create our own set time function
-//#######################################################################################
-$.datepicker._setTime = function(inst, date) {
- var tp_inst = this._get(inst, 'timepicker');
- if (tp_inst) {
- var defaults = tp_inst._defaults,
- // calling _setTime with no date sets time to defaults
- hour = date ? date.getHours() : defaults.hour,
- minute = date ? date.getMinutes() : defaults.minute,
- second = date ? date.getSeconds() : defaults.second,
- millisec = date ? date.getMilliseconds() : defaults.millisec;
-
- //check if within min/max times..
- if ((hour < defaults.hourMin || hour > defaults.hourMax) || (minute < defaults.minuteMin || minute > defaults.minuteMax) || (second < defaults.secondMin || second > defaults.secondMax) || (millisec < defaults.millisecMin || millisec > defaults.millisecMax)) {
- hour = defaults.hourMin;
- minute = defaults.minuteMin;
- second = defaults.secondMin;
- millisec = defaults.millisecMin;
- }
-
- tp_inst.hour = hour;
- tp_inst.minute = minute;
- tp_inst.second = second;
- tp_inst.millisec = millisec;
-
- if (tp_inst.hour_slider) tp_inst.hour_slider.slider('value', hour);
- if (tp_inst.minute_slider) tp_inst.minute_slider.slider('value', minute);
- if (tp_inst.second_slider) tp_inst.second_slider.slider('value', second);
- if (tp_inst.millisec_slider) tp_inst.millisec_slider.slider('value', millisec);
-
- tp_inst._onTimeChange();
- tp_inst._updateDateTime(inst);
- }
-};
-
-//#######################################################################################
-// Create new public method to set only time, callable as $().datepicker('setTime', date)
-//#######################################################################################
-$.datepicker._setTimeDatepicker = function(target, date, withDate) {
- var inst = this._getInst(target),
- tp_inst = this._get(inst, 'timepicker');
-
- if (tp_inst) {
- this._setDateFromField(inst);
- var tp_date;
- if (date) {
- if (typeof date == "string") {
- tp_inst._parseTime(date, withDate);
- tp_date = new Date();
- tp_date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);
- }
- else tp_date = new Date(date.getTime());
- if (tp_date.toString() == 'Invalid Date') tp_date = undefined;
- this._setTime(inst, tp_date);
- }
- }
-
-};
-
-//#######################################################################################
-// override setDate() to allow setting time too within Date object
-//#######################################################################################
-$.datepicker._base_setDateDatepicker = $.datepicker._setDateDatepicker;
-$.datepicker._setDateDatepicker = function(target, date) {
- var inst = this._getInst(target),
- tp_date = (date instanceof Date) ? new Date(date.getTime()) : date;
-
- this._updateDatepicker(inst);
- this._base_setDateDatepicker.apply(this, arguments);
- this._setTimeDatepicker(target, tp_date, true);
-};
-
-//#######################################################################################
-// override getDate() to allow getting time too within Date object
-//#######################################################################################
-$.datepicker._base_getDateDatepicker = $.datepicker._getDateDatepicker;
-$.datepicker._getDateDatepicker = function(target, noDefault) {
- var inst = this._getInst(target),
- tp_inst = this._get(inst, 'timepicker');
-
- if (tp_inst) {
- this._setDateFromField(inst, noDefault);
- var date = this._getDate(inst);
- if (date && tp_inst._parseTime($(target).val(), tp_inst.timeOnly)) date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);
- return date;
- }
- return this._base_getDateDatepicker(target, noDefault);
-};
-
-//#######################################################################################
-// override parseDate() because UI 1.8.14 throws an error about "Extra characters"
-// An option in datapicker to ignore extra format characters would be nicer.
-//#######################################################################################
-$.datepicker._base_parseDate = $.datepicker.parseDate;
-$.datepicker.parseDate = function(format, value, settings) {
- var date;
- try {
- date = this._base_parseDate(format, value, settings);
- } catch (err) {
- if (err.indexOf(":") >= 0) {
- // Hack! The error message ends with a colon, a space, and
- // the "extra" characters. We rely on that instead of
- // attempting to perfectly reproduce the parsing algorithm.
- date = this._base_parseDate(format, value.substring(0,value.length-(err.length-err.indexOf(':')-2)), settings);
- } else {
- // The underlying error was not related to the time
- throw err;
- }
- }
- return date;
-};
-
-//#######################################################################################
-// override formatDate to set date with time to the input
-//#######################################################################################
-$.datepicker._base_formatDate=$.datepicker._formatDate;
-$.datepicker._formatDate = function(inst, day, month, year){
- var tp_inst = this._get(inst, 'timepicker');
- if(tp_inst)
- {
- if(day)
- var b = this._base_formatDate(inst, day, month, year);
- tp_inst._updateDateTime(inst);
- return tp_inst.$input.val();
- }
- return this._base_formatDate(inst);
-};
-
-//#######################################################################################
-// override options setter to add time to maxDate(Time) and minDate(Time). MaxDate
-//#######################################################################################
-$.datepicker._base_optionDatepicker = $.datepicker._optionDatepicker;
-$.datepicker._optionDatepicker = function(target, name, value) {
- var inst = this._getInst(target),
- tp_inst = this._get(inst, 'timepicker');
- if (tp_inst) {
- var min,max,onselect;
- if (typeof name == 'string') { // if min/max was set with the string
- if (name==='minDate' || name==='minDateTime' )
- min = value;
- else if (name==='maxDate' || name==='maxDateTime')
- max = value;
- else if (name==='onSelect')
- onselect=value;
- } else if (typeof name == 'object') { //if min/max was set with the JSON
- if(name.minDate)
- min = name.minDate;
- else if (name.minDateTime)
- min = name.minDateTime;
- else if (name.maxDate)
- max = name.maxDate;
- else if (name.maxDateTime)
- max = name.maxDateTime;
- }
- if(min){ //if min was set
- if(min==0)
- min=new Date();
- else
- min= new Date(min);
-
- tp_inst._defaults.minDate = min;
- tp_inst._defaults.minDateTime = min;
- } else if (max){ //if max was set
- if(max==0)
- max=new Date();
- else
- max= new Date(max);
- tp_inst._defaults.maxDate = max;
- tp_inst._defaults.maxDateTime = max;
- }
- else if (onselect)
- tp_inst._defaults.onSelect=onselect;
- }
- if (value === undefined)
- return this._base_optionDatepicker(target, name);
- return this._base_optionDatepicker(target, name, value);
-};
-
-//#######################################################################################
-// jQuery extend now ignores nulls!
-//#######################################################################################
-function extendRemove(target, props) {
- $.extend(target, props);
- for (var name in props)
- if (props[name] === null || props[name] === undefined)
- target[name] = props[name];
- return target;
-};
-
-$.timepicker = new Timepicker(); // singleton instance
-$.timepicker.version = "0.9.9";
-
-})(jQuery);
-
diff --git a/src/usr/local/www/javascript/jquery.ipv4v6ify.js b/src/usr/local/www/javascript/jquery.ipv4v6ify.js
deleted file mode 100755
index 93a513a..0000000
--- a/src/usr/local/www/javascript/jquery.ipv4v6ify.js
+++ /dev/null
@@ -1,140 +0,0 @@
-/*jslint browser: true, eqeqeq: true, undef: true */
-/*global jQuery */
-/******************************************************************************
-Lines above are for jslint, the JavaScript verifier. http://www.jslint.com/
-******************************************************************************/
-
-/* MIT-licensed code from https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some */
-/* (C) 2007 Mozilla Developer Network and/or Jeff Walden */
-if (!Array.prototype.some) {
- Array.prototype.some = function(fun /*, thisp */) {
- "use strict";
- if (!this) {
- throw new TypeError();
- }
- var t = Object(this);
- var len = t.length >>> 0;
- if (typeof fun !== "function") {
- throw new TypeError();
- }
- var thisp = arguments[1];
- for (var i = 0; i < len; i++) {
- if (i in t && fun.call(thisp, t[i], i, t)) {
- return true;
- }
- }
- return false;
- };
-}
-
-(function ($) {
- // --------------------------------------------------------------------
- // find pairs of <input class='ipv4v6'> (textbox for IPv4 or IPv6 addr)
- // and <select class='ipv4v6'> (dropdown for # bits in CIDR) and
- // activate behavior that restricts options in the <select> when an
- // ipv4 address is typed in the <input>.
- // --------------------------------------------------------------------
- var _ipv4v6ify = function (input1, input2) {
- var options = Array.prototype.slice.call(input2.options, 0);
- var has_128 = options.some(function (x) { return parseInt(x.value, 10) === 128; });
- var has_0 = options.some(function (x) { return parseInt(x.value, 10) === 0; });
- var max_ipv6 = has_128 ? 128 : 127;
- var min_ipv6 = has_0 ? 0 : 1;
- var max_ipv4 = has_128 ? 32 : 31;
- var min_ipv4 = has_0 ? 0 : 1;
- var was_ipv4 = undefined;
- var is_ipv4 = undefined;
- var restrict_bits_to_ipv4 = function () {
- input2.options.length = 0;
- for (var i = 0; i < options.length; i += 1) {
- var val = parseInt(options[i].value, 10);
- if (val >= min_ipv4 && val <= max_ipv4) {
- input2.options.add(options[i]);
- }
- }
- };
- var unrestrict_bits = function () {
- input2.options.length = 0;
- for (var i = 0; i < options.length; i += 1) {
- input2.options.add(options[i]);
- }
- };
- var onchange_handler = function () {
- was_ipv4 = is_ipv4;
- is_ipv4 = /\./.test(input1.value) && !/\:/.test(input1.value);
- // handle state transitions to gracefully change the
- // value in the dropdown.
- var bits = parseInt($(input2).val(), 10);
- if (was_ipv4 === false && is_ipv4 === true) {
- restrict_bits_to_ipv4();
- /* min_ipv4 -> min_ipv4 */
- /* ... -> ... */
- /* max_ipv4 -> max_ipv4 */
- /* ... -> ... */
- /* max_ipv6 -> max_ipv4 */
- if (bits < min_ipv4) {
- $(input2).val(min_ipv4);
- }
- else if (bits < max_ipv4) {
- $(input2).val(bits);
- }
- else {
- $(input2).val(max_ipv4);
- }
- }
- else if (was_ipv4 === true && is_ipv4 === false) {
- unrestrict_bits();
- /* min_ipv4 -> min_ipv4 */
- /* ... -> ... */
- /* max_ipv4 -> max_ipv4 */
- if (bits < min_ipv4) {
- $(input2).val(min_ipv6);
- }
- else if (bits < max_ipv4) {
- $(input2).val(bits);
- }
- else {
- $(input2).val(max_ipv6);
- }
- }
- else if (was_ipv4 === undefined && is_ipv4 === true) {
- // initial value is an ipv4 address
- restrict_bits_to_ipv4();
- /* min_ipv4 -> min_ipv4 */
- /* ... -> ... */
- /* max_ipv4 -> max_ipv4 */
- /* ... -> ... */
- /* max_ipv6 -> max_ipv4 */
- if (bits < min_ipv4) {
- $(input2).val(min_ipv4);
- }
- else if (bits < max_ipv4) {
- $(input2).val(bits);
- }
- else {
- $(input2).val(max_ipv4);
- }
- }
- };
- $(input1).unbind("change").bind("change", onchange_handler).trigger("change");
- };
- $.fn.extend({
- "ipv4v6ify": function () {
- return this.each(function () {
- var inputs, i, input1, input2;
- inputs = $(this).find(":input.ipv4v6").toArray();
- for (i = 0; i < inputs.length - 1; i += 1) {
- input1 = inputs[i];
- input2 = inputs[i + 1];
- if (input1.type === "text" && input2.type === "select-one") {
- _ipv4v6ify(input1, input2);
- }
- }
- });
- }
- });
- $(function () {
- $(document).ipv4v6ify();
- });
-})(jQuery);
-
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/src/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_18_b81900_40x40.png
deleted file mode 100755
index 954e22d..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_18_b81900_40x40.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_20_666666_40x40.png b/src/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_20_666666_40x40.png
deleted file mode 100755
index 64ece57..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_20_666666_40x40.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png
deleted file mode 100755
index 5b5dab2..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png
deleted file mode 100755
index e44f861..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_10_000000_40x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_10_000000_40x100.png
deleted file mode 100755
index abdc010..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_10_000000_40x100.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png
deleted file mode 100755
index b8c9bb1..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png
deleted file mode 100755
index e44f861..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f6f6f6_1x400.png b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f6f6f6_1x400.png
deleted file mode 100755
index 9b383f4..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f6f6f6_1x400.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png
deleted file mode 100755
index cd79e9f..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_fdf5ce_1x400.png b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_fdf5ce_1x400.png
deleted file mode 100755
index a23baad..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_fdf5ce_1x400.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png
deleted file mode 100755
index 3550f06..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png
deleted file mode 100755
index 8ad921a..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_65_ffffff_1x400.png b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_65_ffffff_1x400.png
deleted file mode 100755
index 42ccba2..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_65_ffffff_1x400.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_gloss-wave_35_f6a828_500x100.png
deleted file mode 100755
index 39d5824..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_gloss-wave_35_f6a828_500x100.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
deleted file mode 100755
index f127367..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
deleted file mode 100755
index 359397a..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png
deleted file mode 100755
index 89b88d8..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png
deleted file mode 100755
index a265c62..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_222222_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_222222_256x240.png
deleted file mode 100755
index b273ff1..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-icons_222222_256x240.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_228ef1_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_228ef1_256x240.png
deleted file mode 100755
index a641a37..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-icons_228ef1_256x240.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_3383bb_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_3383bb_256x240.png
deleted file mode 100755
index 905274f..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-icons_3383bb_256x240.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_454545_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_454545_256x240.png
deleted file mode 100755
index 59bd45b..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-icons_454545_256x240.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_70b2e1_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_70b2e1_256x240.png
deleted file mode 100755
index ed8543e..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-icons_70b2e1_256x240.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_999999_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_999999_256x240.png
deleted file mode 100755
index 50ff803..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-icons_999999_256x240.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_ef8c08_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_ef8c08_256x240.png
deleted file mode 100755
index 85e63e9..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-icons_ef8c08_256x240.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_fbc856_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_fbc856_256x240.png
deleted file mode 100755
index 18e65a1..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-icons_fbc856_256x240.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_ffd27a_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_ffd27a_256x240.png
deleted file mode 100755
index e117eff..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-icons_ffd27a_256x240.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_ffffff_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_ffffff_256x240.png
deleted file mode 100755
index 42f8f99..0000000
--- a/src/usr/local/www/javascript/jquery/images/ui-icons_ffffff_256x240.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/jquery-ui-1.11.1.min.js b/src/usr/local/www/javascript/jquery/jquery-ui-1.11.1.min.js
deleted file mode 100644
index 6a4e1d1..0000000
--- a/src/usr/local/www/javascript/jquery/jquery-ui-1.11.1.min.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/*! jQuery UI - v1.11.1 - 2014-09-21
-* http://jqueryui.com
-* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, menu.js, progressbar.js, selectmenu.js, slider.js, spinner.js, tabs.js, tooltip.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.1",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return n=!a&&o.length?e.widget.extend.apply(null,[n].concat(o)):n,a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))}),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.1",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){return e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button?this._mouseUp(t):t.which?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,M=e.extend({},y),N=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?M.left-=d:"center"===n.my[0]&&(M.left-=d/2),"bottom"===n.my[1]?M.top-=c:"center"===n.my[1]&&(M.top-=c/2),M.left+=N[0],M.top+=N[1],a||(M.left=h(M.left),M.top=h(M.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](M,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+N[0],p[1]+N[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-M.left,i=t+m-d,s=v.top-M.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:M.left,top:M.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,e.top+p+f+m>u&&(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,e.top+p+f+m>d&&(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"!==this.options.helper||/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.document[0],s=this.options;try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(n){}return this.helper||s.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(e(s.iframeFix===!0?"iframe":s.iframeFix).each(function(){e("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>").css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(e(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.offsetParentCssPosition=this.offsetParent.css("position"),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.offset.scroll=!1,e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_mouseDrag:function(t,i){if("fixed"===this.offsetParentCssPosition&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return e("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return s.parents("body").length||s.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s[0]===this.element[0]||/(fixed|absolute)/.test(s.css("position"))||s.css("position","absolute"),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t="hidden"!==i.css("overflow"),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}
-},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),"drag"===t&&(this.positionAbs=this._convertPositionTo("absolute")),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=s.options,a=e.extend({},i,{item:s.element});s.sortables=[],e(n.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push({instance:i,shouldRevert:i.options.revert}),i.refreshPositions(),i._trigger("activate",t,a))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});e.each(s.sortables,function(){this.instance.isOver?(this.instance.isOver=0,s.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=this.shouldRevert),this.instance._mouseStop(t),this.instance.options.helper=this.instance.options._helper,"original"===s.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",t,n))})},drag:function(t,i,s){var n=this;e.each(s.sortables,function(){var a=!1,o=this;this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(a=!0,e.each(s.sortables,function(){return this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this!==o&&this.instance._intersectsWith(this.instance.containerCache)&&e.contains(o.instance.element[0],this.instance.element[0])&&(a=!1),a})),a?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=e(n).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return i.helper[0]},t.target=this.instance.currentItem[0],this.instance._mouseCapture(t,!0),this.instance._mouseStart(t,!0,!0),this.instance.offset.click.top=s.offset.click.top,this.instance.offset.click.left=s.offset.click.left,this.instance.offset.parent.left-=s.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=s.offset.parent.top-this.instance.offset.parent.top,s._trigger("toSortable",t),s.dropped=this.instance.element,s.currentItem=s.element,this.instance.fromOutside=s),this.instance.currentItem&&this.instance._mouseDrag(t)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",t,this.instance._uiHash(this.instance)),this.instance._mouseStop(t,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),s._trigger("fromSortable",t),s.dropped=!1)})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left,l=h+s.snapElements[c].width,u=s.snapElements[c].top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top-s.margins.top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top-s.margins.top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left-s.margins.left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left-s.margins.left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top-s.margins.top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top-s.margins.top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left-s.margins.left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left-s.margins.left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.droppable",{version:"1.11.1",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left,o=(t.positionAbs||t.position.absolute).top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=this.element.children(this.handles[i]).first().show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),e(this.handles[i]).length},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=function(t){e(t).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0},h=function(t,s){e(t).each(function(){var t=e(this),n=e(this).data("ui-resizable-alsoresize"),a={},o=s&&s.length?s:t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var i=(n[t]||0)+(r[t]||0);i&&i>=0&&(a[t]=i||null)}),t.css(a)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):e.each(n.alsoResize,function(e,t){h(e,t)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=u-t.height,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.selectable",e.ui.mouse,{version:"1.11.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;
-this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){var e=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===e.axis||this._isFloating(this.items[0].item):!1,this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this));return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-e(document).scrollTop()<o.scrollSensitivity?r=e(document).scrollTop(e(document).scrollTop()-o.scrollSpeed):e(window).height()-(t.pageY-e(document).scrollTop())<o.scrollSensitivity&&(r=e(document).scrollTop(e(document).scrollTop()+o.scrollSpeed)),t.pageX-e(document).scrollLeft()<o.scrollSensitivity?r=e(document).scrollLeft(e(document).scrollLeft()-o.scrollSpeed):e(window).width()-(t.pageX-e(document).scrollLeft())<o.scrollSensitivity&&(r=e(document).scrollLeft(e(document).scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?t.currentItem.children().each(function(){e("<td>&#160;</td>",t.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,e("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(e("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!t){for(this._trigger("beforeStop",e,this._uiHash()),s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!1}if(t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null,!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.accordion",{version:"1.11.1",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide()},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");
-t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr("aria-selected","false"),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true",tabIndex:0,"aria-expanded":"true"})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.length&&(!t.length||e.index()<t.index()),l=this.options.animate||{},u=h&&l.down||l,d=function(){o._toggleComplete(i)};return"number"==typeof u&&(a=u),"string"==typeof u&&(n=u),n=n||u.easing||l.easing,a=a||u.duration||l.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:d,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?r+=i.now:"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,d):e.animate(this.showProps,a,n,d)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.1",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){var i=e(t.currentTarget);i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){function i(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var s,n,a,o,r,h=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:h=!1,n=this.previousFilter||"",a=String.fromCharCode(t.keyCode),o=!1,clearTimeout(this.filterTimer),a===n?o=!0:a=n+a,r=RegExp("^"+i(a),"i"),s=this.activeMenu.find(this.options.items).filter(function(){return r.test(e(this).text())}),s=o&&-1!==s.index(this.active.next())?this.active.nextAll(".ui-menu-item"):s,s.length||(a=String.fromCharCode(t.keyCode),r=RegExp("^"+i(a),"i"),s=this.activeMenu.find(this.options.items).filter(function(){return r.test(e(this).text())})),s.length?(this.focus(t,s),s.length>1?(this.previousFilter=a,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}h&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)}}),e.widget("ui.autocomplete",{version:"1.11.1",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.1",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.1",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.1"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty())
-},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target);return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,M,N,C,A,I,P,z,H,F,E,j,O,W,L=new Date,R=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(e,"isRTL"),B=this._get(e,"showButtonPanel"),J=this._get(e,"hideIfNoPrevNext"),q=this._get(e,"navigationAsDateFormat"),K=this._getNumberOfMonths(e),V=this._get(e,"showCurrentAtPos"),U=this._get(e,"stepMonths"),Q=1!==K[0]||1!==K[1],G=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),X=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-K[0]*K[1]+1,$.getDate())),t=X&&X>t?X:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=q?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-U,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":J?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=q?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+U,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":J?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?G:R,o=q?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;K[0]>w;w++){for(k="",this.maxRows=4,T=0;K[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",M="",Q){if(M+="<div class='ui-datepicker-group",K[1]>1)switch(T){case 0:M+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case K[1]-1:M+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:M+=" ui-datepicker-group-middle",S=""}M+="'>"}for(M+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,X,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",N=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)C=(x+u)%7,N+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[C]+"'>"+p[C]+"</span></th>";for(M+=N+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),I=(this._getFirstDayOfMonth(et,Z)-u+7)%7,P=Math.ceil((I+A)/7),z=Q?this.maxRows>P?this.maxRows:P:P,this.maxRows=z,H=this._daylightSavingAdjust(new Date(et,Z,1-I)),F=0;z>F;F++){for(M+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(H)+"</td>":"",x=0;7>x;x++)j=g?g.apply(e.input?e.input[0]:null,[H]):[!0,""],O=H.getMonth()!==Z,W=O&&!y||!j[0]||X&&X>H||$&&H>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(O?" ui-datepicker-other-month":"")+(H.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===H.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(W?" "+this._unselectableClass+" ui-state-disabled":"")+(O&&!v?"":" "+j[1]+(H.getTime()===G.getTime()?" "+this._currentClass:"")+(H.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(O&&!v||!j[2]?"":" title='"+j[2].replace(/'/g,"&#39;")+"'")+(W?"":" data-handler='selectDay' data-event='click' data-month='"+H.getMonth()+"' data-year='"+H.getFullYear()+"'")+">"+(O&&!v?"&#xa0;":W?"<span class='ui-state-default'>"+H.getDate()+"</span>":"<a class='ui-state-default"+(H.getTime()===R.getTime()?" ui-state-highlight":"")+(H.getTime()===G.getTime()?" ui-state-active":"")+(O?" ui-priority-secondary":"")+"' href='#'>"+H.getDate()+"</a>")+"</td>",H.setDate(H.getDate()+1),H=this._daylightSavingAdjust(H);M+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),M+="</tbody></table>"+(Q?"</div>"+(K[0]>0&&T===K[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=M}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.1",e.datepicker,e.widget("ui.dialog",{version:"1.11.1",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;
-e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0;if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.progressbar",{version:"1.11.1",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectmenu",{version:"1.11.1",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this,i=this.element.attr("tabindex");this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:i||this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(e){e.preventDefault()},click:"_toggle",keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.attr("value"),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"min":case"max":this._animateOff=!0,this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.spinner",{version:"1.11.1",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;
-return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.1",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.success(function(e){setTimeout(function(){o.html(e),s._trigger("load",i,r)},1)}).complete(function(e,t){setTimeout(function(){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.1",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){e.data("ui-tooltip-open")&&n._delay(function(){t&&(t.type=a),this._open(t,e,i)})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,a.is(":hidden")||a.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i),a.length)return a.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),this._addDescribedBy(i,a.attr("id")),a.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):a.position(e.extend({of:i},this.options.position)),this.hiding=!1,this.closing=!1,a.hide(),this._show(a,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){a.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:a}),o={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}},i[0]!==this.element[0]&&(o.remove=function(){this._removeTooltip(a)}),t&&"mouseover"!==t.type||(o.mouseleave="close"),t&&"focusin"!==t.type||(o.focusout="close"),this._on(!0,i,o)}},close:function(t){var i=this,s=e(t?t.currentTarget:this.element),n=this._find(s);this.closing||(clearInterval(this.delayedShow),s.data("ui-tooltip-title")&&!s.attr("title")&&s.attr("title",s.data("ui-tooltip-title")),this._removeDescribedBy(s),this.hiding=!0,n.stop(!0),this._hide(n,this.options.hide,function(){i._removeTooltip(e(this)),this.hiding=!1,this.closing=!1}),s.removeData("ui-tooltip-open"),this._off(s,"mouseleave focusout keyup"),s[0]!==this.element[0]&&this._off(s,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,s){e(s.element).attr("title",s.title),delete i.parents[t]}),this.closing=!0,this._trigger("close",t,{tooltip:n}),this.hiding||(this.closing=!1))},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]=t,i},_find:function(t){var i=t.data("ui-tooltip-id");return i?e("#"+i):e()},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s[0],t.close(n,!0),e("#"+i).remove(),s.data("ui-tooltip-title")&&(s.attr("title")||s.attr("title",s.data("ui-tooltip-title")),s.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}});var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.1",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)
-},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})}}); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/load_balancer_pool_edit/pool.js b/src/usr/local/www/javascript/load_balancer_pool_edit/pool.js
deleted file mode 100644
index 98e317c..0000000
--- a/src/usr/local/www/javascript/load_balancer_pool_edit/pool.js
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- pool.js
- part of pfSense (https://www.pfsense.org/)
-
- Copyright (C) 2005-2008 Bill Marquette <bill.marquette@gmail.com>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/* Add server to virtual server pool
- * operates on whatever form is passed to it
- */
-function AddServerToPool(form) {
- var ServerPort = form.ipaddr.value;
- form['servers[]'].options[form['servers[]'].options.length] = new Option(ServerPort,ServerPort);
-}
-
-
-function AllServers(id, selectAll) {
- var opts = document.getElementById(id).getElementsByTagName('option');
- for (i = 0; i < opts.length; i++)
- {
- opts[i].selected = selectAll;
- }
-}
-
-
-function RemoveServerFromPool(form, field)
-{
- var theSel = form[field];
- var selIndex = theSel.selectedIndex;
- if (selIndex != -1) {
- for(i=theSel.length-1; i>=0; i--)
- {
- if(theSel.options[i].selected)
- {
- theSel.options[i] = null;
- }
- }
- if (theSel.length > 0) {
- theSel.selectedIndex = selIndex == 0 ? 0 : selIndex - 1;
- }
- }
-}
-
-function addOption(theSel, theText, theValue)
-{
- var newOpt = new Option(theText, theValue);
- var selLength = theSel.length;
- theSel.options[selLength] = newOpt;
-}
-
-function deleteOption(theSel, theIndex)
-{
- var selLength = theSel.length;
- if(selLength>0)
- {
- theSel.options[theIndex] = null;
- }
-}
-
-function moveOptions(theSelFrom, theSelTo)
-{
- var selLength = theSelFrom.length;
- var selectedText = new Array();
- var selectedValues = new Array();
- var selectedCount = 0;
-
- var i;
-
- // Find the selected Options in reverse order
- // and delete them from the 'from' Select.
- for(i=selLength-1; i>=0; i--)
- {
- if(theSelFrom.options[i].selected)
- {
- selectedText[selectedCount] = theSelFrom.options[i].text;
- selectedValues[selectedCount] = theSelFrom.options[i].value;
- deleteOption(theSelFrom, i);
- selectedCount++;
- }
- }
-
- // Add the selected text/values in reverse order.
- // This will add the Options to the 'to' Select
- // in the same order as they were in the 'from' Select.
- for(i=selectedCount-1; i>=0; i--)
- {
- addOption(theSelTo, selectedText[i], selectedValues[i]);
- }
-}
-
-function checkPoolControls() {
- var active = document.iform.serversSelect;
- var inactive = document.iform.serversDisabledSelect;
- if (jQuery("#mode").val() == "failover") {
- if (jQuery("#serversSelect option").length > 0) {
- jQuery("#moveToEnabled").prop("disabled",true);
- } else {
- jQuery("#moveToEnabled").prop("disabled",false);
- }
- } else {
- jQuery("#moveToEnabled").prop("disabled",false);
- }
-}
-
-function enforceFailover() {
- if (jQuery("#mode").val() != "failover") {
- return;
- }
- var active = document.iform.serversSelect;
- var inactive = document.iform.serversDisabledSelect;
- var count = 0;
- var moveText = new Array();
- var moveVals = new Array();
- var i;
- if (active.length > 1) {
- // Move all but one entry to the disabled list
- for (i=active.length-1; i>0; i--) {
- moveText[count] = active.options[i].text;
- moveVals[count] = active.options[i].value;
- deleteOption(active, i);
- count++;
- }
- for (i=count-1; i>=0; i--) {
- addOption(inactive, moveText[i], moveVals[i]);
- }
- }
-}
-
-// functions up() and down() modified from http://www.babailiica.com/js/sorter/
-
-function up(obj) {
- var sel = new Array();
- for (var i=0; i<obj.length; i++) {
- if (obj[i].selected == true) {
- sel[sel.length] = i;
- }
- }
- for (i in sel) {
- if (sel[i] != 0 && !obj[sel[i]-1].selected) {
- var tmp = new Array(obj[sel[i]-1].text, obj[sel[i]-1].value);
- obj[sel[i]-1].text = obj[sel[i]].text;
- obj[sel[i]-1].value = obj[sel[i]].value;
- obj[sel[i]].text = tmp[0];
- obj[sel[i]].value = tmp[1];
- obj[sel[i]-1].selected = true;
- obj[sel[i]].selected = false;
- }
- }
-}
-
-function down(obj) {
- var sel = new Array();
- for (var i=obj.length-1; i>-1; i--) {
- if (obj[i].selected == true) {
- sel[sel.length] = i;
- }
- }
- for (i in sel) {
- if (sel[i] != obj.length-1 && !obj[sel[i]+1].selected) {
- var tmp = new Array(obj[sel[i]+1].text, obj[sel[i]+1].value);
- obj[sel[i]+1].text = obj[sel[i]].text;
- obj[sel[i]+1].value = obj[sel[i]].value;
- obj[sel[i]].text = tmp[0];
- obj[sel[i]].value = tmp[1];
- obj[sel[i]+1].selected = true;
- obj[sel[i]].selected = false;
- }
- }
-}
diff --git a/src/usr/local/www/javascript/load_balancer_relay_protocol_edit/load_balancer_relay_protocol_edit.js b/src/usr/local/www/javascript/load_balancer_relay_protocol_edit/load_balancer_relay_protocol_edit.js
deleted file mode 100644
index 6c44272..0000000
--- a/src/usr/local/www/javascript/load_balancer_relay_protocol_edit/load_balancer_relay_protocol_edit.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- pool.js
- part of pfSense (https://www.pfsense.org/)
-
- Copyright (C) 2005-2008 Bill Marquette <bill.marquette@gmail.com>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/*
- * This code makes use of prototype shortcuts and will not work
- * without prototype being loaded prior to it.
- */
-
-function copyOption(theSrc, theDst)
-{
- var selOption = theSrc[theSrc.selectedIndex];
- theDst.options[theDst.length] = new Option(selOption.text, selOption.value);
-}
-
-function deleteOption(theSel)
-{
- var theIndex = theSel.selectedIndex;
- var selLength = theSel.length;
- if(selLength>0)
- {
- theSel.options[theIndex] = null;
- }
-}
-
-function AllOptions(el, selectAll) {
- el.select('option').each(function(opt) {
- opt.selected = selectAll;
- });
-}
-
diff --git a/src/usr/local/www/javascript/niftyjsCode.js b/src/usr/local/www/javascript/niftyjsCode.js
deleted file mode 100644
index 75ef8b0..0000000
--- a/src/usr/local/www/javascript/niftyjsCode.js
+++ /dev/null
@@ -1,174 +0,0 @@
-function NiftyCheck(){
-if(!document.getElementById || !document.createElement)
- return(false);
-isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
-if(Array.prototype.push==null){Array.prototype.push=function(){
- this[this.length]=arguments[0]; return(this.length);};}
-return(true);
-}
-
-function Rounded(selector,wich,bk,color,opt){
-var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
-
-if(color=="transparent"){
- cn=cn+"x";
- ecolor=bk;
- bk="transparent";
- }
-else if(opt && opt.indexOf("border")>=0){
- var optar=opt.split(" ");
- for(i=0;i<optar.length;i++)
- if(optar[i].indexOf("#")>=0) ecolor=optar[i];
- if(ecolor=="") ecolor="#666";
- cn+="e";
- edges=true;
- }
-else if(opt && opt.indexOf("smooth")>=0){
- cn+="a";
- ecolor=Mix(bk,color);
- }
-if(opt && opt.indexOf("small")>=0) cn+="s";
-prefixt=cn;
-prefixb=cn;
-if(wich.indexOf("all")>=0){t=true;b=true;}
-else if(wich.indexOf("top")>=0) t="true";
-else if(wich.indexOf("tl")>=0){
- t="true";
- if(wich.indexOf("tr")<0) prefixt+="l";
- }
-else if(wich.indexOf("tr")>=0){
- t="true";
- prefixt+="r";
- }
-if(wich.indexOf("bottom")>=0) b=true;
-else if(wich.indexOf("bl")>=0){
- b="true";
- if(wich.indexOf("br")<0) prefixb+="l";
- }
-else if(wich.indexOf("br")>=0){
- b="true";
- prefixb+="r";
- }
-var v=getElementsBySelector(selector);
-var l=v.length;
-for(i=0;i<l;i++){
- if(edges) AddBorder(v[i],ecolor);
- if(t) AddTop(v[i],bk,color,ecolor,prefixt);
- if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
- }
-}
-
-function AddBorder(el,bc){
-var i;
-if(!el.passed){
- if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
- var t=el.firstChild.nodeValue;
- el.removeChild(el.lastChild);
- var d=CreateEl("span");
- d.style.display="block";
- d.appendChild(document.createTextNode(t));
- el.appendChild(d);
- }
- for(i=0;i<el.childNodes.length;i++){
- if(el.childNodes[i].nodeType==1){
- el.childNodes[i].style.borderLeft="1px solid "+bc;
- el.childNodes[i].style.borderRight="1px solid "+bc;
- }
- }
- }
-el.passed=true;
-}
-
-function AddTop(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=1;i<=lim;i++){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingTop=0;
-el.insertBefore(d,el.firstChild);
-}
-
-function AddBottom(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=lim;i>0;i--){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingBottom=0;
-el.appendChild(d);
-}
-
-function CreateEl(x){
-if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
-else return(document.createElement(x));
-}
-
-function getElementsBySelector(selector){
-var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
-
-if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
- s=selector.split(" ");
- var fs=s[0].split("#");
- if(fs.length==1) return(objlist);
- f=document.getElementById(fs[1]);
- if(f) return(f.getElementsByTagName(s[1]));
- return(objlist);
- }
-if(selector.indexOf("#")>0){ //id selector like "tag#id"
- s=selector.split("#");
- tag=s[0];
- selid=s[1];
- }
-if(selid!=""){
- f=document.getElementById(selid);
- if(f) objlist.push(f);
- return(objlist);
- }
-if(selector.indexOf(".")>0){ //class selector like "tag.class"
- s=selector.split(".");
- tag=s[0];
- selclass=s[1];
- }
-var v=document.getElementsByTagName(tag); // tag selector like "tag"
-if(selclass=="")
- return(v);
-for(i=0;i<v.length;i++){
- if(v[i].className.indexOf(selclass)>=0){
- objlist.push(v[i]);
- }
- }
-return(objlist);
-}
-
-function Mix(c1,c2){
-var i,step1,step2,x,y,r=new Array(3);
-if(c1.length==4)step1=1;
-else step1=2;
-if(c2.length==4) step2=1;
-else step2=2;
-for(i=0;i<3;i++){
- x=parseInt(c1.substr(1+step1*i,step1),16);
- if(step1==1) x=16*x+x;
- y=parseInt(c2.substr(1+step2*i,step2),16);
- if(step2==1) y=16*y+y;
- r[i]=Math.floor((x*50+y*50)/100);
- }
-return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
-} \ No newline at end of file
diff --git a/src/usr/local/www/javascript/numericupdown/css/numericupdown.css b/src/usr/local/www/javascript/numericupdown/css/numericupdown.css
deleted file mode 100644
index 429619b..0000000
--- a/src/usr/local/www/javascript/numericupdown/css/numericupdown.css
+++ /dev/null
@@ -1,40 +0,0 @@
-.buttonInc,
-.buttonDec
- {
- margin:0;
- padding:0;
- width:11px;
- height:8px;
- vertical-align:top;
- background-color:#ccc;
- text-indent:-999px;
- overflow:hidden;
- background:#ccc url(../images/up.gif) no-repeat 50% 50%;
- border-top:1px solid #eee;
- border-left:1px solid #eee;
- border-bottom:1px solid #777;
- border-right:1px solid #777;
- voice-family: inherit;
- height:9px;
- }
-html>body .buttonInc,
-html>body .buttonDec
- {
- height:9px;
- }
-.buttonDec
- {
- margin:9px 0 0 -11px;
- background:#ccc url(../images/down.gif) no-repeat 50% 50%;
- voice-family: inherit;
- margin:10px 0 0 -11px;
- }
-html>body .buttonDec
- {
- margin:10px 0 0 -11px;
- }
-button
- {
- font-family:monospace;
- line-height:1em;
- }
diff --git a/src/usr/local/www/javascript/numericupdown/images/down.gif b/src/usr/local/www/javascript/numericupdown/images/down.gif
deleted file mode 100755
index 278664a..0000000
--- a/src/usr/local/www/javascript/numericupdown/images/down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/numericupdown/images/up.gif b/src/usr/local/www/javascript/numericupdown/images/up.gif
deleted file mode 100755
index ad33679..0000000
--- a/src/usr/local/www/javascript/numericupdown/images/up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/javascript/numericupdown/js/numericupdown.js b/src/usr/local/www/javascript/numericupdown/js/numericupdown.js
deleted file mode 100644
index a6af0d4..0000000
--- a/src/usr/local/www/javascript/numericupdown/js/numericupdown.js
+++ /dev/null
@@ -1,287 +0,0 @@
-// As usual, we keep the generic functions out of the namespace
-function addEvent(obj, evType, fn, useCapture){
- if (obj.addEventListener){
- obj.addEventListener(evType, fn, useCapture);
- return true;
- } else if (obj.attachEvent){
- var r = obj.attachEvent("on"+evType, fn);
- return r;
- }
- return false;
-}
-
-function removeEvent(obj, evType, fn, useCapture){
- if (obj.removeEventListener){
- obj.removeEventListener(evType, fn, useCapture);
- return true;
- } else if (obj.detachEvent){
- var r = obj.detachEvent("on"+evType, fn);
- return r;
- }
- return false;
-}
-
-if(!String.prototype.trim) String.prototype.trim = function() { return this.replace(/^\s*/,'').replace(/\s*$/, ''); };
-
-var incrementalInputController;
-
-// Encapsulate the Timer and incrementalInput objects
-(function() {
-
-// WEBFX Timer : http://www.webfx.com/
-function Timer(nPauseTime) {
- this._pauseTime = typeof nPauseTime == "undefined" ? 1000 : nPauseTime;
- this._timer = null;
- this._isStarted = false;
-}
-
-Timer.prototype.start = function () {
- if (this.isStarted())
- this.stop();
- var oThis = this;
- this._timer = window.setTimeout(function () {
- if (typeof oThis.ontimer == "function")
- oThis.ontimer();
- }, this._pauseTime);
- this._isStarted = false;
-};
-
-Timer.prototype.stop = function () {
- if (this._timer != null)
- window.clearTimeout(this._timer);
- this._isStarted = false;
-};
-
-Timer.prototype.isStarted = function () {
- return this._isStarted;
-};
-
-Timer.prototype.getPauseTime = function () {
- return this._pauseTime;
-};
-
-Timer.prototype.setPauseTime = function (nPauseTime) {
- this._pauseTime = nPauseTime;
-};
-
-function incrementalInput(inp, range, increment, classInc, classDec) {
- if(!inp || !range) return;
-
- this._inp = inp;
- this._buttonInc;
- this._buttonDec;
- this._value;
- this._classInc = classInc;
- this._classDec = classDec;
- this._minv = Number(range[0]);
- this._maxv = Number(range[1]);
- this._incBase = Number(increment) || 1;
- this._precision = 0;
- if(increment.indexOf('.') != -1) {
- this._precision = increment.substr(increment.indexOf('.')+1, increment.length);
- this._precision = this._precision.length;
- }
-
- this._increment;
- this._timerInc = 1000;
- this._timer = new Timer(1000);
- this._stop = false;
- this._key = false;
-
- this._events = {
-
- dec: function(e) {
- self._increment = -self._incBase;
- self.updateValue();
- return false;
- },
- inc: function(e) {
- self._increment = self._incBase;
- self.updateValue();
- return false;
- },
- keydec: function(e) {
- var kc;
- if (!e) var e = window.event;
-
- if (e.keyCode) kc = e.keyCode;
- else if (e.charCode) kc = e.charCode;
-
- if ( kc != 13 || self._key ) return true;
-
- self._key = true;
- self._increment = -self._incBase;
- self._timerInc = 1000;
- self.updateValue();
- return false;
- },
- keyinc: function(e) {
- var kc;
- if (!e) var e = window.event;
-
- if (e.keyCode) kc = e.keyCode;
- else if (e.charCode) kc = e.charCode;
-
- if ( kc != 13 || self._key ) return true;
-
- self._key = true;
- self._increment = self._incBase;
- self._timerInc = 1000;
- self.updateValue();
- return false;
- },
- clearTimer: function(e) {
- self._key = false;
- self._events.stopTimer();
- },
- stopTimer: function(e) {
- self._timer.stop();
- self._timerInc = 1000;
- self._timer.setPauseTime(self._timerInc);
- },
- onchange: function(e){
- var value = Number(parseFloat(self._inp.value).toFixed(self._precision));
-
- if( Number(value % self._incBase).toFixed(self._precision) != self._incBase ) {
- value -= Number(parseFloat(value % self._incBase)).toFixed(self._precision);
- };
- if(value < self._minv) value = self._minv;
- else if(value > self._maxv) value = self._maxv;
- self._inp.value = parseFloat(value).toFixed(self._precision);
- }
- };
-
- this.updateValue = function() {
- if(self._inp.disabled) {
- stopTimer();
- return;
- }
-
-
- var value = Number(parseFloat(self._inp.value).toFixed(self._precision));
- var stop = self._timerInc == 0 ? true : false;
-
- if( Math.abs(Number(value % self._incBase).toFixed(self._precision)) != self._incBase ) {
- value -= Number(parseFloat(value % self._incBase)).toFixed(self._precision);
- }
-
- value += Number(parseFloat(self._increment).toFixed(self._precision));
-
- if(value < self._minv) {
- value = self._minv;
- stop = true;
- } else if(value > self._maxv) {
- value = self._maxv;
- stop = true;
- }
-
- self._inp.value = parseFloat(value).toFixed(self._precision);
-
- if(self._timerInc > 50) {
- self._timerInc = 50 + Math.round(((self._timerInc - 50) / 1.8));
- }
-
- self._timer.setPauseTime(self._timerInc);
- if(!stop) self._timer.start();
- };
-
- this.construct = function() {
- var h = self._inp.offsetHeight;
-
- self._inp.onchange = self._events.onchange;
-
- self._buttonInc = document.createElement('button');
- self._buttonDec = document.createElement('button');
-
- if(self._classDec) self._buttonDec.className = self._classDec;
- if(self._classInc) self._buttonInc.className = self._classInc;
-
- self._buttonDec.setAttribute('type','button');
- self._buttonInc.setAttribute('type','button');
-
- self._buttonDec.appendChild(document.createTextNode('-'));
- self._buttonInc.appendChild(document.createTextNode('+'));
-
- self._buttonDec.onmousedown = self._events.dec;
- self._buttonInc.onmousedown = self._events.inc;
-
- addEvent(self._buttonDec, "keypress", self._events.keydec, true);
- addEvent(self._buttonDec, "keyup", self._events.clearTimer, true);
- addEvent(self._buttonInc, "keypress", self._events.keyinc, true);
- addEvent(self._buttonInc, "keyup", self._events.clearTimer, true);
-
- self._buttonInc.onmouseout = self._events.stopTimer;
- self._buttonDec.onmouseout = self._events.stopTimer;
-
- addEvent(document, 'mouseup', self._events.stopTimer, false);
-
- if(self._inp.nextSibling) {
- self._inp.parentNode.insertBefore( self._buttonDec, self._inp.nextSibling );
- self._inp.parentNode.insertBefore( self._buttonInc, self._inp.nextSibling );
- } else {
- self._inp.parentNode.appendChild( self._buttonInc );
- self._inp.parentNode.appendChild( self._buttonDec );
- };
- };
-
- var self = this;
-
- self._timer.ontimer = function() { self.updateValue(); };
- self.construct();
-}
-
-incremetalInputController = {
- inputCollection: [],
- constructor: function() {
-
- if(!document.getElementById || !document.createElement) return;
-
- // TODO : cut the regExps down to readable levels - they are hideous at present...
- var regExp_1 = /fd_incremental_inp_range_([-]{0,1}[0-9]+(f[0-9]+){0,1}){1}_([-]{0,1}[0-9]+(f[0-9]+){0,1}){1}/ig;
- var regExp_2 = /fd_increment_([0-9]+(f[0-9]+){0,1}){1}/ig;
- var regExp_3 = /fd_classname_inc_([\-_0-9a-zA-Z]+){1}/ig;
- var regExp_4 = /fd_classname_dec_([\-_0-9a-zA-Z]+){1}/ig;
-
- var inputCollection = document.getElementsByTagName('input');
- var obj, range, classname, classes, classInc, classDec, increment;
-
- for(var i = 0, inp; inp = inputCollection[i]; i++) {
- if(inp.type == 'text' && inp.className && inp.className.search(regExp_1) != -1) {
- classes = inp.className.split(' ');
- increment = 1;
- range = [0,0];
- classInc = "";
- classDec = "";
-
- for(var z = 0, classname; classname = classes[z]; z++) {
- if(classname.search(regExp_1) != -1) {
- range = classname.trim();
- range = range.replace(/fd_incremental_inp_range_/ig, '');
- range = range.replace(/f/g,'.');
- range = range.split('_');
- } else if(classname.search(regExp_2) != -1) {
- increment = classname.trim();
- increment = increment.replace(/fd_increment_/ig, '');
- increment = increment.replace('f','.');
- } else if(classname.search(regExp_3) != -1) {
- classInc = classname.trim();
- classInc = classInc.replace(/fd_classname_inc_/ig, '');
- } else if(classname.search(regExp_4) != -1) {
- classDec = classname.trim();
- classDec = classDec.replace(/fd_classname_dec_/ig, '');
- }
- }
-
- if (inp.value.length == 0 || isNaN(inp.value) == true) { inp.value = 0; }
-
- obj = new incrementalInput(inp, range, increment, classInc, classDec);
- incremetalInputController.inputCollection.push(obj);
- }
- }
- }
-};
-
-// Close and call anonymous function
-})();
-
-addEvent(window, 'load', incremetalInputController.constructor, true); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/pi.js b/src/usr/local/www/javascript/pi.js
deleted file mode 100644
index 8a3a3c3..0000000
--- a/src/usr/local/www/javascript/pi.js
+++ /dev/null
@@ -1,682 +0,0 @@
-(function(_scope){
-
- /*
- * pi.js
- * 1.0
- * Azer Koçulu <http://azer.kodfabrik.com>
- * http://pi-js.googlecode.com
- */
-
- _scope.pi = Object(3.14159265358979323846);
- var pi = _scope.pi;
- pi.version = 1.0;
-
- pi.env = {
- ie: /MSIE/i.test(navigator.userAgent),
- ie6: /MSIE 6/i.test(navigator.userAgent),
- ie7: /MSIE 7/i.test(navigator.userAgent),
- ie8: /MSIE 8/i.test(navigator.userAgent),
- firefox: /Firefox/i.test(navigator.userAgent),
- opera: /Opera/i.test(navigator.userAgent),
- webkit: /Webkit/i.test(navigator.userAgent)
- };
-
- pi.util = {
- IsArray:function(_object){
- return _object && _object != window && ( _object instanceof Array || ( typeof _object.length == "number" && typeof _object.item =="function" ) );
- },
- IsHash:function(_object){
- return _object && typeof _object=="object"&&(_object==window||_object instanceof Object)&&!_object.nodeName&&!pi.util.IsArray(_object);
- },
- DOMContentLoaded:[],
- AddEvent: function(_element,_eventName,_fn,_useCapture){
- _element[pi.env.ie.toggle("attachEvent","addEventListener")](pi.env.ie.toggle("on","")+_eventName,_fn,_useCapture||false);
- return pi.util.AddEvent.curry(this,_element);
- },
- RemoveEvent: function(_element,_eventName,_fn,_useCapture){
- return _element[pi.env.ie.toggle("detachEvent","removeEventListener")](pi.env.ie.toggle("on","")+_eventName,_fn,_useCapture||false);
- },
- GetWindowSize:function(){
- return {
- height:pi.env.ie?Math.max(document.documentElement.clientHeight,document.body.clientHeight):window.innerHeight,
- width:pi.env.ie?Math.max(document.documentElement.clientWidth,document.body.clientWidth):window.innerWidth
- };
- },
- Include:function(_url,_callback){
- var script = new pi.element("script").attribute.set("src",_url), callback = _callback||new Function, done = false, head = pi.get.byTag("head")[0];
- script.environment.getElement().onload = script.environment.getElement().onreadystatechange = function(){
- if(!done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")){
- callback.call(this);
- done = true;
- head.removeChild(script.environment.getElement());
- }
- };
- script.insert(head);
- },
- Element:{
- addClass:function(_element,_class){
- if( !pi.util.Element.hasClass(_element,_class) )
- pi.util.Element.setClass(_element, pi.util.Element.getClass(_element) + " " + _class );
- },
- getClass:function(_element){
- return _element.getAttribute(pi.env.ie.toggle("className","class"))||"";
- },
- hasClass:function(_element,_class){
- return pi.util.Element.getClass(_element).split(" ").indexOf(_class)>-1;
- },
- removeClass:function(_element,_class){
- if( pi.util.Element.hasClass(_element,_class) )
- pi.util.Element.setClass(
- _element,
- pi.util.Element.getClass(_element,_class).split(" ").removeValue(_class).join(" ")
- );
- },
- setClass:function(_element,_value){
- _element.setAttribute( pi.env.ie.toggle("className","class"), _value );
- },
- toggleClass:function(){
- if(pi.util.Element.hasClass.apply(this,arguments))
- pi.util.Element.removeClass.apply(this,arguments);
- else
- pi.util.Element.addClass.apply(this,arguments);
- },
- getOpacity:function(_styleObject){
- var styleObject = _styleObject;
- if(!pi.env.ie)
- return styleObject["opacity"];
-
- var alpha = styleObject["filter"].match(/opacity\=(\d+)/i);
- return alpha?alpha[1]/100:1;
- },
- setOpacity:function(_element,_value){
- if(!pi.env.ie)
- return pi.util.Element.addStyle(_element,{ "opacity":_value });
- _value*=100;
- pi.util.Element.addStyle(_element,{ "filter":"alpha(opacity="+_value+")" });
- return this._parent_;
- },
- getPosition:function(_element){
- var parent = _element,offsetLeft = 0, offsetTop = 0, view = pi.util.Element.getView(_element);
- while(parent&&parent!=document.body&&parent!=document.firstChild){
- offsetLeft +=parseInt(parent.offsetLeft);
- offsetTop += parseInt(parent.offsetTop);
- parent = parent.offsetParent;
- };
- return {
- "bottom":view["bottom"],
- "left":view["left"],
- "marginTop":view["marginTop"],
- "marginLeft":view["marginLeft"],
- "offsetLeft":offsetLeft,
- "offsetTop":offsetTop,
- "position":view["position"],
- "right":view["right"],
- "top":view["top"],
- "z-index":view["zIndex"]
- };
- },
- getSize:function(_element){
- var view = pi.util.Element.getView(_element);
- return {
- "height":view["height"],
- "offsetHeight":_element.offsetHeight,
- "offsetWidth":_element.offsetWidth,
- "width":view["width"]
- };
- },
- addStyle:function(_element,_style){
- for(var key in _style){
- key = key=="float"?pi.env.ie.toggle("styleFloat","cssFloat"):key;
- if (key == "opacity" && pi.env.ie) {
- pi.util.Element.setOpacity(_element,_style[key]);
- continue;
- }
- _element.style[key] = _style[key];
- }
- },
- getStyle:function(_element,_property){
- _property = _property=="float"?pi.env.ie.toggle("styleFloat","cssFloat"):_property;
- if(_property=="opacity"&&pi.env.ie)
- return pi.util.Element.getOpacity(_element.style);
- return typeof _property=="string"?_element.style[_property]:_element.style;
- },
- getView:function(_element,_property){
- var view = document.defaultView?document.defaultView.getComputedStyle(_element,null):_element.currentStyle;
- _property = _property=="float"?pi.env.ie.toggle("styleFloat","cssFloat"):_property;
- if(_property=="opacity"&&pi.env.ie)
- return pi.util.Element.getOpacity(_element,view);
- return typeof _property=="string"?view[_property]:view;
- }
- },
- CloneObject:function(_object,_fn){
- var tmp = {};
- for(var key in _object)
- {
- if( pi.util.IsArray( _object[key] ) ){
- tmp[key] = Array.prototype.clone.apply( _object[key] );
- } else
- if( pi.util.IsHash( _object[key] ) ){
- tmp[ key ] = pi.util.CloneObject(_object[key]);
- if(_fn)_fn.call(tmp,key,_object);
- } else
- tmp[key] = _object[key];
- }
- return tmp;
- },
- MergeObjects:function(_object,_source){
- for(var key in _source){
- var value = _source[key];
- if (pi.util.IsArray(_source[key])) {
- if(pi.util.IsArray( _object[key] )){
- Array.prototype.push.apply( _source[key], _object[key] );
- }
- else
- value = _source[key].clone();
- }
- else
- if (pi.util.IsHash(_source[key])) {
- if (pi.util.IsHash(_object[key])) {
- value = pi.util.MergeObjects(_object[key], _source[key]);
- } else {
- value = pi.util.CloneObject( _source[key] );
- }
- }
- _object[key] = value;
- };
- return _object;
- }
- };
-
- pi.get = function(){
- return document.getElementById(arguments[0]);
- };
- pi.get.byTag = function(){
- return document.getElementsByTagName(arguments[0]);
- };
- pi.get.byClass = function(){ return document.getElementsByClassName.apply(document,arguments); };
-
- pi.base = function(){
- this.body = {};
- this.constructor = null;
-
- this.build = function(_skipClonning){
- var base = this, skipClonning = _skipClonning||false, _private = {},
- fn = function(){
- var _p = pi.util.CloneObject(_private);
- if(!skipClonning){
- for(var key in this){
-
- if(pi.util.IsArray( this[ key ] ) ){
- this[key] = Array.prototype.clone.apply( this[key] );
- } else
- if( pi.util.IsHash(this[key]) ){
- this[key] = pi.util.CloneObject(
- this[ key ],
- function(_key,_object){
- this[ _key ]._parent_ = this;
- }
- );
- this[key]._parent_ = this;
- }
- }
- };
- base.createAccessors( _p, this );
- if(base.constructor)
- return base.constructor.apply(this,arguments);
- return this;
- };
- this.movePrivateMembers(this.body,_private);
- if(this.constructor){
- fn["$Constructor"] = this.constructor;
- }
- fn.prototype = this.body;
- return fn;
- };
-
- this.createAccessors = function(_p, _branch){
- var getter = function(_property){ return this[_property]; },
- setter = function(_property,_value){ this[_property] = _value; return _branch._parent_||_branch; };
-
- for (var name in _p) {
- var isPrivate = name.substring(0, 1) == "_", title = name.substring(1, 2).toUpperCase() + name.substring(2);
- if (isPrivate) {
- _branch["get" + title] = getter.curry(_p,name);
- _branch["set" + title] = setter.curry(_p,name);
- }
- else
- if (pi.util.IsHash(_p[name])){
- if(!_branch[name])
- _branch[name] = {};
- this.createAccessors(_p[name], _branch[name]);
- }
- };
- };
-
- this.movePrivateMembers = function(_object, _branch){
- for (var name in _object) {
- var isPrivate = name.substring(0, 1) == "_";
-
- if (isPrivate) {
- _branch[name] = _object[name];
- delete _object[name];
- }
- else
- if (pi.util.IsHash(_object[name])){
- _branch[name] = {};
- this.movePrivateMembers(_object[name], _branch[name]);
- }
- };
- };
- };
-
- Function.prototype.extend = function(_prototype,_skipClonning){
- var object = new pi.base, superClass = this;
- if(_prototype["$Constructor"]){
- object.constructor = _prototype["$Constructor"];
- delete _prototype["$Constructor"];
- };
-
- object.body = superClass==pi.base?_prototype:pi.util.MergeObjects(_prototype,superClass.prototype,2);
- object.constructor=object.constructor||function(){
- if(superClass!=pi.base)
- superClass.apply(this,arguments);
- };
-
- return object.build(_skipClonning);
- };
-
- Function.prototype.curry = function(_scope){
- var fn = this, scope = _scope||window, args = Array.prototype.slice.call(arguments,1);
- return function(){
- return fn.apply(scope,args.concat( Array.prototype.slice.call(arguments,0) ));
- };
- };
-
- pi.element = pi.base.extend({
- "$Constructor":function(_tag){
- this.environment.setElement(document.createElement(_tag||"DIV"));
- this.environment.getElement().pi = this;
- return this;
- },
- "clean":function(){
- var childs = this.child.get();
- while(childs.length){
- childs[0].parentNode.removeChild(childs[0]);
- }
- },
- "clone":function(_deep){
- return this.environment.getElement().cloneNode(_deep);
- },
- "insert":function(_element){
- _element = _element.environment?_element.environment.getElement():_element;
- _element.appendChild(this.environment.getElement());
- return this;
- },
- "insertAfter":function(_referenceElement){
- _referenceElement = _referenceElement.environment?_referenceElement.environment.getElement():_referenceElement;
- _referenceElement.nextSibling?this.insertBefore(_referenceElement.nextSibling):this.insert(_referenceElement.parentNode);
- return this;
- },
- "insertBefore":function(_referenceElement){
- _referenceElement = _referenceElement.environment?_referenceElement.environment.getElement():_referenceElement;
- _referenceElement.parentNode.insertBefore(this.environment.getElement(),_referenceElement);
- return this;
- },
- "query":function(_expression,_resultType,namespaceResolver,_result){
- return pi.xpath(_expression,_resultType||"ORDERED_NODE_SNAPSHOT_TYPE",this.environment.getElement(),_namespaceResolver,_result);
- },
- "remove":function(){
- this.environment.getParent().removeChild(
- this.environment.getElement()
- );
- },
- "update":function(_value){
- ["textarea","input"].indexOf(this.environment.getName())>-1?
- (this.environment.getElement().value = _value):
- (this.environment.getElement().innerHTML = _value);
- return this;
- },
- "attribute":{
- "getAll":function(_name){
- return this._parent_.environment.getElement().attributes;
- },
- "clear":function(_name){
- this.set(_name,"");
- return this._parent_;
- },
- "get":function(_name){
- return this._parent_.environment.getElement().getAttribute(_name);
- },
- "has":function(_name){
- return pi.env.ie?(this.get(_name)!=null):this._parent_.environment.getElement().hasAttribute(_name);
- },
- "remove":function(_name){
- this._parent_.environment.getElement().removeAttribute(_name);
- return this._parent_;
- },
- "set":function(_name,_value){
- this._parent_.environment.getElement().setAttribute(_name,_value);
- return this._parent_;
- },
- "addClass":function(_classes){
- for (var i = 0; i < arguments.length; i++) {
- pi.util.Element.addClass(this._parent_.environment.getElement(),arguments[i]);
- };
- return this._parent_;
- },
- "clearClass":function(){
- this.setClass("");
- this._parent_;
- },
- "getClass":function(){
- return pi.util.Element.getClass( this._parent_.environment.getElement() );
- },
- "hasClass":function(_class){
- return pi.util.Element.hasClass( this._parent_.environment.getElement(), _class );
- },
- "setClass":function(_value){
- return pi.util.Element.setClass( this._parent_.environment.getElement(), _value );
- },
- "removeClass":function(_class){
- pi.util.Element.removeClass( this._parent_.environment.getElement(), _class );
- return this._parent_;
- },
- "toggleClass":function(_class){
- pi.util.Element.toggleClass( this._parent_.environment.getElement(), _class );
- }
- },
- "child":{
- "get":function(){
- return this._parent_.environment.getElement().childNodes;
- },
- "add":function(_elements){
- for (var i = 0; i < arguments.length; i++) {
- var el = arguments[i];
- this._parent_.environment.getElement().appendChild(
- el.environment ? el.environment.getElement() : el
- );
- }
- return this._parent_;
- },
- "addAfter":function(_element,_referenceElement){
- this.addBefore(
- _element.environment?_element.environment.getElement():_element,
- (_referenceElement.environment?_referenceElement.environment.getElement():_referenceElement).nextSibling
- );
- return this._parent_;
- },
- "addBefore":function(_element,_referenceElement){
- this._parent_.environment.getElement().insertBefore(
- _element.environment?_element.environment.getElement():_element,
- _referenceElement.environment?_referenceElement.environment.getElement():_referenceElement
- );
- return this._parent_;
- },
- "query":function(_tag,_attributeName,_attributeValue){
- return this._parent_.query(
- "{0}{1}".format( (_tag?"{0}".format(_tag):"/*"), _attributeName||_attributeValue?"[contains(concat(' ', @{0}, ' '),' {1} ')]".format(_attributeName||"",_attributeValue||""):"" )
- );
- },
- "remove":function(_element){
- this._parent_.environment.getElement().removeChild(_element.environment?_element.environment.getElement():_element);
- }
- },
- "environment":{
- "_element":null,
- "getParent":function(){
- return this.getElement().parentNode;
- },
- "getPosition":function(){
- return pi.util.Element.getPosition(this.getElement());
- },
- "getSize":function(){
- return pi.util.Element.getSize( this.getElement() );
- },
- "addStyle":function(_styleObject){
- pi.util.Element.addStyle(this.getElement(),_styleObject);
- return this._parent_;
- },
- "getStyle":function(_property){
- return pi.util.Element.getStyle(_property);
- },
- "getName":function(){
- return this.getElement().nodeName;
- },
- "getType":function(){
- return this.getElement().nodeType;
- },
- "getView":function(_property){
- return pi.util.Element.getView(this.getElement(),_property);
- }
- },
- "event":{
- "addListener":function(_event,_fn,_useCapture){
- pi.util.AddEvent(this._parent_.environment.getElement(),_event,_fn,_useCapture);
- return this._parent_;
- },
- "removeListener":function(_event,_fn,_useCapture){
- pi.util.RemoveEvent(this._parent_.environment.getElement(),_event,_fn,_useCapture);
- return this._parent_;
- }
- }
- });
-
- pi.xhr = new pi.base;
- pi.xhr.constructor = function(){
- var api;
- if(!window.XMLHttpRequest){
- var names = ["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
- for (var i = 0; i < names.length; i++) {
- try {
- this.environment.setApi(new ActiveXObject(names[i]));
- break;
- } catch (e) { continue; }
- }
- }
- else
- this.environment.setApi(new XMLHttpRequest());
- this.environment.getApi().onreadystatechange=this.event.readystatechange.curry(this);
- return this;
- };
- pi.xhr.body = {
- "abort":function(){
- this.environment.getApi().abort();
- },
- "send":function(){
- var url = this.environment.getUrl(), data = this.environment.getData(),dataUrl = "";
-
- for (var key in data)
- dataUrl += "{0}={1}&".format(key, data[key]);
-
- if (this.environment.getType()=="GET")
- url += (url.search("\\?")==-1?"?":"&")+"{0}".format(dataUrl);
-
- this.environment.getApi().open(this.environment.getType(),url,this.environment.getAsync());
-
- for(var key in this.environment.getHeader())
- this.environment.getApi().setRequestHeader(key,this.environment.getHeader()[key]);
-
- this.environment.getApi().send(this.environment.getType()=="GET"?"":dataUrl);
- }
- };
- pi.xhr.body.environment = {
- "_async":true, "_api":null, "_cache":true, "_callback":[], "_channel":null, "_data":{}, "_header":{}, "_mimeType":null, "_multipart":false, "_type":"GET", "_timeout":0, "_url":"",
- "addCallback": function(_options,_fn){
- this.getCallback().push({ "fn":_fn, "options":_options });
- },
- "addHeader": function(_key,_value){
- this.getHeader()[_key] = _value;
- },
- "addData": function(_key,_value){
- this.getData()[_key] = _value;
- },
- "changeCache":function(_value){
- if(_value==false){
- this.addData("forceCache",Math.round(Math.random()*10000));
- }
- this.setCache(_value);
- },
- "changeType": function(_value){
- if(_value=="POST"){
- this.addHeader("Content-Type","application/x-www-form-urlencoded");
- }
- this.setType(_value);
- }
- };
- pi.xhr.body.event = {
- "readystatechange":function(){
- var readyState = this.environment.getApi().readyState;
- var callback=this.environment.getCallback();
-
- for (var i = 0; i < callback.length; i++) {
- if(callback[i].options.readyState.indexOf(readyState)>-1)
- callback[i].fn.apply(this);
- }
- }
- };
- pi.xhr = pi.xhr.build();
-
- /*
- * xml.xhr.get
- */
-
- pi.xhr.get = function(_url,_returnPiObject){
- var request = new pi.xhr();
- request.environment.setAsync(false);
- request.environment.setUrl(_url);
- request.send();
- return _returnPiObject?request:request.environment.getApi();
- };
-
- /*
- * pi.xpath
- */
-
- pi.xpath = function(_expression,_resultType,_contextNode,_namespaceResolver,_result){
- var contextNode = _contextNode||document,
- expression = _expression||"",
- namespaceResolver = _namespaceResolver||null,
- result=_result||null,
- resultType=_resultType||"ANY_TYPE";
- return document.evaluate(expression, contextNode, namespaceResolver, XPathResult[resultType], result);
- };
-
- Array.prototype.clone = function(){
- var tmp = [];
- Array.prototype.push.apply(tmp,this);
- tmp.forEach(function(item,index,object){
- if(item instanceof Array)
- object[index] = object[index].clone();
- });
- return tmp;
- };
- Array.prototype.count = function(_value){
- var count = 0;
- this.forEach(function(){
- count+=Number(arguments[0]==_value);
- });
- return count;
- };
-
- Array.prototype.forEach = Array.prototype.forEach||function(_function){
- for(var i=0; i<this.length; i++)
- _function.apply(this,[this[i],i,this]);
- };
-
- Array.prototype.getLastItem = function(){
- return this[this.length-1];
- };
-
- Array.prototype.indexOf = Array.prototype.indexOf||function(_value){
- var index = -1;
- for(var i=0; i<this.length; i++)
- if(this[i]==_value){
- index = i;
- break;
- }
- return index;
- };
-
- Array.prototype.remove = function(_index){
- var array = this.slice(0,_index);
- Array.prototype.push.apply(array,this.slice(_index+1));
- return array;
- };
-
- Array.prototype.removeValue = function(_value){
- return this.remove(this.indexOf(_value));
- };
-
- Boolean.prototype.toggle = function(){
- return this==true?arguments[0]:arguments[1];
- };
-
- Number.prototype.base = function(_system){
- var remain = this%_system;
- if(this==remain)return String.fromCharCode(this+(this>9?87:48));
- return ((this-remain)/_system).base(_system)+String.fromCharCode(remain+(remain>9?87:48));
- };
- Number.prototype.decimal = function(_system){
- var result = 0, digit = String(this).split("");
- for(var i=0; i<digit.length; i++)
- {
- digit[i]=parseInt((digit[i].charCodeAt(0)>58)?digit[i].charCodeAt(0)-87:digit[i]);
- result += digit[i]*(Math.pow(_system,digit.length-1-i));
- }
- return result;
- };
- Number.prototype.range = function(_pattern){
- for(
- var value = String(this), isFloat = /\./i.test(value),
- i = isFloat.toggle(parseInt(value.split(".")[0]),0),
- end = parseInt(value.split(".")[isFloat.toggle(1,0)]),
- array = []; i<end; i++
- ){
- array.push(
- Boolean(_pattern)==false?i:(typeof _pattern=="function"?_pattern(i):_pattern[i])
- );
- }
- return array;
- };
-
- String.prototype.escape = function(){
- return escape(this);
- };
-
- String.prototype.format = function(){
- var values = arguments;
- return this.replace(/\{(\d)\}/g,function(){
- return values[arguments[1]];
- });
- };
-
- String.prototype.leftpad = function(_len,_ch){
- var str=this;
- var ch = Boolean(_ch)==false?" ":_ch;
- while(str.length<_len)
- str=ch+str;
- return str;
- };
-
- String.prototype.toggle = function(_value,_other){
- return this==_value?_value:_other;
- };
-
- String.prototype.unicode = function(){
- var str="", obj = this.split("");
- for(var i=obj.length-1; i>=0; i--)
- str="\\u{0}{1}".format(String(obj[i].charCodeAt(0).base(16)).leftpad(4,"0"),str);
- return str;
- };
-
- pi.util.AddEvent(
- pi.env.ie?window:document,
- pi.env.ie?"load":"DOMContentLoaded",
- function(){
- for(var i=0; i<pi.util.DOMContentLoaded.length; i++){
- pi.util.DOMContentLoaded[ i ]();
- }
- }
- );
-
-})(window); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/row_helper.js b/src/usr/local/www/javascript/row_helper.js
deleted file mode 100644
index 07d4bfc..0000000
--- a/src/usr/local/www/javascript/row_helper.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// Global Variables
-var rowname = new Array(4999);
-var rowtype = new Array(4999);
-var newrow = new Array(4999);
-var rowsize = new Array(4999);
-
-for (i = 0; i < 4999; i++) {
- rowname[i] = '';
- rowtype[i] = '';
- newrow[i] = '';
- rowsize[i] = '30';
-}
-
-var field_counter_js = 0;
-var loaded = 0;
-var is_streaming_progress_bar = 0;
-var temp_streaming_text = "";
-
-var addRowTo = (function() {
- return (function (tableId) {
- var $ = jQuery;
- var d, tbody, tr, td, bgc, i, ii, j;
- d = document;
- tbody = d.getElementById(tableId).getElementsByTagName("tbody").item(0);
- tr = d.createElement("tr");
- for (i = 0; i < field_counter_js; i++) {
- td = d.createElement("td");
- if(typeof(rowtype[i]) == 'function') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' />" + rowtype[i](rowname[i], rowsize[i], totalrows) + " ";
- } else if(rowtype[i] == 'textbox') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input size='" + rowsize[i] + "' class='formfld unknown' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
- } else if(rowtype[i] == 'textbox,ipv4v6') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input size='" + rowsize[i] + "' class='formfld unknown ipv4v6' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
- } else if(rowtype[i] == 'password') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input type='password' size='" + rowsize[i] + "' class='formfld pwd' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
- } else if(rowtype[i] == 'select') {
- var cidr;
- var str;
- for (cidr = 128; cidr>= 1; cidr--) {
- str=str + "<option value=\"" + cidr + "\" >" + cidr + "</option>";
- }
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select size='1' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "'>" + str + "</select> ";
- } else if(rowtype[i] == 'select,ipv4v6') {
- var cidr;
- var str;
- for (cidr = 128; cidr>= 1; cidr--) {
- str=str + "<option value=\"" + cidr + "\" >" + cidr + "</option>";
- }
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select class='ipv4v6' size='1' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "'>" + str + "</select> ";
- } else if(rowtype[i] == 'select_source') {
- var cidr;
- var str;
- for (cidr = 128; cidr>= 1; cidr--) {
- str=str + "<option value=\"" + cidr + "\" >" + cidr + "</option>";
- }
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select size='1' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "'>" + str + "</select> ";
- } else {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input type='checkbox' name='" + rowname[i] + totalrows + "' /> ";
- }
- tr.appendChild(td);
- }
- td = d.createElement("td");
- td.rowSpan = "1";
-
- td.innerHTML = '<a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/' + theme + '/images/icons/icon_x.gif" /></a>';
- tr.appendChild(td);
- tbody.appendChild(tr);
- totalrows++;
- if($(tr).ipv4v6ify)
- $(tr).ipv4v6ify();
- });
-})();
-
-function removeRow(el) {
- var cel;
- while (el && el.nodeName.toLowerCase() != "tr")
- el = el.parentNode;
-
- if (el && el.parentNode) {
- cel = el.getElementsByTagName("td").item(0);
- el.parentNode.removeChild(el);
- }
-}
-
-function find_unique_field_name(field_name) {
- // loop through field_name and strip off -NUMBER
- var last_found_dash = 0;
- for (var i = 0; i < field_name.length; i++) {
- // is this a dash, if so, update
- // last_found_dash
- if (field_name.substr(i,1) == "-" )
- last_found_dash = i;
- }
- if (last_found_dash < 1)
- return field_name;
- return(field_name.substr(0,last_found_dash));
-}
diff --git a/src/usr/local/www/javascript/row_helper_dynamic.js b/src/usr/local/www/javascript/row_helper_dynamic.js
deleted file mode 100644
index d144093..0000000
--- a/src/usr/local/www/javascript/row_helper_dynamic.js
+++ /dev/null
@@ -1,98 +0,0 @@
-// Global Variables
-var rowname = new Array(99);
-var rowtype = new Array(99);
-var newrow = new Array(99);
-var rowsize = new Array(99);
-
-// Global variables. Set to javascript code
-// that will be eval() after change, add & delete.
-var rowhelper_onChange = '';
-var rowhelper_onAdd = '';
-var rowhelper_onDelete = '';
-
-for (i = 0; i < 99; i++) {
- rowname[i] = '';
- rowtype[i] = '';
- newrow[i] = '';
- rowsize[i] = '25';
-}
-
-var field_counter_js = 0;
-var loaded = 0;
-var is_streaming_progress_bar = 0;
-var temp_streaming_text = "";
-
-var addRowTo = (function() {
- return (function (tableId, objectSize) {
- var $ = jQuery;
- var d, tbody, tr, td, bgc, i, ii, j, size, className;
- d = document;
- tbody = d.getElementById(tableId).getElementsByTagName("tbody").item(0);
- tr = d.createElement("tr");
- totalrows++;
- size = objectSize;
- for (i = 0; i < field_counter_js; i++) {
- if (!objectSize)
- size = rowsize[i];
- td = d.createElement("td");
- if(typeof(rowtype[i]) == 'function') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' />" + rowtype[i](rowname[i], size, totalrows) + " ";
- } else if(rowtype[i] == 'textbox') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input " + rowhelper_onChange + " size='" + rowsize[i] + "' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
- } else if(rowtype[i] == 'textbox,ipv4v6') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input " + rowhelper_onChange + " size='" + rowsize[i] + "' name='" + rowname[i] + totalrows + "' class='ipv4v6' id='" + rowname[i] + totalrows + "' /> ";
- } else if(rowtype[i] == 'select') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select " + rowhelper_onChange + " name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "'>" + newrow[i] + "</select> ";
- } else if(rowtype[i] == 'select,ipv4v6') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select " + rowhelper_onChange + " name='" + rowname[i] + totalrows + "' class='ipv4v6' id='" + rowname[i] + totalrows + "'>" + newrow[i] + "</select> ";
- } else if(rowtype[i] == 'interfaces_selection') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select " + rowhelper_onChange + " name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "'>" + newrow[i] + "</select> ";
- } else if(rowtype[i] == 'select_source') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select " + rowhelper_onChange + " name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "'>" + newrow[i] + "</select> ";
- } else if(rowtype[i] == 'checkbox') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input " + rowhelper_onChange + " type='checkbox'name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
- } else if(rowtype[i] == 'input') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input " + rowhelper_onChange + " class='formfld unknown' size='" + size + "' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
- } else if(rowtype[i] == 'password') {
- td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input " + rowhelper_onChange + " class='formfld pwd' type='password' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
- }
- tr.appendChild(td);
- }
- td = d.createElement("td");
- td.rowSpan = "1";
- td.innerHTML = '<a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/' + theme + '/images/icons/icon_x.gif" /></a>';
- tr.appendChild(td);
- tbody.appendChild(tr);
- if(rowhelper_onAdd != '')
- eval(rowhelper_onAdd);
- if($(tr).ipv4v6ify)
- $(tr).ipv4v6ify();
- });
-})();
-
-function removeRow(el) {
- var cel;
- while (el && el.nodeName.toLowerCase() != "tr")
- el = el.parentNode;
-
- if (el && el.parentNode) {
- cel = el.getElementsByTagName("td").item(0);
- el.parentNode.removeChild(el);
- }
- if(rowhelper_onDelete != '')
- eval(rowhelper_onDelete);
-}
-
-function find_unique_field_name(field_name) {
- // loop through field_name and strip off -NUMBER
- var last_found_dash = 0;
- for (var i = 0; i < field_name.length; i++) {
- // is this a dash, if so, update
- // last_found_dash
- if (field_name.substr(i,1) == "-" )
- last_found_dash = i;
- }
- if (last_found_dash < 1)
- return field_name;
- return(field_name.substr(0,last_found_dash));
-}
diff --git a/src/usr/local/www/javascript/row_toggle.js b/src/usr/local/www/javascript/row_toggle.js
deleted file mode 100644
index 350743e..0000000
--- a/src/usr/local/www/javascript/row_toggle.js
+++ /dev/null
@@ -1,66 +0,0 @@
-function fr_toggle(id, prefix) {
- if (!prefix)
- prefix = 'fr';
-
- var checkbox = document.getElementById(prefix + 'c' + id);
- checkbox.checked = !checkbox.checked;
- fr_bgcolor(id, prefix);
-}
-
-function fr_bgcolor(id, prefix) {
- if (!prefix)
- prefix = 'fr';
-
- var row = document.getElementById(prefix + id);
- var checkbox = document.getElementById(prefix + 'c' + id);
- var cells = row.getElementsByTagName('td');
- var cellcnt = cells.length;
-
- for (i = 0; i < cellcnt; i++) {
- // Check for cells with frd id only
- if (cells[i].id == prefix + 'd' + id)
- cells[i].style.backgroundColor = checkbox.checked ? "#FFFFBB" : "#FFFFFF";
- }
- //cells[7].style.backgroundColor = checkbox.checked ? "#FFFFBB" : "#990000";
-}
-
-function fr_insline(id, on, prefix) {
- if (!prefix)
- prefix = 'fr';
-
- var row = document.getElementById(prefix + id);
- var prevrow;
- if (id != 0) {
- prevrow = document.getElementById(prefix + (id-1));
- } else {
- prevrow = document.getElementById(prefix + 'header');
- }
-
- var cells = row.getElementsByTagName("td");
- var prevcells = prevrow.getElementsByTagName("td");
-
- for (i = 0; i <= prevcells.length - 1; i++) {
- if (prevcells[i].id == prefix + 'd' + (id-1)) {
- if (on) {
- prevcells[i].style.borderBottom = "3px solid #990000";
- prevcells[i].style.paddingBottom = ((id != 0) ? 2 : 3) + "px";
- } else {
- prevcells[i].style.borderBottom = "1px solid #999999";
- prevcells[i].style.borderBottomWidth = "1px";
- prevcells[i].style.paddingBottom = ((id != 0) ? 4 : 5) + "px";
- }
- }
- }
-
- for (i = 0; i <= cells.length - 1; i++) {
- if (cells[i].id == prefix + 'd' + (id)) {
- if (on) {
- cells[i].style.borderTop = "2px solid #990000";
- cells[i].style.paddingTop = "2px";
- } else {
- cells[i].style.borderTopWidth = 0;
- cells[i].style.paddingTop = "4px";
- }
- }
- }
-}
diff --git a/src/usr/local/www/javascript/scriptaculous/builder.js b/src/usr/local/www/javascript/scriptaculous/builder.js
deleted file mode 100644
index b0dd14e..0000000
--- a/src/usr/local/www/javascript/scriptaculous/builder.js
+++ /dev/null
@@ -1,136 +0,0 @@
-// script.aculo.us builder.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
-
-// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-var Builder = {
- NODEMAP: {
- AREA: 'map',
- CAPTION: 'table',
- COL: 'table',
- COLGROUP: 'table',
- LEGEND: 'fieldset',
- OPTGROUP: 'select',
- OPTION: 'select',
- PARAM: 'object',
- TBODY: 'table',
- TD: 'table',
- TFOOT: 'table',
- TH: 'table',
- THEAD: 'table',
- TR: 'table'
- },
- // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
- // due to a Firefox bug
- node: function(elementName) {
- elementName = elementName.toUpperCase();
-
- // try innerHTML approach
- var parentTag = this.NODEMAP[elementName] || 'div';
- var parentElement = document.createElement(parentTag);
- try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
- parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
- } catch(e) {}
- var element = parentElement.firstChild || null;
-
- // see if browser added wrapping tags
- if(element && (element.tagName.toUpperCase() != elementName))
- element = element.getElementsByTagName(elementName)[0];
-
- // fallback to createElement approach
- if(!element) element = document.createElement(elementName);
-
- // abort if nothing could be created
- if(!element) return;
-
- // attributes (or text)
- if(arguments[1])
- if(this._isStringOrNumber(arguments[1]) ||
- (arguments[1] instanceof Array) ||
- arguments[1].tagName) {
- this._children(element, arguments[1]);
- } else {
- var attrs = this._attributes(arguments[1]);
- if(attrs.length) {
- try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
- parentElement.innerHTML = "<" +elementName + " " +
- attrs + "></" + elementName + ">";
- } catch(e) {}
- element = parentElement.firstChild || null;
- // workaround firefox 1.0.X bug
- if(!element) {
- element = document.createElement(elementName);
- for(attr in arguments[1])
- element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
- }
- if(element.tagName.toUpperCase() != elementName)
- element = parentElement.getElementsByTagName(elementName)[0];
- }
- }
-
- // text, or array of children
- if(arguments[2])
- this._children(element, arguments[2]);
-
- return $(element);
- },
- _text: function(text) {
- return document.createTextNode(text);
- },
-
- ATTR_MAP: {
- 'className': 'class',
- 'htmlFor': 'for'
- },
-
- _attributes: function(attributes) {
- var attrs = [];
- for(attribute in attributes)
- attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
- '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
- return attrs.join(" ");
- },
- _children: function(element, children) {
- if(children.tagName) {
- element.appendChild(children);
- return;
- }
- if(typeof children=='object') { // array can hold nodes and text
- children.flatten().each( function(e) {
- if(typeof e=='object')
- element.appendChild(e);
- else
- if(Builder._isStringOrNumber(e))
- element.appendChild(Builder._text(e));
- });
- } else
- if(Builder._isStringOrNumber(children))
- element.appendChild(Builder._text(children));
- },
- _isStringOrNumber: function(param) {
- return(typeof param=='string' || typeof param=='number');
- },
- build: function(html) {
- var element = this.node('div');
- $(element).update(html.strip());
- return element.down();
- },
- dump: function(scope) {
- if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
-
- var tags = ("a abbr acronym address applet area b base basefont bdo big blockquote body " +
- "br button caption center cite code col colgroup dd del dfn dir div dl dt em fieldset " +
- "font form frame frameset h1 h2 h3 h4 h5 h6 head hr html i iframe img input ins isindex "+
- "kbd label legend li link map menu meta noframes noscript object ol optgroup option p "+
- "param pre q s samp script select small span strike strong style sub sup table tbody td "+
- "textarea tfoot th thead title tr tt u ul var").split(/\s+/);
-
- tags.each( function(tag){
- scope[tag] = function() {
- return Builder.node.apply(Builder, [tag].concat($A(arguments)));
- };
- });
- }
-}; \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/controls.js b/src/usr/local/www/javascript/scriptaculous/controls.js
deleted file mode 100644
index 59815cb..0000000
--- a/src/usr/local/www/javascript/scriptaculous/controls.js
+++ /dev/null
@@ -1,965 +0,0 @@
-// script.aculo.us controls.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
-
-// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// (c) 2005-2009 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
-// (c) 2005-2009 Jon Tirsen (http://www.tirsen.com)
-// Contributors:
-// Richard Livsey
-// Rahul Bhargava
-// Rob Wills
-//
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-// Autocompleter.Base handles all the autocompletion functionality
-// that's independent of the data source for autocompletion. This
-// includes drawing the autocompletion menu, observing keyboard
-// and mouse events, and similar.
-//
-// Specific autocompleters need to provide, at the very least,
-// a getUpdatedChoices function that will be invoked every time
-// the text inside the monitored textbox changes. This method
-// should get the text for which to provide autocompletion by
-// invoking this.getToken(), NOT by directly accessing
-// this.element.value. This is to allow incremental tokenized
-// autocompletion. Specific auto-completion logic (AJAX, etc)
-// belongs in getUpdatedChoices.
-//
-// Tokenized incremental autocompletion is enabled automatically
-// when an autocompleter is instantiated with the 'tokens' option
-// in the options parameter, e.g.:
-// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
-// will incrementally autocomplete with a comma as the token.
-// Additionally, ',' in the above example can be replaced with
-// a token array, e.g. { tokens: [',', '\n'] } which
-// enables autocompletion on multiple tokens. This is most
-// useful when one of the tokens is \n (a newline), as it
-// allows smart autocompletion after linebreaks.
-
-if(typeof Effect == 'undefined')
- throw("controls.js requires including script.aculo.us' effects.js library");
-
-var Autocompleter = { };
-Autocompleter.Base = Class.create({
- baseInitialize: function(element, update, options) {
- element = $(element);
- this.element = element;
- this.update = $(update);
- this.hasFocus = false;
- this.changed = false;
- this.active = false;
- this.index = 0;
- this.entryCount = 0;
- this.oldElementValue = this.element.value;
-
- if(this.setOptions)
- this.setOptions(options);
- else
- this.options = options || { };
-
- this.options.paramName = this.options.paramName || this.element.name;
- this.options.tokens = this.options.tokens || [];
- this.options.frequency = this.options.frequency || 0.4;
- this.options.minChars = this.options.minChars || 1;
- this.options.onShow = this.options.onShow ||
- function(element, update){
- if(!update.style.position || update.style.position=='absolute') {
- update.style.position = 'absolute';
- Position.clone(element, update, {
- setHeight: false,
- offsetTop: element.offsetHeight
- });
- }
- Effect.Appear(update,{duration:0.15});
- };
- this.options.onHide = this.options.onHide ||
- function(element, update){ new Effect.Fade(update,{duration:0.15}); };
-
- if(typeof(this.options.tokens) == 'string')
- this.options.tokens = new Array(this.options.tokens);
- // Force carriage returns as token delimiters anyway
- if (!this.options.tokens.include('\n'))
- this.options.tokens.push('\n');
-
- this.observer = null;
-
- this.element.setAttribute('autocomplete','off');
-
- Element.hide(this.update);
-
- Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
- Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this));
- },
-
- show: function() {
- if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
- if(!this.iefix &&
- (Prototype.Browser.IE) &&
- (Element.getStyle(this.update, 'position')=='absolute')) {
- new Insertion.After(this.update,
- '<iframe id="' + this.update.id + '_iefix" '+
- 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
- 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
- this.iefix = $(this.update.id+'_iefix');
- }
- if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
- },
-
- fixIEOverlapping: function() {
- Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
- this.iefix.style.zIndex = 1;
- this.update.style.zIndex = 2;
- Element.show(this.iefix);
- },
-
- hide: function() {
- this.stopIndicator();
- if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
- if(this.iefix) Element.hide(this.iefix);
- },
-
- startIndicator: function() {
- if(this.options.indicator) Element.show(this.options.indicator);
- },
-
- stopIndicator: function() {
- if(this.options.indicator) Element.hide(this.options.indicator);
- },
-
- onKeyPress: function(event) {
- if(this.active)
- switch(event.keyCode) {
- case Event.KEY_TAB:
- case Event.KEY_RETURN:
- this.selectEntry();
- Event.stop(event);
- case Event.KEY_ESC:
- this.hide();
- this.active = false;
- Event.stop(event);
- return;
- case Event.KEY_LEFT:
- case Event.KEY_RIGHT:
- return;
- case Event.KEY_UP:
- this.markPrevious();
- this.render();
- Event.stop(event);
- return;
- case Event.KEY_DOWN:
- this.markNext();
- this.render();
- Event.stop(event);
- return;
- }
- else
- if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
- (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;
-
- this.changed = true;
- this.hasFocus = true;
-
- if(this.observer) clearTimeout(this.observer);
- this.observer =
- setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
- },
-
- activate: function() {
- this.changed = false;
- this.hasFocus = true;
- this.getUpdatedChoices();
- },
-
- onHover: function(event) {
- var element = Event.findElement(event, 'LI');
- if(this.index != element.autocompleteIndex)
- {
- this.index = element.autocompleteIndex;
- this.render();
- }
- Event.stop(event);
- },
-
- onClick: function(event) {
- var element = Event.findElement(event, 'LI');
- this.index = element.autocompleteIndex;
- this.selectEntry();
- this.hide();
- },
-
- onBlur: function(event) {
- // needed to make click events working
- setTimeout(this.hide.bind(this), 250);
- this.hasFocus = false;
- this.active = false;
- },
-
- render: function() {
- if(this.entryCount > 0) {
- for (var i = 0; i < this.entryCount; i++)
- this.index==i ?
- Element.addClassName(this.getEntry(i),"selected") :
- Element.removeClassName(this.getEntry(i),"selected");
- if(this.hasFocus) {
- this.show();
- this.active = true;
- }
- } else {
- this.active = false;
- this.hide();
- }
- },
-
- markPrevious: function() {
- if(this.index > 0) this.index--;
- else this.index = this.entryCount-1;
- this.getEntry(this.index).scrollIntoView(true);
- },
-
- markNext: function() {
- if(this.index < this.entryCount-1) this.index++;
- else this.index = 0;
- this.getEntry(this.index).scrollIntoView(false);
- },
-
- getEntry: function(index) {
- return this.update.firstChild.childNodes[index];
- },
-
- getCurrentEntry: function() {
- return this.getEntry(this.index);
- },
-
- selectEntry: function() {
- this.active = false;
- this.updateElement(this.getCurrentEntry());
- },
-
- updateElement: function(selectedElement) {
- if (this.options.updateElement) {
- this.options.updateElement(selectedElement);
- return;
- }
- var value = '';
- if (this.options.select) {
- var nodes = $(selectedElement).select('.' + this.options.select) || [];
- if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
- } else
- value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
-
- var bounds = this.getTokenBounds();
- if (bounds[0] != -1) {
- var newValue = this.element.value.substr(0, bounds[0]);
- var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);
- if (whitespace)
- newValue += whitespace[0];
- this.element.value = newValue + value + this.element.value.substr(bounds[1]);
- } else {
- this.element.value = value;
- }
- this.oldElementValue = this.element.value;
- this.element.focus();
-
- if (this.options.afterUpdateElement)
- this.options.afterUpdateElement(this.element, selectedElement);
- },
-
- updateChoices: function(choices) {
- if(!this.changed && this.hasFocus) {
- this.update.innerHTML = choices;
- Element.cleanWhitespace(this.update);
- Element.cleanWhitespace(this.update.down());
-
- if(this.update.firstChild && this.update.down().childNodes) {
- this.entryCount =
- this.update.down().childNodes.length;
- for (var i = 0; i < this.entryCount; i++) {
- var entry = this.getEntry(i);
- entry.autocompleteIndex = i;
- this.addObservers(entry);
- }
- } else {
- this.entryCount = 0;
- }
-
- this.stopIndicator();
- this.index = 0;
-
- if(this.entryCount==1 && this.options.autoSelect) {
- this.selectEntry();
- this.hide();
- } else {
- this.render();
- }
- }
- },
-
- addObservers: function(element) {
- Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
- Event.observe(element, "click", this.onClick.bindAsEventListener(this));
- },
-
- onObserverEvent: function() {
- this.changed = false;
- this.tokenBounds = null;
- if(this.getToken().length>=this.options.minChars) {
- this.getUpdatedChoices();
- } else {
- this.active = false;
- this.hide();
- }
- this.oldElementValue = this.element.value;
- },
-
- getToken: function() {
- var bounds = this.getTokenBounds();
- return this.element.value.substring(bounds[0], bounds[1]).strip();
- },
-
- getTokenBounds: function() {
- if (null != this.tokenBounds) return this.tokenBounds;
- var value = this.element.value;
- if (value.strip().empty()) return [-1, 0];
- var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);
- var offset = (diff == this.oldElementValue.length ? 1 : 0);
- var prevTokenPos = -1, nextTokenPos = value.length;
- var tp;
- for (var index = 0, l = this.options.tokens.length; index < l; ++index) {
- tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);
- if (tp > prevTokenPos) prevTokenPos = tp;
- tp = value.indexOf(this.options.tokens[index], diff + offset);
- if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;
- }
- return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);
- }
-});
-
-Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {
- var boundary = Math.min(newS.length, oldS.length);
- for (var index = 0; index < boundary; ++index)
- if (newS[index] != oldS[index])
- return index;
- return boundary;
-};
-
-Ajax.Autocompleter = Class.create(Autocompleter.Base, {
- initialize: function(element, update, url, options) {
- this.baseInitialize(element, update, options);
- this.options.asynchronous = true;
- this.options.onComplete = this.onComplete.bind(this);
- this.options.defaultParams = this.options.parameters || null;
- this.url = url;
- },
-
- getUpdatedChoices: function() {
- this.startIndicator();
-
- var entry = encodeURIComponent(this.options.paramName) + '=' +
- encodeURIComponent(this.getToken());
-
- this.options.parameters = this.options.callback ?
- this.options.callback(this.element, entry) : entry;
-
- if(this.options.defaultParams)
- this.options.parameters += '&' + this.options.defaultParams;
-
- new Ajax.Request(this.url, this.options);
- },
-
- onComplete: function(request) {
- this.updateChoices(request.responseText);
- }
-});
-
-// The local array autocompleter. Used when you'd prefer to
-// inject an array of autocompletion options into the page, rather
-// than sending out Ajax queries, which can be quite slow sometimes.
-//
-// The constructor takes four parameters. The first two are, as usual,
-// the id of the monitored textbox, and id of the autocompletion menu.
-// The third is the array you want to autocomplete from, and the fourth
-// is the options block.
-//
-// Extra local autocompletion options:
-// - choices - How many autocompletion choices to offer
-//
-// - partialSearch - If false, the autocompleter will match entered
-// text only at the beginning of strings in the
-// autocomplete array. Defaults to true, which will
-// match text at the beginning of any *word* in the
-// strings in the autocomplete array. If you want to
-// search anywhere in the string, additionally set
-// the option fullSearch to true (default: off).
-//
-// - fullSsearch - Search anywhere in autocomplete array strings.
-//
-// - partialChars - How many characters to enter before triggering
-// a partial match (unlike minChars, which defines
-// how many characters are required to do any match
-// at all). Defaults to 2.
-//
-// - ignoreCase - Whether to ignore case when autocompleting.
-// Defaults to true.
-//
-// It's possible to pass in a custom function as the 'selector'
-// option, if you prefer to write your own autocompletion logic.
-// In that case, the other options above will not apply unless
-// you support them.
-
-Autocompleter.Local = Class.create(Autocompleter.Base, {
- initialize: function(element, update, array, options) {
- this.baseInitialize(element, update, options);
- this.options.array = array;
- },
-
- getUpdatedChoices: function() {
- this.updateChoices(this.options.selector(this));
- },
-
- setOptions: function(options) {
- this.options = Object.extend({
- choices: 10,
- partialSearch: true,
- partialChars: 2,
- ignoreCase: true,
- fullSearch: false,
- selector: function(instance) {
- var ret = []; // Beginning matches
- var partial = []; // Inside matches
- var entry = instance.getToken();
- var count = 0;
-
- for (var i = 0; i < instance.options.array.length &&
- ret.length < instance.options.choices ; i++) {
-
- var elem = instance.options.array[i];
- var foundPos = instance.options.ignoreCase ?
- elem.toLowerCase().indexOf(entry.toLowerCase()) :
- elem.indexOf(entry);
-
- while (foundPos != -1) {
- if (foundPos == 0 && elem.length != entry.length) {
- ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
- elem.substr(entry.length) + "</li>");
- break;
- } else if (entry.length >= instance.options.partialChars &&
- instance.options.partialSearch && foundPos != -1) {
- if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
- partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
- elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
- foundPos + entry.length) + "</li>");
- break;
- }
- }
-
- foundPos = instance.options.ignoreCase ?
- elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
- elem.indexOf(entry, foundPos + 1);
-
- }
- }
- if (partial.length)
- ret = ret.concat(partial.slice(0, instance.options.choices - ret.length));
- return "<ul>" + ret.join('') + "</ul>";
- }
- }, options || { });
- }
-});
-
-// AJAX in-place editor and collection editor
-// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April 2007).
-
-// Use this if you notice weird scrolling problems on some browsers,
-// the DOM might be a bit confused when this gets called so do this
-// waits 1 ms (with setTimeout) until it does the activation
-Field.scrollFreeActivate = function(field) {
- setTimeout(function() {
- Field.activate(field);
- }, 1);
-};
-
-Ajax.InPlaceEditor = Class.create({
- initialize: function(element, url, options) {
- this.url = url;
- this.element = element = $(element);
- this.prepareOptions();
- this._controls = { };
- arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!!
- Object.extend(this.options, options || { });
- if (!this.options.formId && this.element.id) {
- this.options.formId = this.element.id + '-inplaceeditor';
- if ($(this.options.formId))
- this.options.formId = '';
- }
- if (this.options.externalControl)
- this.options.externalControl = $(this.options.externalControl);
- if (!this.options.externalControl)
- this.options.externalControlOnly = false;
- this._originalBackground = this.element.getStyle('background-color') || 'transparent';
- this.element.title = this.options.clickToEditText;
- this._boundCancelHandler = this.handleFormCancellation.bind(this);
- this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);
- this._boundFailureHandler = this.handleAJAXFailure.bind(this);
- this._boundSubmitHandler = this.handleFormSubmission.bind(this);
- this._boundWrapperHandler = this.wrapUp.bind(this);
- this.registerListeners();
- },
- checkForEscapeOrReturn: function(e) {
- if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;
- if (Event.KEY_ESC == e.keyCode)
- this.handleFormCancellation(e);
- else if (Event.KEY_RETURN == e.keyCode)
- this.handleFormSubmission(e);
- },
- createControl: function(mode, handler, extraClasses) {
- var control = this.options[mode + 'Control'];
- var text = this.options[mode + 'Text'];
- if ('button' == control) {
- var btn = document.createElement('input');
- btn.type = 'submit';
- btn.value = text;
- btn.className = 'editor_' + mode + '_button';
- if ('cancel' == mode)
- btn.onclick = this._boundCancelHandler;
- this._form.appendChild(btn);
- this._controls[mode] = btn;
- } else if ('link' == control) {
- var link = document.createElement('a');
- link.href = '#';
- link.appendChild(document.createTextNode(text));
- link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler;
- link.className = 'editor_' + mode + '_link';
- if (extraClasses)
- link.className += ' ' + extraClasses;
- this._form.appendChild(link);
- this._controls[mode] = link;
- }
- },
- createEditField: function() {
- var text = (this.options.loadTextURL ? this.options.loadingText : this.getText());
- var fld;
- if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {
- fld = document.createElement('input');
- fld.type = 'text';
- var size = this.options.size || this.options.cols || 0;
- if (0 < size) fld.size = size;
- } else {
- fld = document.createElement('textarea');
- fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);
- fld.cols = this.options.cols || 40;
- }
- fld.name = this.options.paramName;
- fld.value = text; // No HTML breaks conversion anymore
- fld.className = 'editor_field';
- if (this.options.submitOnBlur)
- fld.onblur = this._boundSubmitHandler;
- this._controls.editor = fld;
- if (this.options.loadTextURL)
- this.loadExternalText();
- this._form.appendChild(this._controls.editor);
- },
- createForm: function() {
- var ipe = this;
- function addText(mode, condition) {
- var text = ipe.options['text' + mode + 'Controls'];
- if (!text || condition === false) return;
- ipe._form.appendChild(document.createTextNode(text));
- };
- this._form = $(document.createElement('form'));
- this._form.id = this.options.formId;
- this._form.addClassName(this.options.formClassName);
- this._form.onsubmit = this._boundSubmitHandler;
- this.createEditField();
- if ('textarea' == this._controls.editor.tagName.toLowerCase())
- this._form.appendChild(document.createElement('br'));
- if (this.options.onFormCustomization)
- this.options.onFormCustomization(this, this._form);
- addText('Before', this.options.okControl || this.options.cancelControl);
- this.createControl('ok', this._boundSubmitHandler);
- addText('Between', this.options.okControl && this.options.cancelControl);
- this.createControl('cancel', this._boundCancelHandler, 'editor_cancel');
- addText('After', this.options.okControl || this.options.cancelControl);
- },
- destroy: function() {
- if (this._oldInnerHTML)
- this.element.innerHTML = this._oldInnerHTML;
- this.leaveEditMode();
- this.unregisterListeners();
- },
- enterEditMode: function(e) {
- if (this._saving || this._editing) return;
- this._editing = true;
- this.triggerCallback('onEnterEditMode');
- if (this.options.externalControl)
- this.options.externalControl.hide();
- this.element.hide();
- this.createForm();
- this.element.parentNode.insertBefore(this._form, this.element);
- if (!this.options.loadTextURL)
- this.postProcessEditField();
- if (e) Event.stop(e);
- },
- enterHover: function(e) {
- if (this.options.hoverClassName)
- this.element.addClassName(this.options.hoverClassName);
- if (this._saving) return;
- this.triggerCallback('onEnterHover');
- },
- getText: function() {
- return this.element.innerHTML.unescapeHTML();
- },
- handleAJAXFailure: function(transport) {
- this.triggerCallback('onFailure', transport);
- if (this._oldInnerHTML) {
- this.element.innerHTML = this._oldInnerHTML;
- this._oldInnerHTML = null;
- }
- },
- handleFormCancellation: function(e) {
- this.wrapUp();
- if (e) Event.stop(e);
- },
- handleFormSubmission: function(e) {
- var form = this._form;
- var value = $F(this._controls.editor);
- this.prepareSubmission();
- var params = this.options.callback(form, value) || '';
- if (Object.isString(params))
- params = params.toQueryParams();
- params.editorId = this.element.id;
- if (this.options.htmlResponse) {
- var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions);
- Object.extend(options, {
- parameters: params,
- onComplete: this._boundWrapperHandler,
- onFailure: this._boundFailureHandler
- });
- new Ajax.Updater({ success: this.element }, this.url, options);
- } else {
- var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
- Object.extend(options, {
- parameters: params,
- onComplete: this._boundWrapperHandler,
- onFailure: this._boundFailureHandler
- });
- new Ajax.Request(this.url, options);
- }
- if (e) Event.stop(e);
- },
- leaveEditMode: function() {
- this.element.removeClassName(this.options.savingClassName);
- this.removeForm();
- this.leaveHover();
- this.element.style.backgroundColor = this._originalBackground;
- this.element.show();
- if (this.options.externalControl)
- this.options.externalControl.show();
- this._saving = false;
- this._editing = false;
- this._oldInnerHTML = null;
- this.triggerCallback('onLeaveEditMode');
- },
- leaveHover: function(e) {
- if (this.options.hoverClassName)
- this.element.removeClassName(this.options.hoverClassName);
- if (this._saving) return;
- this.triggerCallback('onLeaveHover');
- },
- loadExternalText: function() {
- this._form.addClassName(this.options.loadingClassName);
- this._controls.editor.disabled = true;
- var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
- Object.extend(options, {
- parameters: 'editorId=' + encodeURIComponent(this.element.id),
- onComplete: Prototype.emptyFunction,
- onSuccess: function(transport) {
- this._form.removeClassName(this.options.loadingClassName);
- var text = transport.responseText;
- if (this.options.stripLoadedTextTags)
- text = text.stripTags();
- this._controls.editor.value = text;
- this._controls.editor.disabled = false;
- this.postProcessEditField();
- }.bind(this),
- onFailure: this._boundFailureHandler
- });
- new Ajax.Request(this.options.loadTextURL, options);
- },
- postProcessEditField: function() {
- var fpc = this.options.fieldPostCreation;
- if (fpc)
- $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate']();
- },
- prepareOptions: function() {
- this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);
- Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);
- [this._extraDefaultOptions].flatten().compact().each(function(defs) {
- Object.extend(this.options, defs);
- }.bind(this));
- },
- prepareSubmission: function() {
- this._saving = true;
- this.removeForm();
- this.leaveHover();
- this.showSaving();
- },
- registerListeners: function() {
- this._listeners = { };
- var listener;
- $H(Ajax.InPlaceEditor.Listeners).each(function(pair) {
- listener = this[pair.value].bind(this);
- this._listeners[pair.key] = listener;
- if (!this.options.externalControlOnly)
- this.element.observe(pair.key, listener);
- if (this.options.externalControl)
- this.options.externalControl.observe(pair.key, listener);
- }.bind(this));
- },
- removeForm: function() {
- if (!this._form) return;
- this._form.remove();
- this._form = null;
- this._controls = { };
- },
- showSaving: function() {
- this._oldInnerHTML = this.element.innerHTML;
- this.element.innerHTML = this.options.savingText;
- this.element.addClassName(this.options.savingClassName);
- this.element.style.backgroundColor = this._originalBackground;
- this.element.show();
- },
- triggerCallback: function(cbName, arg) {
- if ('function' == typeof this.options[cbName]) {
- this.options[cbName](this, arg);
- }
- },
- unregisterListeners: function() {
- $H(this._listeners).each(function(pair) {
- if (!this.options.externalControlOnly)
- this.element.stopObserving(pair.key, pair.value);
- if (this.options.externalControl)
- this.options.externalControl.stopObserving(pair.key, pair.value);
- }.bind(this));
- },
- wrapUp: function(transport) {
- this.leaveEditMode();
- // Can't use triggerCallback due to backward compatibility: requires
- // binding + direct element
- this._boundComplete(transport, this.element);
- }
-});
-
-Object.extend(Ajax.InPlaceEditor.prototype, {
- dispose: Ajax.InPlaceEditor.prototype.destroy
-});
-
-Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {
- initialize: function($super, element, url, options) {
- this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;
- $super(element, url, options);
- },
-
- createEditField: function() {
- var list = document.createElement('select');
- list.name = this.options.paramName;
- list.size = 1;
- this._controls.editor = list;
- this._collection = this.options.collection || [];
- if (this.options.loadCollectionURL)
- this.loadCollection();
- else
- this.checkForExternalText();
- this._form.appendChild(this._controls.editor);
- },
-
- loadCollection: function() {
- this._form.addClassName(this.options.loadingClassName);
- this.showLoadingText(this.options.loadingCollectionText);
- var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
- Object.extend(options, {
- parameters: 'editorId=' + encodeURIComponent(this.element.id),
- onComplete: Prototype.emptyFunction,
- onSuccess: function(transport) {
- var js = transport.responseText.strip();
- if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check
- throw('Server returned an invalid collection representation.');
- this._collection = eval(js);
- this.checkForExternalText();
- }.bind(this),
- onFailure: this.onFailure
- });
- new Ajax.Request(this.options.loadCollectionURL, options);
- },
-
- showLoadingText: function(text) {
- this._controls.editor.disabled = true;
- var tempOption = this._controls.editor.firstChild;
- if (!tempOption) {
- tempOption = document.createElement('option');
- tempOption.value = '';
- this._controls.editor.appendChild(tempOption);
- tempOption.selected = true;
- }
- tempOption.update((text || '').stripScripts().stripTags());
- },
-
- checkForExternalText: function() {
- this._text = this.getText();
- if (this.options.loadTextURL)
- this.loadExternalText();
- else
- this.buildOptionList();
- },
-
- loadExternalText: function() {
- this.showLoadingText(this.options.loadingText);
- var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
- Object.extend(options, {
- parameters: 'editorId=' + encodeURIComponent(this.element.id),
- onComplete: Prototype.emptyFunction,
- onSuccess: function(transport) {
- this._text = transport.responseText.strip();
- this.buildOptionList();
- }.bind(this),
- onFailure: this.onFailure
- });
- new Ajax.Request(this.options.loadTextURL, options);
- },
-
- buildOptionList: function() {
- this._form.removeClassName(this.options.loadingClassName);
- this._collection = this._collection.map(function(entry) {
- return 2 === entry.length ? entry : [entry, entry].flatten();
- });
- var marker = ('value' in this.options) ? this.options.value : this._text;
- var textFound = this._collection.any(function(entry) {
- return entry[0] == marker;
- }.bind(this));
- this._controls.editor.update('');
- var option;
- this._collection.each(function(entry, index) {
- option = document.createElement('option');
- option.value = entry[0];
- option.selected = textFound ? entry[0] == marker : 0 == index;
- option.appendChild(document.createTextNode(entry[1]));
- this._controls.editor.appendChild(option);
- }.bind(this));
- this._controls.editor.disabled = false;
- Field.scrollFreeActivate(this._controls.editor);
- }
-});
-
-//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! ****
-//**** This only exists for a while, in order to let ****
-//**** users adapt to the new API. Read up on the new ****
-//**** API and convert your code to it ASAP! ****
-
-Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) {
- if (!options) return;
- function fallback(name, expr) {
- if (name in options || expr === undefined) return;
- options[name] = expr;
- };
- fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' :
- options.cancelLink == options.cancelButton == false ? false : undefined)));
- fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' :
- options.okLink == options.okButton == false ? false : undefined)));
- fallback('highlightColor', options.highlightcolor);
- fallback('highlightEndColor', options.highlightendcolor);
-};
-
-Object.extend(Ajax.InPlaceEditor, {
- DefaultOptions: {
- ajaxOptions: { },
- autoRows: 3, // Use when multi-line w/ rows == 1
- cancelControl: 'link', // 'link'|'button'|false
- cancelText: 'cancel',
- clickToEditText: 'Click to edit',
- externalControl: null, // id|elt
- externalControlOnly: false,
- fieldPostCreation: 'activate', // 'activate'|'focus'|false
- formClassName: 'inplaceeditor-form',
- formId: null, // id|elt
- highlightColor: '#ffff99',
- highlightEndColor: '#ffffff',
- hoverClassName: '',
- htmlResponse: true,
- loadingClassName: 'inplaceeditor-loading',
- loadingText: 'Loading...',
- okControl: 'button', // 'link'|'button'|false
- okText: 'ok',
- paramName: 'value',
- rows: 1, // If 1 and multi-line, uses autoRows
- savingClassName: 'inplaceeditor-saving',
- savingText: 'Saving...',
- size: 0,
- stripLoadedTextTags: false,
- submitOnBlur: false,
- textAfterControls: '',
- textBeforeControls: '',
- textBetweenControls: ''
- },
- DefaultCallbacks: {
- callback: function(form) {
- return Form.serialize(form);
- },
- onComplete: function(transport, element) {
- // For backward compatibility, this one is bound to the IPE, and passes
- // the element directly. It was too often customized, so we don't break it.
- new Effect.Highlight(element, {
- startcolor: this.options.highlightColor, keepBackgroundImage: true });
- },
- onEnterEditMode: null,
- onEnterHover: function(ipe) {
- ipe.element.style.backgroundColor = ipe.options.highlightColor;
- if (ipe._effect)
- ipe._effect.cancel();
- },
- onFailure: function(transport, ipe) {
- alert('Error communication with the server: ' + transport.responseText.stripTags());
- },
- onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls.
- onLeaveEditMode: null,
- onLeaveHover: function(ipe) {
- ipe._effect = new Effect.Highlight(ipe.element, {
- startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor,
- restorecolor: ipe._originalBackground, keepBackgroundImage: true
- });
- }
- },
- Listeners: {
- click: 'enterEditMode',
- keydown: 'checkForEscapeOrReturn',
- mouseover: 'enterHover',
- mouseout: 'leaveHover'
- }
-});
-
-Ajax.InPlaceCollectionEditor.DefaultOptions = {
- loadingCollectionText: 'Loading options...'
-};
-
-// Delayed observer, like Form.Element.Observer,
-// but waits for delay after last key input
-// Ideal for live-search fields
-
-Form.Element.DelayedObserver = Class.create({
- initialize: function(element, delay, callback) {
- this.delay = delay || 0.5;
- this.element = $(element);
- this.callback = callback;
- this.timer = null;
- this.lastValue = $F(this.element);
- Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
- },
- delayedListener: function(event) {
- if(this.lastValue == $F(this.element)) return;
- if(this.timer) clearTimeout(this.timer);
- this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
- this.lastValue = $F(this.element);
- },
- onTimerEvent: function() {
- this.timer = null;
- this.callback(this.element, $F(this.element));
- }
-}); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/dragdrop.js b/src/usr/local/www/javascript/scriptaculous/dragdrop.js
deleted file mode 100644
index 452601e..0000000
--- a/src/usr/local/www/javascript/scriptaculous/dragdrop.js
+++ /dev/null
@@ -1,974 +0,0 @@
-// script.aculo.us dragdrop.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
-
-// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-if(Object.isUndefined(Effect))
- throw("dragdrop.js requires including script.aculo.us' effects.js library");
-
-var Droppables = {
- drops: [],
-
- remove: function(element) {
- this.drops = this.drops.reject(function(d) { return d.element==$(element); });
- },
-
- add: function(element) {
- element = $(element);
- var options = Object.extend({
- greedy: true,
- hoverclass: null,
- tree: false
- }, arguments[1] || { });
-
- // cache containers
- if(options.containment) {
- options._containers = [];
- var containment = options.containment;
- if(Object.isArray(containment)) {
- containment.each( function(c) { options._containers.push($(c)); });
- } else {
- options._containers.push($(containment));
- }
- }
-
- if(options.accept) options.accept = [options.accept].flatten();
-
- Element.makePositioned(element); // fix IE
- options.element = element;
-
- this.drops.push(options);
- },
-
- findDeepestChild: function(drops) {
- deepest = drops[0];
-
- for (i = 1; i < drops.length; ++i)
- if (Element.isParent(drops[i].element, deepest.element))
- deepest = drops[i];
-
- return deepest;
- },
-
- isContained: function(element, drop) {
- var containmentNode;
- if(drop.tree) {
- containmentNode = element.treeNode;
- } else {
- containmentNode = element.parentNode;
- }
- return drop._containers.detect(function(c) { return containmentNode == c; });
- },
-
- isAffected: function(point, element, drop) {
- return (
- (drop.element!=element) &&
- ((!drop._containers) ||
- this.isContained(element, drop)) &&
- ((!drop.accept) ||
- (Element.classNames(element).detect(
- function(v) { return drop.accept.include(v); } ) )) &&
- Position.within(drop.element, point[0], point[1]) );
- },
-
- deactivate: function(drop) {
- if(drop.hoverclass)
- Element.removeClassName(drop.element, drop.hoverclass);
- this.last_active = null;
- },
-
- activate: function(drop) {
- if(drop.hoverclass)
- Element.addClassName(drop.element, drop.hoverclass);
- this.last_active = drop;
- },
-
- show: function(point, element) {
- if(!this.drops.length) return;
- var drop, affected = [];
-
- this.drops.each( function(drop) {
- if(Droppables.isAffected(point, element, drop))
- affected.push(drop);
- });
-
- if(affected.length>0)
- drop = Droppables.findDeepestChild(affected);
-
- if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);
- if (drop) {
- Position.within(drop.element, point[0], point[1]);
- if(drop.onHover)
- drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
-
- if (drop != this.last_active) Droppables.activate(drop);
- }
- },
-
- fire: function(event, element) {
- if(!this.last_active) return;
- Position.prepare();
-
- if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
- if (this.last_active.onDrop) {
- this.last_active.onDrop(element, this.last_active.element, event);
- return true;
- }
- },
-
- reset: function() {
- if(this.last_active)
- this.deactivate(this.last_active);
- }
-};
-
-var Draggables = {
- drags: [],
- observers: [],
-
- register: function(draggable) {
- if(this.drags.length == 0) {
- this.eventMouseUp = this.endDrag.bindAsEventListener(this);
- this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
- this.eventKeypress = this.keyPress.bindAsEventListener(this);
-
- Event.observe(document, "mouseup", this.eventMouseUp);
- Event.observe(document, "mousemove", this.eventMouseMove);
- Event.observe(document, "keypress", this.eventKeypress);
- }
- this.drags.push(draggable);
- },
-
- unregister: function(draggable) {
- this.drags = this.drags.reject(function(d) { return d==draggable; });
- if(this.drags.length == 0) {
- Event.stopObserving(document, "mouseup", this.eventMouseUp);
- Event.stopObserving(document, "mousemove", this.eventMouseMove);
- Event.stopObserving(document, "keypress", this.eventKeypress);
- }
- },
-
- activate: function(draggable) {
- if(draggable.options.delay) {
- this._timeout = setTimeout(function() {
- Draggables._timeout = null;
- window.focus();
- Draggables.activeDraggable = draggable;
- }.bind(this), draggable.options.delay);
- } else {
- window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
- this.activeDraggable = draggable;
- }
- },
-
- deactivate: function() {
- this.activeDraggable = null;
- },
-
- updateDrag: function(event) {
- if(!this.activeDraggable) return;
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- // Mozilla-based browsers fire successive mousemove events with
- // the same coordinates, prevent needless redrawing (moz bug?)
- if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
- this._lastPointer = pointer;
-
- this.activeDraggable.updateDrag(event, pointer);
- },
-
- endDrag: function(event) {
- if(this._timeout) {
- clearTimeout(this._timeout);
- this._timeout = null;
- }
- if(!this.activeDraggable) return;
- this._lastPointer = null;
- this.activeDraggable.endDrag(event);
- this.activeDraggable = null;
- },
-
- keyPress: function(event) {
- if(this.activeDraggable)
- this.activeDraggable.keyPress(event);
- },
-
- addObserver: function(observer) {
- this.observers.push(observer);
- this._cacheObserverCallbacks();
- },
-
- removeObserver: function(element) { // element instead of observer fixes mem leaks
- this.observers = this.observers.reject( function(o) { return o.element==element; });
- this._cacheObserverCallbacks();
- },
-
- notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'
- if(this[eventName+'Count'] > 0)
- this.observers.each( function(o) {
- if(o[eventName]) o[eventName](eventName, draggable, event);
- });
- if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
- },
-
- _cacheObserverCallbacks: function() {
- ['onStart','onEnd','onDrag'].each( function(eventName) {
- Draggables[eventName+'Count'] = Draggables.observers.select(
- function(o) { return o[eventName]; }
- ).length;
- });
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-var Draggable = Class.create({
- initialize: function(element) {
- var defaults = {
- handle: false,
- reverteffect: function(element, top_offset, left_offset) {
- var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
- new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
- queue: {scope:'_draggable', position:'end'}
- });
- },
- endeffect: function(element) {
- var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
- new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
- queue: {scope:'_draggable', position:'end'},
- afterFinish: function(){
- Draggable._dragging[element] = false;
- }
- });
- },
- zindex: 1000,
- revert: false,
- quiet: false,
- scroll: false,
- scrollSensitivity: 20,
- scrollSpeed: 15,
- snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }
- delay: 0
- };
-
- if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
- Object.extend(defaults, {
- starteffect: function(element) {
- element._opacity = Element.getOpacity(element);
- Draggable._dragging[element] = true;
- new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
- }
- });
-
- var options = Object.extend(defaults, arguments[1] || { });
-
- this.element = $(element);
-
- if(options.handle && Object.isString(options.handle))
- this.handle = this.element.down('.'+options.handle, 0);
-
- if(!this.handle) this.handle = $(options.handle);
- if(!this.handle) this.handle = this.element;
-
- if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
- options.scroll = $(options.scroll);
- this._isScrollChild = Element.childOf(this.element, options.scroll);
- }
-
- Element.makePositioned(this.element); // fix IE
-
- this.options = options;
- this.dragging = false;
-
- this.eventMouseDown = this.initDrag.bindAsEventListener(this);
- Event.observe(this.handle, "mousedown", this.eventMouseDown);
-
- Draggables.register(this);
- },
-
- destroy: function() {
- Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
- Draggables.unregister(this);
- },
-
- currentDelta: function() {
- return([
- parseInt(Element.getStyle(this.element,'left') || '0'),
- parseInt(Element.getStyle(this.element,'top') || '0')]);
- },
-
- initDrag: function(event) {
- if(!Object.isUndefined(Draggable._dragging[this.element]) &&
- Draggable._dragging[this.element]) return;
- if(Event.isLeftClick(event)) {
- // abort on form elements, fixes a Firefox issue
- var src = Event.element(event);
- if((tag_name = src.tagName.toUpperCase()) && (
- tag_name=='input' ||
- tag_name=='select' ||
- tag_name=='option' ||
- tag_name=='button' ||
- tag_name=='textarea')) return;
-
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var pos = this.element.cumulativeOffset();
- this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]); });
-
- Draggables.activate(this);
- Event.stop(event);
- }
- },
-
- startDrag: function(event) {
- this.dragging = true;
- if(!this.delta)
- this.delta = this.currentDelta();
-
- if(this.options.zindex) {
- this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
- this.element.style.zIndex = this.options.zindex;
- }
-
- if(this.options.ghosting) {
- this._clone = this.element.cloneNode(true);
- this._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
- if (!this._originallyAbsolute)
- Position.absolutize(this.element);
- this.element.parentNode.insertBefore(this._clone, this.element);
- }
-
- if(this.options.scroll) {
- if (this.options.scroll == window) {
- var where = this._getWindowScroll(this.options.scroll);
- this.originalScrollLeft = where.left;
- this.originalScrollTop = where.top;
- } else {
- this.originalScrollLeft = this.options.scroll.scrollLeft;
- this.originalScrollTop = this.options.scroll.scrollTop;
- }
- }
-
- Draggables.notify('onStart', this, event);
-
- if(this.options.starteffect) this.options.starteffect(this.element);
- },
-
- updateDrag: function(event, pointer) {
- if(!this.dragging) this.startDrag(event);
-
- if(!this.options.quiet){
- Position.prepare();
- Droppables.show(pointer, this.element);
- }
-
- Draggables.notify('onDrag', this, event);
-
- this.draw(pointer);
- if(this.options.change) this.options.change(this);
-
- if(this.options.scroll) {
- this.stopScrolling();
-
- var p;
- if (this.options.scroll == window) {
- with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
- } else {
- p = Position.page(this.options.scroll);
- p[0] += this.options.scroll.scrollLeft + Position.deltaX;
- p[1] += this.options.scroll.scrollTop + Position.deltaY;
- p.push(p[0]+this.options.scroll.offsetWidth);
- p.push(p[1]+this.options.scroll.offsetHeight);
- }
- var speed = [0,0];
- if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
- if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
- if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
- if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
- this.startScrolling(speed);
- }
-
- // fix AppleWebKit rendering
- if(Prototype.Browser.WebKit) window.scrollBy(0,0);
-
- Event.stop(event);
- },
-
- finishDrag: function(event, success) {
- this.dragging = false;
-
- if(this.options.quiet){
- Position.prepare();
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- Droppables.show(pointer, this.element);
- }
-
- if(this.options.ghosting) {
- if (!this._originallyAbsolute)
- Position.relativize(this.element);
- delete this._originallyAbsolute;
- Element.remove(this._clone);
- this._clone = null;
- }
-
- var dropped = false;
- if(success) {
- dropped = Droppables.fire(event, this.element);
- if (!dropped) dropped = false;
- }
- if(dropped && this.options.onDropped) this.options.onDropped(this.element);
- Draggables.notify('onEnd', this, event);
-
- var revert = this.options.revert;
- if(revert && Object.isFunction(revert)) revert = revert(this.element);
-
- var d = this.currentDelta();
- if(revert && this.options.reverteffect) {
- if (dropped == 0 || revert != 'failure')
- this.options.reverteffect(this.element,
- d[1]-this.delta[1], d[0]-this.delta[0]);
- } else {
- this.delta = d;
- }
-
- if(this.options.zindex)
- this.element.style.zIndex = this.originalZ;
-
- if(this.options.endeffect)
- this.options.endeffect(this.element);
-
- Draggables.deactivate(this);
- Droppables.reset();
- },
-
- keyPress: function(event) {
- if(event.keyCode!=Event.KEY_ESC) return;
- this.finishDrag(event, false);
- Event.stop(event);
- },
-
- endDrag: function(event) {
- if(!this.dragging) return;
- this.stopScrolling();
- this.finishDrag(event, true);
- Event.stop(event);
- },
-
- draw: function(point) {
- var pos = this.element.cumulativeOffset();
- if(this.options.ghosting) {
- var r = Position.realOffset(this.element);
- pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
- }
-
- var d = this.currentDelta();
- pos[0] -= d[0]; pos[1] -= d[1];
-
- if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
- pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
- pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
- }
-
- var p = [0,1].map(function(i){
- return (point[i]-pos[i]-this.offset[i]);
- }.bind(this));
-
- if(this.options.snap) {
- if(Object.isFunction(this.options.snap)) {
- p = this.options.snap(p[0],p[1],this);
- } else {
- if(Object.isArray(this.options.snap)) {
- p = p.map( function(v, i) {
- return (v/this.options.snap[i]).round()*this.options.snap[i]; }.bind(this));
- } else {
- p = p.map( function(v) {
- return (v/this.options.snap).round()*this.options.snap; }.bind(this));
- }
- }}
-
- var style = this.element.style;
- if((!this.options.constraint) || (this.options.constraint=='horizontal'))
- style.left = p[0] + "px";
- if((!this.options.constraint) || (this.options.constraint=='vertical'))
- style.top = p[1] + "px";
-
- if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
- },
-
- stopScrolling: function() {
- if(this.scrollInterval) {
- clearInterval(this.scrollInterval);
- this.scrollInterval = null;
- Draggables._lastScrollPointer = null;
- }
- },
-
- startScrolling: function(speed) {
- if(!(speed[0] || speed[1])) return;
- this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
- this.lastScrolled = new Date();
- this.scrollInterval = setInterval(this.scroll.bind(this), 10);
- },
-
- scroll: function() {
- var current = new Date();
- var delta = current - this.lastScrolled;
- this.lastScrolled = current;
- if(this.options.scroll == window) {
- with (this._getWindowScroll(this.options.scroll)) {
- if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
- var d = delta / 1000;
- this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
- }
- }
- } else {
- this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
- this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
- }
-
- Position.prepare();
- Droppables.show(Draggables._lastPointer, this.element);
- Draggables.notify('onDrag', this);
- if (this._isScrollChild) {
- Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
- Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
- Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
- if (Draggables._lastScrollPointer[0] < 0)
- Draggables._lastScrollPointer[0] = 0;
- if (Draggables._lastScrollPointer[1] < 0)
- Draggables._lastScrollPointer[1] = 0;
- this.draw(Draggables._lastScrollPointer);
- }
-
- if(this.options.change) this.options.change(this);
- },
-
- _getWindowScroll: function(w) {
- var T, L, W, H;
- with (w.document) {
- if (w.document.documentElement && documentElement.scrollTop) {
- T = documentElement.scrollTop;
- L = documentElement.scrollLeft;
- } else if (w.document.body) {
- T = body.scrollTop;
- L = body.scrollLeft;
- }
- if (w.innerWidth) {
- W = w.innerWidth;
- H = w.innerHeight;
- } else if (w.document.documentElement && documentElement.clientWidth) {
- W = documentElement.clientWidth;
- H = documentElement.clientHeight;
- } else {
- W = body.offsetWidth;
- H = body.offsetHeight;
- }
- }
- return { top: T, left: L, width: W, height: H };
- }
-});
-
-Draggable._dragging = { };
-
-/*--------------------------------------------------------------------------*/
-
-var SortableObserver = Class.create({
- initialize: function(element, observer) {
- this.element = $(element);
- this.observer = observer;
- this.lastValue = Sortable.serialize(this.element);
- },
-
- onStart: function() {
- this.lastValue = Sortable.serialize(this.element);
- },
-
- onEnd: function() {
- Sortable.unmark();
- if(this.lastValue != Sortable.serialize(this.element))
- this.observer(this.element);
- }
-});
-
-var Sortable = {
- SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
-
- sortables: { },
-
- _findRootElement: function(element) {
- while (element.tagName.toUpperCase() != "BODY") {
- if(element.id && Sortable.sortables[element.id]) return element;
- element = element.parentNode;
- }
- },
-
- options: function(element) {
- element = Sortable._findRootElement($(element));
- if(!element) return;
- return Sortable.sortables[element.id];
- },
-
- destroy: function(element){
- element = $(element);
- var s = Sortable.sortables[element.id];
-
- if(s) {
- Draggables.removeObserver(s.element);
- s.droppables.each(function(d){ Droppables.remove(d); });
- s.draggables.invoke('destroy');
-
- delete Sortable.sortables[s.element.id];
- }
- },
-
- create: function(element) {
- element = $(element);
- var options = Object.extend({
- element: element,
- tag: 'li', // assumes li children, override with tag: 'tagname'
- dropOnEmpty: false,
- tree: false,
- treeTag: 'ul',
- overlap: 'vertical', // one of 'vertical', 'horizontal'
- constraint: 'vertical', // one of 'vertical', 'horizontal', false
- containment: element, // also takes array of elements (or id's); or false
- handle: false, // or a CSS class
- only: false,
- delay: 0,
- hoverclass: null,
- ghosting: false,
- quiet: false,
- scroll: false,
- scrollSensitivity: 20,
- scrollSpeed: 15,
- format: this.SERIALIZE_RULE,
-
- // these take arrays of elements or ids and can be
- // used for better initialization performance
- elements: false,
- handles: false,
-
- onChange: Prototype.emptyFunction,
- onUpdate: Prototype.emptyFunction
- }, arguments[1] || { });
-
- // clear any old sortable with same element
- this.destroy(element);
-
- // build options for the draggables
- var options_for_draggable = {
- revert: true,
- quiet: options.quiet,
- scroll: options.scroll,
- scrollSpeed: options.scrollSpeed,
- scrollSensitivity: options.scrollSensitivity,
- delay: options.delay,
- ghosting: options.ghosting,
- constraint: options.constraint,
- handle: options.handle };
-
- if(options.starteffect)
- options_for_draggable.starteffect = options.starteffect;
-
- if(options.reverteffect)
- options_for_draggable.reverteffect = options.reverteffect;
- else
- if(options.ghosting) options_for_draggable.reverteffect = function(element) {
- element.style.top = 0;
- element.style.left = 0;
- };
-
- if(options.endeffect)
- options_for_draggable.endeffect = options.endeffect;
-
- if(options.zindex)
- options_for_draggable.zindex = options.zindex;
-
- // build options for the droppables
- var options_for_droppable = {
- overlap: options.overlap,
- containment: options.containment,
- tree: options.tree,
- hoverclass: options.hoverclass,
- onHover: Sortable.onHover
- };
-
- var options_for_tree = {
- onHover: Sortable.onEmptyHover,
- overlap: options.overlap,
- containment: options.containment,
- hoverclass: options.hoverclass
- };
-
- // fix for gecko engine
- Element.cleanWhitespace(element);
-
- options.draggables = [];
- options.droppables = [];
-
- // drop on empty handling
- if(options.dropOnEmpty || options.tree) {
- Droppables.add(element, options_for_tree);
- options.droppables.push(element);
- }
-
- (options.elements || this.findElements(element, options) || []).each( function(e,i) {
- var handle = options.handles ? $(options.handles[i]) :
- (options.handle ? $(e).select('.' + options.handle)[0] : e);
- options.draggables.push(
- new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
- Droppables.add(e, options_for_droppable);
- if(options.tree) e.treeNode = element;
- options.droppables.push(e);
- });
-
- if(options.tree) {
- (Sortable.findTreeElements(element, options) || []).each( function(e) {
- Droppables.add(e, options_for_tree);
- e.treeNode = element;
- options.droppables.push(e);
- });
- }
-
- // keep reference
- this.sortables[element.identify()] = options;
-
- // for onupdate
- Draggables.addObserver(new SortableObserver(element, options.onUpdate));
-
- },
-
- // return all suitable-for-sortable elements in a guaranteed order
- findElements: function(element, options) {
- return Element.findChildren(
- element, options.only, options.tree ? true : false, options.tag);
- },
-
- findTreeElements: function(element, options) {
- return Element.findChildren(
- element, options.only, options.tree ? true : false, options.treeTag);
- },
-
- onHover: function(element, dropon, overlap) {
- if(Element.isParent(dropon, element)) return;
-
- if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
- return;
- } else if(overlap>0.5) {
- Sortable.mark(dropon, 'before');
- if(dropon.previousSibling != element) {
- var oldParentNode = element.parentNode;
- element.style.visibility = "hidden"; // fix gecko rendering
- dropon.parentNode.insertBefore(element, dropon);
- if(dropon.parentNode!=oldParentNode)
- Sortable.options(oldParentNode).onChange(element);
- Sortable.options(dropon.parentNode).onChange(element);
- }
- } else {
- Sortable.mark(dropon, 'after');
- var nextElement = dropon.nextSibling || null;
- if(nextElement != element) {
- var oldParentNode = element.parentNode;
- element.style.visibility = "hidden"; // fix gecko rendering
- dropon.parentNode.insertBefore(element, nextElement);
- if(dropon.parentNode!=oldParentNode)
- Sortable.options(oldParentNode).onChange(element);
- Sortable.options(dropon.parentNode).onChange(element);
- }
- }
- },
-
- onEmptyHover: function(element, dropon, overlap) {
- var oldParentNode = element.parentNode;
- var droponOptions = Sortable.options(dropon);
-
- if(!Element.isParent(dropon, element)) {
- var index;
-
- var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
- var child = null;
-
- if(children) {
- var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
-
- for (index = 0; index < children.length; index += 1) {
- if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
- offset -= Element.offsetSize (children[index], droponOptions.overlap);
- } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
- child = index + 1 < children.length ? children[index + 1] : null;
- break;
- } else {
- child = children[index];
- break;
- }
- }
- }
-
- dropon.insertBefore(element, child);
-
- Sortable.options(oldParentNode).onChange(element);
- droponOptions.onChange(element);
- }
- },
-
- unmark: function() {
- if(Sortable._marker) Sortable._marker.hide();
- },
-
- mark: function(dropon, position) {
- // mark on ghosting only
- var sortable = Sortable.options(dropon.parentNode);
- if(sortable && !sortable.ghosting) return;
-
- if(!Sortable._marker) {
- Sortable._marker =
- ($('dropmarker') || Element.extend(document.createElement('DIV'))).
- hide().addClassName('dropmarker').setStyle({position:'absolute'});
- document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
- }
- var offsets = dropon.cumulativeOffset();
- Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
-
- if(position=='after')
- if(sortable.overlap == 'horizontal')
- Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
- else
- Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
-
- Sortable._marker.show();
- },
-
- _tree: function(element, options, parent) {
- var children = Sortable.findElements(element, options) || [];
-
- for (var i = 0; i < children.length; ++i) {
- var match = children[i].id.match(options.format);
-
- if (!match) continue;
-
- var child = {
- id: encodeURIComponent(match ? match[1] : null),
- element: element,
- parent: parent,
- children: [],
- position: parent.children.length,
- container: $(children[i]).down(options.treeTag)
- };
-
- /* Get the element containing the children and recurse over it */
- if (child.container)
- this._tree(child.container, options, child);
-
- parent.children.push (child);
- }
-
- return parent;
- },
-
- tree: function(element) {
- element = $(element);
- var sortableOptions = this.options(element);
- var options = Object.extend({
- tag: sortableOptions.tag,
- treeTag: sortableOptions.treeTag,
- only: sortableOptions.only,
- name: element.id,
- format: sortableOptions.format
- }, arguments[1] || { });
-
- var root = {
- id: null,
- parent: null,
- children: [],
- container: element,
- position: 0
- };
-
- return Sortable._tree(element, options, root);
- },
-
- /* Construct a [i] index for a particular node */
- _constructIndex: function(node) {
- var index = '';
- do {
- if (node.id) index = '[' + node.position + ']' + index;
- } while ((node = node.parent) != null);
- return index;
- },
-
- sequence: function(element) {
- element = $(element);
- var options = Object.extend(this.options(element), arguments[1] || { });
-
- return $(this.findElements(element, options) || []).map( function(item) {
- return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
- });
- },
-
- setSequence: function(element, new_sequence) {
- element = $(element);
- var options = Object.extend(this.options(element), arguments[2] || { });
-
- var nodeMap = { };
- this.findElements(element, options).each( function(n) {
- if (n.id.match(options.format))
- nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
- n.parentNode.removeChild(n);
- });
-
- new_sequence.each(function(ident) {
- var n = nodeMap[ident];
- if (n) {
- n[1].appendChild(n[0]);
- delete nodeMap[ident];
- }
- });
- },
-
- serialize: function(element) {
- element = $(element);
- var options = Object.extend(Sortable.options(element), arguments[1] || { });
- var name = encodeURIComponent(
- (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
-
- if (options.tree) {
- return Sortable.tree(element, arguments[1]).children.map( function (item) {
- return [name + Sortable._constructIndex(item) + "[id]=" +
- encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
- }).flatten().join('&');
- } else {
- return Sortable.sequence(element, arguments[1]).map( function(item) {
- return name + "[]=" + encodeURIComponent(item);
- }).join('&');
- }
- }
-};
-
-// Returns true if child is contained within element
-Element.isParent = function(child, element) {
- if (!child.parentNode || child == element) return false;
- if (child.parentNode == element) return true;
- return Element.isParent(child.parentNode, element);
-};
-
-Element.findChildren = function(element, only, recursive, tagName) {
- if(!element.hasChildNodes()) return null;
- tagName = tagName.toUpperCase();
- if(only) only = [only].flatten();
- var elements = [];
- $A(element.childNodes).each( function(e) {
- if(e.tagName && e.tagName.toUpperCase()==tagName &&
- (!only || (Element.classNames(e).detect(function(v) { return only.include(v); }))))
- elements.push(e);
- if(recursive) {
- var grandchildren = Element.findChildren(e, only, recursive, tagName);
- if(grandchildren) elements.push(grandchildren);
- }
- });
-
- return (elements.length>0 ? elements.flatten() : []);
-};
-
-Element.offsetSize = function (element, type) {
- return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
-}; \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/effects.js b/src/usr/local/www/javascript/scriptaculous/effects.js
deleted file mode 100644
index 7d5192c..0000000
--- a/src/usr/local/www/javascript/scriptaculous/effects.js
+++ /dev/null
@@ -1,1123 +0,0 @@
-// script.aculo.us effects.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
-
-// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// Contributors:
-// Justin Palmer (http://encytemedia.com/)
-// Mark Pilgrim (http://diveintomark.org/)
-// Martin Bialasinki
-//
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-// converts rgb() and #xxx to #xxxxxx format,
-// returns self (or first argument) if not convertable
-String.prototype.parseColor = function() {
- var color = '#';
- if (this.slice(0,4) == 'rgb(') {
- var cols = this.slice(4,this.length-1).split(',');
- var i=0; do { color += parseInt(cols[i]).toColorPart(); } while (++i<3);
- } else {
- if (this.slice(0,1) == '#') {
- if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
- if (this.length==7) color = this.toLowerCase();
- }
- }
- return (color.length==7 ? color : (arguments[0] || this));
-};
-
-/*--------------------------------------------------------------------------*/
-
-Element.collectTextNodes = function(element) {
- return $A($(element).childNodes).collect( function(node) {
- return (node.nodeType==3 ? node.nodeValue :
- (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
- }).flatten().join('');
-};
-
-Element.collectTextNodesIgnoreClass = function(element, className) {
- return $A($(element).childNodes).collect( function(node) {
- return (node.nodeType==3 ? node.nodeValue :
- ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
- Element.collectTextNodesIgnoreClass(node, className) : ''));
- }).flatten().join('');
-};
-
-Element.setContentZoom = function(element, percent) {
- element = $(element);
- element.setStyle({fontSize: (percent/100) + 'em'});
- if (Prototype.Browser.WebKit) window.scrollBy(0,0);
- return element;
-};
-
-Element.getInlineOpacity = function(element){
- return $(element).style.opacity || '';
-};
-
-Element.forceRerendering = function(element) {
- try {
- element = $(element);
- var n = document.createTextNode(' ');
- element.appendChild(n);
- element.removeChild(n);
- } catch(e) { }
-};
-
-/*--------------------------------------------------------------------------*/
-
-var Effect = {
- _elementDoesNotExistError: {
- name: 'ElementDoesNotExistError',
- message: 'The specified DOM element does not exist, but is required for this effect to operate'
- },
- Transitions: {
- linear: Prototype.K,
- sinoidal: function(pos) {
- return (-Math.cos(pos*Math.PI)/2) + .5;
- },
- reverse: function(pos) {
- return 1-pos;
- },
- flicker: function(pos) {
- var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4;
- return pos > 1 ? 1 : pos;
- },
- wobble: function(pos) {
- return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5;
- },
- pulse: function(pos, pulses) {
- return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5;
- },
- spring: function(pos) {
- return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));
- },
- none: function(pos) {
- return 0;
- },
- full: function(pos) {
- return 1;
- }
- },
- DefaultOptions: {
- duration: 1.0, // seconds
- fps: 100, // 100= assume 66fps max.
- sync: false, // true for combining
- from: 0.0,
- to: 1.0,
- delay: 0.0,
- queue: 'parallel'
- },
- tagifyText: function(element) {
- var tagifyStyle = 'position:relative';
- if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
-
- element = $(element);
- $A(element.childNodes).each( function(child) {
- if (child.nodeType==3) {
- child.nodeValue.toArray().each( function(character) {
- element.insertBefore(
- new Element('span', {style: tagifyStyle}).update(
- character == ' ' ? String.fromCharCode(160) : character),
- child);
- });
- Element.remove(child);
- }
- });
- },
- multiple: function(element, effect) {
- var elements;
- if (((typeof element == 'object') ||
- Object.isFunction(element)) &&
- (element.length))
- elements = element;
- else
- elements = $(element).childNodes;
-
- var options = Object.extend({
- speed: 0.1,
- delay: 0.0
- }, arguments[2] || { });
- var masterDelay = options.delay;
-
- $A(elements).each( function(element, index) {
- new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
- });
- },
- PAIRS: {
- 'slide': ['SlideDown','SlideUp'],
- 'blind': ['BlindDown','BlindUp'],
- 'appear': ['Appear','Fade']
- },
- toggle: function(element, effect, options) {
- element = $(element);
- effect = (effect || 'appear').toLowerCase();
-
- return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({
- queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
- }, options || {}));
- }
-};
-
-Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;
-
-/* ------------- core effects ------------- */
-
-Effect.ScopedQueue = Class.create(Enumerable, {
- initialize: function() {
- this.effects = [];
- this.interval = null;
- },
- _each: function(iterator) {
- this.effects._each(iterator);
- },
- add: function(effect) {
- var timestamp = new Date().getTime();
-
- var position = Object.isString(effect.options.queue) ?
- effect.options.queue : effect.options.queue.position;
-
- switch(position) {
- case 'front':
- // move unstarted effects after this effect
- this.effects.findAll(function(e){ return e.state=='idle'; }).each( function(e) {
- e.startOn += effect.finishOn;
- e.finishOn += effect.finishOn;
- });
- break;
- case 'with-last':
- timestamp = this.effects.pluck('startOn').max() || timestamp;
- break;
- case 'end':
- // start effect after last queued effect has finished
- timestamp = this.effects.pluck('finishOn').max() || timestamp;
- break;
- }
-
- effect.startOn += timestamp;
- effect.finishOn += timestamp;
-
- if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
- this.effects.push(effect);
-
- if (!this.interval)
- this.interval = setInterval(this.loop.bind(this), 15);
- },
- remove: function(effect) {
- this.effects = this.effects.reject(function(e) { return e==effect; });
- if (this.effects.length == 0) {
- clearInterval(this.interval);
- this.interval = null;
- }
- },
- loop: function() {
- var timePos = new Date().getTime();
- for(var i=0, len=this.effects.length;i<len;i++)
- this.effects[i] && this.effects[i].loop(timePos);
- }
-});
-
-Effect.Queues = {
- instances: $H(),
- get: function(queueName) {
- if (!Object.isString(queueName)) return queueName;
-
- return this.instances.get(queueName) ||
- this.instances.set(queueName, new Effect.ScopedQueue());
- }
-};
-Effect.Queue = Effect.Queues.get('global');
-
-Effect.Base = Class.create({
- position: null,
- start: function(options) {
- if (options && options.transition === false) options.transition = Effect.Transitions.linear;
- this.options = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });
- this.currentFrame = 0;
- this.state = 'idle';
- this.startOn = this.options.delay*1000;
- this.finishOn = this.startOn+(this.options.duration*1000);
- this.fromToDelta = this.options.to-this.options.from;
- this.totalTime = this.finishOn-this.startOn;
- this.totalFrames = this.options.fps*this.options.duration;
-
- this.render = (function() {
- function dispatch(effect, eventName) {
- if (effect.options[eventName + 'Internal'])
- effect.options[eventName + 'Internal'](effect);
- if (effect.options[eventName])
- effect.options[eventName](effect);
- }
-
- return function(pos) {
- if (this.state === "idle") {
- this.state = "running";
- dispatch(this, 'beforeSetup');
- if (this.setup) this.setup();
- dispatch(this, 'afterSetup');
- }
- if (this.state === "running") {
- pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from;
- this.position = pos;
- dispatch(this, 'beforeUpdate');
- if (this.update) this.update(pos);
- dispatch(this, 'afterUpdate');
- }
- };
- })();
-
- this.event('beforeStart');
- if (!this.options.sync)
- Effect.Queues.get(Object.isString(this.options.queue) ?
- 'global' : this.options.queue.scope).add(this);
- },
- loop: function(timePos) {
- if (timePos >= this.startOn) {
- if (timePos >= this.finishOn) {
- this.render(1.0);
- this.cancel();
- this.event('beforeFinish');
- if (this.finish) this.finish();
- this.event('afterFinish');
- return;
- }
- var pos = (timePos - this.startOn) / this.totalTime,
- frame = (pos * this.totalFrames).round();
- if (frame > this.currentFrame) {
- this.render(pos);
- this.currentFrame = frame;
- }
- }
- },
- cancel: function() {
- if (!this.options.sync)
- Effect.Queues.get(Object.isString(this.options.queue) ?
- 'global' : this.options.queue.scope).remove(this);
- this.state = 'finished';
- },
- event: function(eventName) {
- if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
- if (this.options[eventName]) this.options[eventName](this);
- },
- inspect: function() {
- var data = $H();
- for(property in this)
- if (!Object.isFunction(this[property])) data.set(property, this[property]);
- return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
- }
-});
-
-Effect.Parallel = Class.create(Effect.Base, {
- initialize: function(effects) {
- this.effects = effects || [];
- this.start(arguments[1]);
- },
- update: function(position) {
- this.effects.invoke('render', position);
- },
- finish: function(position) {
- this.effects.each( function(effect) {
- effect.render(1.0);
- effect.cancel();
- effect.event('beforeFinish');
- if (effect.finish) effect.finish(position);
- effect.event('afterFinish');
- });
- }
-});
-
-Effect.Tween = Class.create(Effect.Base, {
- initialize: function(object, from, to) {
- object = Object.isString(object) ? $(object) : object;
- var args = $A(arguments), method = args.last(),
- options = args.length == 5 ? args[3] : null;
- this.method = Object.isFunction(method) ? method.bind(object) :
- Object.isFunction(object[method]) ? object[method].bind(object) :
- function(value) { object[method] = value; };
- this.start(Object.extend({ from: from, to: to }, options || { }));
- },
- update: function(position) {
- this.method(position);
- }
-});
-
-Effect.Event = Class.create(Effect.Base, {
- initialize: function() {
- this.start(Object.extend({ duration: 0 }, arguments[0] || { }));
- },
- update: Prototype.emptyFunction
-});
-
-Effect.Opacity = Class.create(Effect.Base, {
- initialize: function(element) {
- this.element = $(element);
- if (!this.element) throw(Effect._elementDoesNotExistError);
- // make this work on IE on elements without 'layout'
- if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
- this.element.setStyle({zoom: 1});
- var options = Object.extend({
- from: this.element.getOpacity() || 0.0,
- to: 1.0
- }, arguments[1] || { });
- this.start(options);
- },
- update: function(position) {
- this.element.setOpacity(position);
- }
-});
-
-Effect.Move = Class.create(Effect.Base, {
- initialize: function(element) {
- this.element = $(element);
- if (!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({
- x: 0,
- y: 0,
- mode: 'relative'
- }, arguments[1] || { });
- this.start(options);
- },
- setup: function() {
- this.element.makePositioned();
- this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
- this.originalTop = parseFloat(this.element.getStyle('top') || '0');
- if (this.options.mode == 'absolute') {
- this.options.x = this.options.x - this.originalLeft;
- this.options.y = this.options.y - this.originalTop;
- }
- },
- update: function(position) {
- this.element.setStyle({
- left: (this.options.x * position + this.originalLeft).round() + 'px',
- top: (this.options.y * position + this.originalTop).round() + 'px'
- });
- }
-});
-
-// for backwards compatibility
-Effect.MoveBy = function(element, toTop, toLeft) {
- return new Effect.Move(element,
- Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
-};
-
-Effect.Scale = Class.create(Effect.Base, {
- initialize: function(element, percent) {
- this.element = $(element);
- if (!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({
- scaleX: true,
- scaleY: true,
- scaleContent: true,
- scaleFromCenter: false,
- scaleMode: 'box', // 'box' or 'contents' or { } with provided values
- scaleFrom: 100.0,
- scaleTo: percent
- }, arguments[2] || { });
- this.start(options);
- },
- setup: function() {
- this.restoreAfterFinish = this.options.restoreAfterFinish || false;
- this.elementPositioning = this.element.getStyle('position');
-
- this.originalStyle = { };
- ['top','left','width','height','fontSize'].each( function(k) {
- this.originalStyle[k] = this.element.style[k];
- }.bind(this));
-
- this.originalTop = this.element.offsetTop;
- this.originalLeft = this.element.offsetLeft;
-
- var fontSize = this.element.getStyle('font-size') || '100%';
- ['em','px','%','pt'].each( function(fontSizeType) {
- if (fontSize.indexOf(fontSizeType)>0) {
- this.fontSize = parseFloat(fontSize);
- this.fontSizeType = fontSizeType;
- }
- }.bind(this));
-
- this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
-
- this.dims = null;
- if (this.options.scaleMode=='box')
- this.dims = [this.element.offsetHeight, this.element.offsetWidth];
- if (/^content/.test(this.options.scaleMode))
- this.dims = [this.element.scrollHeight, this.element.scrollWidth];
- if (!this.dims)
- this.dims = [this.options.scaleMode.originalHeight,
- this.options.scaleMode.originalWidth];
- },
- update: function(position) {
- var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
- if (this.options.scaleContent && this.fontSize)
- this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
- this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
- },
- finish: function(position) {
- if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
- },
- setDimensions: function(height, width) {
- var d = { };
- if (this.options.scaleX) d.width = width.round() + 'px';
- if (this.options.scaleY) d.height = height.round() + 'px';
- if (this.options.scaleFromCenter) {
- var topd = (height - this.dims[0])/2;
- var leftd = (width - this.dims[1])/2;
- if (this.elementPositioning == 'absolute') {
- if (this.options.scaleY) d.top = this.originalTop-topd + 'px';
- if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
- } else {
- if (this.options.scaleY) d.top = -topd + 'px';
- if (this.options.scaleX) d.left = -leftd + 'px';
- }
- }
- this.element.setStyle(d);
- }
-});
-
-Effect.Highlight = Class.create(Effect.Base, {
- initialize: function(element) {
- this.element = $(element);
- if (!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
- this.start(options);
- },
- setup: function() {
- // Prevent executing on elements not in the layout flow
- if (this.element.getStyle('display')=='none') { this.cancel(); return; }
- // Disable background image during the effect
- this.oldStyle = { };
- if (!this.options.keepBackgroundImage) {
- this.oldStyle.backgroundImage = this.element.getStyle('background-image');
- this.element.setStyle({backgroundImage: 'none'});
- }
- if (!this.options.endcolor)
- this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
- if (!this.options.restorecolor)
- this.options.restorecolor = this.element.getStyle('background-color');
- // init color calculations
- this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16); }.bind(this));
- this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i]; }.bind(this));
- },
- update: function(position) {
- this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
- return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });
- },
- finish: function() {
- this.element.setStyle(Object.extend(this.oldStyle, {
- backgroundColor: this.options.restorecolor
- }));
- }
-});
-
-Effect.ScrollTo = function(element) {
- var options = arguments[1] || { },
- scrollOffsets = document.viewport.getScrollOffsets(),
- elementOffsets = $(element).cumulativeOffset();
-
- if (options.offset) elementOffsets[1] += options.offset;
-
- return new Effect.Tween(null,
- scrollOffsets.top,
- elementOffsets[1],
- options,
- function(p){ scrollTo(scrollOffsets.left, p.round()); }
- );
-};
-
-/* ------------- combination effects ------------- */
-
-Effect.Fade = function(element) {
- element = $(element);
- var oldOpacity = element.getInlineOpacity();
- var options = Object.extend({
- from: element.getOpacity() || 1.0,
- to: 0.0,
- afterFinishInternal: function(effect) {
- if (effect.options.to!=0) return;
- effect.element.hide().setStyle({opacity: oldOpacity});
- }
- }, arguments[1] || { });
- return new Effect.Opacity(element,options);
-};
-
-Effect.Appear = function(element) {
- element = $(element);
- var options = Object.extend({
- from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
- to: 1.0,
- // force Safari to render floated elements properly
- afterFinishInternal: function(effect) {
- effect.element.forceRerendering();
- },
- beforeSetup: function(effect) {
- effect.element.setOpacity(effect.options.from).show();
- }}, arguments[1] || { });
- return new Effect.Opacity(element,options);
-};
-
-Effect.Puff = function(element) {
- element = $(element);
- var oldStyle = {
- opacity: element.getInlineOpacity(),
- position: element.getStyle('position'),
- top: element.style.top,
- left: element.style.left,
- width: element.style.width,
- height: element.style.height
- };
- return new Effect.Parallel(
- [ new Effect.Scale(element, 200,
- { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
- new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
- Object.extend({ duration: 1.0,
- beforeSetupInternal: function(effect) {
- Position.absolutize(effect.effects[0].element);
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide().setStyle(oldStyle); }
- }, arguments[1] || { })
- );
-};
-
-Effect.BlindUp = function(element) {
- element = $(element);
- element.makeClipping();
- return new Effect.Scale(element, 0,
- Object.extend({ scaleContent: false,
- scaleX: false,
- restoreAfterFinish: true,
- afterFinishInternal: function(effect) {
- effect.element.hide().undoClipping();
- }
- }, arguments[1] || { })
- );
-};
-
-Effect.BlindDown = function(element) {
- element = $(element);
- var elementDimensions = element.getDimensions();
- return new Effect.Scale(element, 100, Object.extend({
- scaleContent: false,
- scaleX: false,
- scaleFrom: 0,
- scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
- restoreAfterFinish: true,
- afterSetup: function(effect) {
- effect.element.makeClipping().setStyle({height: '0px'}).show();
- },
- afterFinishInternal: function(effect) {
- effect.element.undoClipping();
- }
- }, arguments[1] || { }));
-};
-
-Effect.SwitchOff = function(element) {
- element = $(element);
- var oldOpacity = element.getInlineOpacity();
- return new Effect.Appear(element, Object.extend({
- duration: 0.4,
- from: 0,
- transition: Effect.Transitions.flicker,
- afterFinishInternal: function(effect) {
- new Effect.Scale(effect.element, 1, {
- duration: 0.3, scaleFromCenter: true,
- scaleX: false, scaleContent: false, restoreAfterFinish: true,
- beforeSetup: function(effect) {
- effect.element.makePositioned().makeClipping();
- },
- afterFinishInternal: function(effect) {
- effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
- }
- });
- }
- }, arguments[1] || { }));
-};
-
-Effect.DropOut = function(element) {
- element = $(element);
- var oldStyle = {
- top: element.getStyle('top'),
- left: element.getStyle('left'),
- opacity: element.getInlineOpacity() };
- return new Effect.Parallel(
- [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
- new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
- Object.extend(
- { duration: 0.5,
- beforeSetup: function(effect) {
- effect.effects[0].element.makePositioned();
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
- }
- }, arguments[1] || { }));
-};
-
-Effect.Shake = function(element) {
- element = $(element);
- var options = Object.extend({
- distance: 20,
- duration: 0.5
- }, arguments[1] || {});
- var distance = parseFloat(options.distance);
- var split = parseFloat(options.duration) / 10.0;
- var oldStyle = {
- top: element.getStyle('top'),
- left: element.getStyle('left') };
- return new Effect.Move(element,
- { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
- effect.element.undoPositioned().setStyle(oldStyle);
- }}); }}); }}); }}); }}); }});
-};
-
-Effect.SlideDown = function(element) {
- element = $(element).cleanWhitespace();
- // SlideDown need to have the content of the element wrapped in a container element with fixed height!
- var oldInnerBottom = element.down().getStyle('bottom');
- var elementDimensions = element.getDimensions();
- return new Effect.Scale(element, 100, Object.extend({
- scaleContent: false,
- scaleX: false,
- scaleFrom: window.opera ? 0 : 1,
- scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
- restoreAfterFinish: true,
- afterSetup: function(effect) {
- effect.element.makePositioned();
- effect.element.down().makePositioned();
- if (window.opera) effect.element.setStyle({top: ''});
- effect.element.makeClipping().setStyle({height: '0px'}).show();
- },
- afterUpdateInternal: function(effect) {
- effect.element.down().setStyle({bottom:
- (effect.dims[0] - effect.element.clientHeight) + 'px' });
- },
- afterFinishInternal: function(effect) {
- effect.element.undoClipping().undoPositioned();
- effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
- }, arguments[1] || { })
- );
-};
-
-Effect.SlideUp = function(element) {
- element = $(element).cleanWhitespace();
- var oldInnerBottom = element.down().getStyle('bottom');
- var elementDimensions = element.getDimensions();
- return new Effect.Scale(element, window.opera ? 0 : 1,
- Object.extend({ scaleContent: false,
- scaleX: false,
- scaleMode: 'box',
- scaleFrom: 100,
- scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
- restoreAfterFinish: true,
- afterSetup: function(effect) {
- effect.element.makePositioned();
- effect.element.down().makePositioned();
- if (window.opera) effect.element.setStyle({top: ''});
- effect.element.makeClipping().show();
- },
- afterUpdateInternal: function(effect) {
- effect.element.down().setStyle({bottom:
- (effect.dims[0] - effect.element.clientHeight) + 'px' });
- },
- afterFinishInternal: function(effect) {
- effect.element.hide().undoClipping().undoPositioned();
- effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});
- }
- }, arguments[1] || { })
- );
-};
-
-// Bug in opera makes the TD containing this element expand for a instance after finish
-Effect.Squish = function(element) {
- return new Effect.Scale(element, window.opera ? 1 : 0, {
- restoreAfterFinish: true,
- beforeSetup: function(effect) {
- effect.element.makeClipping();
- },
- afterFinishInternal: function(effect) {
- effect.element.hide().undoClipping();
- }
- });
-};
-
-Effect.Grow = function(element) {
- element = $(element);
- var options = Object.extend({
- direction: 'center',
- moveTransition: Effect.Transitions.sinoidal,
- scaleTransition: Effect.Transitions.sinoidal,
- opacityTransition: Effect.Transitions.full
- }, arguments[1] || { });
- var oldStyle = {
- top: element.style.top,
- left: element.style.left,
- height: element.style.height,
- width: element.style.width,
- opacity: element.getInlineOpacity() };
-
- var dims = element.getDimensions();
- var initialMoveX, initialMoveY;
- var moveX, moveY;
-
- switch (options.direction) {
- case 'top-left':
- initialMoveX = initialMoveY = moveX = moveY = 0;
- break;
- case 'top-right':
- initialMoveX = dims.width;
- initialMoveY = moveY = 0;
- moveX = -dims.width;
- break;
- case 'bottom-left':
- initialMoveX = moveX = 0;
- initialMoveY = dims.height;
- moveY = -dims.height;
- break;
- case 'bottom-right':
- initialMoveX = dims.width;
- initialMoveY = dims.height;
- moveX = -dims.width;
- moveY = -dims.height;
- break;
- case 'center':
- initialMoveX = dims.width / 2;
- initialMoveY = dims.height / 2;
- moveX = -dims.width / 2;
- moveY = -dims.height / 2;
- break;
- }
-
- return new Effect.Move(element, {
- x: initialMoveX,
- y: initialMoveY,
- duration: 0.01,
- beforeSetup: function(effect) {
- effect.element.hide().makeClipping().makePositioned();
- },
- afterFinishInternal: function(effect) {
- new Effect.Parallel(
- [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
- new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
- new Effect.Scale(effect.element, 100, {
- scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
- sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
- ], Object.extend({
- beforeSetup: function(effect) {
- effect.effects[0].element.setStyle({height: '0px'}).show();
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
- }
- }, options)
- );
- }
- });
-};
-
-Effect.Shrink = function(element) {
- element = $(element);
- var options = Object.extend({
- direction: 'center',
- moveTransition: Effect.Transitions.sinoidal,
- scaleTransition: Effect.Transitions.sinoidal,
- opacityTransition: Effect.Transitions.none
- }, arguments[1] || { });
- var oldStyle = {
- top: element.style.top,
- left: element.style.left,
- height: element.style.height,
- width: element.style.width,
- opacity: element.getInlineOpacity() };
-
- var dims = element.getDimensions();
- var moveX, moveY;
-
- switch (options.direction) {
- case 'top-left':
- moveX = moveY = 0;
- break;
- case 'top-right':
- moveX = dims.width;
- moveY = 0;
- break;
- case 'bottom-left':
- moveX = 0;
- moveY = dims.height;
- break;
- case 'bottom-right':
- moveX = dims.width;
- moveY = dims.height;
- break;
- case 'center':
- moveX = dims.width / 2;
- moveY = dims.height / 2;
- break;
- }
-
- return new Effect.Parallel(
- [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
- new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
- new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
- ], Object.extend({
- beforeStartInternal: function(effect) {
- effect.effects[0].element.makePositioned().makeClipping();
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
- }, options)
- );
-};
-
-Effect.Pulsate = function(element) {
- element = $(element);
- var options = arguments[1] || { },
- oldOpacity = element.getInlineOpacity(),
- transition = options.transition || Effect.Transitions.linear,
- reverser = function(pos){
- return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5);
- };
-
- return new Effect.Opacity(element,
- Object.extend(Object.extend({ duration: 2.0, from: 0,
- afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
- }, options), {transition: reverser}));
-};
-
-Effect.Fold = function(element) {
- element = $(element);
- var oldStyle = {
- top: element.style.top,
- left: element.style.left,
- width: element.style.width,
- height: element.style.height };
- element.makeClipping();
- return new Effect.Scale(element, 5, Object.extend({
- scaleContent: false,
- scaleX: false,
- afterFinishInternal: function(effect) {
- new Effect.Scale(element, 1, {
- scaleContent: false,
- scaleY: false,
- afterFinishInternal: function(effect) {
- effect.element.hide().undoClipping().setStyle(oldStyle);
- } });
- }}, arguments[1] || { }));
-};
-
-Effect.Morph = Class.create(Effect.Base, {
- initialize: function(element) {
- this.element = $(element);
- if (!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({
- style: { }
- }, arguments[1] || { });
-
- if (!Object.isString(options.style)) this.style = $H(options.style);
- else {
- if (options.style.include(':'))
- this.style = options.style.parseStyle();
- else {
- this.element.addClassName(options.style);
- this.style = $H(this.element.getStyles());
- this.element.removeClassName(options.style);
- var css = this.element.getStyles();
- this.style = this.style.reject(function(style) {
- return style.value == css[style.key];
- });
- options.afterFinishInternal = function(effect) {
- effect.element.addClassName(effect.options.style);
- effect.transforms.each(function(transform) {
- effect.element.style[transform.style] = '';
- });
- };
- }
- }
- this.start(options);
- },
-
- setup: function(){
- function parseColor(color){
- if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
- color = color.parseColor();
- return $R(0,2).map(function(i){
- return parseInt( color.slice(i*2+1,i*2+3), 16 );
- });
- }
- this.transforms = this.style.map(function(pair){
- var property = pair[0], value = pair[1], unit = null;
-
- if (value.parseColor('#zzzzzz') != '#zzzzzz') {
- value = value.parseColor();
- unit = 'color';
- } else if (property == 'opacity') {
- value = parseFloat(value);
- if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
- this.element.setStyle({zoom: 1});
- } else if (Element.CSS_LENGTH.test(value)) {
- var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
- value = parseFloat(components[1]);
- unit = (components.length == 3) ? components[2] : null;
- }
-
- var originalValue = this.element.getStyle(property);
- return {
- style: property.camelize(),
- originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
- targetValue: unit=='color' ? parseColor(value) : value,
- unit: unit
- };
- }.bind(this)).reject(function(transform){
- return (
- (transform.originalValue == transform.targetValue) ||
- (
- transform.unit != 'color' &&
- (isNaN(transform.originalValue) || isNaN(transform.targetValue))
- )
- );
- });
- },
- update: function(position) {
- var style = { }, transform, i = this.transforms.length;
- while(i--)
- style[(transform = this.transforms[i]).style] =
- transform.unit=='color' ? '#'+
- (Math.round(transform.originalValue[0]+
- (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
- (Math.round(transform.originalValue[1]+
- (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
- (Math.round(transform.originalValue[2]+
- (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
- (transform.originalValue +
- (transform.targetValue - transform.originalValue) * position).toFixed(3) +
- (transform.unit === null ? '' : transform.unit);
- this.element.setStyle(style, true);
- }
-});
-
-Effect.Transform = Class.create({
- initialize: function(tracks){
- this.tracks = [];
- this.options = arguments[1] || { };
- this.addTracks(tracks);
- },
- addTracks: function(tracks){
- tracks.each(function(track){
- track = $H(track);
- var data = track.values().first();
- this.tracks.push($H({
- ids: track.keys().first(),
- effect: Effect.Morph,
- options: { style: data }
- }));
- }.bind(this));
- return this;
- },
- play: function(){
- return new Effect.Parallel(
- this.tracks.map(function(track){
- var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');
- var elements = [$(ids) || $$(ids)].flatten();
- return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)); });
- }).flatten(),
- this.options
- );
- }
-});
-
-Element.CSS_PROPERTIES = $w(
- 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
- 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
- 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
- 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
- 'fontSize fontWeight height left letterSpacing lineHeight ' +
- 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
- 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
- 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
- 'right textIndent top width wordSpacing zIndex');
-
-Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
-
-String.__parseStyleElement = document.createElement('div');
-String.prototype.parseStyle = function(){
- var style, styleRules = $H();
- if (Prototype.Browser.WebKit)
- style = new Element('div',{style:this}).style;
- else {
- String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
- style = String.__parseStyleElement.childNodes[0].style;
- }
-
- Element.CSS_PROPERTIES.each(function(property){
- if (style[property]) styleRules.set(property, style[property]);
- });
-
- if (Prototype.Browser.IE && this.include('opacity'))
- styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);
-
- return styleRules;
-};
-
-if (document.defaultView && document.defaultView.getComputedStyle) {
- Element.getStyles = function(element) {
- var css = document.defaultView.getComputedStyle($(element), null);
- return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
- styles[property] = css[property];
- return styles;
- });
- };
-} else {
- Element.getStyles = function(element) {
- element = $(element);
- var css = element.currentStyle, styles;
- styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) {
- results[property] = css[property];
- return results;
- });
- if (!styles.opacity) styles.opacity = element.getOpacity();
- return styles;
- };
-}
-
-Effect.Methods = {
- morph: function(element, style) {
- element = $(element);
- new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));
- return element;
- },
- visualEffect: function(element, effect, options) {
- element = $(element);
- var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
- new Effect[klass](element, options);
- return element;
- },
- highlight: function(element, options) {
- element = $(element);
- new Effect.Highlight(element, options);
- return element;
- }
-};
-
-$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
- 'pulsate shake puff squish switchOff dropOut').each(
- function(effect) {
- Effect.Methods[effect] = function(element, options){
- element = $(element);
- Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
- return element;
- };
- }
-);
-
-$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
- function(f) { Effect.Methods[f] = Element[f]; }
-);
-
-Element.addMethods(Effect.Methods); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/prototype.js b/src/usr/local/www/javascript/scriptaculous/prototype.js
deleted file mode 100644
index 9cb702c..0000000
--- a/src/usr/local/www/javascript/scriptaculous/prototype.js
+++ /dev/null
@@ -1,6079 +0,0 @@
-/* Prototype JavaScript framework, version 1.7
- * (c) 2005-2010 Sam Stephenson
- *
- * Prototype is freely distributable under the terms of an MIT-style license.
- * For details, see the Prototype web site: http://www.prototypejs.org/
- *
- *--------------------------------------------------------------------------*/
-
-var Prototype = {
-
- Version: '1.7',
-
- Browser: (function(){
- var ua = navigator.userAgent;
- var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
- return {
- IE: !!window.attachEvent && !isOpera,
- Opera: isOpera,
- WebKit: ua.indexOf('AppleWebKit/') > -1,
- Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
- MobileSafari: /Apple.*Mobile/.test(ua)
- };
- })(),
-
- BrowserFeatures: {
- XPath: !!document.evaluate,
-
- SelectorsAPI: !!document.querySelector,
-
- ElementExtensions: (function() {
- var constructor = window.Element || window.HTMLElement;
- return !!(constructor && constructor.prototype);
- })(),
- SpecificElementExtensions: (function() {
- if (typeof window.HTMLDivElement !== 'undefined')
- return true;
-
- var div = document.createElement('div'),
- form = document.createElement('form'),
- isSupported = false;
-
- if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) {
- isSupported = true;
- }
-
- div = form = null;
-
- return isSupported;
- })()
- },
-
- ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
- JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
-
- emptyFunction: function() { },
-
- K: function(x) { return x; }
-};
-
-if (Prototype.Browser.MobileSafari)
- Prototype.BrowserFeatures.SpecificElementExtensions = false;
-
-
-var Abstract = { };
-
-
-var Try = {
- these: function() {
- var returnValue;
-
- for (var i = 0, length = arguments.length; i < length; i++) {
- var lambda = arguments[i];
- try {
- returnValue = lambda();
- break;
- } catch (e) { }
- }
-
- return returnValue;
- }
-};
-
-/* Based on Alex Arnell's inheritance implementation. */
-
-var Class = (function() {
-
- var IS_DONTENUM_BUGGY = (function(){
- for (var p in { toString: 1 }) {
- if (p === 'toString') return false;
- }
- return true;
- })();
-
- function subclass() {};
- function create() {
- var parent = null, properties = $A(arguments);
- if (Object.isFunction(properties[0]))
- parent = properties.shift();
-
- function klass() {
- this.initialize.apply(this, arguments);
- }
-
- Object.extend(klass, Class.Methods);
- klass.superclass = parent;
- klass.subclasses = [];
-
- if (parent) {
- subclass.prototype = parent.prototype;
- klass.prototype = new subclass;
- parent.subclasses.push(klass);
- }
-
- for (var i = 0, length = properties.length; i < length; i++)
- klass.addMethods(properties[i]);
-
- if (!klass.prototype.initialize)
- klass.prototype.initialize = Prototype.emptyFunction;
-
- klass.prototype.constructor = klass;
- return klass;
- }
-
- function addMethods(source) {
- var ancestor = this.superclass && this.superclass.prototype,
- properties = Object.keys(source);
-
- if (IS_DONTENUM_BUGGY) {
- if (source.toString != Object.prototype.toString)
- properties.push("toString");
- if (source.valueOf != Object.prototype.valueOf)
- properties.push("valueOf");
- }
-
- for (var i = 0, length = properties.length; i < length; i++) {
- var property = properties[i], value = source[property];
- if (ancestor && Object.isFunction(value) &&
- value.argumentNames()[0] == "$super") {
- var method = value;
- value = (function(m) {
- return function() { return ancestor[m].apply(this, arguments); };
- })(property).wrap(method);
-
- value.valueOf = method.valueOf.bind(method);
- value.toString = method.toString.bind(method);
- }
- this.prototype[property] = value;
- }
-
- return this;
- }
-
- return {
- create: create,
- Methods: {
- addMethods: addMethods
- }
- };
-})();
-(function() {
-
- var _toString = Object.prototype.toString,
- NULL_TYPE = 'Null',
- UNDEFINED_TYPE = 'Undefined',
- BOOLEAN_TYPE = 'Boolean',
- NUMBER_TYPE = 'Number',
- STRING_TYPE = 'String',
- OBJECT_TYPE = 'Object',
- FUNCTION_CLASS = '[object Function]',
- BOOLEAN_CLASS = '[object Boolean]',
- NUMBER_CLASS = '[object Number]',
- STRING_CLASS = '[object String]',
- ARRAY_CLASS = '[object Array]',
- DATE_CLASS = '[object Date]',
- NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON &&
- typeof JSON.stringify === 'function' &&
- JSON.stringify(0) === '0' &&
- typeof JSON.stringify(Prototype.K) === 'undefined';
-
- function Type(o) {
- switch(o) {
- case null: return NULL_TYPE;
- case (void 0): return UNDEFINED_TYPE;
- }
- var type = typeof o;
- switch(type) {
- case 'boolean': return BOOLEAN_TYPE;
- case 'number': return NUMBER_TYPE;
- case 'string': return STRING_TYPE;
- }
- return OBJECT_TYPE;
- }
-
- function extend(destination, source) {
- for (var property in source)
- destination[property] = source[property];
- return destination;
- }
-
- function inspect(object) {
- try {
- if (isUndefined(object)) return 'undefined';
- if (object === null) return 'null';
- return object.inspect ? object.inspect() : String(object);
- } catch (e) {
- if (e instanceof RangeError) return '...';
- throw e;
- }
- }
-
- function toJSON(value) {
- return Str('', { '': value }, []);
- }
-
- function Str(key, holder, stack) {
- var value = holder[key],
- type = typeof value;
-
- if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') {
- value = value.toJSON(key);
- }
-
- var _class = _toString.call(value);
-
- switch (_class) {
- case NUMBER_CLASS:
- case BOOLEAN_CLASS:
- case STRING_CLASS:
- value = value.valueOf();
- }
-
- switch (value) {
- case null: return 'null';
- case true: return 'true';
- case false: return 'false';
- }
-
- type = typeof value;
- switch (type) {
- case 'string':
- return value.inspect(true);
- case 'number':
- return isFinite(value) ? String(value) : 'null';
- case 'object':
-
- for (var i = 0, length = stack.length; i < length; i++) {
- if (stack[i] === value) { throw new TypeError(); }
- }
- stack.push(value);
-
- var partial = [];
- if (_class === ARRAY_CLASS) {
- for (var i = 0, length = value.length; i < length; i++) {
- var str = Str(i, value, stack);
- partial.push(typeof str === 'undefined' ? 'null' : str);
- }
- partial = '[' + partial.join(',') + ']';
- } else {
- var keys = Object.keys(value);
- for (var i = 0, length = keys.length; i < length; i++) {
- var key = keys[i], str = Str(key, value, stack);
- if (typeof str !== "undefined") {
- partial.push(key.inspect(true)+ ':' + str);
- }
- }
- partial = '{' + partial.join(',') + '}';
- }
- stack.pop();
- return partial;
- }
- }
-
- function stringify(object) {
- return JSON.stringify(object);
- }
-
- function toQueryString(object) {
- return $H(object).toQueryString();
- }
-
- function toHTML(object) {
- return object && object.toHTML ? object.toHTML() : String.interpret(object);
- }
-
- function keys(object) {
- if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); }
- var results = [];
- for (var property in object) {
- if (object.hasOwnProperty(property)) {
- results.push(property);
- }
- }
- return results;
- }
-
- function values(object) {
- var results = [];
- for (var property in object)
- results.push(object[property]);
- return results;
- }
-
- function clone(object) {
- return extend({ }, object);
- }
-
- function isElement(object) {
- return !!(object && object.nodeType == 1);
- }
-
- function isArray(object) {
- return _toString.call(object) === ARRAY_CLASS;
- }
-
- var hasNativeIsArray = (typeof Array.isArray == 'function')
- && Array.isArray([]) && !Array.isArray({});
-
- if (hasNativeIsArray) {
- isArray = Array.isArray;
- }
-
- function isHash(object) {
- return object instanceof Hash;
- }
-
- function isFunction(object) {
- return _toString.call(object) === FUNCTION_CLASS;
- }
-
- function isString(object) {
- return _toString.call(object) === STRING_CLASS;
- }
-
- function isNumber(object) {
- return _toString.call(object) === NUMBER_CLASS;
- }
-
- function isDate(object) {
- return _toString.call(object) === DATE_CLASS;
- }
-
- function isUndefined(object) {
- return typeof object === "undefined";
- }
-
- extend(Object, {
- extend: extend,
- inspect: inspect,
- toJSON: NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON,
- toQueryString: toQueryString,
- toHTML: toHTML,
- keys: Object.keys || keys,
- values: values,
- clone: clone,
- isElement: isElement,
- isArray: isArray,
- isHash: isHash,
- isFunction: isFunction,
- isString: isString,
- isNumber: isNumber,
- isDate: isDate,
- isUndefined: isUndefined
- });
-})();
-Object.extend(Function.prototype, (function() {
- var slice = Array.prototype.slice;
-
- function update(array, args) {
- var arrayLength = array.length, length = args.length;
- while (length--) array[arrayLength + length] = args[length];
- return array;
- }
-
- function merge(array, args) {
- array = slice.call(array, 0);
- return update(array, args);
- }
-
- function argumentNames() {
- var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
- .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
- .replace(/\s+/g, '').split(',');
- return names.length == 1 && !names[0] ? [] : names;
- }
-
- function bind(context) {
- if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
- var __method = this, args = slice.call(arguments, 1);
- return function() {
- var a = merge(args, arguments);
- return __method.apply(context, a);
- };
- }
-
- function bindAsEventListener(context) {
- var __method = this, args = slice.call(arguments, 1);
- return function(event) {
- var a = update([event || window.event], args);
- return __method.apply(context, a);
- };
- }
-
- function curry() {
- if (!arguments.length) return this;
- var __method = this, args = slice.call(arguments, 0);
- return function() {
- var a = merge(args, arguments);
- return __method.apply(this, a);
- };
- }
-
- function delay(timeout) {
- var __method = this, args = slice.call(arguments, 1);
- timeout = timeout * 1000;
- return window.setTimeout(function() {
- return __method.apply(__method, args);
- }, timeout);
- }
-
- function defer() {
- var args = update([0.01], arguments);
- return this.delay.apply(this, args);
- }
-
- function wrap(wrapper) {
- var __method = this;
- return function() {
- var a = update([__method.bind(this)], arguments);
- return wrapper.apply(this, a);
- };
- }
-
- function methodize() {
- if (this._methodized) return this._methodized;
- var __method = this;
- return this._methodized = function() {
- var a = update([this], arguments);
- return __method.apply(null, a);
- };
- }
-
- return {
- argumentNames: argumentNames,
- bind: bind,
- bindAsEventListener: bindAsEventListener,
- curry: curry,
- delay: delay,
- defer: defer,
- wrap: wrap,
- methodize: methodize
- };
-})());
-
-
-
-(function(proto) {
-
- function toISOString() {
- return this.getUTCFullYear() + '-' +
- (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
- this.getUTCDate().toPaddedString(2) + 'T' +
- this.getUTCHours().toPaddedString(2) + ':' +
- this.getUTCMinutes().toPaddedString(2) + ':' +
- this.getUTCSeconds().toPaddedString(2) + 'Z';
- }
-
-
- function toJSON() {
- return this.toISOString();
- }
-
- if (!proto.toISOString) proto.toISOString = toISOString;
- if (!proto.toJSON) proto.toJSON = toJSON;
-
-})(Date.prototype);
-
-
-RegExp.prototype.match = RegExp.prototype.test;
-
-RegExp.escape = function(str) {
- return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
-};
-var PeriodicalExecuter = Class.create({
- initialize: function(callback, frequency) {
- this.callback = callback;
- this.frequency = frequency;
- this.currentlyExecuting = false;
-
- this.registerCallback();
- },
-
- registerCallback: function() {
- this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
- },
-
- execute: function() {
- this.callback(this);
- },
-
- stop: function() {
- if (!this.timer) return;
- clearInterval(this.timer);
- this.timer = null;
- },
-
- onTimerEvent: function() {
- if (!this.currentlyExecuting) {
- try {
- this.currentlyExecuting = true;
- this.execute();
- this.currentlyExecuting = false;
- } catch(e) {
- this.currentlyExecuting = false;
- throw e;
- }
- }
- }
-});
-Object.extend(String, {
- interpret: function(value) {
- return value == null ? '' : String(value);
- },
- specialChar: {
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '\\': '\\\\'
- }
-});
-
-Object.extend(String.prototype, (function() {
- var NATIVE_JSON_PARSE_SUPPORT = window.JSON &&
- typeof JSON.parse === 'function' &&
- JSON.parse('{"test": true}').test;
-
- function prepareReplacement(replacement) {
- if (Object.isFunction(replacement)) return replacement;
- var template = new Template(replacement);
- return function(match) { return template.evaluate(match); };
- }
-
- function gsub(pattern, replacement) {
- var result = '', source = this, match;
- replacement = prepareReplacement(replacement);
-
- if (Object.isString(pattern))
- pattern = RegExp.escape(pattern);
-
- if (!(pattern.length || pattern.source)) {
- replacement = replacement('');
- return replacement + source.split('').join(replacement) + replacement;
- }
-
- while (source.length > 0) {
- if (match = source.match(pattern)) {
- result += source.slice(0, match.index);
- result += String.interpret(replacement(match));
- source = source.slice(match.index + match[0].length);
- } else {
- result += source, source = '';
- }
- }
- return result;
- }
-
- function sub(pattern, replacement, count) {
- replacement = prepareReplacement(replacement);
- count = Object.isUndefined(count) ? 1 : count;
-
- return this.gsub(pattern, function(match) {
- if (--count < 0) return match[0];
- return replacement(match);
- });
- }
-
- function scan(pattern, iterator) {
- this.gsub(pattern, iterator);
- return String(this);
- }
-
- function truncate(length, truncation) {
- length = length || 30;
- truncation = Object.isUndefined(truncation) ? '...' : truncation;
- return this.length > length ?
- this.slice(0, length - truncation.length) + truncation : String(this);
- }
-
- function strip() {
- return this.replace(/^\s+/, '').replace(/\s+$/, '');
- }
-
- function stripTags() {
- return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, '');
- }
-
- function stripScripts() {
- return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
- }
-
- function extractScripts() {
- var matchAll = new RegExp(Prototype.ScriptFragment, 'img'),
- matchOne = new RegExp(Prototype.ScriptFragment, 'im');
- return (this.match(matchAll) || []).map(function(scriptTag) {
- return (scriptTag.match(matchOne) || ['', ''])[1];
- });
- }
-
- function evalScripts() {
- return this.extractScripts().map(function(script) { return eval(script); });
- }
-
- function escapeHTML() {
- return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
- }
-
- function unescapeHTML() {
- return this.stripTags().replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&');
- }
-
-
- function toQueryParams(separator) {
- var match = this.strip().match(/([^?#]*)(#.*)?$/);
- if (!match) return { };
-
- return match[1].split(separator || '&').inject({ }, function(hash, pair) {
- if ((pair = pair.split('='))[0]) {
- var key = decodeURIComponent(pair.shift()),
- value = pair.length > 1 ? pair.join('=') : pair[0];
-
- if (value != undefined) value = decodeURIComponent(value);
-
- if (key in hash) {
- if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
- hash[key].push(value);
- }
- else hash[key] = value;
- }
- return hash;
- });
- }
-
- function toArray() {
- return this.split('');
- }
-
- function succ() {
- return this.slice(0, this.length - 1) +
- String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
- }
-
- function times(count) {
- return count < 1 ? '' : new Array(count + 1).join(this);
- }
-
- function camelize() {
- return this.replace(/-+(.)?/g, function(match, chr) {
- return chr ? chr.toUpperCase() : '';
- });
- }
-
- function capitalize() {
- return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
- }
-
- function underscore() {
- return this.replace(/::/g, '/')
- .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
- .replace(/([a-z\d])([A-Z])/g, '$1_$2')
- .replace(/-/g, '_')
- .toLowerCase();
- }
-
- function dasherize() {
- return this.replace(/_/g, '-');
- }
-
- function inspect(useDoubleQuotes) {
- var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) {
- if (character in String.specialChar) {
- return String.specialChar[character];
- }
- return '\\u00' + character.charCodeAt().toPaddedString(2, 16);
- });
- if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
- return "'" + escapedString.replace(/'/g, '\\\'') + "'";
- }
-
- function unfilterJSON(filter) {
- return this.replace(filter || Prototype.JSONFilter, '$1');
- }
-
- function isJSON() {
- var str = this;
- if (str.blank()) return false;
- str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
- str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
- str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
- return (/^[\],:{}\s]*$/).test(str);
- }
-
- function evalJSON(sanitize) {
- var json = this.unfilterJSON(),
- cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
- if (cx.test(json)) {
- json = json.replace(cx, function (a) {
- return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
- });
- }
- try {
- if (!sanitize || json.isJSON()) return eval('(' + json + ')');
- } catch (e) { }
- throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
- }
-
- function parseJSON() {
- var json = this.unfilterJSON();
- return JSON.parse(json);
- }
-
- function include(pattern) {
- return this.indexOf(pattern) > -1;
- }
-
- function startsWith(pattern) {
- return this.lastIndexOf(pattern, 0) === 0;
- }
-
- function endsWith(pattern) {
- var d = this.length - pattern.length;
- return d >= 0 && this.indexOf(pattern, d) === d;
- }
-
- function empty() {
- return this == '';
- }
-
- function blank() {
- return /^\s*$/.test(this);
- }
-
- function interpolate(object, pattern) {
- return new Template(this, pattern).evaluate(object);
- }
-
- return {
- gsub: gsub,
- sub: sub,
- scan: scan,
- truncate: truncate,
- strip: String.prototype.trim || strip,
- stripTags: stripTags,
- stripScripts: stripScripts,
- extractScripts: extractScripts,
- evalScripts: evalScripts,
- escapeHTML: escapeHTML,
- unescapeHTML: unescapeHTML,
- toQueryParams: toQueryParams,
- parseQuery: toQueryParams,
- toArray: toArray,
- succ: succ,
- times: times,
- camelize: camelize,
- capitalize: capitalize,
- underscore: underscore,
- dasherize: dasherize,
- inspect: inspect,
- unfilterJSON: unfilterJSON,
- isJSON: isJSON,
- evalJSON: NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON,
- include: include,
- startsWith: startsWith,
- endsWith: endsWith,
- empty: empty,
- blank: blank,
- interpolate: interpolate
- };
-})());
-
-var Template = Class.create({
- initialize: function(template, pattern) {
- this.template = template.toString();
- this.pattern = pattern || Template.Pattern;
- },
-
- evaluate: function(object) {
- if (object && Object.isFunction(object.toTemplateReplacements))
- object = object.toTemplateReplacements();
-
- return this.template.gsub(this.pattern, function(match) {
- if (object == null) return (match[1] + '');
-
- var before = match[1] || '';
- if (before == '\\') return match[2];
-
- var ctx = object, expr = match[3],
- pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
-
- match = pattern.exec(expr);
- if (match == null) return before;
-
- while (match != null) {
- var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1];
- ctx = ctx[comp];
- if (null == ctx || '' == match[3]) break;
- expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
- match = pattern.exec(expr);
- }
-
- return before + String.interpret(ctx);
- });
- }
-});
-Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
-
-var $break = { };
-
-var Enumerable = (function() {
- function each(iterator, context) {
- var index = 0;
- try {
- this._each(function(value) {
- iterator.call(context, value, index++);
- });
- } catch (e) {
- if (e != $break) throw e;
- }
- return this;
- }
-
- function eachSlice(number, iterator, context) {
- var index = -number, slices = [], array = this.toArray();
- if (number < 1) return array;
- while ((index += number) < array.length)
- slices.push(array.slice(index, index+number));
- return slices.collect(iterator, context);
- }
-
- function all(iterator, context) {
- iterator = iterator || Prototype.K;
- var result = true;
- this.each(function(value, index) {
- result = result && !!iterator.call(context, value, index);
- if (!result) throw $break;
- });
- return result;
- }
-
- function any(iterator, context) {
- iterator = iterator || Prototype.K;
- var result = false;
- this.each(function(value, index) {
- if (result = !!iterator.call(context, value, index))
- throw $break;
- });
- return result;
- }
-
- function collect(iterator, context) {
- iterator = iterator || Prototype.K;
- var results = [];
- this.each(function(value, index) {
- results.push(iterator.call(context, value, index));
- });
- return results;
- }
-
- function detect(iterator, context) {
- var result;
- this.each(function(value, index) {
- if (iterator.call(context, value, index)) {
- result = value;
- throw $break;
- }
- });
- return result;
- }
-
- function findAll(iterator, context) {
- var results = [];
- this.each(function(value, index) {
- if (iterator.call(context, value, index))
- results.push(value);
- });
- return results;
- }
-
- function grep(filter, iterator, context) {
- iterator = iterator || Prototype.K;
- var results = [];
-
- if (Object.isString(filter))
- filter = new RegExp(RegExp.escape(filter));
-
- this.each(function(value, index) {
- if (filter.match(value))
- results.push(iterator.call(context, value, index));
- });
- return results;
- }
-
- function include(object) {
- if (Object.isFunction(this.indexOf))
- if (this.indexOf(object) != -1) return true;
-
- var found = false;
- this.each(function(value) {
- if (value == object) {
- found = true;
- throw $break;
- }
- });
- return found;
- }
-
- function inGroupsOf(number, fillWith) {
- fillWith = Object.isUndefined(fillWith) ? null : fillWith;
- return this.eachSlice(number, function(slice) {
- while(slice.length < number) slice.push(fillWith);
- return slice;
- });
- }
-
- function inject(memo, iterator, context) {
- this.each(function(value, index) {
- memo = iterator.call(context, memo, value, index);
- });
- return memo;
- }
-
- function invoke(method) {
- var args = $A(arguments).slice(1);
- return this.map(function(value) {
- return value[method].apply(value, args);
- });
- }
-
- function max(iterator, context) {
- iterator = iterator || Prototype.K;
- var result;
- this.each(function(value, index) {
- value = iterator.call(context, value, index);
- if (result == null || value >= result)
- result = value;
- });
- return result;
- }
-
- function min(iterator, context) {
- iterator = iterator || Prototype.K;
- var result;
- this.each(function(value, index) {
- value = iterator.call(context, value, index);
- if (result == null || value < result)
- result = value;
- });
- return result;
- }
-
- function partition(iterator, context) {
- iterator = iterator || Prototype.K;
- var trues = [], falses = [];
- this.each(function(value, index) {
- (iterator.call(context, value, index) ?
- trues : falses).push(value);
- });
- return [trues, falses];
- }
-
- function pluck(property) {
- var results = [];
- this.each(function(value) {
- results.push(value[property]);
- });
- return results;
- }
-
- function reject(iterator, context) {
- var results = [];
- this.each(function(value, index) {
- if (!iterator.call(context, value, index))
- results.push(value);
- });
- return results;
- }
-
- function sortBy(iterator, context) {
- return this.map(function(value, index) {
- return {
- value: value,
- criteria: iterator.call(context, value, index)
- };
- }).sort(function(left, right) {
- var a = left.criteria, b = right.criteria;
- return a < b ? -1 : a > b ? 1 : 0;
- }).pluck('value');
- }
-
- function toArray() {
- return this.map();
- }
-
- function zip() {
- var iterator = Prototype.K, args = $A(arguments);
- if (Object.isFunction(args.last()))
- iterator = args.pop();
-
- var collections = [this].concat(args).map($A);
- return this.map(function(value, index) {
- return iterator(collections.pluck(index));
- });
- }
-
- function size() {
- return this.toArray().length;
- }
-
- function inspect() {
- return '#<Enumerable:' + this.toArray().inspect() + '>';
- }
-
-
-
-
-
-
-
-
-
- return {
- each: each,
- eachSlice: eachSlice,
- all: all,
- every: all,
- any: any,
- some: any,
- collect: collect,
- map: collect,
- detect: detect,
- findAll: findAll,
- select: findAll,
- filter: findAll,
- grep: grep,
- include: include,
- member: include,
- inGroupsOf: inGroupsOf,
- inject: inject,
- invoke: invoke,
- max: max,
- min: min,
- partition: partition,
- pluck: pluck,
- reject: reject,
- sortBy: sortBy,
- toArray: toArray,
- entries: toArray,
- zip: zip,
- size: size,
- inspect: inspect,
- find: detect
- };
-})();
-
-function $A(iterable) {
- if (!iterable) return [];
- if ('toArray' in Object(iterable)) return iterable.toArray();
- var length = iterable.length || 0, results = new Array(length);
- while (length--) results[length] = iterable[length];
- return results;
-}
-
-
-function $w(string) {
- if (!Object.isString(string)) return [];
- string = string.strip();
- return string ? string.split(/\s+/) : [];
-}
-
-Array.from = $A;
-
-
-(function() {
- var arrayProto = Array.prototype,
- slice = arrayProto.slice,
- _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available
-
- function each(iterator, context) {
- for (var i = 0, length = this.length >>> 0; i < length; i++) {
- if (i in this) iterator.call(context, this[i], i, this);
- }
- }
- if (!_each) _each = each;
-
- function clear() {
- this.length = 0;
- return this;
- }
-
- function first() {
- return this[0];
- }
-
- function last() {
- return this[this.length - 1];
- }
-
- function compact() {
- return this.select(function(value) {
- return value != null;
- });
- }
-
- function flatten() {
- return this.inject([], function(array, value) {
- if (Object.isArray(value))
- return array.concat(value.flatten());
- array.push(value);
- return array;
- });
- }
-
- function without() {
- var values = slice.call(arguments, 0);
- return this.select(function(value) {
- return !values.include(value);
- });
- }
-
- function reverse(inline) {
- return (inline === false ? this.toArray() : this)._reverse();
- }
-
- function uniq(sorted) {
- return this.inject([], function(array, value, index) {
- if (0 == index || (sorted ? array.last() != value : !array.include(value)))
- array.push(value);
- return array;
- });
- }
-
- function intersect(array) {
- return this.uniq().findAll(function(item) {
- return array.detect(function(value) { return item === value; });
- });
- }
-
-
- function clone() {
- return slice.call(this, 0);
- }
-
- function size() {
- return this.length;
- }
-
- function inspect() {
- return '[' + this.map(Object.inspect).join(', ') + ']';
- }
-
- function indexOf(item, i) {
- i || (i = 0);
- var length = this.length;
- if (i < 0) i = length + i;
- for (; i < length; i++)
- if (this[i] === item) return i;
- return -1;
- }
-
- function lastIndexOf(item, i) {
- i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
- var n = this.slice(0, i).reverse().indexOf(item);
- return (n < 0) ? n : i - n - 1;
- }
-
- function concat() {
- var array = slice.call(this, 0), item;
- for (var i = 0, length = arguments.length; i < length; i++) {
- item = arguments[i];
- if (Object.isArray(item) && !('callee' in item)) {
- for (var j = 0, arrayLength = item.length; j < arrayLength; j++)
- array.push(item[j]);
- } else {
- array.push(item);
- }
- }
- return array;
- }
-
- Object.extend(arrayProto, Enumerable);
-
- if (!arrayProto._reverse)
- arrayProto._reverse = arrayProto.reverse;
-
- Object.extend(arrayProto, {
- _each: _each,
- clear: clear,
- first: first,
- last: last,
- compact: compact,
- flatten: flatten,
- without: without,
- reverse: reverse,
- uniq: uniq,
- intersect: intersect,
- clone: clone,
- toArray: clone,
- size: size,
- inspect: inspect
- });
-
- var CONCAT_ARGUMENTS_BUGGY = (function() {
- return [].concat(arguments)[0][0] !== 1;
- })(1,2);
-
- if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat;
-
- if (!arrayProto.indexOf) arrayProto.indexOf = indexOf;
- if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf;
-})();
-function $H(object) {
- return new Hash(object);
-};
-
-var Hash = Class.create(Enumerable, (function() {
- function initialize(object) {
- this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
- }
-
-
- function _each(iterator) {
- for (var key in this._object) {
- var value = this._object[key], pair = [key, value];
- pair.key = key;
- pair.value = value;
- iterator(pair);
- }
- }
-
- function set(key, value) {
- return this._object[key] = value;
- }
-
- function get(key) {
- if (this._object[key] !== Object.prototype[key])
- return this._object[key];
- }
-
- function unset(key) {
- var value = this._object[key];
- delete this._object[key];
- return value;
- }
-
- function toObject() {
- return Object.clone(this._object);
- }
-
-
-
- function keys() {
- return this.pluck('key');
- }
-
- function values() {
- return this.pluck('value');
- }
-
- function index(value) {
- var match = this.detect(function(pair) {
- return pair.value === value;
- });
- return match && match.key;
- }
-
- function merge(object) {
- return this.clone().update(object);
- }
-
- function update(object) {
- return new Hash(object).inject(this, function(result, pair) {
- result.set(pair.key, pair.value);
- return result;
- });
- }
-
- function toQueryPair(key, value) {
- if (Object.isUndefined(value)) return key;
- return key + '=' + encodeURIComponent(String.interpret(value));
- }
-
- function toQueryString() {
- return this.inject([], function(results, pair) {
- var key = encodeURIComponent(pair.key), values = pair.value;
-
- if (values && typeof values == 'object') {
- if (Object.isArray(values)) {
- var queryValues = [];
- for (var i = 0, len = values.length, value; i < len; i++) {
- value = values[i];
- queryValues.push(toQueryPair(key, value));
- }
- return results.concat(queryValues);
- }
- } else results.push(toQueryPair(key, values));
- return results;
- }).join('&');
- }
-
- function inspect() {
- return '#<Hash:{' + this.map(function(pair) {
- return pair.map(Object.inspect).join(': ');
- }).join(', ') + '}>';
- }
-
- function clone() {
- return new Hash(this);
- }
-
- return {
- initialize: initialize,
- _each: _each,
- set: set,
- get: get,
- unset: unset,
- toObject: toObject,
- toTemplateReplacements: toObject,
- keys: keys,
- values: values,
- index: index,
- merge: merge,
- update: update,
- toQueryString: toQueryString,
- inspect: inspect,
- toJSON: toObject,
- clone: clone
- };
-})());
-
-Hash.from = $H;
-Object.extend(Number.prototype, (function() {
- function toColorPart() {
- return this.toPaddedString(2, 16);
- }
-
- function succ() {
- return this + 1;
- }
-
- function times(iterator, context) {
- $R(0, this, true).each(iterator, context);
- return this;
- }
-
- function toPaddedString(length, radix) {
- var string = this.toString(radix || 10);
- return '0'.times(length - string.length) + string;
- }
-
- function abs() {
- return Math.abs(this);
- }
-
- function round() {
- return Math.round(this);
- }
-
- function ceil() {
- return Math.ceil(this);
- }
-
- function floor() {
- return Math.floor(this);
- }
-
- return {
- toColorPart: toColorPart,
- succ: succ,
- times: times,
- toPaddedString: toPaddedString,
- abs: abs,
- round: round,
- ceil: ceil,
- floor: floor
- };
-})());
-
-function $R(start, end, exclusive) {
- return new ObjectRange(start, end, exclusive);
-}
-
-var ObjectRange = Class.create(Enumerable, (function() {
- function initialize(start, end, exclusive) {
- this.start = start;
- this.end = end;
- this.exclusive = exclusive;
- }
-
- function _each(iterator) {
- var value = this.start;
- while (this.include(value)) {
- iterator(value);
- value = value.succ();
- }
- }
-
- function include(value) {
- if (value < this.start)
- return false;
- if (this.exclusive)
- return value < this.end;
- return value <= this.end;
- }
-
- return {
- initialize: initialize,
- _each: _each,
- include: include
- };
-})());
-
-
-
-var Ajax = {
- getTransport: function() {
- return Try.these(
- function() {return new XMLHttpRequest();},
- function() {return new ActiveXObject('Msxml2.XMLHTTP');},
- function() {return new ActiveXObject('Microsoft.XMLHTTP');}
- ) || false;
- },
-
- activeRequestCount: 0
-};
-
-Ajax.Responders = {
- responders: [],
-
- _each: function(iterator) {
- this.responders._each(iterator);
- },
-
- register: function(responder) {
- if (!this.include(responder))
- this.responders.push(responder);
- },
-
- unregister: function(responder) {
- this.responders = this.responders.without(responder);
- },
-
- dispatch: function(callback, request, transport, json) {
- this.each(function(responder) {
- if (Object.isFunction(responder[callback])) {
- try {
- responder[callback].apply(responder, [request, transport, json]);
- } catch (e) { }
- }
- });
- }
-};
-
-Object.extend(Ajax.Responders, Enumerable);
-
-Ajax.Responders.register({
- onCreate: function() { Ajax.activeRequestCount++; },
- onComplete: function() { Ajax.activeRequestCount--; }
-});
-Ajax.Base = Class.create({
- initialize: function(options) {
- this.options = {
- method: 'post',
- asynchronous: true,
- contentType: 'application/x-www-form-urlencoded',
- encoding: 'UTF-8',
- parameters: '',
- evalJSON: true,
- evalJS: true
- };
- Object.extend(this.options, options || { });
-
- this.options.method = this.options.method.toLowerCase();
-
- if (Object.isHash(this.options.parameters))
- this.options.parameters = this.options.parameters.toObject();
- }
-});
-Ajax.Request = Class.create(Ajax.Base, {
- _complete: false,
-
- initialize: function($super, url, options) {
- $super(options);
- this.transport = Ajax.getTransport();
- this.request(url);
- },
-
- request: function(url) {
- this.url = url;
- this.method = this.options.method;
- var params = Object.isString(this.options.parameters) ?
- this.options.parameters :
- Object.toQueryString(this.options.parameters);
-
- if (!['get', 'post'].include(this.method)) {
- params += (params ? '&' : '') + "_method=" + this.method;
- this.method = 'post';
- }
-
- if (params && this.method === 'get') {
- this.url += (this.url.include('?') ? '&' : '?') + params;
- }
-
- this.parameters = params.toQueryParams();
-
- try {
- var response = new Ajax.Response(this);
- if (this.options.onCreate) this.options.onCreate(response);
- Ajax.Responders.dispatch('onCreate', this, response);
-
- this.transport.open(this.method.toUpperCase(), this.url,
- this.options.asynchronous);
-
- if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
-
- this.transport.onreadystatechange = this.onStateChange.bind(this);
- this.setRequestHeaders();
-
- this.body = this.method == 'post' ? (this.options.postBody || params) : null;
- this.transport.send(this.body);
-
- /* Force Firefox to handle ready state 4 for synchronous requests */
- if (!this.options.asynchronous && this.transport.overrideMimeType)
- this.onStateChange();
-
- }
- catch (e) {
- this.dispatchException(e);
- }
- },
-
- onStateChange: function() {
- var readyState = this.transport.readyState;
- if (readyState > 1 && !((readyState == 4) && this._complete))
- this.respondToReadyState(this.transport.readyState);
- },
-
- setRequestHeaders: function() {
- var headers = {
- 'X-Requested-With': 'XMLHttpRequest',
- 'X-Prototype-Version': Prototype.Version,
- 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
- };
-
- if (this.method == 'post') {
- headers['Content-type'] = this.options.contentType +
- (this.options.encoding ? '; charset=' + this.options.encoding : '');
-
- /* Force "Connection: close" for older Mozilla browsers to work
- * around a bug where XMLHttpRequest sends an incorrect
- * Content-length header. See Mozilla Bugzilla #246651.
- */
- if (this.transport.overrideMimeType &&
- (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
- headers['Connection'] = 'close';
- }
-
- if (typeof this.options.requestHeaders == 'object') {
- var extras = this.options.requestHeaders;
-
- if (Object.isFunction(extras.push))
- for (var i = 0, length = extras.length; i < length; i += 2)
- headers[extras[i]] = extras[i+1];
- else
- $H(extras).each(function(pair) { headers[pair.key] = pair.value; });
- }
-
- for (var name in headers)
- this.transport.setRequestHeader(name, headers[name]);
- },
-
- success: function() {
- var status = this.getStatus();
- return !status || (status >= 200 && status < 300) || status == 304;
- },
-
- getStatus: function() {
- try {
- if (this.transport.status === 1223) return 204;
- return this.transport.status || 0;
- } catch (e) { return 0; }
- },
-
- respondToReadyState: function(readyState) {
- var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
-
- if (state == 'Complete') {
- try {
- this._complete = true;
- (this.options['on' + response.status]
- || this.options['on' + (this.success() ? 'Success' : 'Failure')]
- || Prototype.emptyFunction)(response, response.headerJSON);
- } catch (e) {
- this.dispatchException(e);
- }
-
- var contentType = response.getHeader('Content-type');
- if (this.options.evalJS == 'force'
- || (this.options.evalJS && this.isSameOrigin() && contentType
- && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
- this.evalResponse();
- }
-
- try {
- (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
- Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
- } catch (e) {
- this.dispatchException(e);
- }
-
- if (state == 'Complete') {
- this.transport.onreadystatechange = Prototype.emptyFunction;
- }
- },
-
- isSameOrigin: function() {
- var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
- return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
- protocol: location.protocol,
- domain: document.domain,
- port: location.port ? ':' + location.port : ''
- }));
- },
-
- getHeader: function(name) {
- try {
- return this.transport.getResponseHeader(name) || null;
- } catch (e) { return null; }
- },
-
- evalResponse: function() {
- try {
- return eval((this.transport.responseText || '').unfilterJSON());
- } catch (e) {
- this.dispatchException(e);
- }
- },
-
- dispatchException: function(exception) {
- (this.options.onException || Prototype.emptyFunction)(this, exception);
- Ajax.Responders.dispatch('onException', this, exception);
- }
-});
-
-Ajax.Request.Events =
- ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
-
-
-
-
-
-
-
-
-Ajax.Response = Class.create({
- initialize: function(request){
- this.request = request;
- var transport = this.transport = request.transport,
- readyState = this.readyState = transport.readyState;
-
- if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
- this.status = this.getStatus();
- this.statusText = this.getStatusText();
- this.responseText = String.interpret(transport.responseText);
- this.headerJSON = this._getHeaderJSON();
- }
-
- if (readyState == 4) {
- var xml = transport.responseXML;
- this.responseXML = Object.isUndefined(xml) ? null : xml;
- this.responseJSON = this._getResponseJSON();
- }
- },
-
- status: 0,
-
- statusText: '',
-
- getStatus: Ajax.Request.prototype.getStatus,
-
- getStatusText: function() {
- try {
- return this.transport.statusText || '';
- } catch (e) { return ''; }
- },
-
- getHeader: Ajax.Request.prototype.getHeader,
-
- getAllHeaders: function() {
- try {
- return this.getAllResponseHeaders();
- } catch (e) { return null; }
- },
-
- getResponseHeader: function(name) {
- return this.transport.getResponseHeader(name);
- },
-
- getAllResponseHeaders: function() {
- return this.transport.getAllResponseHeaders();
- },
-
- _getHeaderJSON: function() {
- var json = this.getHeader('X-JSON');
- if (!json) return null;
- json = decodeURIComponent(escape(json));
- try {
- return json.evalJSON(this.request.options.sanitizeJSON ||
- !this.request.isSameOrigin());
- } catch (e) {
- this.request.dispatchException(e);
- }
- },
-
- _getResponseJSON: function() {
- var options = this.request.options;
- if (!options.evalJSON || (options.evalJSON != 'force' &&
- !(this.getHeader('Content-type') || '').include('application/json')) ||
- this.responseText.blank())
- return null;
- try {
- return this.responseText.evalJSON(options.sanitizeJSON ||
- !this.request.isSameOrigin());
- } catch (e) {
- this.request.dispatchException(e);
- }
- }
-});
-
-Ajax.Updater = Class.create(Ajax.Request, {
- initialize: function($super, container, url, options) {
- this.container = {
- success: (container.success || container),
- failure: (container.failure || (container.success ? null : container))
- };
-
- options = Object.clone(options);
- var onComplete = options.onComplete;
- options.onComplete = (function(response, json) {
- this.updateContent(response.responseText);
- if (Object.isFunction(onComplete)) onComplete(response, json);
- }).bind(this);
-
- $super(url, options);
- },
-
- updateContent: function(responseText) {
- var receiver = this.container[this.success() ? 'success' : 'failure'],
- options = this.options;
-
- if (!options.evalScripts) responseText = responseText.stripScripts();
-
- if (receiver = $(receiver)) {
- if (options.insertion) {
- if (Object.isString(options.insertion)) {
- var insertion = { }; insertion[options.insertion] = responseText;
- receiver.insert(insertion);
- }
- else options.insertion(receiver, responseText);
- }
- else receiver.update(responseText);
- }
- }
-});
-
-Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
- initialize: function($super, container, url, options) {
- $super(options);
- this.onComplete = this.options.onComplete;
-
- this.frequency = (this.options.frequency || 2);
- this.decay = (this.options.decay || 1);
-
- this.updater = { };
- this.container = container;
- this.url = url;
-
- this.start();
- },
-
- start: function() {
- this.options.onComplete = this.updateComplete.bind(this);
- this.onTimerEvent();
- },
-
- stop: function() {
- this.updater.options.onComplete = undefined;
- clearTimeout(this.timer);
- (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
- },
-
- updateComplete: function(response) {
- if (this.options.decay) {
- this.decay = (response.responseText == this.lastText ?
- this.decay * this.options.decay : 1);
-
- this.lastText = response.responseText;
- }
- this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
- },
-
- onTimerEvent: function() {
- this.updater = new Ajax.Updater(this.container, this.url, this.options);
- }
-});
-
-
-function $(element) {
- if (arguments.length > 1) {
- for (var i = 0, elements = [], length = arguments.length; i < length; i++)
- elements.push($(arguments[i]));
- return elements;
- }
- if (Object.isString(element))
- element = document.getElementById(element);
- return Element.extend(element);
-}
-
-if (Prototype.BrowserFeatures.XPath) {
- document._getElementsByXPath = function(expression, parentElement) {
- var results = [];
- var query = document.evaluate(expression, $(parentElement) || document,
- null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- for (var i = 0, length = query.snapshotLength; i < length; i++)
- results.push(Element.extend(query.snapshotItem(i)));
- return results;
- };
-}
-
-/*--------------------------------------------------------------------------*/
-
-if (!Node) var Node = { };
-
-if (!Node.ELEMENT_NODE) {
- Object.extend(Node, {
- ELEMENT_NODE: 1,
- ATTRIBUTE_NODE: 2,
- TEXT_NODE: 3,
- CDATA_SECTION_NODE: 4,
- ENTITY_REFERENCE_NODE: 5,
- ENTITY_NODE: 6,
- PROCESSING_INSTRUCTION_NODE: 7,
- COMMENT_NODE: 8,
- DOCUMENT_NODE: 9,
- DOCUMENT_TYPE_NODE: 10,
- DOCUMENT_FRAGMENT_NODE: 11,
- NOTATION_NODE: 12
- });
-}
-
-
-
-(function(global) {
- function shouldUseCache(tagName, attributes) {
- if (tagName === 'select') return false;
- if ('type' in attributes) return false;
- return true;
- }
-
- var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){
- try {
- var el = document.createElement('<input name="x">');
- return el.tagName.toLowerCase() === 'input' && el.name === 'x';
- }
- catch(err) {
- return false;
- }
- })();
-
- var element = global.Element;
-
- global.Element = function(tagName, attributes) {
- attributes = attributes || { };
- tagName = tagName.toLowerCase();
- var cache = Element.cache;
-
- if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) {
- tagName = '<' + tagName + ' name="' + attributes.name + '">';
- delete attributes.name;
- return Element.writeAttribute(document.createElement(tagName), attributes);
- }
-
- if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
-
- var node = shouldUseCache(tagName, attributes) ?
- cache[tagName].cloneNode(false) : document.createElement(tagName);
-
- return Element.writeAttribute(node, attributes);
- };
-
- Object.extend(global.Element, element || { });
- if (element) global.Element.prototype = element.prototype;
-
-})(this);
-
-Element.idCounter = 1;
-Element.cache = { };
-
-Element._purgeElement = function(element) {
- var uid = element._prototypeUID;
- if (uid) {
- Element.stopObserving(element);
- element._prototypeUID = void 0;
- delete Element.Storage[uid];
- }
-};
-
-Element.Methods = {
- visible: function(element) {
- return $(element).style.display != 'none';
- },
-
- toggle: function(element) {
- element = $(element);
- Element[Element.visible(element) ? 'hide' : 'show'](element);
- return element;
- },
-
- hide: function(element) {
- element = $(element);
- element.style.display = 'none';
- return element;
- },
-
- show: function(element) {
- element = $(element);
- element.style.display = '';
- return element;
- },
-
- remove: function(element) {
- element = $(element);
- element.parentNode.removeChild(element);
- return element;
- },
-
- update: (function(){
-
- var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){
- var el = document.createElement("select"),
- isBuggy = true;
- el.innerHTML = "<option value=\"test\">test</option>";
- if (el.options && el.options[0]) {
- isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION";
- }
- el = null;
- return isBuggy;
- })();
-
- var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){
- try {
- var el = document.createElement("table");
- if (el && el.tBodies) {
- el.innerHTML = "<tbody><tr><td>test</td></tr></tbody>";
- var isBuggy = typeof el.tBodies[0] == "undefined";
- el = null;
- return isBuggy;
- }
- } catch (e) {
- return true;
- }
- })();
-
- var LINK_ELEMENT_INNERHTML_BUGGY = (function() {
- try {
- var el = document.createElement('div');
- el.innerHTML = "<link>";
- var isBuggy = (el.childNodes.length === 0);
- el = null;
- return isBuggy;
- } catch(e) {
- return true;
- }
- })();
-
- var ANY_INNERHTML_BUGGY = SELECT_ELEMENT_INNERHTML_BUGGY ||
- TABLE_ELEMENT_INNERHTML_BUGGY || LINK_ELEMENT_INNERHTML_BUGGY;
-
- var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () {
- var s = document.createElement("script"),
- isBuggy = false;
- try {
- s.appendChild(document.createTextNode(""));
- isBuggy = !s.firstChild ||
- s.firstChild && s.firstChild.nodeType !== 3;
- } catch (e) {
- isBuggy = true;
- }
- s = null;
- return isBuggy;
- })();
-
-
- function update(element, content) {
- element = $(element);
- var purgeElement = Element._purgeElement;
-
- var descendants = element.getElementsByTagName('*'),
- i = descendants.length;
- while (i--) purgeElement(descendants[i]);
-
- if (content && content.toElement)
- content = content.toElement();
-
- if (Object.isElement(content))
- return element.update().insert(content);
-
- content = Object.toHTML(content);
-
- var tagName = element.tagName.toUpperCase();
-
- if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) {
- element.text = content;
- return element;
- }
-
- if (ANY_INNERHTML_BUGGY) {
- if (tagName in Element._insertionTranslations.tags) {
- while (element.firstChild) {
- element.removeChild(element.firstChild);
- }
- Element._getContentFromAnonymousElement(tagName, content.stripScripts())
- .each(function(node) {
- element.appendChild(node);
- });
- } else if (LINK_ELEMENT_INNERHTML_BUGGY && Object.isString(content) && content.indexOf('<link') > -1) {
- while (element.firstChild) {
- element.removeChild(element.firstChild);
- }
- var nodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts(), true);
- nodes.each(function(node) { element.appendChild(node); });
- }
- else {
- element.innerHTML = content.stripScripts();
- }
- }
- else {
- element.innerHTML = content.stripScripts();
- }
-
- content.evalScripts.bind(content).defer();
- return element;
- }
-
- return update;
- })(),
-
- replace: function(element, content) {
- element = $(element);
- if (content && content.toElement) content = content.toElement();
- else if (!Object.isElement(content)) {
- content = Object.toHTML(content);
- var range = element.ownerDocument.createRange();
- range.selectNode(element);
- content.evalScripts.bind(content).defer();
- content = range.createContextualFragment(content.stripScripts());
- }
- element.parentNode.replaceChild(content, element);
- return element;
- },
-
- insert: function(element, insertions) {
- element = $(element);
-
- if (Object.isString(insertions) || Object.isNumber(insertions) ||
- Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
- insertions = {bottom:insertions};
-
- var content, insert, tagName, childNodes;
-
- for (var position in insertions) {
- content = insertions[position];
- position = position.toLowerCase();
- insert = Element._insertionTranslations[position];
-
- if (content && content.toElement) content = content.toElement();
- if (Object.isElement(content)) {
- insert(element, content);
- continue;
- }
-
- content = Object.toHTML(content);
-
- tagName = ((position == 'before' || position == 'after')
- ? element.parentNode : element).tagName.toUpperCase();
-
- childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
-
- if (position == 'top' || position == 'after') childNodes.reverse();
- childNodes.each(insert.curry(element));
-
- content.evalScripts.bind(content).defer();
- }
-
- return element;
- },
-
- wrap: function(element, wrapper, attributes) {
- element = $(element);
- if (Object.isElement(wrapper))
- $(wrapper).writeAttribute(attributes || { });
- else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
- else wrapper = new Element('div', wrapper);
- if (element.parentNode)
- element.parentNode.replaceChild(wrapper, element);
- wrapper.appendChild(element);
- return wrapper;
- },
-
- inspect: function(element) {
- element = $(element);
- var result = '<' + element.tagName.toLowerCase();
- $H({'id': 'id', 'className': 'class'}).each(function(pair) {
- var property = pair.first(),
- attribute = pair.last(),
- value = (element[property] || '').toString();
- if (value) result += ' ' + attribute + '=' + value.inspect(true);
- });
- return result + '>';
- },
-
- recursivelyCollect: function(element, property, maximumLength) {
- element = $(element);
- maximumLength = maximumLength || -1;
- var elements = [];
-
- while (element = element[property]) {
- if (element.nodeType == 1)
- elements.push(Element.extend(element));
- if (elements.length == maximumLength)
- break;
- }
-
- return elements;
- },
-
- ancestors: function(element) {
- return Element.recursivelyCollect(element, 'parentNode');
- },
-
- descendants: function(element) {
- return Element.select(element, "*");
- },
-
- firstDescendant: function(element) {
- element = $(element).firstChild;
- while (element && element.nodeType != 1) element = element.nextSibling;
- return $(element);
- },
-
- immediateDescendants: function(element) {
- var results = [], child = $(element).firstChild;
- while (child) {
- if (child.nodeType === 1) {
- results.push(Element.extend(child));
- }
- child = child.nextSibling;
- }
- return results;
- },
-
- previousSiblings: function(element, maximumLength) {
- return Element.recursivelyCollect(element, 'previousSibling');
- },
-
- nextSiblings: function(element) {
- return Element.recursivelyCollect(element, 'nextSibling');
- },
-
- siblings: function(element) {
- element = $(element);
- return Element.previousSiblings(element).reverse()
- .concat(Element.nextSiblings(element));
- },
-
- match: function(element, selector) {
- element = $(element);
- if (Object.isString(selector))
- return Prototype.Selector.match(element, selector);
- return selector.match(element);
- },
-
- up: function(element, expression, index) {
- element = $(element);
- if (arguments.length == 1) return $(element.parentNode);
- var ancestors = Element.ancestors(element);
- return Object.isNumber(expression) ? ancestors[expression] :
- Prototype.Selector.find(ancestors, expression, index);
- },
-
- down: function(element, expression, index) {
- element = $(element);
- if (arguments.length == 1) return Element.firstDescendant(element);
- return Object.isNumber(expression) ? Element.descendants(element)[expression] :
- Element.select(element, expression)[index || 0];
- },
-
- previous: function(element, expression, index) {
- element = $(element);
- if (Object.isNumber(expression)) index = expression, expression = false;
- if (!Object.isNumber(index)) index = 0;
-
- if (expression) {
- return Prototype.Selector.find(element.previousSiblings(), expression, index);
- } else {
- return element.recursivelyCollect("previousSibling", index + 1)[index];
- }
- },
-
- next: function(element, expression, index) {
- element = $(element);
- if (Object.isNumber(expression)) index = expression, expression = false;
- if (!Object.isNumber(index)) index = 0;
-
- if (expression) {
- return Prototype.Selector.find(element.nextSiblings(), expression, index);
- } else {
- var maximumLength = Object.isNumber(index) ? index + 1 : 1;
- return element.recursivelyCollect("nextSibling", index + 1)[index];
- }
- },
-
-
- select: function(element) {
- element = $(element);
- var expressions = Array.prototype.slice.call(arguments, 1).join(', ');
- return Prototype.Selector.select(expressions, element);
- },
-
- adjacent: function(element) {
- element = $(element);
- var expressions = Array.prototype.slice.call(arguments, 1).join(', ');
- return Prototype.Selector.select(expressions, element.parentNode).without(element);
- },
-
- identify: function(element) {
- element = $(element);
- var id = Element.readAttribute(element, 'id');
- if (id) return id;
- do { id = 'anonymous_element_' + Element.idCounter++; } while ($(id));
- Element.writeAttribute(element, 'id', id);
- return id;
- },
-
- readAttribute: function(element, name) {
- element = $(element);
- if (Prototype.Browser.IE) {
- var t = Element._attributeTranslations.read;
- if (t.values[name]) return t.values[name](element, name);
- if (t.names[name]) name = t.names[name];
- if (name.include(':')) {
- return (!element.attributes || !element.attributes[name]) ? null :
- element.attributes[name].value;
- }
- }
- return element.getAttribute(name);
- },
-
- writeAttribute: function(element, name, value) {
- element = $(element);
- var attributes = { }, t = Element._attributeTranslations.write;
-
- if (typeof name == 'object') attributes = name;
- else attributes[name] = Object.isUndefined(value) ? true : value;
-
- for (var attr in attributes) {
- name = t.names[attr] || attr;
- value = attributes[attr];
- if (t.values[attr]) name = t.values[attr](element, value);
- if (value === false || value === null)
- element.removeAttribute(name);
- else if (value === true)
- element.setAttribute(name, name);
- else element.setAttribute(name, value);
- }
- return element;
- },
-
- getHeight: function(element) {
- return Element.getDimensions(element).height;
- },
-
- getWidth: function(element) {
- return Element.getDimensions(element).width;
- },
-
- classNames: function(element) {
- return new Element.ClassNames(element);
- },
-
- hasClassName: function(element, className) {
- if (!(element = $(element))) return;
- var elementClassName = element.className;
- return (elementClassName.length > 0 && (elementClassName == className ||
- new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
- },
-
- addClassName: function(element, className) {
- if (!(element = $(element))) return;
- if (!Element.hasClassName(element, className))
- element.className += (element.className ? ' ' : '') + className;
- return element;
- },
-
- removeClassName: function(element, className) {
- if (!(element = $(element))) return;
- element.className = element.className.replace(
- new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
- return element;
- },
-
- toggleClassName: function(element, className) {
- if (!(element = $(element))) return;
- return Element[Element.hasClassName(element, className) ?
- 'removeClassName' : 'addClassName'](element, className);
- },
-
- cleanWhitespace: function(element) {
- element = $(element);
- var node = element.firstChild;
- while (node) {
- var nextNode = node.nextSibling;
- if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
- element.removeChild(node);
- node = nextNode;
- }
- return element;
- },
-
- empty: function(element) {
- return $(element).innerHTML.blank();
- },
-
- descendantOf: function(element, ancestor) {
- element = $(element), ancestor = $(ancestor);
-
- if (element.compareDocumentPosition)
- return (element.compareDocumentPosition(ancestor) & 8) === 8;
-
- if (ancestor.contains)
- return ancestor.contains(element) && ancestor !== element;
-
- while (element = element.parentNode)
- if (element == ancestor) return true;
-
- return false;
- },
-
- scrollTo: function(element) {
- element = $(element);
- var pos = Element.cumulativeOffset(element);
- window.scrollTo(pos[0], pos[1]);
- return element;
- },
-
- getStyle: function(element, style) {
- element = $(element);
- style = style == 'float' ? 'cssFloat' : style.camelize();
- var value = element.style[style];
- if (!value || value == 'auto') {
- var css = document.defaultView.getComputedStyle(element, null);
- value = css ? css[style] : null;
- }
- if (style == 'opacity') return value ? parseFloat(value) : 1.0;
- return value == 'auto' ? null : value;
- },
-
- getOpacity: function(element) {
- return $(element).getStyle('opacity');
- },
-
- setStyle: function(element, styles) {
- element = $(element);
- var elementStyle = element.style, match;
- if (Object.isString(styles)) {
- element.style.cssText += ';' + styles;
- return styles.include('opacity') ?
- element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
- }
- for (var property in styles)
- if (property == 'opacity') element.setOpacity(styles[property]);
- else
- elementStyle[(property == 'float' || property == 'cssFloat') ?
- (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
- property] = styles[property];
-
- return element;
- },
-
- setOpacity: function(element, value) {
- element = $(element);
- element.style.opacity = (value == 1 || value === '') ? '' :
- (value < 0.00001) ? 0 : value;
- return element;
- },
-
- makePositioned: function(element) {
- element = $(element);
- var pos = Element.getStyle(element, 'position');
- if (pos == 'static' || !pos) {
- element._madePositioned = true;
- element.style.position = 'relative';
- if (Prototype.Browser.Opera) {
- element.style.top = 0;
- element.style.left = 0;
- }
- }
- return element;
- },
-
- undoPositioned: function(element) {
- element = $(element);
- if (element._madePositioned) {
- element._madePositioned = undefined;
- element.style.position =
- element.style.top =
- element.style.left =
- element.style.bottom =
- element.style.right = '';
- }
- return element;
- },
-
- makeClipping: function(element) {
- element = $(element);
- if (element._overflow) return element;
- element._overflow = Element.getStyle(element, 'overflow') || 'auto';
- if (element._overflow !== 'hidden')
- element.style.overflow = 'hidden';
- return element;
- },
-
- undoClipping: function(element) {
- element = $(element);
- if (!element._overflow) return element;
- element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
- element._overflow = null;
- return element;
- },
-
- clonePosition: function(element, source) {
- var options = Object.extend({
- setLeft: true,
- setTop: true,
- setWidth: true,
- setHeight: true,
- offsetTop: 0,
- offsetLeft: 0
- }, arguments[2] || { });
-
- source = $(source);
- var p = Element.viewportOffset(source), delta = [0, 0], parent = null;
-
- element = $(element);
-
- if (Element.getStyle(element, 'position') == 'absolute') {
- parent = Element.getOffsetParent(element);
- delta = Element.viewportOffset(parent);
- }
-
- if (parent == document.body) {
- delta[0] -= document.body.offsetLeft;
- delta[1] -= document.body.offsetTop;
- }
-
- if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
- if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
- if (options.setWidth) element.style.width = source.offsetWidth + 'px';
- if (options.setHeight) element.style.height = source.offsetHeight + 'px';
- return element;
- }
-};
-
-Object.extend(Element.Methods, {
- getElementsBySelector: Element.Methods.select,
-
- childElements: Element.Methods.immediateDescendants
-});
-
-Element._attributeTranslations = {
- write: {
- names: {
- className: 'class',
- htmlFor: 'for'
- },
- values: { }
- }
-};
-
-if (Prototype.Browser.Opera) {
- Element.Methods.getStyle = Element.Methods.getStyle.wrap(
- function(proceed, element, style) {
- switch (style) {
- case 'height': case 'width':
- if (!Element.visible(element)) return null;
-
- var dim = parseInt(proceed(element, style), 10);
-
- if (dim !== element['offset' + style.capitalize()])
- return dim + 'px';
-
- var properties;
- if (style === 'height') {
- properties = ['border-top-width', 'padding-top',
- 'padding-bottom', 'border-bottom-width'];
- }
- else {
- properties = ['border-left-width', 'padding-left',
- 'padding-right', 'border-right-width'];
- }
- return properties.inject(dim, function(memo, property) {
- var val = proceed(element, property);
- return val === null ? memo : memo - parseInt(val, 10);
- }) + 'px';
- default: return proceed(element, style);
- }
- }
- );
-
- Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
- function(proceed, element, attribute) {
- if (attribute === 'title') return element.title;
- return proceed(element, attribute);
- }
- );
-}
-
-else if (Prototype.Browser.IE) {
- Element.Methods.getStyle = function(element, style) {
- element = $(element);
- style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
- var value = element.style[style];
- if (!value && element.currentStyle) value = element.currentStyle[style];
-
- if (style == 'opacity') {
- if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
- if (value[1]) return parseFloat(value[1]) / 100;
- return 1.0;
- }
-
- if (value == 'auto') {
- if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
- return element['offset' + style.capitalize()] + 'px';
- return null;
- }
- return value;
- };
-
- Element.Methods.setOpacity = function(element, value) {
- function stripAlpha(filter){
- return filter.replace(/alpha\([^\)]*\)/gi,'');
- }
- element = $(element);
- var currentStyle = element.currentStyle;
- if ((currentStyle && !currentStyle.hasLayout) ||
- (!currentStyle && element.style.zoom == 'normal'))
- element.style.zoom = 1;
-
- var filter = element.getStyle('filter'), style = element.style;
- if (value == 1 || value === '') {
- (filter = stripAlpha(filter)) ?
- style.filter = filter : style.removeAttribute('filter');
- return element;
- } else if (value < 0.00001) value = 0;
- style.filter = stripAlpha(filter) +
- 'alpha(opacity=' + (value * 100) + ')';
- return element;
- };
-
- Element._attributeTranslations = (function(){
-
- var classProp = 'className',
- forProp = 'for',
- el = document.createElement('div');
-
- el.setAttribute(classProp, 'x');
-
- if (el.className !== 'x') {
- el.setAttribute('class', 'x');
- if (el.className === 'x') {
- classProp = 'class';
- }
- }
- el = null;
-
- el = document.createElement('label');
- el.setAttribute(forProp, 'x');
- if (el.htmlFor !== 'x') {
- el.setAttribute('htmlFor', 'x');
- if (el.htmlFor === 'x') {
- forProp = 'htmlFor';
- }
- }
- el = null;
-
- return {
- read: {
- names: {
- 'class': classProp,
- 'className': classProp,
- 'for': forProp,
- 'htmlFor': forProp
- },
- values: {
- _getAttr: function(element, attribute) {
- return element.getAttribute(attribute);
- },
- _getAttr2: function(element, attribute) {
- return element.getAttribute(attribute, 2);
- },
- _getAttrNode: function(element, attribute) {
- var node = element.getAttributeNode(attribute);
- return node ? node.value : "";
- },
- _getEv: (function(){
-
- var el = document.createElement('div'), f;
- el.onclick = Prototype.emptyFunction;
- var value = el.getAttribute('onclick');
-
- if (String(value).indexOf('{') > -1) {
- f = function(element, attribute) {
- attribute = element.getAttribute(attribute);
- if (!attribute) return null;
- attribute = attribute.toString();
- attribute = attribute.split('{')[1];
- attribute = attribute.split('}')[0];
- return attribute.strip();
- };
- }
- else if (value === '') {
- f = function(element, attribute) {
- attribute = element.getAttribute(attribute);
- if (!attribute) return null;
- return attribute.strip();
- };
- }
- el = null;
- return f;
- })(),
- _flag: function(element, attribute) {
- return $(element).hasAttribute(attribute) ? attribute : null;
- },
- style: function(element) {
- return element.style.cssText.toLowerCase();
- },
- title: function(element) {
- return element.title;
- }
- }
- }
- };
- })();
-
- Element._attributeTranslations.write = {
- names: Object.extend({
- cellpadding: 'cellPadding',
- cellspacing: 'cellSpacing'
- }, Element._attributeTranslations.read.names),
- values: {
- checked: function(element, value) {
- element.checked = !!value;
- },
-
- style: function(element, value) {
- element.style.cssText = value ? value : '';
- }
- }
- };
-
- Element._attributeTranslations.has = {};
-
- $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
- 'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
- Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
- Element._attributeTranslations.has[attr.toLowerCase()] = attr;
- });
-
- (function(v) {
- Object.extend(v, {
- href: v._getAttr2,
- src: v._getAttr2,
- type: v._getAttr,
- action: v._getAttrNode,
- disabled: v._flag,
- checked: v._flag,
- readonly: v._flag,
- multiple: v._flag,
- onload: v._getEv,
- onunload: v._getEv,
- onclick: v._getEv,
- ondblclick: v._getEv,
- onmousedown: v._getEv,
- onmouseup: v._getEv,
- onmouseover: v._getEv,
- onmousemove: v._getEv,
- onmouseout: v._getEv,
- onfocus: v._getEv,
- onblur: v._getEv,
- onkeypress: v._getEv,
- onkeydown: v._getEv,
- onkeyup: v._getEv,
- onsubmit: v._getEv,
- onreset: v._getEv,
- onselect: v._getEv,
- onchange: v._getEv
- });
- })(Element._attributeTranslations.read.values);
-
- if (Prototype.BrowserFeatures.ElementExtensions) {
- (function() {
- function _descendants(element) {
- var nodes = element.getElementsByTagName('*'), results = [];
- for (var i = 0, node; node = nodes[i]; i++)
- if (node.tagName !== "!") // Filter out comment nodes.
- results.push(node);
- return results;
- }
-
- Element.Methods.down = function(element, expression, index) {
- element = $(element);
- if (arguments.length == 1) return element.firstDescendant();
- return Object.isNumber(expression) ? _descendants(element)[expression] :
- Element.select(element, expression)[index || 0];
- };
- })();
- }
-
-}
-
-else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
- Element.Methods.setOpacity = function(element, value) {
- element = $(element);
- element.style.opacity = (value == 1) ? 0.999999 :
- (value === '') ? '' : (value < 0.00001) ? 0 : value;
- return element;
- };
-}
-
-else if (Prototype.Browser.WebKit) {
- Element.Methods.setOpacity = function(element, value) {
- element = $(element);
- element.style.opacity = (value == 1 || value === '') ? '' :
- (value < 0.00001) ? 0 : value;
-
- if (value == 1)
- if (element.tagName.toUpperCase() == 'IMG' && element.width) {
- element.width++; element.width--;
- } else try {
- var n = document.createTextNode(' ');
- element.appendChild(n);
- element.removeChild(n);
- } catch (e) { }
-
- return element;
- };
-}
-
-if ('outerHTML' in document.documentElement) {
- Element.Methods.replace = function(element, content) {
- element = $(element);
-
- if (content && content.toElement) content = content.toElement();
- if (Object.isElement(content)) {
- element.parentNode.replaceChild(content, element);
- return element;
- }
-
- content = Object.toHTML(content);
- var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
-
- if (Element._insertionTranslations.tags[tagName]) {
- var nextSibling = element.next(),
- fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
- parent.removeChild(element);
- if (nextSibling)
- fragments.each(function(node) { parent.insertBefore(node, nextSibling); });
- else
- fragments.each(function(node) { parent.appendChild(node); });
- }
- else element.outerHTML = content.stripScripts();
-
- content.evalScripts.bind(content).defer();
- return element;
- };
-}
-
-Element._returnOffset = function(l, t) {
- var result = [l, t];
- result.left = l;
- result.top = t;
- return result;
-};
-
-Element._getContentFromAnonymousElement = function(tagName, html, force) {
- var div = new Element('div'),
- t = Element._insertionTranslations.tags[tagName];
-
- var workaround = false;
- if (t) workaround = true;
- else if (force) {
- workaround = true;
- t = ['', '', 0];
- }
-
- if (workaround) {
- div.innerHTML = '&nbsp;' + t[0] + html + t[1];
- div.removeChild(div.firstChild);
- for (var i = t[2]; i--; ) {
- div = div.firstChild;
- }
- }
- else {
- div.innerHTML = html;
- }
- return $A(div.childNodes);
-};
-
-Element._insertionTranslations = {
- before: function(element, node) {
- element.parentNode.insertBefore(node, element);
- },
- top: function(element, node) {
- element.insertBefore(node, element.firstChild);
- },
- bottom: function(element, node) {
- element.appendChild(node);
- },
- after: function(element, node) {
- element.parentNode.insertBefore(node, element.nextSibling);
- },
- tags: {
- TABLE: ['<table>', '</table>', 1],
- TBODY: ['<table><tbody>', '</tbody></table>', 2],
- TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3],
- TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
- SELECT: ['<select>', '</select>', 1]
- }
-};
-
-(function() {
- var tags = Element._insertionTranslations.tags;
- Object.extend(tags, {
- THEAD: tags.TBODY,
- TFOOT: tags.TBODY,
- TH: tags.TD
- });
-})();
-
-Element.Methods.Simulated = {
- hasAttribute: function(element, attribute) {
- attribute = Element._attributeTranslations.has[attribute] || attribute;
- var node = $(element).getAttributeNode(attribute);
- return !!(node && node.specified);
- }
-};
-
-Element.Methods.ByTag = { };
-
-Object.extend(Element, Element.Methods);
-
-(function(div) {
-
- if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) {
- window.HTMLElement = { };
- window.HTMLElement.prototype = div['__proto__'];
- Prototype.BrowserFeatures.ElementExtensions = true;
- }
-
- div = null;
-
-})(document.createElement('div'));
-
-Element.extend = (function() {
-
- function checkDeficiency(tagName) {
- if (typeof window.Element != 'undefined') {
- var proto = window.Element.prototype;
- if (proto) {
- var id = '_' + (Math.random()+'').slice(2),
- el = document.createElement(tagName);
- proto[id] = 'x';
- var isBuggy = (el[id] !== 'x');
- delete proto[id];
- el = null;
- return isBuggy;
- }
- }
- return false;
- }
-
- function extendElementWith(element, methods) {
- for (var property in methods) {
- var value = methods[property];
- if (Object.isFunction(value) && !(property in element))
- element[property] = value.methodize();
- }
- }
-
- var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object');
-
- if (Prototype.BrowserFeatures.SpecificElementExtensions) {
- if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) {
- return function(element) {
- if (element && typeof element._extendedByPrototype == 'undefined') {
- var t = element.tagName;
- if (t && (/^(?:object|applet|embed)$/i.test(t))) {
- extendElementWith(element, Element.Methods);
- extendElementWith(element, Element.Methods.Simulated);
- extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]);
- }
- }
- return element;
- };
- }
- return Prototype.K;
- }
-
- var Methods = { }, ByTag = Element.Methods.ByTag;
-
- var extend = Object.extend(function(element) {
- if (!element || typeof element._extendedByPrototype != 'undefined' ||
- element.nodeType != 1 || element == window) return element;
-
- var methods = Object.clone(Methods),
- tagName = element.tagName.toUpperCase();
-
- if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
-
- extendElementWith(element, methods);
-
- element._extendedByPrototype = Prototype.emptyFunction;
- return element;
-
- }, {
- refresh: function() {
- if (!Prototype.BrowserFeatures.ElementExtensions) {
- Object.extend(Methods, Element.Methods);
- Object.extend(Methods, Element.Methods.Simulated);
- }
- }
- });
-
- extend.refresh();
- return extend;
-})();
-
-if (document.documentElement.hasAttribute) {
- Element.hasAttribute = function(element, attribute) {
- return element.hasAttribute(attribute);
- };
-}
-else {
- Element.hasAttribute = Element.Methods.Simulated.hasAttribute;
-}
-
-Element.addMethods = function(methods) {
- var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
-
- if (!methods) {
- Object.extend(Form, Form.Methods);
- Object.extend(Form.Element, Form.Element.Methods);
- Object.extend(Element.Methods.ByTag, {
- "FORM": Object.clone(Form.Methods),
- "INPUT": Object.clone(Form.Element.Methods),
- "SELECT": Object.clone(Form.Element.Methods),
- "TEXTAREA": Object.clone(Form.Element.Methods),
- "BUTTON": Object.clone(Form.Element.Methods)
- });
- }
-
- if (arguments.length == 2) {
- var tagName = methods;
- methods = arguments[1];
- }
-
- if (!tagName) Object.extend(Element.Methods, methods || { });
- else {
- if (Object.isArray(tagName)) tagName.each(extend);
- else extend(tagName);
- }
-
- function extend(tagName) {
- tagName = tagName.toUpperCase();
- if (!Element.Methods.ByTag[tagName])
- Element.Methods.ByTag[tagName] = { };
- Object.extend(Element.Methods.ByTag[tagName], methods);
- }
-
- function copy(methods, destination, onlyIfAbsent) {
- onlyIfAbsent = onlyIfAbsent || false;
- for (var property in methods) {
- var value = methods[property];
- if (!Object.isFunction(value)) continue;
- if (!onlyIfAbsent || !(property in destination))
- destination[property] = value.methodize();
- }
- }
-
- function findDOMClass(tagName) {
- var klass;
- var trans = {
- "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
- "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
- "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
- "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
- "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
- "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
- "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
- "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
- "FrameSet", "IFRAME": "IFrame"
- };
- if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
- if (window[klass]) return window[klass];
- klass = 'HTML' + tagName + 'Element';
- if (window[klass]) return window[klass];
- klass = 'HTML' + tagName.capitalize() + 'Element';
- if (window[klass]) return window[klass];
-
- var element = document.createElement(tagName),
- proto = element['__proto__'] || element.constructor.prototype;
-
- element = null;
- return proto;
- }
-
- var elementPrototype = window.HTMLElement ? HTMLElement.prototype :
- Element.prototype;
-
- if (F.ElementExtensions) {
- copy(Element.Methods, elementPrototype);
- copy(Element.Methods.Simulated, elementPrototype, true);
- }
-
- if (F.SpecificElementExtensions) {
- for (var tag in Element.Methods.ByTag) {
- var klass = findDOMClass(tag);
- if (Object.isUndefined(klass)) continue;
- copy(T[tag], klass.prototype);
- }
- }
-
- Object.extend(Element, Element.Methods);
- delete Element.ByTag;
-
- if (Element.extend.refresh) Element.extend.refresh();
- Element.cache = { };
-};
-
-
-document.viewport = {
-
- getDimensions: function() {
- return { width: this.getWidth(), height: this.getHeight() };
- },
-
- getScrollOffsets: function() {
- return Element._returnOffset(
- window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
- window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
- }
-};
-
-(function(viewport) {
- var B = Prototype.Browser, doc = document, element, property = {};
-
- function getRootElement() {
- if (B.WebKit && !doc.evaluate)
- return document;
-
- if (B.Opera && window.parseFloat(window.opera.version()) < 9.5)
- return document.body;
-
- return document.documentElement;
- }
-
- function define(D) {
- if (!element) element = getRootElement();
-
- property[D] = 'client' + D;
-
- viewport['get' + D] = function() { return element[property[D]]; };
- return viewport['get' + D]();
- }
-
- viewport.getWidth = define.curry('Width');
-
- viewport.getHeight = define.curry('Height');
-})(document.viewport);
-
-
-Element.Storage = {
- UID: 1
-};
-
-Element.addMethods({
- getStorage: function(element) {
- if (!(element = $(element))) return;
-
- var uid;
- if (element === window) {
- uid = 0;
- } else {
- if (typeof element._prototypeUID === "undefined")
- element._prototypeUID = Element.Storage.UID++;
- uid = element._prototypeUID;
- }
-
- if (!Element.Storage[uid])
- Element.Storage[uid] = $H();
-
- return Element.Storage[uid];
- },
-
- store: function(element, key, value) {
- if (!(element = $(element))) return;
-
- if (arguments.length === 2) {
- Element.getStorage(element).update(key);
- } else {
- Element.getStorage(element).set(key, value);
- }
-
- return element;
- },
-
- retrieve: function(element, key, defaultValue) {
- if (!(element = $(element))) return;
- var hash = Element.getStorage(element), value = hash.get(key);
-
- if (Object.isUndefined(value)) {
- hash.set(key, defaultValue);
- value = defaultValue;
- }
-
- return value;
- },
-
- clone: function(element, deep) {
- if (!(element = $(element))) return;
- var clone = element.cloneNode(deep);
- clone._prototypeUID = void 0;
- if (deep) {
- var descendants = Element.select(clone, '*'),
- i = descendants.length;
- while (i--) {
- descendants[i]._prototypeUID = void 0;
- }
- }
- return Element.extend(clone);
- },
-
- purge: function(element) {
- if (!(element = $(element))) return;
- var purgeElement = Element._purgeElement;
-
- purgeElement(element);
-
- var descendants = element.getElementsByTagName('*'),
- i = descendants.length;
-
- while (i--) purgeElement(descendants[i]);
-
- return null;
- }
-});
-
-(function() {
-
- function toDecimal(pctString) {
- var match = pctString.match(/^(\d+)%?$/i);
- if (!match) return null;
- return (Number(match[1]) / 100);
- }
-
- function getPixelValue(value, property, context) {
- var element = null;
- if (Object.isElement(value)) {
- element = value;
- value = element.getStyle(property);
- }
-
- if (value === null) {
- return null;
- }
-
- if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) {
- return window.parseFloat(value);
- }
-
- var isPercentage = value.include('%'), isViewport = (context === document.viewport);
-
- if (/\d/.test(value) && element && element.runtimeStyle && !(isPercentage && isViewport)) {
- var style = element.style.left, rStyle = element.runtimeStyle.left;
- element.runtimeStyle.left = element.currentStyle.left;
- element.style.left = value || 0;
- value = element.style.pixelLeft;
- element.style.left = style;
- element.runtimeStyle.left = rStyle;
-
- return value;
- }
-
- if (element && isPercentage) {
- context = context || element.parentNode;
- var decimal = toDecimal(value);
- var whole = null;
- var position = element.getStyle('position');
-
- var isHorizontal = property.include('left') || property.include('right') ||
- property.include('width');
-
- var isVertical = property.include('top') || property.include('bottom') ||
- property.include('height');
-
- if (context === document.viewport) {
- if (isHorizontal) {
- whole = document.viewport.getWidth();
- } else if (isVertical) {
- whole = document.viewport.getHeight();
- }
- } else {
- if (isHorizontal) {
- whole = $(context).measure('width');
- } else if (isVertical) {
- whole = $(context).measure('height');
- }
- }
-
- return (whole === null) ? 0 : whole * decimal;
- }
-
- return 0;
- }
-
- function toCSSPixels(number) {
- if (Object.isString(number) && number.endsWith('px')) {
- return number;
- }
- return number + 'px';
- }
-
- function isDisplayed(element) {
- var originalElement = element;
- while (element && element.parentNode) {
- var display = element.getStyle('display');
- if (display === 'none') {
- return false;
- }
- element = $(element.parentNode);
- }
- return true;
- }
-
- var hasLayout = Prototype.K;
- if ('currentStyle' in document.documentElement) {
- hasLayout = function(element) {
- if (!element.currentStyle.hasLayout) {
- element.style.zoom = 1;
- }
- return element;
- };
- }
-
- function cssNameFor(key) {
- if (key.include('border')) key = key + '-width';
- return key.camelize();
- }
-
- Element.Layout = Class.create(Hash, {
- initialize: function($super, element, preCompute) {
- $super();
- this.element = $(element);
-
- Element.Layout.PROPERTIES.each( function(property) {
- this._set(property, null);
- }, this);
-
- if (preCompute) {
- this._preComputing = true;
- this._begin();
- Element.Layout.PROPERTIES.each( this._compute, this );
- this._end();
- this._preComputing = false;
- }
- },
-
- _set: function(property, value) {
- return Hash.prototype.set.call(this, property, value);
- },
-
- set: function(property, value) {
- throw "Properties of Element.Layout are read-only.";
- },
-
- get: function($super, property) {
- var value = $super(property);
- return value === null ? this._compute(property) : value;
- },
-
- _begin: function() {
- if (this._prepared) return;
-
- var element = this.element;
- if (isDisplayed(element)) {
- this._prepared = true;
- return;
- }
-
- var originalStyles = {
- position: element.style.position || '',
- width: element.style.width || '',
- visibility: element.style.visibility || '',
- display: element.style.display || ''
- };
-
- element.store('prototype_original_styles', originalStyles);
-
- var position = element.getStyle('position'),
- width = element.getStyle('width');
-
- if (width === "0px" || width === null) {
- element.style.display = 'block';
- width = element.getStyle('width');
- }
-
- var context = (position === 'fixed') ? document.viewport :
- element.parentNode;
-
- element.setStyle({
- position: 'absolute',
- visibility: 'hidden',
- display: 'block'
- });
-
- var positionedWidth = element.getStyle('width');
-
- var newWidth;
- if (width && (positionedWidth === width)) {
- newWidth = getPixelValue(element, 'width', context);
- } else if (position === 'absolute' || position === 'fixed') {
- newWidth = getPixelValue(element, 'width', context);
- } else {
- var parent = element.parentNode, pLayout = $(parent).getLayout();
-
- newWidth = pLayout.get('width') -
- this.get('margin-left') -
- this.get('border-left') -
- this.get('padding-left') -
- this.get('padding-right') -
- this.get('border-right') -
- this.get('margin-right');
- }
-
- element.setStyle({ width: newWidth + 'px' });
-
- this._prepared = true;
- },
-
- _end: function() {
- var element = this.element;
- var originalStyles = element.retrieve('prototype_original_styles');
- element.store('prototype_original_styles', null);
- element.setStyle(originalStyles);
- this._prepared = false;
- },
-
- _compute: function(property) {
- var COMPUTATIONS = Element.Layout.COMPUTATIONS;
- if (!(property in COMPUTATIONS)) {
- throw "Property not found.";
- }
-
- return this._set(property, COMPUTATIONS[property].call(this, this.element));
- },
-
- toObject: function() {
- var args = $A(arguments);
- var keys = (args.length === 0) ? Element.Layout.PROPERTIES :
- args.join(' ').split(' ');
- var obj = {};
- keys.each( function(key) {
- if (!Element.Layout.PROPERTIES.include(key)) return;
- var value = this.get(key);
- if (value != null) obj[key] = value;
- }, this);
- return obj;
- },
-
- toHash: function() {
- var obj = this.toObject.apply(this, arguments);
- return new Hash(obj);
- },
-
- toCSS: function() {
- var args = $A(arguments);
- var keys = (args.length === 0) ? Element.Layout.PROPERTIES :
- args.join(' ').split(' ');
- var css = {};
-
- keys.each( function(key) {
- if (!Element.Layout.PROPERTIES.include(key)) return;
- if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return;
-
- var value = this.get(key);
- if (value != null) css[cssNameFor(key)] = value + 'px';
- }, this);
- return css;
- },
-
- inspect: function() {
- return "#<Element.Layout>";
- }
- });
-
- Object.extend(Element.Layout, {
- PROPERTIES: $w('height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height'),
-
- COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'),
-
- COMPUTATIONS: {
- 'height': function(element) {
- if (!this._preComputing) this._begin();
-
- var bHeight = this.get('border-box-height');
- if (bHeight <= 0) {
- if (!this._preComputing) this._end();
- return 0;
- }
-
- var bTop = this.get('border-top'),
- bBottom = this.get('border-bottom');
-
- var pTop = this.get('padding-top'),
- pBottom = this.get('padding-bottom');
-
- if (!this._preComputing) this._end();
-
- return bHeight - bTop - bBottom - pTop - pBottom;
- },
-
- 'width': function(element) {
- if (!this._preComputing) this._begin();
-
- var bWidth = this.get('border-box-width');
- if (bWidth <= 0) {
- if (!this._preComputing) this._end();
- return 0;
- }
-
- var bLeft = this.get('border-left'),
- bRight = this.get('border-right');
-
- var pLeft = this.get('padding-left'),
- pRight = this.get('padding-right');
-
- if (!this._preComputing) this._end();
-
- return bWidth - bLeft - bRight - pLeft - pRight;
- },
-
- 'padding-box-height': function(element) {
- var height = this.get('height'),
- pTop = this.get('padding-top'),
- pBottom = this.get('padding-bottom');
-
- return height + pTop + pBottom;
- },
-
- 'padding-box-width': function(element) {
- var width = this.get('width'),
- pLeft = this.get('padding-left'),
- pRight = this.get('padding-right');
-
- return width + pLeft + pRight;
- },
-
- 'border-box-height': function(element) {
- if (!this._preComputing) this._begin();
- var height = element.offsetHeight;
- if (!this._preComputing) this._end();
- return height;
- },
-
- 'border-box-width': function(element) {
- if (!this._preComputing) this._begin();
- var width = element.offsetWidth;
- if (!this._preComputing) this._end();
- return width;
- },
-
- 'margin-box-height': function(element) {
- var bHeight = this.get('border-box-height'),
- mTop = this.get('margin-top'),
- mBottom = this.get('margin-bottom');
-
- if (bHeight <= 0) return 0;
-
- return bHeight + mTop + mBottom;
- },
-
- 'margin-box-width': function(element) {
- var bWidth = this.get('border-box-width'),
- mLeft = this.get('margin-left'),
- mRight = this.get('margin-right');
-
- if (bWidth <= 0) return 0;
-
- return bWidth + mLeft + mRight;
- },
-
- 'top': function(element) {
- var offset = element.positionedOffset();
- return offset.top;
- },
-
- 'bottom': function(element) {
- var offset = element.positionedOffset(),
- parent = element.getOffsetParent(),
- pHeight = parent.measure('height');
-
- var mHeight = this.get('border-box-height');
-
- return pHeight - mHeight - offset.top;
- },
-
- 'left': function(element) {
- var offset = element.positionedOffset();
- return offset.left;
- },
-
- 'right': function(element) {
- var offset = element.positionedOffset(),
- parent = element.getOffsetParent(),
- pWidth = parent.measure('width');
-
- var mWidth = this.get('border-box-width');
-
- return pWidth - mWidth - offset.left;
- },
-
- 'padding-top': function(element) {
- return getPixelValue(element, 'paddingTop');
- },
-
- 'padding-bottom': function(element) {
- return getPixelValue(element, 'paddingBottom');
- },
-
- 'padding-left': function(element) {
- return getPixelValue(element, 'paddingLeft');
- },
-
- 'padding-right': function(element) {
- return getPixelValue(element, 'paddingRight');
- },
-
- 'border-top': function(element) {
- return getPixelValue(element, 'borderTopWidth');
- },
-
- 'border-bottom': function(element) {
- return getPixelValue(element, 'borderBottomWidth');
- },
-
- 'border-left': function(element) {
- return getPixelValue(element, 'borderLeftWidth');
- },
-
- 'border-right': function(element) {
- return getPixelValue(element, 'borderRightWidth');
- },
-
- 'margin-top': function(element) {
- return getPixelValue(element, 'marginTop');
- },
-
- 'margin-bottom': function(element) {
- return getPixelValue(element, 'marginBottom');
- },
-
- 'margin-left': function(element) {
- return getPixelValue(element, 'marginLeft');
- },
-
- 'margin-right': function(element) {
- return getPixelValue(element, 'marginRight');
- }
- }
- });
-
- if ('getBoundingClientRect' in document.documentElement) {
- Object.extend(Element.Layout.COMPUTATIONS, {
- 'right': function(element) {
- var parent = hasLayout(element.getOffsetParent());
- var rect = element.getBoundingClientRect(),
- pRect = parent.getBoundingClientRect();
-
- return (pRect.right - rect.right).round();
- },
-
- 'bottom': function(element) {
- var parent = hasLayout(element.getOffsetParent());
- var rect = element.getBoundingClientRect(),
- pRect = parent.getBoundingClientRect();
-
- return (pRect.bottom - rect.bottom).round();
- }
- });
- }
-
- Element.Offset = Class.create({
- initialize: function(left, top) {
- this.left = left.round();
- this.top = top.round();
-
- this[0] = this.left;
- this[1] = this.top;
- },
-
- relativeTo: function(offset) {
- return new Element.Offset(
- this.left - offset.left,
- this.top - offset.top
- );
- },
-
- inspect: function() {
- return "#<Element.Offset left: #{left} top: #{top}>".interpolate(this);
- },
-
- toString: function() {
- return "[#{left}, #{top}]".interpolate(this);
- },
-
- toArray: function() {
- return [this.left, this.top];
- }
- });
-
- function getLayout(element, preCompute) {
- return new Element.Layout(element, preCompute);
- }
-
- function measure(element, property) {
- return $(element).getLayout().get(property);
- }
-
- function getDimensions(element) {
- element = $(element);
- var display = Element.getStyle(element, 'display');
-
- if (display && display !== 'none') {
- return { width: element.offsetWidth, height: element.offsetHeight };
- }
-
- var style = element.style;
- var originalStyles = {
- visibility: style.visibility,
- position: style.position,
- display: style.display
- };
-
- var newStyles = {
- visibility: 'hidden',
- display: 'block'
- };
-
- if (originalStyles.position !== 'fixed')
- newStyles.position = 'absolute';
-
- Element.setStyle(element, newStyles);
-
- var dimensions = {
- width: element.offsetWidth,
- height: element.offsetHeight
- };
-
- Element.setStyle(element, originalStyles);
-
- return dimensions;
- }
-
- function getOffsetParent(element) {
- element = $(element);
-
- if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
- return $(document.body);
-
- var isInline = (Element.getStyle(element, 'display') === 'inline');
- if (!isInline && element.offsetParent) return $(element.offsetParent);
-
- while ((element = element.parentNode) && element !== document.body) {
- if (Element.getStyle(element, 'position') !== 'static') {
- return isHtml(element) ? $(document.body) : $(element);
- }
- }
-
- return $(document.body);
- }
-
-
- function cumulativeOffset(element) {
- element = $(element);
- var valueT = 0, valueL = 0;
- if (element.parentNode) {
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- element = element.offsetParent;
- } while (element);
- }
- return new Element.Offset(valueL, valueT);
- }
-
- function positionedOffset(element) {
- element = $(element);
-
- var layout = element.getLayout();
-
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- element = element.offsetParent;
- if (element) {
- if (isBody(element)) break;
- var p = Element.getStyle(element, 'position');
- if (p !== 'static') break;
- }
- } while (element);
-
- valueL -= layout.get('margin-top');
- valueT -= layout.get('margin-left');
-
- return new Element.Offset(valueL, valueT);
- }
-
- function cumulativeScrollOffset(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.scrollTop || 0;
- valueL += element.scrollLeft || 0;
- element = element.parentNode;
- } while (element);
- return new Element.Offset(valueL, valueT);
- }
-
- function viewportOffset(forElement) {
- element = $(element);
- var valueT = 0, valueL = 0, docBody = document.body;
-
- var element = forElement;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- if (element.offsetParent == docBody &&
- Element.getStyle(element, 'position') == 'absolute') break;
- } while (element = element.offsetParent);
-
- element = forElement;
- do {
- if (element != docBody) {
- valueT -= element.scrollTop || 0;
- valueL -= element.scrollLeft || 0;
- }
- } while (element = element.parentNode);
- return new Element.Offset(valueL, valueT);
- }
-
- function absolutize(element) {
- element = $(element);
-
- if (Element.getStyle(element, 'position') === 'absolute') {
- return element;
- }
-
- var offsetParent = getOffsetParent(element);
- var eOffset = element.viewportOffset(),
- pOffset = offsetParent.viewportOffset();
-
- var offset = eOffset.relativeTo(pOffset);
- var layout = element.getLayout();
-
- element.store('prototype_absolutize_original_styles', {
- left: element.getStyle('left'),
- top: element.getStyle('top'),
- width: element.getStyle('width'),
- height: element.getStyle('height')
- });
-
- element.setStyle({
- position: 'absolute',
- top: offset.top + 'px',
- left: offset.left + 'px',
- width: layout.get('width') + 'px',
- height: layout.get('height') + 'px'
- });
-
- return element;
- }
-
- function relativize(element) {
- element = $(element);
- if (Element.getStyle(element, 'position') === 'relative') {
- return element;
- }
-
- var originalStyles =
- element.retrieve('prototype_absolutize_original_styles');
-
- if (originalStyles) element.setStyle(originalStyles);
- return element;
- }
-
- if (Prototype.Browser.IE) {
- getOffsetParent = getOffsetParent.wrap(
- function(proceed, element) {
- element = $(element);
-
- if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
- return $(document.body);
-
- var position = element.getStyle('position');
- if (position !== 'static') return proceed(element);
-
- element.setStyle({ position: 'relative' });
- var value = proceed(element);
- element.setStyle({ position: position });
- return value;
- }
- );
-
- positionedOffset = positionedOffset.wrap(function(proceed, element) {
- element = $(element);
- if (!element.parentNode) return new Element.Offset(0, 0);
- var position = element.getStyle('position');
- if (position !== 'static') return proceed(element);
-
- var offsetParent = element.getOffsetParent();
- if (offsetParent && offsetParent.getStyle('position') === 'fixed')
- hasLayout(offsetParent);
-
- element.setStyle({ position: 'relative' });
- var value = proceed(element);
- element.setStyle({ position: position });
- return value;
- });
- } else if (Prototype.Browser.Webkit) {
- cumulativeOffset = function(element) {
- element = $(element);
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- if (element.offsetParent == document.body)
- if (Element.getStyle(element, 'position') == 'absolute') break;
-
- element = element.offsetParent;
- } while (element);
-
- return new Element.Offset(valueL, valueT);
- };
- }
-
-
- Element.addMethods({
- getLayout: getLayout,
- measure: measure,
- getDimensions: getDimensions,
- getOffsetParent: getOffsetParent,
- cumulativeOffset: cumulativeOffset,
- positionedOffset: positionedOffset,
- cumulativeScrollOffset: cumulativeScrollOffset,
- viewportOffset: viewportOffset,
- absolutize: absolutize,
- relativize: relativize
- });
-
- function isBody(element) {
- return element.nodeName.toUpperCase() === 'BODY';
- }
-
- function isHtml(element) {
- return element.nodeName.toUpperCase() === 'HTML';
- }
-
- function isDocument(element) {
- return element.nodeType === Node.DOCUMENT_NODE;
- }
-
- function isDetached(element) {
- return element !== document.body &&
- !Element.descendantOf(element, document.body);
- }
-
- if ('getBoundingClientRect' in document.documentElement) {
- Element.addMethods({
- viewportOffset: function(element) {
- element = $(element);
- if (isDetached(element)) return new Element.Offset(0, 0);
-
- var rect = element.getBoundingClientRect(),
- docEl = document.documentElement;
- return new Element.Offset(rect.left - docEl.clientLeft,
- rect.top - docEl.clientTop);
- }
- });
- }
-})();
-window.$$ = function() {
- var expression = $A(arguments).join(', ');
- return Prototype.Selector.select(expression, document);
-};
-
-Prototype.Selector = (function() {
-
- function select() {
- throw new Error('Method "Prototype.Selector.select" must be defined.');
- }
-
- function match() {
- throw new Error('Method "Prototype.Selector.match" must be defined.');
- }
-
- function find(elements, expression, index) {
- index = index || 0;
- var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i;
-
- for (i = 0; i < length; i++) {
- if (match(elements[i], expression) && index == matchIndex++) {
- return Element.extend(elements[i]);
- }
- }
- }
-
- function extendElements(elements) {
- for (var i = 0, length = elements.length; i < length; i++) {
- Element.extend(elements[i]);
- }
- return elements;
- }
-
-
- var K = Prototype.K;
-
- return {
- select: select,
- match: match,
- find: find,
- extendElements: (Element.extend === K) ? K : extendElements,
- extendElement: Element.extend
- };
-})();
-Prototype._original_property = window.Sizzle;
-/*!
- * Sizzle CSS Selector Engine - v1.0
- * Copyright 2009, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- * More information: http://sizzlejs.com/
- */
-(function(){
-
-var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
- done = 0,
- toString = Object.prototype.toString,
- hasDuplicate = false,
- baseHasDuplicate = true;
-
-[0, 0].sort(function(){
- baseHasDuplicate = false;
- return 0;
-});
-
-var Sizzle = function(selector, context, results, seed) {
- results = results || [];
- var origContext = context = context || document;
-
- if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
- return [];
- }
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context),
- soFar = selector;
-
- while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
- soFar = m[3];
-
- parts.push( m[1] );
-
- if ( m[2] ) {
- extra = m[3];
- break;
- }
- }
-
- if ( parts.length > 1 && origPOS.exec( selector ) ) {
- if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- set = posProcess( parts[0] + parts[1], context );
- } else {
- set = Expr.relative[ parts[0] ] ?
- [ context ] :
- Sizzle( parts.shift(), context );
-
- while ( parts.length ) {
- selector = parts.shift();
-
- if ( Expr.relative[ selector ] )
- selector += parts.shift();
-
- set = posProcess( selector, set );
- }
- }
- } else {
- if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
- Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
- var ret = Sizzle.find( parts.shift(), context, contextXML );
- context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
- }
-
- if ( context ) {
- var ret = seed ?
- { expr: parts.pop(), set: makeArray(seed) } :
- Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
- set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
-
- if ( parts.length > 0 ) {
- checkSet = makeArray(set);
- } else {
- prune = false;
- }
-
- while ( parts.length ) {
- var cur = parts.pop(), pop = cur;
-
- if ( !Expr.relative[ cur ] ) {
- cur = "";
- } else {
- pop = parts.pop();
- }
-
- if ( pop == null ) {
- pop = context;
- }
-
- Expr.relative[ cur ]( checkSet, pop, contextXML );
- }
- } else {
- checkSet = parts = [];
- }
- }
-
- if ( !checkSet ) {
- checkSet = set;
- }
-
- if ( !checkSet ) {
- throw "Syntax error, unrecognized expression: " + (cur || selector);
- }
-
- if ( toString.call(checkSet) === "[object Array]" ) {
- if ( !prune ) {
- results.push.apply( results, checkSet );
- } else if ( context && context.nodeType === 1 ) {
- for ( var i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
- results.push( set[i] );
- }
- }
- } else {
- for ( var i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
- results.push( set[i] );
- }
- }
- }
- } else {
- makeArray( checkSet, results );
- }
-
- if ( extra ) {
- Sizzle( extra, origContext, results, seed );
- Sizzle.uniqueSort( results );
- }
-
- return results;
-};
-
-Sizzle.uniqueSort = function(results){
- if ( sortOrder ) {
- hasDuplicate = baseHasDuplicate;
- results.sort(sortOrder);
-
- if ( hasDuplicate ) {
- for ( var i = 1; i < results.length; i++ ) {
- if ( results[i] === results[i-1] ) {
- results.splice(i--, 1);
- }
- }
- }
- }
-
- return results;
-};
-
-Sizzle.matches = function(expr, set){
- return Sizzle(expr, null, null, set);
-};
-
-Sizzle.find = function(expr, context, isXML){
- var set, match;
-
- if ( !expr ) {
- return [];
- }
-
- for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
- var type = Expr.order[i], match;
-
- if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
- var left = match[1];
- match.splice(1,1);
-
- if ( left.substr( left.length - 1 ) !== "\\" ) {
- match[1] = (match[1] || "").replace(/\\/g, "");
- set = Expr.find[ type ]( match, context, isXML );
- if ( set != null ) {
- expr = expr.replace( Expr.match[ type ], "" );
- break;
- }
- }
- }
- }
-
- if ( !set ) {
- set = context.getElementsByTagName("*");
- }
-
- return {set: set, expr: expr};
-};
-
-Sizzle.filter = function(expr, set, inplace, not){
- var old = expr, result = [], curLoop = set, match, anyFound,
- isXMLFilter = set && set[0] && isXML(set[0]);
-
- while ( expr && set.length ) {
- for ( var type in Expr.filter ) {
- if ( (match = Expr.match[ type ].exec( expr )) != null ) {
- var filter = Expr.filter[ type ], found, item;
- anyFound = false;
-
- if ( curLoop == result ) {
- result = [];
- }
-
- if ( Expr.preFilter[ type ] ) {
- match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
- if ( !match ) {
- anyFound = found = true;
- } else if ( match === true ) {
- continue;
- }
- }
-
- if ( match ) {
- for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
- if ( item ) {
- found = filter( item, match, i, curLoop );
- var pass = not ^ !!found;
-
- if ( inplace && found != null ) {
- if ( pass ) {
- anyFound = true;
- } else {
- curLoop[i] = false;
- }
- } else if ( pass ) {
- result.push( item );
- anyFound = true;
- }
- }
- }
- }
-
- if ( found !== undefined ) {
- if ( !inplace ) {
- curLoop = result;
- }
-
- expr = expr.replace( Expr.match[ type ], "" );
-
- if ( !anyFound ) {
- return [];
- }
-
- break;
- }
- }
- }
-
- if ( expr == old ) {
- if ( anyFound == null ) {
- throw "Syntax error, unrecognized expression: " + expr;
- } else {
- break;
- }
- }
-
- old = expr;
- }
-
- return curLoop;
-};
-
-var Expr = Sizzle.selectors = {
- order: [ "ID", "NAME", "TAG" ],
- match: {
- ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
- CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
- NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
- ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
- TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
- CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
- POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
- PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
- },
- leftMatch: {},
- attrMap: {
- "class": "className",
- "for": "htmlFor"
- },
- attrHandle: {
- href: function(elem){
- return elem.getAttribute("href");
- }
- },
- relative: {
- "+": function(checkSet, part, isXML){
- var isPartStr = typeof part === "string",
- isTag = isPartStr && !/\W/.test(part),
- isPartStrNotTag = isPartStr && !isTag;
-
- if ( isTag && !isXML ) {
- part = part.toUpperCase();
- }
-
- for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
- if ( (elem = checkSet[i]) ) {
- while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
-
- checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
- elem || false :
- elem === part;
- }
- }
-
- if ( isPartStrNotTag ) {
- Sizzle.filter( part, checkSet, true );
- }
- },
- ">": function(checkSet, part, isXML){
- var isPartStr = typeof part === "string";
-
- if ( isPartStr && !/\W/.test(part) ) {
- part = isXML ? part : part.toUpperCase();
-
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- var parent = elem.parentNode;
- checkSet[i] = parent.nodeName === part ? parent : false;
- }
- }
- } else {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- checkSet[i] = isPartStr ?
- elem.parentNode :
- elem.parentNode === part;
- }
- }
-
- if ( isPartStr ) {
- Sizzle.filter( part, checkSet, true );
- }
- }
- },
- "": function(checkSet, part, isXML){
- var doneName = done++, checkFn = dirCheck;
-
- if ( !/\W/.test(part) ) {
- var nodeCheck = part = isXML ? part : part.toUpperCase();
- checkFn = dirNodeCheck;
- }
-
- checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
- },
- "~": function(checkSet, part, isXML){
- var doneName = done++, checkFn = dirCheck;
-
- if ( typeof part === "string" && !/\W/.test(part) ) {
- var nodeCheck = part = isXML ? part : part.toUpperCase();
- checkFn = dirNodeCheck;
- }
-
- checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
- }
- },
- find: {
- ID: function(match, context, isXML){
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
- return m ? [m] : [];
- }
- },
- NAME: function(match, context, isXML){
- if ( typeof context.getElementsByName !== "undefined" ) {
- var ret = [], results = context.getElementsByName(match[1]);
-
- for ( var i = 0, l = results.length; i < l; i++ ) {
- if ( results[i].getAttribute("name") === match[1] ) {
- ret.push( results[i] );
- }
- }
-
- return ret.length === 0 ? null : ret;
- }
- },
- TAG: function(match, context){
- return context.getElementsByTagName(match[1]);
- }
- },
- preFilter: {
- CLASS: function(match, curLoop, inplace, result, not, isXML){
- match = " " + match[1].replace(/\\/g, "") + " ";
-
- if ( isXML ) {
- return match;
- }
-
- for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
- if ( elem ) {
- if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
- if ( !inplace )
- result.push( elem );
- } else if ( inplace ) {
- curLoop[i] = false;
- }
- }
- }
-
- return false;
- },
- ID: function(match){
- return match[1].replace(/\\/g, "");
- },
- TAG: function(match, curLoop){
- for ( var i = 0; curLoop[i] === false; i++ ){}
- return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
- },
- CHILD: function(match){
- if ( match[1] == "nth" ) {
- var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
- match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
- !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
- match[2] = (test[1] + (test[2] || 1)) - 0;
- match[3] = test[3] - 0;
- }
-
- match[0] = done++;
-
- return match;
- },
- ATTR: function(match, curLoop, inplace, result, not, isXML){
- var name = match[1].replace(/\\/g, "");
-
- if ( !isXML && Expr.attrMap[name] ) {
- match[1] = Expr.attrMap[name];
- }
-
- if ( match[2] === "~=" ) {
- match[4] = " " + match[4] + " ";
- }
-
- return match;
- },
- PSEUDO: function(match, curLoop, inplace, result, not){
- if ( match[1] === "not" ) {
- if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
- match[3] = Sizzle(match[3], null, null, curLoop);
- } else {
- var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
- if ( !inplace ) {
- result.push.apply( result, ret );
- }
- return false;
- }
- } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
- return true;
- }
-
- return match;
- },
- POS: function(match){
- match.unshift( true );
- return match;
- }
- },
- filters: {
- enabled: function(elem){
- return elem.disabled === false && elem.type !== "hidden";
- },
- disabled: function(elem){
- return elem.disabled === true;
- },
- checked: function(elem){
- return elem.checked === true;
- },
- selected: function(elem){
- elem.parentNode.selectedIndex;
- return elem.selected === true;
- },
- parent: function(elem){
- return !!elem.firstChild;
- },
- empty: function(elem){
- return !elem.firstChild;
- },
- has: function(elem, i, match){
- return !!Sizzle( match[3], elem ).length;
- },
- header: function(elem){
- return /h\d/i.test( elem.nodeName );
- },
- text: function(elem){
- return "text" === elem.type;
- },
- radio: function(elem){
- return "radio" === elem.type;
- },
- checkbox: function(elem){
- return "checkbox" === elem.type;
- },
- file: function(elem){
- return "file" === elem.type;
- },
- password: function(elem){
- return "password" === elem.type;
- },
- submit: function(elem){
- return "submit" === elem.type;
- },
- image: function(elem){
- return "image" === elem.type;
- },
- reset: function(elem){
- return "reset" === elem.type;
- },
- button: function(elem){
- return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
- },
- input: function(elem){
- return /input|select|textarea|button/i.test(elem.nodeName);
- }
- },
- setFilters: {
- first: function(elem, i){
- return i === 0;
- },
- last: function(elem, i, match, array){
- return i === array.length - 1;
- },
- even: function(elem, i){
- return i % 2 === 0;
- },
- odd: function(elem, i){
- return i % 2 === 1;
- },
- lt: function(elem, i, match){
- return i < match[3] - 0;
- },
- gt: function(elem, i, match){
- return i > match[3] - 0;
- },
- nth: function(elem, i, match){
- return match[3] - 0 == i;
- },
- eq: function(elem, i, match){
- return match[3] - 0 == i;
- }
- },
- filter: {
- PSEUDO: function(elem, match, i, array){
- var name = match[1], filter = Expr.filters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
- } else if ( name === "contains" ) {
- return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
- } else if ( name === "not" ) {
- var not = match[3];
-
- for ( var i = 0, l = not.length; i < l; i++ ) {
- if ( not[i] === elem ) {
- return false;
- }
- }
-
- return true;
- }
- },
- CHILD: function(elem, match){
- var type = match[1], node = elem;
- switch (type) {
- case 'only':
- case 'first':
- while ( (node = node.previousSibling) ) {
- if ( node.nodeType === 1 ) return false;
- }
- if ( type == 'first') return true;
- node = elem;
- case 'last':
- while ( (node = node.nextSibling) ) {
- if ( node.nodeType === 1 ) return false;
- }
- return true;
- case 'nth':
- var first = match[2], last = match[3];
-
- if ( first == 1 && last == 0 ) {
- return true;
- }
-
- var doneName = match[0],
- parent = elem.parentNode;
-
- if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
- var count = 0;
- for ( node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType === 1 ) {
- node.nodeIndex = ++count;
- }
- }
- parent.sizcache = doneName;
- }
-
- var diff = elem.nodeIndex - last;
- if ( first == 0 ) {
- return diff == 0;
- } else {
- return ( diff % first == 0 && diff / first >= 0 );
- }
- }
- },
- ID: function(elem, match){
- return elem.nodeType === 1 && elem.getAttribute("id") === match;
- },
- TAG: function(elem, match){
- return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
- },
- CLASS: function(elem, match){
- return (" " + (elem.className || elem.getAttribute("class")) + " ")
- .indexOf( match ) > -1;
- },
- ATTR: function(elem, match){
- var name = match[1],
- result = Expr.attrHandle[ name ] ?
- Expr.attrHandle[ name ]( elem ) :
- elem[ name ] != null ?
- elem[ name ] :
- elem.getAttribute( name ),
- value = result + "",
- type = match[2],
- check = match[4];
-
- return result == null ?
- type === "!=" :
- type === "=" ?
- value === check :
- type === "*=" ?
- value.indexOf(check) >= 0 :
- type === "~=" ?
- (" " + value + " ").indexOf(check) >= 0 :
- !check ?
- value && result !== false :
- type === "!=" ?
- value != check :
- type === "^=" ?
- value.indexOf(check) === 0 :
- type === "$=" ?
- value.substr(value.length - check.length) === check :
- type === "|=" ?
- value === check || value.substr(0, check.length + 1) === check + "-" :
- false;
- },
- POS: function(elem, match, i, array){
- var name = match[2], filter = Expr.setFilters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
- }
- }
- }
-};
-
-var origPOS = Expr.match.POS;
-
-for ( var type in Expr.match ) {
- Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
- Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source );
-}
-
-var makeArray = function(array, results) {
- array = Array.prototype.slice.call( array, 0 );
-
- if ( results ) {
- results.push.apply( results, array );
- return results;
- }
-
- return array;
-};
-
-try {
- Array.prototype.slice.call( document.documentElement.childNodes, 0 );
-
-} catch(e){
- makeArray = function(array, results) {
- var ret = results || [];
-
- if ( toString.call(array) === "[object Array]" ) {
- Array.prototype.push.apply( ret, array );
- } else {
- if ( typeof array.length === "number" ) {
- for ( var i = 0, l = array.length; i < l; i++ ) {
- ret.push( array[i] );
- }
- } else {
- for ( var i = 0; array[i]; i++ ) {
- ret.push( array[i] );
- }
- }
- }
-
- return ret;
- };
-}
-
-var sortOrder;
-
-if ( document.documentElement.compareDocumentPosition ) {
- sortOrder = function( a, b ) {
- if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
- if ( a == b ) {
- hasDuplicate = true;
- }
- return 0;
- }
-
- var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
- if ( ret === 0 ) {
- hasDuplicate = true;
- }
- return ret;
- };
-} else if ( "sourceIndex" in document.documentElement ) {
- sortOrder = function( a, b ) {
- if ( !a.sourceIndex || !b.sourceIndex ) {
- if ( a == b ) {
- hasDuplicate = true;
- }
- return 0;
- }
-
- var ret = a.sourceIndex - b.sourceIndex;
- if ( ret === 0 ) {
- hasDuplicate = true;
- }
- return ret;
- };
-} else if ( document.createRange ) {
- sortOrder = function( a, b ) {
- if ( !a.ownerDocument || !b.ownerDocument ) {
- if ( a == b ) {
- hasDuplicate = true;
- }
- return 0;
- }
-
- var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
- aRange.setStart(a, 0);
- aRange.setEnd(a, 0);
- bRange.setStart(b, 0);
- bRange.setEnd(b, 0);
- var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
- if ( ret === 0 ) {
- hasDuplicate = true;
- }
- return ret;
- };
-}
-
-(function(){
- var form = document.createElement("div"),
- id = "script" + (new Date).getTime();
- form.innerHTML = "<a name='" + id + "'/>";
-
- var root = document.documentElement;
- root.insertBefore( form, root.firstChild );
-
- if ( !!document.getElementById( id ) ) {
- Expr.find.ID = function(match, context, isXML){
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
- return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
- }
- };
-
- Expr.filter.ID = function(elem, match){
- var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
- return elem.nodeType === 1 && node && node.nodeValue === match;
- };
- }
-
- root.removeChild( form );
- root = form = null; // release memory in IE
-})();
-
-(function(){
-
- var div = document.createElement("div");
- div.appendChild( document.createComment("") );
-
- if ( div.getElementsByTagName("*").length > 0 ) {
- Expr.find.TAG = function(match, context){
- var results = context.getElementsByTagName(match[1]);
-
- if ( match[1] === "*" ) {
- var tmp = [];
-
- for ( var i = 0; results[i]; i++ ) {
- if ( results[i].nodeType === 1 ) {
- tmp.push( results[i] );
- }
- }
-
- results = tmp;
- }
-
- return results;
- };
- }
-
- div.innerHTML = "<a href='#'></a>";
- if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
- div.firstChild.getAttribute("href") !== "#" ) {
- Expr.attrHandle.href = function(elem){
- return elem.getAttribute("href", 2);
- };
- }
-
- div = null; // release memory in IE
-})();
-
-if ( document.querySelectorAll ) (function(){
- var oldSizzle = Sizzle, div = document.createElement("div");
- div.innerHTML = "<p class='TEST'></p>";
-
- if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
- return;
- }
-
- Sizzle = function(query, context, extra, seed){
- context = context || document;
-
- if ( !seed && context.nodeType === 9 && !isXML(context) ) {
- try {
- return makeArray( context.querySelectorAll(query), extra );
- } catch(e){}
- }
-
- return oldSizzle(query, context, extra, seed);
- };
-
- for ( var prop in oldSizzle ) {
- Sizzle[ prop ] = oldSizzle[ prop ];
- }
-
- div = null; // release memory in IE
-})();
-
-if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
- var div = document.createElement("div");
- div.innerHTML = "<div class='test e'></div><div class='test'></div>";
-
- if ( div.getElementsByClassName("e").length === 0 )
- return;
-
- div.lastChild.className = "e";
-
- if ( div.getElementsByClassName("e").length === 1 )
- return;
-
- Expr.order.splice(1, 0, "CLASS");
- Expr.find.CLASS = function(match, context, isXML) {
- if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
- return context.getElementsByClassName(match[1]);
- }
- };
-
- div = null; // release memory in IE
-})();
-
-function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- var sibDir = dir == "previousSibling" && !isXML;
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- if ( sibDir && elem.nodeType === 1 ){
- elem.sizcache = doneName;
- elem.sizset = i;
- }
- elem = elem[dir];
- var match = false;
-
- while ( elem ) {
- if ( elem.sizcache === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 && !isXML ){
- elem.sizcache = doneName;
- elem.sizset = i;
- }
-
- if ( elem.nodeName === cur ) {
- match = elem;
- break;
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- var sibDir = dir == "previousSibling" && !isXML;
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- if ( sibDir && elem.nodeType === 1 ) {
- elem.sizcache = doneName;
- elem.sizset = i;
- }
- elem = elem[dir];
- var match = false;
-
- while ( elem ) {
- if ( elem.sizcache === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 ) {
- if ( !isXML ) {
- elem.sizcache = doneName;
- elem.sizset = i;
- }
- if ( typeof cur !== "string" ) {
- if ( elem === cur ) {
- match = true;
- break;
- }
-
- } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
- match = elem;
- break;
- }
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-var contains = document.compareDocumentPosition ? function(a, b){
- return a.compareDocumentPosition(b) & 16;
-} : function(a, b){
- return a !== b && (a.contains ? a.contains(b) : true);
-};
-
-var isXML = function(elem){
- return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
- !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML";
-};
-
-var posProcess = function(selector, context){
- var tmpSet = [], later = "", match,
- root = context.nodeType ? [context] : context;
-
- while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
- later += match[0];
- selector = selector.replace( Expr.match.PSEUDO, "" );
- }
-
- selector = Expr.relative[selector] ? selector + "*" : selector;
-
- for ( var i = 0, l = root.length; i < l; i++ ) {
- Sizzle( selector, root[i], tmpSet );
- }
-
- return Sizzle.filter( later, tmpSet );
-};
-
-
-window.Sizzle = Sizzle;
-
-})();
-
-;(function(engine) {
- var extendElements = Prototype.Selector.extendElements;
-
- function select(selector, scope) {
- return extendElements(engine(selector, scope || document));
- }
-
- function match(element, selector) {
- return engine.matches(selector, [element]).length == 1;
- }
-
- Prototype.Selector.engine = engine;
- Prototype.Selector.select = select;
- Prototype.Selector.match = match;
-})(Sizzle);
-
-window.Sizzle = Prototype._original_property;
-delete Prototype._original_property;
-
-var Form = {
- reset: function(form) {
- form = $(form);
- form.reset();
- return form;
- },
-
- serializeElements: function(elements, options) {
- if (typeof options != 'object') options = { hash: !!options };
- else if (Object.isUndefined(options.hash)) options.hash = true;
- var key, value, submitted = false, submit = options.submit, accumulator, initial;
-
- if (options.hash) {
- initial = {};
- accumulator = function(result, key, value) {
- if (key in result) {
- if (!Object.isArray(result[key])) result[key] = [result[key]];
- result[key].push(value);
- } else result[key] = value;
- return result;
- };
- } else {
- initial = '';
- accumulator = function(result, key, value) {
- return result + (result ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value);
- };
- }
-
- return elements.inject(initial, function(result, element) {
- if (!element.disabled && element.name) {
- key = element.name; value = $(element).getValue();
- if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
- submit !== false && (!submit || key == submit) && (submitted = true)))) {
- result = accumulator(result, key, value);
- }
- }
- return result;
- });
- }
-};
-
-Form.Methods = {
- serialize: function(form, options) {
- return Form.serializeElements(Form.getElements(form), options);
- },
-
- getElements: function(form) {
- var elements = $(form).getElementsByTagName('*'),
- element,
- arr = [ ],
- serializers = Form.Element.Serializers;
- for (var i = 0; element = elements[i]; i++) {
- arr.push(element);
- }
- return arr.inject([], function(elements, child) {
- if (serializers[child.tagName.toLowerCase()])
- elements.push(Element.extend(child));
- return elements;
- });
- },
-
- getInputs: function(form, typeName, name) {
- form = $(form);
- var inputs = form.getElementsByTagName('input');
-
- if (!typeName && !name) return $A(inputs).map(Element.extend);
-
- for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
- var input = inputs[i];
- if ((typeName && input.type != typeName) || (name && input.name != name))
- continue;
- matchingInputs.push(Element.extend(input));
- }
-
- return matchingInputs;
- },
-
- disable: function(form) {
- form = $(form);
- Form.getElements(form).invoke('disable');
- return form;
- },
-
- enable: function(form) {
- form = $(form);
- Form.getElements(form).invoke('enable');
- return form;
- },
-
- findFirstElement: function(form) {
- var elements = $(form).getElements().findAll(function(element) {
- return 'hidden' != element.type && !element.disabled;
- });
- var firstByIndex = elements.findAll(function(element) {
- return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
- }).sortBy(function(element) { return element.tabIndex; }).first();
-
- return firstByIndex ? firstByIndex : elements.find(function(element) {
- return /^(?:input|select|textarea)$/i.test(element.tagName);
- });
- },
-
- focusFirstElement: function(form) {
- form = $(form);
- var element = form.findFirstElement();
- if (element) element.activate();
- return form;
- },
-
- request: function(form, options) {
- form = $(form), options = Object.clone(options || { });
-
- var params = options.parameters, action = form.readAttribute('action') || '';
- if (action.blank()) action = window.location.href;
- options.parameters = form.serialize(true);
-
- if (params) {
- if (Object.isString(params)) params = params.toQueryParams();
- Object.extend(options.parameters, params);
- }
-
- if (form.hasAttribute('method') && !options.method)
- options.method = form.method;
-
- return new Ajax.Request(action, options);
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-
-Form.Element = {
- focus: function(element) {
- $(element).focus();
- return element;
- },
-
- select: function(element) {
- $(element).select();
- return element;
- }
-};
-
-Form.Element.Methods = {
-
- serialize: function(element) {
- element = $(element);
- if (!element.disabled && element.name) {
- var value = element.getValue();
- if (value != undefined) {
- var pair = { };
- pair[element.name] = value;
- return Object.toQueryString(pair);
- }
- }
- return '';
- },
-
- getValue: function(element) {
- element = $(element);
- var method = element.tagName.toLowerCase();
- return Form.Element.Serializers[method](element);
- },
-
- setValue: function(element, value) {
- element = $(element);
- var method = element.tagName.toLowerCase();
- Form.Element.Serializers[method](element, value);
- return element;
- },
-
- clear: function(element) {
- $(element).value = '';
- return element;
- },
-
- present: function(element) {
- return $(element).value != '';
- },
-
- activate: function(element) {
- element = $(element);
- try {
- element.focus();
- if (element.select && (element.tagName.toLowerCase() != 'input' ||
- !(/^(?:button|reset|submit)$/i.test(element.type))))
- element.select();
- } catch (e) { }
- return element;
- },
-
- disable: function(element) {
- element = $(element);
- element.disabled = true;
- return element;
- },
-
- enable: function(element) {
- element = $(element);
- element.disabled = false;
- return element;
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-var Field = Form.Element;
-
-var $F = Form.Element.Methods.getValue;
-
-/*--------------------------------------------------------------------------*/
-
-Form.Element.Serializers = (function() {
- function input(element, value) {
- switch (element.type.toLowerCase()) {
- case 'checkbox':
- case 'radio':
- return inputSelector(element, value);
- default:
- return valueSelector(element, value);
- }
- }
-
- function inputSelector(element, value) {
- if (Object.isUndefined(value))
- return element.checked ? element.value : null;
- else element.checked = !!value;
- }
-
- function valueSelector(element, value) {
- if (Object.isUndefined(value)) return element.value;
- else element.value = value;
- }
-
- function select(element, value) {
- if (Object.isUndefined(value))
- return (element.type === 'select-one' ? selectOne : selectMany)(element);
-
- var opt, currentValue, single = !Object.isArray(value);
- for (var i = 0, length = element.length; i < length; i++) {
- opt = element.options[i];
- currentValue = this.optionValue(opt);
- if (single) {
- if (currentValue == value) {
- opt.selected = true;
- return;
- }
- }
- else opt.selected = value.include(currentValue);
- }
- }
-
- function selectOne(element) {
- var index = element.selectedIndex;
- return index >= 0 ? optionValue(element.options[index]) : null;
- }
-
- function selectMany(element) {
- var values, length = element.length;
- if (!length) return null;
-
- for (var i = 0, values = []; i < length; i++) {
- var opt = element.options[i];
- if (opt.selected) values.push(optionValue(opt));
- }
- return values;
- }
-
- function optionValue(opt) {
- return Element.hasAttribute(opt, 'value') ? opt.value : opt.text;
- }
-
- return {
- input: input,
- inputSelector: inputSelector,
- textarea: valueSelector,
- select: select,
- selectOne: selectOne,
- selectMany: selectMany,
- optionValue: optionValue,
- button: valueSelector
- };
-})();
-
-/*--------------------------------------------------------------------------*/
-
-
-Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
- initialize: function($super, element, frequency, callback) {
- $super(callback, frequency);
- this.element = $(element);
- this.lastValue = this.getValue();
- },
-
- execute: function() {
- var value = this.getValue();
- if (Object.isString(this.lastValue) && Object.isString(value) ?
- this.lastValue != value : String(this.lastValue) != String(value)) {
- this.callback(this.element, value);
- this.lastValue = value;
- }
- }
-});
-
-Form.Element.Observer = Class.create(Abstract.TimedObserver, {
- getValue: function() {
- return Form.Element.getValue(this.element);
- }
-});
-
-Form.Observer = Class.create(Abstract.TimedObserver, {
- getValue: function() {
- return Form.serialize(this.element);
- }
-});
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.EventObserver = Class.create({
- initialize: function(element, callback) {
- this.element = $(element);
- this.callback = callback;
-
- this.lastValue = this.getValue();
- if (this.element.tagName.toLowerCase() == 'form')
- this.registerFormCallbacks();
- else
- this.registerCallback(this.element);
- },
-
- onElementEvent: function() {
- var value = this.getValue();
- if (this.lastValue != value) {
- this.callback(this.element, value);
- this.lastValue = value;
- }
- },
-
- registerFormCallbacks: function() {
- Form.getElements(this.element).each(this.registerCallback, this);
- },
-
- registerCallback: function(element) {
- if (element.type) {
- switch (element.type.toLowerCase()) {
- case 'checkbox':
- case 'radio':
- Event.observe(element, 'click', this.onElementEvent.bind(this));
- break;
- default:
- Event.observe(element, 'change', this.onElementEvent.bind(this));
- break;
- }
- }
- }
-});
-
-Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
- getValue: function() {
- return Form.Element.getValue(this.element);
- }
-});
-
-Form.EventObserver = Class.create(Abstract.EventObserver, {
- getValue: function() {
- return Form.serialize(this.element);
- }
-});
-(function() {
-
- var Event = {
- KEY_BACKSPACE: 8,
- KEY_TAB: 9,
- KEY_RETURN: 13,
- KEY_ESC: 27,
- KEY_LEFT: 37,
- KEY_UP: 38,
- KEY_RIGHT: 39,
- KEY_DOWN: 40,
- KEY_DELETE: 46,
- KEY_HOME: 36,
- KEY_END: 35,
- KEY_PAGEUP: 33,
- KEY_PAGEDOWN: 34,
- KEY_INSERT: 45,
-
- cache: {}
- };
-
- var docEl = document.documentElement;
- var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl
- && 'onmouseleave' in docEl;
-
-
-
- var isIELegacyEvent = function(event) { return false; };
-
- if (window.attachEvent) {
- if (window.addEventListener) {
- isIELegacyEvent = function(event) {
- return !(event instanceof window.Event);
- };
- } else {
- isIELegacyEvent = function(event) { return true; };
- }
- }
-
- var _isButton;
-
- function _isButtonForDOMEvents(event, code) {
- return event.which ? (event.which === code + 1) : (event.button === code);
- }
-
- var legacyButtonMap = { 0: 1, 1: 4, 2: 2 };
- function _isButtonForLegacyEvents(event, code) {
- return event.button === legacyButtonMap[code];
- }
-
- function _isButtonForWebKit(event, code) {
- switch (code) {
- case 0: return event.which == 1 && !event.metaKey;
- case 1: return event.which == 2 || (event.which == 1 && event.metaKey);
- case 2: return event.which == 3;
- default: return false;
- }
- }
-
- if (window.attachEvent) {
- if (!window.addEventListener) {
- _isButton = _isButtonForLegacyEvents;
- } else {
- _isButton = function(event, code) {
- return isIELegacyEvent(event) ? _isButtonForLegacyEvents(event, code) :
- _isButtonForDOMEvents(event, code);
- };
- }
- } else if (Prototype.Browser.WebKit) {
- _isButton = _isButtonForWebKit;
- } else {
- _isButton = _isButtonForDOMEvents;
- }
-
- function isLeftClick(event) { return _isButton(event, 0); }
-
- function isMiddleClick(event) { return _isButton(event, 1); }
-
- function isRightClick(event) { return _isButton(event, 2); }
-
- function element(event) {
- event = Event.extend(event);
-
- var node = event.target, type = event.type,
- currentTarget = event.currentTarget;
-
- if (currentTarget && currentTarget.tagName) {
- if (type === 'load' || type === 'error' ||
- (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
- && currentTarget.type === 'radio'))
- node = currentTarget;
- }
-
- if (node.nodeType == Node.TEXT_NODE)
- node = node.parentNode;
-
- return Element.extend(node);
- }
-
- function findElement(event, expression) {
- var element = Event.element(event);
-
- if (!expression) return element;
- while (element) {
- if (Object.isElement(element) && Prototype.Selector.match(element, expression)) {
- return Element.extend(element);
- }
- element = element.parentNode;
- }
- }
-
- function pointer(event) {
- return { x: pointerX(event), y: pointerY(event) };
- }
-
- function pointerX(event) {
- var docElement = document.documentElement,
- body = document.body || { scrollLeft: 0 };
-
- return event.pageX || (event.clientX +
- (docElement.scrollLeft || body.scrollLeft) -
- (docElement.clientLeft || 0));
- }
-
- function pointerY(event) {
- var docElement = document.documentElement,
- body = document.body || { scrollTop: 0 };
-
- return event.pageY || (event.clientY +
- (docElement.scrollTop || body.scrollTop) -
- (docElement.clientTop || 0));
- }
-
- function stop(event) {
- Event.extend(event);
- event.preventDefault();
- event.stopPropagation();
-
- event.stopped = true;
- }
-
- Event.Methods = {
- isLeftClick: isLeftClick,
- isMiddleClick: isMiddleClick,
- isRightClick: isRightClick,
-
- element: element,
- findElement: findElement,
-
- pointer: pointer,
- pointerX: pointerX,
- pointerY: pointerY,
-
- stop: stop
- };
-
- var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
- m[name] = Event.Methods[name].methodize();
- return m;
- });
-
- if (window.attachEvent) {
- function _relatedTarget(event) {
- var element;
- switch (event.type) {
- case 'mouseover':
- case 'mouseenter':
- element = event.fromElement;
- break;
- case 'mouseout':
- case 'mouseleave':
- element = event.toElement;
- break;
- default:
- return null;
- }
- return Element.extend(element);
- }
-
- var additionalMethods = {
- stopPropagation: function() { this.cancelBubble = true; },
- preventDefault: function() { this.returnValue = false; },
- inspect: function() { return '[object Event]'; }
- };
-
- Event.extend = function(event, element) {
- if (!event) return false;
-
- if (!isIELegacyEvent(event)) return event;
-
- if (event._extendedByPrototype) return event;
- event._extendedByPrototype = Prototype.emptyFunction;
-
- var pointer = Event.pointer(event);
-
- Object.extend(event, {
- target: event.srcElement || element,
- relatedTarget: _relatedTarget(event),
- pageX: pointer.x,
- pageY: pointer.y
- });
-
- Object.extend(event, methods);
- Object.extend(event, additionalMethods);
-
- return event;
- };
- } else {
- Event.extend = Prototype.K;
- }
-
- if (window.addEventListener) {
- Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__;
- Object.extend(Event.prototype, methods);
- }
-
- function _createResponder(element, eventName, handler) {
- var registry = Element.retrieve(element, 'prototype_event_registry');
-
- if (Object.isUndefined(registry)) {
- CACHE.push(element);
- registry = Element.retrieve(element, 'prototype_event_registry', $H());
- }
-
- var respondersForEvent = registry.get(eventName);
- if (Object.isUndefined(respondersForEvent)) {
- respondersForEvent = [];
- registry.set(eventName, respondersForEvent);
- }
-
- if (respondersForEvent.pluck('handler').include(handler)) return false;
-
- var responder;
- if (eventName.include(":")) {
- responder = function(event) {
- if (Object.isUndefined(event.eventName))
- return false;
-
- if (event.eventName !== eventName)
- return false;
-
- Event.extend(event, element);
- handler.call(element, event);
- };
- } else {
- if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED &&
- (eventName === "mouseenter" || eventName === "mouseleave")) {
- if (eventName === "mouseenter" || eventName === "mouseleave") {
- responder = function(event) {
- Event.extend(event, element);
-
- var parent = event.relatedTarget;
- while (parent && parent !== element) {
- try { parent = parent.parentNode; }
- catch(e) { parent = element; }
- }
-
- if (parent === element) return;
-
- handler.call(element, event);
- };
- }
- } else {
- responder = function(event) {
- Event.extend(event, element);
- handler.call(element, event);
- };
- }
- }
-
- responder.handler = handler;
- respondersForEvent.push(responder);
- return responder;
- }
-
- function _destroyCache() {
- for (var i = 0, length = CACHE.length; i < length; i++) {
- Event.stopObserving(CACHE[i]);
- CACHE[i] = null;
- }
- }
-
- var CACHE = [];
-
- if (Prototype.Browser.IE)
- window.attachEvent('onunload', _destroyCache);
-
- if (Prototype.Browser.WebKit)
- window.addEventListener('unload', Prototype.emptyFunction, false);
-
-
- var _getDOMEventName = Prototype.K,
- translations = { mouseenter: "mouseover", mouseleave: "mouseout" };
-
- if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) {
- _getDOMEventName = function(eventName) {
- return (translations[eventName] || eventName);
- };
- }
-
- function observe(element, eventName, handler) {
- element = $(element);
-
- var responder = _createResponder(element, eventName, handler);
-
- if (!responder) return element;
-
- if (eventName.include(':')) {
- if (element.addEventListener)
- element.addEventListener("dataavailable", responder, false);
- else {
- element.attachEvent("ondataavailable", responder);
- element.attachEvent("onlosecapture", responder);
- }
- } else {
- var actualEventName = _getDOMEventName(eventName);
-
- if (element.addEventListener)
- element.addEventListener(actualEventName, responder, false);
- else
- element.attachEvent("on" + actualEventName, responder);
- }
-
- return element;
- }
-
- function stopObserving(element, eventName, handler) {
- element = $(element);
-
- var registry = Element.retrieve(element, 'prototype_event_registry');
- if (!registry) return element;
-
- if (!eventName) {
- registry.each( function(pair) {
- var eventName = pair.key;
- stopObserving(element, eventName);
- });
- return element;
- }
-
- var responders = registry.get(eventName);
- if (!responders) return element;
-
- if (!handler) {
- responders.each(function(r) {
- stopObserving(element, eventName, r.handler);
- });
- return element;
- }
-
- var i = responders.length, responder;
- while (i--) {
- if (responders[i].handler === handler) {
- responder = responders[i];
- break;
- }
- }
- if (!responder) return element;
-
- if (eventName.include(':')) {
- if (element.removeEventListener)
- element.removeEventListener("dataavailable", responder, false);
- else {
- element.detachEvent("ondataavailable", responder);
- element.detachEvent("onlosecapture", responder);
- }
- } else {
- var actualEventName = _getDOMEventName(eventName);
- if (element.removeEventListener)
- element.removeEventListener(actualEventName, responder, false);
- else
- element.detachEvent('on' + actualEventName, responder);
- }
-
- registry.set(eventName, responders.without(responder));
-
- return element;
- }
-
- function fire(element, eventName, memo, bubble) {
- element = $(element);
-
- if (Object.isUndefined(bubble))
- bubble = true;
-
- if (element == document && document.createEvent && !element.dispatchEvent)
- element = document.documentElement;
-
- var event;
- if (document.createEvent) {
- event = document.createEvent('HTMLEvents');
- event.initEvent('dataavailable', bubble, true);
- } else {
- event = document.createEventObject();
- event.eventType = bubble ? 'ondataavailable' : 'onlosecapture';
- }
-
- event.eventName = eventName;
- event.memo = memo || { };
-
- if (document.createEvent)
- element.dispatchEvent(event);
- else
- element.fireEvent(event.eventType, event);
-
- return Event.extend(event);
- }
-
- Event.Handler = Class.create({
- initialize: function(element, eventName, selector, callback) {
- this.element = $(element);
- this.eventName = eventName;
- this.selector = selector;
- this.callback = callback;
- this.handler = this.handleEvent.bind(this);
- },
-
- start: function() {
- Event.observe(this.element, this.eventName, this.handler);
- return this;
- },
-
- stop: function() {
- Event.stopObserving(this.element, this.eventName, this.handler);
- return this;
- },
-
- handleEvent: function(event) {
- var element = Event.findElement(event, this.selector);
- if (element) this.callback.call(this.element, event, element);
- }
- });
-
- function on(element, eventName, selector, callback) {
- element = $(element);
- if (Object.isFunction(selector) && Object.isUndefined(callback)) {
- callback = selector, selector = null;
- }
-
- return new Event.Handler(element, eventName, selector, callback).start();
- }
-
- Object.extend(Event, Event.Methods);
-
- Object.extend(Event, {
- fire: fire,
- observe: observe,
- stopObserving: stopObserving,
- on: on
- });
-
- Element.addMethods({
- fire: fire,
-
- observe: observe,
-
- stopObserving: stopObserving,
-
- on: on
- });
-
- Object.extend(document, {
- fire: fire.methodize(),
-
- observe: observe.methodize(),
-
- stopObserving: stopObserving.methodize(),
-
- on: on.methodize(),
-
- loaded: false
- });
-
- if (window.Event) Object.extend(window.Event, Event);
- else window.Event = Event;
-})();
-
-(function() {
- /* Support for the DOMContentLoaded event is based on work by Dan Webb,
- Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */
-
- var timer;
-
- function fireContentLoadedEvent() {
- if (document.loaded) return;
- if (timer) window.clearTimeout(timer);
- document.loaded = true;
- document.fire('dom:loaded');
- }
-
- function checkReadyState() {
- if (document.readyState === 'complete') {
- document.stopObserving('readystatechange', checkReadyState);
- fireContentLoadedEvent();
- }
- }
-
- function pollDoScroll() {
- try { document.documentElement.doScroll('left'); }
- catch(e) {
- timer = pollDoScroll.defer();
- return;
- }
- fireContentLoadedEvent();
- }
-
- if (document.addEventListener) {
- document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
- } else {
- document.observe('readystatechange', checkReadyState);
- if (window == top)
- timer = pollDoScroll.defer();
- }
-
- Event.observe(window, 'load', fireContentLoadedEvent);
-})();
-
-Element.addMethods();
-
-/*------------------------------- DEPRECATED -------------------------------*/
-
-Hash.toQueryString = Object.toQueryString;
-
-var Toggle = { display: Element.toggle };
-
-Element.Methods.childOf = Element.Methods.descendantOf;
-
-var Insertion = {
- Before: function(element, content) {
- return Element.insert(element, {before:content});
- },
-
- Top: function(element, content) {
- return Element.insert(element, {top:content});
- },
-
- Bottom: function(element, content) {
- return Element.insert(element, {bottom:content});
- },
-
- After: function(element, content) {
- return Element.insert(element, {after:content});
- }
-};
-
-var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
-
-var Position = {
- includeScrollOffsets: false,
-
- prepare: function() {
- this.deltaX = window.pageXOffset
- || document.documentElement.scrollLeft
- || document.body.scrollLeft
- || 0;
- this.deltaY = window.pageYOffset
- || document.documentElement.scrollTop
- || document.body.scrollTop
- || 0;
- },
-
- within: function(element, x, y) {
- if (this.includeScrollOffsets)
- return this.withinIncludingScrolloffsets(element, x, y);
- this.xcomp = x;
- this.ycomp = y;
- this.offset = Element.cumulativeOffset(element);
-
- return (y >= this.offset[1] &&
- y < this.offset[1] + element.offsetHeight &&
- x >= this.offset[0] &&
- x < this.offset[0] + element.offsetWidth);
- },
-
- withinIncludingScrolloffsets: function(element, x, y) {
- var offsetcache = Element.cumulativeScrollOffset(element);
-
- this.xcomp = x + offsetcache[0] - this.deltaX;
- this.ycomp = y + offsetcache[1] - this.deltaY;
- this.offset = Element.cumulativeOffset(element);
-
- return (this.ycomp >= this.offset[1] &&
- this.ycomp < this.offset[1] + element.offsetHeight &&
- this.xcomp >= this.offset[0] &&
- this.xcomp < this.offset[0] + element.offsetWidth);
- },
-
- overlap: function(mode, element) {
- if (!mode) return 0;
- if (mode == 'vertical')
- return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
- element.offsetHeight;
- if (mode == 'horizontal')
- return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
- element.offsetWidth;
- },
-
-
- cumulativeOffset: Element.Methods.cumulativeOffset,
-
- positionedOffset: Element.Methods.positionedOffset,
-
- absolutize: function(element) {
- Position.prepare();
- return Element.absolutize(element);
- },
-
- relativize: function(element) {
- Position.prepare();
- return Element.relativize(element);
- },
-
- realOffset: Element.Methods.cumulativeScrollOffset,
-
- offsetParent: Element.Methods.getOffsetParent,
-
- page: Element.Methods.viewportOffset,
-
- clone: function(source, target, options) {
- options = options || { };
- return Element.clonePosition(target, source, options);
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
- function iter(name) {
- return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
- }
-
- instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
- function(element, className) {
- className = className.toString().strip();
- var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
- return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
- } : function(element, className) {
- className = className.toString().strip();
- var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
- if (!classNames && !className) return elements;
-
- var nodes = $(element).getElementsByTagName('*');
- className = ' ' + className + ' ';
-
- for (var i = 0, child, cn; child = nodes[i]; i++) {
- if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
- (classNames && classNames.all(function(name) {
- return !name.toString().blank() && cn.include(' ' + name + ' ');
- }))))
- elements.push(Element.extend(child));
- }
- return elements;
- };
-
- return function(className, parentElement) {
- return $(parentElement || document.body).getElementsByClassName(className);
- };
-}(Element.Methods);
-
-/*--------------------------------------------------------------------------*/
-
-Element.ClassNames = Class.create();
-Element.ClassNames.prototype = {
- initialize: function(element) {
- this.element = $(element);
- },
-
- _each: function(iterator) {
- this.element.className.split(/\s+/).select(function(name) {
- return name.length > 0;
- })._each(iterator);
- },
-
- set: function(className) {
- this.element.className = className;
- },
-
- add: function(classNameToAdd) {
- if (this.include(classNameToAdd)) return;
- this.set($A(this).concat(classNameToAdd).join(' '));
- },
-
- remove: function(classNameToRemove) {
- if (!this.include(classNameToRemove)) return;
- this.set($A(this).without(classNameToRemove).join(' '));
- },
-
- toString: function() {
- return $A(this).join(' ');
- }
-};
-
-Object.extend(Element.ClassNames.prototype, Enumerable);
-
-/*--------------------------------------------------------------------------*/
-
-(function() {
- window.Selector = Class.create({
- initialize: function(expression) {
- this.expression = expression.strip();
- },
-
- findElements: function(rootElement) {
- return Prototype.Selector.select(this.expression, rootElement);
- },
-
- match: function(element) {
- return Prototype.Selector.match(element, this.expression);
- },
-
- toString: function() {
- return this.expression;
- },
-
- inspect: function() {
- return "#<Selector: " + this.expression + ">";
- }
- });
-
- Object.extend(Selector, {
- matchElements: function(elements, expression) {
- var match = Prototype.Selector.match,
- results = [];
-
- for (var i = 0, length = elements.length; i < length; i++) {
- var element = elements[i];
- if (match(element, expression)) {
- results.push(Element.extend(element));
- }
- }
- return results;
- },
-
- findElement: function(elements, expression, index) {
- index = index || 0;
- var matchIndex = 0, element;
- for (var i = 0, length = elements.length; i < length; i++) {
- element = elements[i];
- if (Prototype.Selector.match(element, expression) && index === matchIndex++) {
- return Element.extend(element);
- }
- }
- },
-
- findChildElements: function(element, expressions) {
- var selector = expressions.toArray().join(', ');
- return Prototype.Selector.select(selector, element || document);
- }
- });
-})();
diff --git a/src/usr/local/www/javascript/scriptaculous/scriptaculous.js b/src/usr/local/www/javascript/scriptaculous/scriptaculous.js
deleted file mode 100644
index 6bf437a..0000000
--- a/src/usr/local/www/javascript/scriptaculous/scriptaculous.js
+++ /dev/null
@@ -1,68 +0,0 @@
-// script.aculo.us scriptaculous.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
-
-// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-var Scriptaculous = {
- Version: '1.8.3',
- require: function(libraryName) {
- try{
- // inserting via DOM fails in Safari 2.0, so brute force approach
- document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>');
- } catch(e) {
- // for xhtml+xml served content, fall back to DOM methods
- var script = document.createElement('script');
- script.type = 'text/javascript';
- script.src = libraryName;
- document.getElementsByTagName('head')[0].appendChild(script);
- }
- },
- REQUIRED_PROTOTYPE: '1.6.0.3',
- load: function() {
- function convertVersionString(versionString) {
- var v = versionString.replace(/_.*|\./g, '');
- v = parseInt(v + '0'.times(4-v.length));
- return versionString.indexOf('_') > -1 ? v-1 : v;
- }
-
- if((typeof Prototype=='undefined') ||
- (typeof Element == 'undefined') ||
- (typeof Element.Methods=='undefined') ||
- (convertVersionString(Prototype.Version) <
- convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))
- throw("script.aculo.us requires the Prototype JavaScript framework >= " +
- Scriptaculous.REQUIRED_PROTOTYPE);
-
- var js = /scriptaculous\.js(\?.*)?$/;
- $$('head script[src]').findAll(function(s) {
- return s.src.match(js);
- }).each(function(s) {
- var path = s.src.replace(js, ''),
- includes = s.src.match(/\?.*load=([a-z,]*)/);
- (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each(
- function(include) { Scriptaculous.require(path+include+'.js') });
- });
- }
-};
-
-Scriptaculous.load(); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/slider.js b/src/usr/local/www/javascript/scriptaculous/slider.js
deleted file mode 100644
index 5fd0347..0000000
--- a/src/usr/local/www/javascript/scriptaculous/slider.js
+++ /dev/null
@@ -1,275 +0,0 @@
-// script.aculo.us slider.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
-
-// Copyright (c) 2005-2009 Marty Haught, Thomas Fuchs
-//
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-if (!Control) var Control = { };
-
-// options:
-// axis: 'vertical', or 'horizontal' (default)
-//
-// callbacks:
-// onChange(value)
-// onSlide(value)
-Control.Slider = Class.create({
- initialize: function(handle, track, options) {
- var slider = this;
-
- if (Object.isArray(handle)) {
- this.handles = handle.collect( function(e) { return $(e); });
- } else {
- this.handles = [$(handle)];
- }
-
- this.track = $(track);
- this.options = options || { };
-
- this.axis = this.options.axis || 'horizontal';
- this.increment = this.options.increment || 1;
- this.step = parseInt(this.options.step || '1');
- this.range = this.options.range || $R(0,1);
-
- this.value = 0; // assure backwards compat
- this.values = this.handles.map( function() { return 0; });
- this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s); }) : false;
- this.options.startSpan = $(this.options.startSpan || null);
- this.options.endSpan = $(this.options.endSpan || null);
-
- this.restricted = this.options.restricted || false;
-
- this.maximum = this.options.maximum || this.range.end;
- this.minimum = this.options.minimum || this.range.start;
-
- // Will be used to align the handle onto the track, if necessary
- this.alignX = parseInt(this.options.alignX || '0');
- this.alignY = parseInt(this.options.alignY || '0');
-
- this.trackLength = this.maximumOffset() - this.minimumOffset();
-
- this.handleLength = this.isVertical() ?
- (this.handles[0].offsetHeight != 0 ?
- this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
- (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
- this.handles[0].style.width.replace(/px$/,""));
-
- this.active = false;
- this.dragging = false;
- this.disabled = false;
-
- if (this.options.disabled) this.setDisabled();
-
- // Allowed values array
- this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
- if (this.allowedValues) {
- this.minimum = this.allowedValues.min();
- this.maximum = this.allowedValues.max();
- }
-
- this.eventMouseDown = this.startDrag.bindAsEventListener(this);
- this.eventMouseUp = this.endDrag.bindAsEventListener(this);
- this.eventMouseMove = this.update.bindAsEventListener(this);
-
- // Initialize handles in reverse (make sure first handle is active)
- this.handles.each( function(h,i) {
- i = slider.handles.length-1-i;
- slider.setValue(parseFloat(
- (Object.isArray(slider.options.sliderValue) ?
- slider.options.sliderValue[i] : slider.options.sliderValue) ||
- slider.range.start), i);
- h.makePositioned().observe("mousedown", slider.eventMouseDown);
- });
-
- this.track.observe("mousedown", this.eventMouseDown);
- document.observe("mouseup", this.eventMouseUp);
- document.observe("mousemove", this.eventMouseMove);
-
- this.initialized = true;
- },
- dispose: function() {
- var slider = this;
- Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
- Event.stopObserving(document, "mouseup", this.eventMouseUp);
- Event.stopObserving(document, "mousemove", this.eventMouseMove);
- this.handles.each( function(h) {
- Event.stopObserving(h, "mousedown", slider.eventMouseDown);
- });
- },
- setDisabled: function(){
- this.disabled = true;
- },
- setEnabled: function(){
- this.disabled = false;
- },
- getNearestValue: function(value){
- if (this.allowedValues){
- if (value >= this.allowedValues.max()) return(this.allowedValues.max());
- if (value <= this.allowedValues.min()) return(this.allowedValues.min());
-
- var offset = Math.abs(this.allowedValues[0] - value);
- var newValue = this.allowedValues[0];
- this.allowedValues.each( function(v) {
- var currentOffset = Math.abs(v - value);
- if (currentOffset <= offset){
- newValue = v;
- offset = currentOffset;
- }
- });
- return newValue;
- }
- if (value > this.range.end) return this.range.end;
- if (value < this.range.start) return this.range.start;
- return value;
- },
- setValue: function(sliderValue, handleIdx){
- if (!this.active) {
- this.activeHandleIdx = handleIdx || 0;
- this.activeHandle = this.handles[this.activeHandleIdx];
- this.updateStyles();
- }
- handleIdx = handleIdx || this.activeHandleIdx || 0;
- if (this.initialized && this.restricted) {
- if ((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
- sliderValue = this.values[handleIdx-1];
- if ((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
- sliderValue = this.values[handleIdx+1];
- }
- sliderValue = this.getNearestValue(sliderValue);
- this.values[handleIdx] = sliderValue;
- this.value = this.values[0]; // assure backwards compat
-
- this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
- this.translateToPx(sliderValue);
-
- this.drawSpans();
- if (!this.dragging || !this.event) this.updateFinished();
- },
- setValueBy: function(delta, handleIdx) {
- this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
- handleIdx || this.activeHandleIdx || 0);
- },
- translateToPx: function(value) {
- return Math.round(
- ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
- (value - this.range.start)) + "px";
- },
- translateToValue: function(offset) {
- return ((offset/(this.trackLength-this.handleLength) *
- (this.range.end-this.range.start)) + this.range.start);
- },
- getRange: function(range) {
- var v = this.values.sortBy(Prototype.K);
- range = range || 0;
- return $R(v[range],v[range+1]);
- },
- minimumOffset: function(){
- return(this.isVertical() ? this.alignY : this.alignX);
- },
- maximumOffset: function(){
- return(this.isVertical() ?
- (this.track.offsetHeight != 0 ? this.track.offsetHeight :
- this.track.style.height.replace(/px$/,"")) - this.alignY :
- (this.track.offsetWidth != 0 ? this.track.offsetWidth :
- this.track.style.width.replace(/px$/,"")) - this.alignX);
- },
- isVertical: function(){
- return (this.axis == 'vertical');
- },
- drawSpans: function() {
- var slider = this;
- if (this.spans)
- $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)); });
- if (this.options.startSpan)
- this.setSpan(this.options.startSpan,
- $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
- if (this.options.endSpan)
- this.setSpan(this.options.endSpan,
- $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
- },
- setSpan: function(span, range) {
- if (this.isVertical()) {
- span.style.top = this.translateToPx(range.start);
- span.style.height = this.translateToPx(range.end - range.start + this.range.start);
- } else {
- span.style.left = this.translateToPx(range.start);
- span.style.width = this.translateToPx(range.end - range.start + this.range.start);
- }
- },
- updateStyles: function() {
- this.handles.each( function(h){ Element.removeClassName(h, 'selected'); });
- Element.addClassName(this.activeHandle, 'selected');
- },
- startDrag: function(event) {
- if (Event.isLeftClick(event)) {
- if (!this.disabled){
- this.active = true;
-
- var handle = Event.element(event);
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var track = handle;
- if (track==this.track) {
- var offsets = this.track.cumulativeOffset();
- this.event = event;
- this.setValue(this.translateToValue(
- (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
- ));
- var offsets = this.activeHandle.cumulativeOffset();
- this.offsetX = (pointer[0] - offsets[0]);
- this.offsetY = (pointer[1] - offsets[1]);
- } else {
- // find the handle (prevents issues with Safari)
- while((this.handles.indexOf(handle) == -1) && handle.parentNode)
- handle = handle.parentNode;
-
- if (this.handles.indexOf(handle)!=-1) {
- this.activeHandle = handle;
- this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
- this.updateStyles();
-
- var offsets = this.activeHandle.cumulativeOffset();
- this.offsetX = (pointer[0] - offsets[0]);
- this.offsetY = (pointer[1] - offsets[1]);
- }
- }
- }
- Event.stop(event);
- }
- },
- update: function(event) {
- if (this.active) {
- if (!this.dragging) this.dragging = true;
- this.draw(event);
- if (Prototype.Browser.WebKit) window.scrollBy(0,0);
- Event.stop(event);
- }
- },
- draw: function(event) {
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var offsets = this.track.cumulativeOffset();
- pointer[0] -= this.offsetX + offsets[0];
- pointer[1] -= this.offsetY + offsets[1];
- this.event = event;
- this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
- if (this.initialized && this.options.onSlide)
- this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
- },
- endDrag: function(event) {
- if (this.active && this.dragging) {
- this.finishDrag(event, true);
- Event.stop(event);
- }
- this.active = false;
- this.dragging = false;
- },
- finishDrag: function(event, success) {
- this.active = false;
- this.dragging = false;
- this.updateFinished();
- },
- updateFinished: function() {
- if (this.initialized && this.options.onChange)
- this.options.onChange(this.values.length>1 ? this.values : this.value, this);
- this.event = null;
- }
-}); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/sound.js b/src/usr/local/www/javascript/scriptaculous/sound.js
deleted file mode 100644
index a3bf4cd..0000000
--- a/src/usr/local/www/javascript/scriptaculous/sound.js
+++ /dev/null
@@ -1,59 +0,0 @@
-// script.aculo.us sound.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
-
-// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Based on code created by Jules Gravinese (http://www.webveteran.com/)
-//
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-Sound = {
- tracks: {},
- _enabled: true,
- template:
- new Template('<embed style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>'),
- enable: function(){
- Sound._enabled = true;
- },
- disable: function(){
- Sound._enabled = false;
- },
- play: function(url){
- if(!Sound._enabled) return;
- var options = Object.extend({
- track: 'global', url: url, replace: false
- }, arguments[1] || {});
-
- if(options.replace && this.tracks[options.track]) {
- $R(0, this.tracks[options.track].id).each(function(id){
- var sound = $('sound_'+options.track+'_'+id);
- sound.Stop && sound.Stop();
- sound.remove();
- });
- this.tracks[options.track] = null;
- }
-
- if(!this.tracks[options.track])
- this.tracks[options.track] = { id: 0 };
- else
- this.tracks[options.track].id++;
-
- options.id = this.tracks[options.track].id;
- $$('body')[0].insert(
- Prototype.Browser.IE ? new Element('bgsound',{
- id: 'sound_'+options.track+'_'+options.id,
- src: options.url, loop: 1, autostart: true
- }) : Sound.template.evaluate(options));
- }
-};
-
-if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){
- if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1; }))
- Sound.template = new Template('<object id="sound_#{track}_#{id}" width="0" height="0" type="audio/mpeg" data="#{url}"/>');
- else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('Windows Media') != -1; }))
- Sound.template = new Template('<object id="sound_#{track}_#{id}" type="application/x-mplayer2" data="#{url}"></object>');
- else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('RealPlayer') != -1; }))
- Sound.template = new Template('<embed type="audio/x-pn-realaudio-plugin" style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>');
- else
- Sound.play = function(){};
-} \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/unittest.js b/src/usr/local/www/javascript/scriptaculous/unittest.js
deleted file mode 100644
index e18b08e..0000000
--- a/src/usr/local/www/javascript/scriptaculous/unittest.js
+++ /dev/null
@@ -1,568 +0,0 @@
-// script.aculo.us unittest.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
-
-// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// (c) 2005-2009 Jon Tirsen (http://www.tirsen.com)
-// (c) 2005-2009 Michael Schuerig (http://www.schuerig.de/michael/)
-//
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-// experimental, Firefox-only
-Event.simulateMouse = function(element, eventName) {
- var options = Object.extend({
- pointerX: 0,
- pointerY: 0,
- buttons: 0,
- ctrlKey: false,
- altKey: false,
- shiftKey: false,
- metaKey: false
- }, arguments[2] || {});
- var oEvent = document.createEvent("MouseEvents");
- oEvent.initMouseEvent(eventName, true, true, document.defaultView,
- options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
- options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element));
-
- if(this.mark) Element.remove(this.mark);
- this.mark = document.createElement('div');
- this.mark.appendChild(document.createTextNode(" "));
- document.body.appendChild(this.mark);
- this.mark.style.position = 'absolute';
- this.mark.style.top = options.pointerY + "px";
- this.mark.style.left = options.pointerX + "px";
- this.mark.style.width = "5px";
- this.mark.style.height = "5px;";
- this.mark.style.borderTop = "1px solid red;";
- this.mark.style.borderLeft = "1px solid red;";
-
- if(this.step)
- alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
-
- $(element).dispatchEvent(oEvent);
-};
-
-// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.
-// You need to downgrade to 1.0.4 for now to get this working
-// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much
-Event.simulateKey = function(element, eventName) {
- var options = Object.extend({
- ctrlKey: false,
- altKey: false,
- shiftKey: false,
- metaKey: false,
- keyCode: 0,
- charCode: 0
- }, arguments[2] || {});
-
- var oEvent = document.createEvent("KeyEvents");
- oEvent.initKeyEvent(eventName, true, true, window,
- options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
- options.keyCode, options.charCode );
- $(element).dispatchEvent(oEvent);
-};
-
-Event.simulateKeys = function(element, command) {
- for(var i=0; i<command.length; i++) {
- Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});
- }
-};
-
-var Test = {};
-Test.Unit = {};
-
-// security exception workaround
-Test.Unit.inspect = Object.inspect;
-
-Test.Unit.Logger = Class.create();
-Test.Unit.Logger.prototype = {
- initialize: function(log) {
- this.log = $(log);
- if (this.log) {
- this._createLogTable();
- }
- },
- start: function(testName) {
- if (!this.log) return;
- this.testName = testName;
- this.lastLogLine = document.createElement('tr');
- this.statusCell = document.createElement('td');
- this.nameCell = document.createElement('td');
- this.nameCell.className = "nameCell";
- this.nameCell.appendChild(document.createTextNode(testName));
- this.messageCell = document.createElement('td');
- this.lastLogLine.appendChild(this.statusCell);
- this.lastLogLine.appendChild(this.nameCell);
- this.lastLogLine.appendChild(this.messageCell);
- this.loglines.appendChild(this.lastLogLine);
- },
- finish: function(status, summary) {
- if (!this.log) return;
- this.lastLogLine.className = status;
- this.statusCell.innerHTML = status;
- this.messageCell.innerHTML = this._toHTML(summary);
- this.addLinksToResults();
- },
- message: function(message) {
- if (!this.log) return;
- this.messageCell.innerHTML = this._toHTML(message);
- },
- summary: function(summary) {
- if (!this.log) return;
- this.logsummary.innerHTML = this._toHTML(summary);
- },
- _createLogTable: function() {
- this.log.innerHTML =
- '<div id="logsummary"></div>' +
- '<table id="logtable">' +
- '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +
- '<tbody id="loglines"></tbody>' +
- '</table>';
- this.logsummary = $('logsummary');
- this.loglines = $('loglines');
- },
- _toHTML: function(txt) {
- return txt.escapeHTML().replace(/\n/g,"<br />");
- },
- addLinksToResults: function(){
- $$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log
- td.title = "Run only this test";
- Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;});
- });
- $$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log
- td.title = "Run all tests";
- Event.observe(td, 'click', function(){ window.location.search = "";});
- });
- }
-};
-
-Test.Unit.Runner = Class.create();
-Test.Unit.Runner.prototype = {
- initialize: function(testcases) {
- this.options = Object.extend({
- testLog: 'testlog'
- }, arguments[1] || {});
- this.options.resultsURL = this.parseResultsURLQueryParameter();
- this.options.tests = this.parseTestsQueryParameter();
- if (this.options.testLog) {
- this.options.testLog = $(this.options.testLog) || null;
- }
- if(this.options.tests) {
- this.tests = [];
- for(var i = 0; i < this.options.tests.length; i++) {
- if(/^test/.test(this.options.tests[i])) {
- this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));
- }
- }
- } else {
- if (this.options.test) {
- this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];
- } else {
- this.tests = [];
- for(var testcase in testcases) {
- if(/^test/.test(testcase)) {
- this.tests.push(
- new Test.Unit.Testcase(
- this.options.context ? ' -> ' + this.options.titles[testcase] : testcase,
- testcases[testcase], testcases["setup"], testcases["teardown"]
- ));
- }
- }
- }
- }
- this.currentTest = 0;
- this.logger = new Test.Unit.Logger(this.options.testLog);
- setTimeout(this.runTests.bind(this), 1000);
- },
- parseResultsURLQueryParameter: function() {
- return window.location.search.parseQuery()["resultsURL"];
- },
- parseTestsQueryParameter: function(){
- if (window.location.search.parseQuery()["tests"]){
- return window.location.search.parseQuery()["tests"].split(',');
- };
- },
- // Returns:
- // "ERROR" if there was an error,
- // "FAILURE" if there was a failure, or
- // "SUCCESS" if there was neither
- getResult: function() {
- var hasFailure = false;
- for(var i=0;i<this.tests.length;i++) {
- if (this.tests[i].errors > 0) {
- return "ERROR";
- }
- if (this.tests[i].failures > 0) {
- hasFailure = true;
- }
- }
- if (hasFailure) {
- return "FAILURE";
- } else {
- return "SUCCESS";
- }
- },
- postResults: function() {
- if (this.options.resultsURL) {
- new Ajax.Request(this.options.resultsURL,
- { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });
- }
- },
- runTests: function() {
- var test = this.tests[this.currentTest];
- if (!test) {
- // finished!
- this.postResults();
- this.logger.summary(this.summary());
- return;
- }
- if(!test.isWaiting) {
- this.logger.start(test.name);
- }
- test.run();
- if(test.isWaiting) {
- this.logger.message("Waiting for " + test.timeToWait + "ms");
- setTimeout(this.runTests.bind(this), test.timeToWait || 1000);
- } else {
- this.logger.finish(test.status(), test.summary());
- this.currentTest++;
- // tail recursive, hopefully the browser will skip the stackframe
- this.runTests();
- }
- },
- summary: function() {
- var assertions = 0;
- var failures = 0;
- var errors = 0;
- var messages = [];
- for(var i=0;i<this.tests.length;i++) {
- assertions += this.tests[i].assertions;
- failures += this.tests[i].failures;
- errors += this.tests[i].errors;
- }
- return (
- (this.options.context ? this.options.context + ': ': '') +
- this.tests.length + " tests, " +
- assertions + " assertions, " +
- failures + " failures, " +
- errors + " errors");
- }
-};
-
-Test.Unit.Assertions = Class.create();
-Test.Unit.Assertions.prototype = {
- initialize: function() {
- this.assertions = 0;
- this.failures = 0;
- this.errors = 0;
- this.messages = [];
- },
- summary: function() {
- return (
- this.assertions + " assertions, " +
- this.failures + " failures, " +
- this.errors + " errors" + "\n" +
- this.messages.join("\n"));
- },
- pass: function() {
- this.assertions++;
- },
- fail: function(message) {
- this.failures++;
- this.messages.push("Failure: " + message);
- },
- info: function(message) {
- this.messages.push("Info: " + message);
- },
- error: function(error) {
- this.errors++;
- this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
- },
- status: function() {
- if (this.failures > 0) return 'failed';
- if (this.errors > 0) return 'error';
- return 'passed';
- },
- assert: function(expression) {
- var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
- try { expression ? this.pass() :
- this.fail(message); }
- catch(e) { this.error(e); }
- },
- assertEqual: function(expected, actual) {
- var message = arguments[2] || "assertEqual";
- try { (expected == actual) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertInspect: function(expected, actual) {
- var message = arguments[2] || "assertInspect";
- try { (expected == actual.inspect()) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertEnumEqual: function(expected, actual) {
- var message = arguments[2] || "assertEnumEqual";
- try { $A(expected).length == $A(actual).length &&
- expected.zip(actual).all(function(pair) { return pair[0] == pair[1]; }) ?
- this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) +
- ', actual ' + Test.Unit.inspect(actual)); }
- catch(e) { this.error(e); }
- },
- assertNotEqual: function(expected, actual) {
- var message = arguments[2] || "assertNotEqual";
- try { (expected != actual) ? this.pass() :
- this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertIdentical: function(expected, actual) {
- var message = arguments[2] || "assertIdentical";
- try { (expected === actual) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertNotIdentical: function(expected, actual) {
- var message = arguments[2] || "assertNotIdentical";
- try { !(expected === actual) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertNull: function(obj) {
- var message = arguments[1] || 'assertNull';
- try { (obj==null) ? this.pass() :
- this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
- catch(e) { this.error(e); }
- },
- assertMatch: function(expected, actual) {
- var message = arguments[2] || 'assertMatch';
- var regex = new RegExp(expected);
- try { (regex.exec(actual)) ? this.pass() :
- this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertHidden: function(element) {
- var message = arguments[1] || 'assertHidden';
- this.assertEqual("none", element.style.display, message);
- },
- assertNotNull: function(object) {
- var message = arguments[1] || 'assertNotNull';
- this.assert(object != null, message);
- },
- assertType: function(expected, actual) {
- var message = arguments[2] || 'assertType';
- try {
- (actual.constructor == expected) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + (actual.constructor) + '"'); }
- catch(e) { this.error(e); }
- },
- assertNotOfType: function(expected, actual) {
- var message = arguments[2] || 'assertNotOfType';
- try {
- (actual.constructor != expected) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + (actual.constructor) + '"'); }
- catch(e) { this.error(e); }
- },
- assertInstanceOf: function(expected, actual) {
- var message = arguments[2] || 'assertInstanceOf';
- try {
- (actual instanceof expected) ? this.pass() :
- this.fail(message + ": object was not an instance of the expected type"); }
- catch(e) { this.error(e); }
- },
- assertNotInstanceOf: function(expected, actual) {
- var message = arguments[2] || 'assertNotInstanceOf';
- try {
- !(actual instanceof expected) ? this.pass() :
- this.fail(message + ": object was an instance of the not expected type"); }
- catch(e) { this.error(e); }
- },
- assertRespondsTo: function(method, obj) {
- var message = arguments[2] || 'assertRespondsTo';
- try {
- (obj[method] && typeof obj[method] == 'function') ? this.pass() :
- this.fail(message + ": object doesn't respond to [" + method + "]"); }
- catch(e) { this.error(e); }
- },
- assertReturnsTrue: function(method, obj) {
- var message = arguments[2] || 'assertReturnsTrue';
- try {
- var m = obj[method];
- if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
- m() ? this.pass() :
- this.fail(message + ": method returned false"); }
- catch(e) { this.error(e); }
- },
- assertReturnsFalse: function(method, obj) {
- var message = arguments[2] || 'assertReturnsFalse';
- try {
- var m = obj[method];
- if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
- !m() ? this.pass() :
- this.fail(message + ": method returned true"); }
- catch(e) { this.error(e); }
- },
- assertRaise: function(exceptionName, method) {
- var message = arguments[2] || 'assertRaise';
- try {
- method();
- this.fail(message + ": exception expected but none was raised"); }
- catch(e) {
- ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e);
- }
- },
- assertElementsMatch: function() {
- var expressions = $A(arguments), elements = $A(expressions.shift());
- if (elements.length != expressions.length) {
- this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
- return false;
- }
- elements.zip(expressions).all(function(pair, index) {
- var element = $(pair.first()), expression = pair.last();
- if (element.match(expression)) return true;
- this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
- }.bind(this)) && this.pass();
- },
- assertElementMatches: function(element, expression) {
- this.assertElementsMatch([element], expression);
- },
- benchmark: function(operation, iterations) {
- var startAt = new Date();
- (iterations || 1).times(operation);
- var timeTaken = ((new Date())-startAt);
- this.info((arguments[2] || 'Operation') + ' finished ' +
- iterations + ' iterations in ' + (timeTaken/1000)+'s' );
- return timeTaken;
- },
- _isVisible: function(element) {
- element = $(element);
- if(!element.parentNode) return true;
- this.assertNotNull(element);
- if(element.style && Element.getStyle(element, 'display') == 'none')
- return false;
-
- return this._isVisible(element.parentNode);
- },
- assertNotVisible: function(element) {
- this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));
- },
- assertVisible: function(element) {
- this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
- },
- benchmark: function(operation, iterations) {
- var startAt = new Date();
- (iterations || 1).times(operation);
- var timeTaken = ((new Date())-startAt);
- this.info((arguments[2] || 'Operation') + ' finished ' +
- iterations + ' iterations in ' + (timeTaken/1000)+'s' );
- return timeTaken;
- }
-};
-
-Test.Unit.Testcase = Class.create();
-Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {
- initialize: function(name, test, setup, teardown) {
- Test.Unit.Assertions.prototype.initialize.bind(this)();
- this.name = name;
-
- if(typeof test == 'string') {
- test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');
- test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');
- this.test = function() {
- eval('with(this){'+test+'}');
- };
- } else {
- this.test = test || function() {};
- }
-
- this.setup = setup || function() {};
- this.teardown = teardown || function() {};
- this.isWaiting = false;
- this.timeToWait = 1000;
- },
- wait: function(time, nextPart) {
- this.isWaiting = true;
- this.test = nextPart;
- this.timeToWait = time;
- },
- run: function() {
- try {
- try {
- if (!this.isWaiting) this.setup.bind(this)();
- this.isWaiting = false;
- this.test.bind(this)();
- } finally {
- if(!this.isWaiting) {
- this.teardown.bind(this)();
- }
- }
- }
- catch(e) { this.error(e); }
- }
-});
-
-// *EXPERIMENTAL* BDD-style testing to please non-technical folk
-// This draws many ideas from RSpec http://rspec.rubyforge.org/
-
-Test.setupBDDExtensionMethods = function(){
- var METHODMAP = {
- shouldEqual: 'assertEqual',
- shouldNotEqual: 'assertNotEqual',
- shouldEqualEnum: 'assertEnumEqual',
- shouldBeA: 'assertType',
- shouldNotBeA: 'assertNotOfType',
- shouldBeAn: 'assertType',
- shouldNotBeAn: 'assertNotOfType',
- shouldBeNull: 'assertNull',
- shouldNotBeNull: 'assertNotNull',
-
- shouldBe: 'assertReturnsTrue',
- shouldNotBe: 'assertReturnsFalse',
- shouldRespondTo: 'assertRespondsTo'
- };
- var makeAssertion = function(assertion, args, object) {
- this[assertion].apply(this,(args || []).concat([object]));
- };
-
- Test.BDDMethods = {};
- $H(METHODMAP).each(function(pair) {
- Test.BDDMethods[pair.key] = function() {
- var args = $A(arguments);
- var scope = args.shift();
- makeAssertion.apply(scope, [pair.value, args, this]); };
- });
-
- [Array.prototype, String.prototype, Number.prototype, Boolean.prototype].each(
- function(p){ Object.extend(p, Test.BDDMethods); }
- );
-};
-
-Test.context = function(name, spec, log){
- Test.setupBDDExtensionMethods();
-
- var compiledSpec = {};
- var titles = {};
- for(specName in spec) {
- switch(specName){
- case "setup":
- case "teardown":
- compiledSpec[specName] = spec[specName];
- break;
- default:
- var testName = 'test'+specName.gsub(/\s+/,'-').camelize();
- var body = spec[specName].toString().split('\n').slice(1);
- if(/^\{/.test(body[0])) body = body.slice(1);
- body.pop();
- body = body.map(function(statement){
- return statement.strip();
- });
- compiledSpec[testName] = body.join('\n');
- titles[testName] = specName;
- }
- }
- new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });
-}; \ No newline at end of file
diff --git a/src/usr/local/www/javascript/sorttable.js b/src/usr/local/www/javascript/sorttable.js
deleted file mode 100644
index f150e56..0000000
--- a/src/usr/local/www/javascript/sorttable.js
+++ /dev/null
@@ -1,584 +0,0 @@
-/*
- SortTable
- version 2
- 7th April 2007
- Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/
-
- Instructions:
- Download this file
- Add <script src="sorttable.js"></script> to your HTML
- Add class="sortable" to any table you'd like to make sortable
- Click on the headers to sort
-
- Thanks to many, many people for contributions and suggestions.
- Licenced as X11: http://www.kryogenix.org/code/browser/licence.html
- This basically means: do what you want with it.
-
- -- pfSense modifications --
- Allow for sorting of IP adresses
- 2012-09-15 Allow for multiple header rows, using "sortableHeaderRowIdentifier" class for the TR that has the column headers. (used in firewall-log)
- 2012-09-15 Allow sorting multiple dual/mutlti rows together, using sortablemultirow="2" attribute for the table
- 2012-09-15 Allow sorting of IP:Port texts, changed sort compare function
- 2012-11-05 Allow sorting of IP:Port and *:port texts toghether also AAA_23 AAA_123 in 'numeric order' (used in Diagnostics\Sockets column LOCAL)
-*/
-
-
-var stIsIE = /*@cc_on!@*/false;
-
-sorttable = {
- init: function() {
- // quit if this function has already been called
- if (arguments.callee.done) return;
- // flag this function so we don't do the same thing twice
- arguments.callee.done = true;
- // kill the timer
- if (_timer) clearInterval(_timer);
-
- if (!document.createElement || !document.getElementsByTagName) return;
-
- sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/;
-
- forEach(document.getElementsByTagName('table'), function(table) {
- if (table.className.search(/\bsortable\b/) != -1) {
- sorttable.makeSortable(table);
- }
- });
-
- },
-
- makeSortable: function(table) {
- if (table.getElementsByTagName('thead').length == 0) {
- // table doesn't have a tHead. Since it should have, create one and
- // put the first table row in it.
- the = document.createElement('thead');
- the.appendChild(table.rows[0]);
- table.insertBefore(the,table.firstChild);
- }
- // Safari doesn't support table.tHead, sigh
- if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0];
-
- headrow = undefined;
- if (table.tHead.rows.length == 1)
- headrow = table.tHead.rows[0].cells;
- else
- {
- //if multiple rows are found one must be marked with class <tr class="sortableHeaderRowIdentifier">
- for (var i=0; i<table.tHead.rows.length; i++) {
- if (table.tHead.rows[i].className.search(/\bsortableHeaderRowIdentifier\b/) != -1)
- {
- headrow = table.tHead.rows[i].cells;
- break;
- }
- }
- }
- if (headrow == undefined)
- return;
-
- if (table.getAttribute("sortableMultirow") != undefined)
- sortableMultirow = parseInt(table.getAttribute("sortableMultirow"));
- else
- sortableMultirow = 1;
-
- // Sorttable v1 put rows with a class of "sortbottom" at the bottom (as
- // "total" rows, for example). This is B&R, since what you're supposed
- // to do is put them in a tfoot. So, if there are sortbottom rows,
- // for backwards compatibility, move them to tfoot (creating it if needed).
- sortbottomrows = [];
- for (var i=0; i<table.rows.length; i++) {
- if (table.rows[i].className.search(/\bsortbottom\b/) != -1) {
- sortbottomrows[sortbottomrows.length] = table.rows[i];
- }
- }
- if (sortbottomrows) {
- if (table.tFoot == null) {
- // table doesn't have a tfoot. Create one.
- tfo = document.createElement('tfoot');
- table.appendChild(tfo);
- }
- for (var i=0; i<sortbottomrows.length; i++) {
- tfo.appendChild(sortbottomrows[i]);
- }
- delete sortbottomrows;
- }
-
- // work through each column and calculate its type
- for (var i=0; i<headrow.length; i++) {
- // manually override the type with a sorttable_type attribute
- if (!headrow[i].className.match(/\bsorttable_nosort\b/)) { // skip this col
- mtch = headrow[i].className.match(/\bsorttable_([a-z0-9]+)\b/);
- if (mtch) { override = mtch[1]; }
- if (mtch && typeof sorttable["sort_"+override] == 'function') {
- headrow[i].sorttable_sortfunction = sorttable["sort_"+override];
- } else {
- headrow[i].sorttable_sortfunction = sorttable.guessType(table,i, sortableMultirow);
- }
- // make it clickable to sort
- headrow[i].sorttable_columnindex = i;
- headrow[i].sorttable_tbody = table.tBodies[0];
- dean_addEvent(headrow[i],"click", function(e) {
-
- if (this.className.search(/\bsorttable_sorted\b/) != -1) {
- // if we're already sorted by this column, just
- // reverse the table, which is quicker
- sorttable.reverse(this.sorttable_tbody, sortableMultirow);
- this.className = this.className.replace('sorttable_sorted',
- 'sorttable_sorted_reverse');
- this.removeChild(document.getElementById('sorttable_sortfwdind'));
- sortrevind = document.createElement('span');
- sortrevind.id = "sorttable_sortrevind";
- sortrevind.innerHTML = stIsIE ? '&nbsp<font face="webdings">5</font>' : '&nbsp;&#x25B4;';
- this.appendChild(sortrevind);
- return;
- }
- if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) {
- // if we're already sorted by this column in reverse, just
- // re-reverse the table, which is quicker
- sorttable.reverse(this.sorttable_tbody, sortableMultirow);
- this.className = this.className.replace('sorttable_sorted_reverse',
- 'sorttable_sorted');
- this.removeChild(document.getElementById('sorttable_sortrevind'));
- sortfwdind = document.createElement('span');
- sortfwdind.id = "sorttable_sortfwdind";
- sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6</font>' : '&nbsp;&#x25BE;';
- this.appendChild(sortfwdind);
- return;
- }
-
- // remove sorttable_sorted classes
- theadrow = this.parentNode;
- forEach(theadrow.childNodes, function(cell) {
- if (cell.nodeType == 1) { // an element
- cell.className = cell.className.replace('sorttable_sorted_reverse','');
- cell.className = cell.className.replace('sorttable_sorted','');
- }
- });
- sortfwdind = document.getElementById('sorttable_sortfwdind');
- if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); }
- sortrevind = document.getElementById('sorttable_sortrevind');
- if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); }
-
- this.className += ' sorttable_sorted';
- sortfwdind = document.createElement('span');
- sortfwdind.id = "sorttable_sortfwdind";
- sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6</font>' : '&nbsp;&#x25BE;';
- this.appendChild(sortfwdind);
-
- // build an array to sort. This is a Schwartzian transform thing,
- // i.e., we "decorate" each row with the actual sort key,
- // sort based on the sort keys, and then put the rows back in order
- // which is a lot faster because you only do getInnerText once per row
- row_array = [];
- col = this.sorttable_columnindex;
- rows = this.sorttable_tbody.rows;
- for (var j=0; j<rows.length; j+=sortableMultirow) {
- row_array[row_array.length] = [sorttable.getInnerText(rows[j].cells[col]), rows[j]];
- for(var k=1; k < sortableMultirow;k++)
- {
- row_array[row_array.length-1][k+1]=rows[j+k];
- }
- }
- /* If you want a stable sort, uncomment the following line */
- //sorttable.shaker_sort(row_array, this.sorttable_sortfunction);
- /* and comment out this one */
- row_array.sort(this.sorttable_sortfunction);
-
- tb = this.sorttable_tbody;
- for (var j=0; j<row_array.length; j++) {
- for(var k=0; k<sortableMultirow; k++) {
- row = row_array[j][k+1];
- if (j % 2 == 0)
- row.className = row.className.replace(' listMReven',' listMRodd');
- else
- row.className = row.className.replace(' listMRodd',' listMReven');
-
- tb.appendChild(row);
- }
- }
-
- delete row_array;
- });
- }
- }
- },
-
- guessType: function(table, column, sortableMultirow) {
- // guess the type of a column based on its first non-blank row
- sortfn = sorttable.sort_alpha;
- for (var i=0; i<table.tBodies[0].rows.length; i+=sortableMultirow) {
- text = sorttable.getInnerText(table.tBodies[0].rows[i].cells[column]);
- if (text != '') {
- if (text.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\:[0-9]{1,5})?\b/)) {
- return sorttable.sort_ipaddr;
- }
- if (text.match(/^-?[£$¤]?[\d,.]+%?$/)) {
- return sorttable.sort_numeric;
- }
- // check for a date: dd/mm/yyyy or dd/mm/yy
- // can have / or . or - as separator
- // can be mm/dd as well
- possdate = text.match(sorttable.DATE_RE);
- if (possdate) {
- // looks like a date
- first = parseInt(possdate[1]);
- second = parseInt(possdate[2]);
- if (first > 12) {
- // definitely dd/mm
- return sorttable.sort_ddmm;
- } else if (second > 12) {
- return sorttable.sort_mmdd;
- } else {
- // looks like a date, but we can't tell which, so assume
- // that it's dd/mm (English imperialism!) and keep looking
- sortfn = sorttable.sort_ddmm;
- }
- }
- }
- }
- return sortfn;
- },
-
- getInnerText: function(node) {
- // gets the text we want to use for sorting for a cell.
- // strips leading and trailing whitespace.
- // this is *not* a generic getInnerText function; it's special to sorttable.
- // for example, you can override the cell text with a customkey attribute.
- // it also gets .value for <input> fields.
-
- hasInputs = (typeof node.getElementsByTagName == 'function') &&
- node.getElementsByTagName('input').length;
-
- if (node.getAttribute("sorttable_customkey") != null) {
- return node.getAttribute("sorttable_customkey");
- }
- else if (typeof node.textContent != 'undefined' && !hasInputs) {
- return node.textContent.replace(/^\s+|\s+$/g, '');
- }
- else if (typeof node.innerText != 'undefined' && !hasInputs) {
- return node.innerText.replace(/^\s+|\s+$/g, '');
- }
- else if (typeof node.text != 'undefined' && !hasInputs) {
- return node.text.replace(/^\s+|\s+$/g, '');
- }
- else {
- switch (node.nodeType) {
- case 3:
- if (node.nodeName.toLowerCase() == 'input') {
- return node.value.replace(/^\s+|\s+$/g, '');
- }
- case 4:
- return node.nodeValue.replace(/^\s+|\s+$/g, '');
- break;
- case 1:
- case 11:
- var innerText = '';
- for (var i = 0; i < node.childNodes.length; i++) {
- innerText += sorttable.getInnerText(node.childNodes[i]);
- }
- return innerText.replace(/^\s+|\s+$/g, '');
- break;
- default:
- return '';
- }
- }
- },
-
- reverse: function(tbody, sortableMultirow) {
- // reverse the rows in a tbody
- newrows = [];
- for (var i=0; i<tbody.rows.length; i++) {
- newrows[newrows.length] = tbody.rows[i];
- }
- for (var i=newrows.length-1; i>=0; i-=sortableMultirow) {
- for(var j=sortableMultirow-1;j>=0;j--)
- {
- tbody.appendChild(newrows[i-j]);
- }
- }
- delete newrows;
- },
-
- /* sort functions
- each sort function takes two parameters, a and b
- you are comparing a[0] and b[0] */
- sort_numeric: function(a,b) {
- aa = parseFloat(a[0].replace(/[^0-9.-]/g,''));
- if (isNaN(aa)) aa = 0;
- bb = parseFloat(b[0].replace(/[^0-9.-]/g,''));
- if (isNaN(bb)) bb = 0;
- return aa-bb;
- },
- sort_alpha: function(a,b) {
- if (a[0]==b[0]) return 0;
- if (a[0]<b[0]) return -1;
- return 1;
- },
- sort_ddmm: function(a,b) {
- mtch = a[0].match(sorttable.DATE_RE);
- y = mtch[3]; m = mtch[2]; d = mtch[1];
- if (m.length == 1) m = '0'+m;
- if (d.length == 1) d = '0'+d;
- dt1 = y+m+d;
- mtch = b[0].match(sorttable.DATE_RE);
- y = mtch[3]; m = mtch[2]; d = mtch[1];
- if (m.length == 1) m = '0'+m;
- if (d.length == 1) d = '0'+d;
- dt2 = y+m+d;
- if (dt1==dt2) return 0;
- if (dt1<dt2) return -1;
- return 1;
- },
- sort_mmdd: function(a,b) {
- mtch = a[0].match(sorttable.DATE_RE);
- y = mtch[3]; d = mtch[2]; m = mtch[1];
- if (m.length == 1) m = '0'+m;
- if (d.length == 1) d = '0'+d;
- dt1 = y+m+d;
- mtch = b[0].match(sorttable.DATE_RE);
- y = mtch[3]; d = mtch[2]; m = mtch[1];
- if (m.length == 1) m = '0'+m;
- if (d.length == 1) d = '0'+d;
- dt2 = y+m+d;
- if (dt1==dt2) return 0;
- if (dt1<dt2) return -1;
- return 1;
- },
- sortWithNumber: function(a,b) {
- amatch = a[0].match(/.*?(?=[0-9])/);
- bmatch = b[0].match(/.*?(?=[0-9])/);
- if (amatch && bmatch && amatch[0] == bmatch[0])
- {
- anumber = a[0].substring(amatch.length+1);
- bnumber = b[0].substring(bmatch.length+1);
- a2match = parseInt(anumber.match(/[0-9]*/));
- b2match = parseInt(bnumber.match(/[0-9]*/));
- if (a2match > b2match) return 1;
- if (a2match < b2match) return -1;
- }
- if (a[0] == b[0]) return 0;
- if (a[0] < b[0]) return -1;
- return 1;
- },
- sort_ipaddr: function(a,b) {
- aip = ip2ulong(a[0]);
- bip = ip2ulong(b[0]);
- if (aip && bip)
- {
- if (aip == bip) return 0;
- if (aip < bip) return -1;
- return 1;
- } else {
- if (aip !== false || bip !== false)
- return aip === false ? -1 : 1;
- else
- {
- return sorttable.sortWithNumber(a,b);
- }
- }
- },
-
- shaker_sort: function(list, comp_func) {
- // A stable sort function to allow multi-level sorting of data
- // see: http://en.wikipedia.org/wiki/Cocktail_sort
- // thanks to Joseph Nahmias
- var b = 0;
- var t = list.length - 1;
- var swap = true;
-
- while(swap) {
- swap = false;
- for(var i = b; i < t; ++i) {
- if ( comp_func(list[i], list[i+1]) > 0 ) {
- var q = list[i]; list[i] = list[i+1]; list[i+1] = q;
- swap = true;
- }
- } // for
- t--;
-
- if (!swap) break;
-
- for(var i = t; i > b; --i) {
- if ( comp_func(list[i], list[i-1]) < 0 ) {
- var q = list[i]; list[i] = list[i-1]; list[i-1] = q;
- swap = true;
- }
- } // for
- b++;
-
- } // while(swap)
- }
-};
-
-/* ******************************************************************
- Supporting functions: bundled here to avoid depending on a library
- ****************************************************************** */
-
-function ip2ulong(ip) {
- ip += "";
- var ulip = false;
- var octets = [];
- ipportmatch = ip.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:[0-9]{1,5}\b/);// IP:port
- if (ipportmatch) {
- ipportmatch += "";
- ipport = ipportmatch.split(':');
- octets = ipport[0].split('.');
- for (i=0; i < 4; i++) {
- ulip += octets[i] * Math.pow(256, (5-i));
- }
- ulip += parseInt(ipport[1]);
- } else {
- ipmatch = ip.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/);// IP only
- if (ipmatch) {
- ipmatch+="";
- octets = ipmatch.split('.');
- for (i=0; i < 4; i++) {
- ulip += octets[i] * Math.pow(256, (5-i));
- }
- }
- }
- return ulip;
-}
-
-// Dean Edwards/Matthias Miller/John Resig
-
-/* for Mozilla/Opera9 */
-if (document.addEventListener) {
- document.addEventListener("DOMContentLoaded", sorttable.init, false);
-}
-
-/* for Safari */
-if (/WebKit/i.test(navigator.userAgent)) { // sniff
- var _timer = setInterval(function() {
- if (/loaded|complete/.test(document.readyState)) {
- sorttable.init(); // call the onload handler
- }
- }, 10);
-}
-
-/* for other browsers */
-window.onload = sorttable.init;
-
-// written by Dean Edwards, 2005
-// with input from Tino Zijdel, Matthias Miller, Diego Perini
-
-// http://dean.edwards.name/weblog/2005/10/add-event/
-
-function dean_addEvent(element, type, handler) {
- if (element.addEventListener) {
- element.addEventListener(type, handler, false);
- } else {
- // assign each event handler a unique ID
- if (!handler.$$guid) handler.$$guid = dean_addEvent.guid++;
- // create a hash table of event types for the element
- if (!element.events) element.events = {};
- // create a hash table of event handlers for each element/event pair
- var handlers = element.events[type];
- if (!handlers) {
- handlers = element.events[type] = {};
- // store the existing event handler (if there is one)
- if (element["on" + type]) {
- handlers[0] = element["on" + type];
- }
- }
- // store the event handler in the hash table
- handlers[handler.$$guid] = handler;
- // assign a global event handler to do all the work
- element["on" + type] = handleEvent;
- }
-};
-// a counter used to create unique IDs
-dean_addEvent.guid = 1;
-
-function removeEvent(element, type, handler) {
- if (element.removeEventListener) {
- element.removeEventListener(type, handler, false);
- } else {
- // delete the event handler from the hash table
- if (element.events && element.events[type]) {
- delete element.events[type][handler.$$guid];
- }
- }
-};
-
-function handleEvent(event) {
- var returnValue = true;
- // grab the event object (IE uses a global event object)
- event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
- // get a reference to the hash table of event handlers
- var handlers = this.events[event.type];
- // execute each event handler
- for (var i in handlers) {
- this.$$handleEvent = handlers[i];
- if (this.$$handleEvent(event) === false) {
- returnValue = false;
- }
- }
- return returnValue;
-};
-
-function fixEvent(event) {
- // add W3C standard event methods
- event.preventDefault = fixEvent.preventDefault;
- event.stopPropagation = fixEvent.stopPropagation;
- return event;
-};
-fixEvent.preventDefault = function() {
- this.returnValue = false;
-};
-fixEvent.stopPropagation = function() {
- this.cancelBubble = true;
-};
-
-// Dean's forEach: http://dean.edwards.name/base/forEach.js
-/*
- forEach, version 1.0
- Copyright 2006, Dean Edwards
- License: http://www.opensource.org/licenses/mit-license.php
-*/
-
-// array-like enumeration
-if (!Array.forEach) { // mozilla already supports this
- Array.forEach = function(array, block, context) {
- for (var i = 0; i < array.length; i++) {
- block.call(context, array[i], i, array);
- }
- };
-}
-
-// generic enumeration
-Function.prototype.forEach = function(object, block, context) {
- for (var key in object) {
- if (typeof this.prototype[key] == "undefined") {
- block.call(context, object[key], key, object);
- }
- }
-};
-
-// character enumeration
-String.forEach = function(string, block, context) {
- Array.forEach(string.split(""), function(chr, index) {
- block.call(context, chr, index, string);
- });
-};
-
-// globally resolve forEach enumeration
-var forEach = function(object, block, context) {
- if (object) {
- var resolve = Object; // default
- if (object instanceof Function) {
- // functions have a "length" property
- resolve = Function;
- } else if (object.forEach instanceof Function) {
- // the object implements a custom forEach method so use that
- object.forEach(block, context);
- return;
- } else if (typeof object == "string") {
- // the object is a string
- resolve = String;
- } else if (typeof object.length == "number") {
- // the object is array-like
- resolve = Array;
- }
- resolve.forEach(object, block, context);
- }
-};
-
diff --git a/src/usr/local/www/javascript/suggestions.js b/src/usr/local/www/javascript/suggestions.js
deleted file mode 100644
index 682a352..0000000
--- a/src/usr/local/www/javascript/suggestions.js
+++ /dev/null
@@ -1,33 +0,0 @@
-
-/**
- * Provides suggestions for state names (USA).
- * @class
- * @scope public
- */
-function StateSuggestions(text) {
- this.states = text;
-}
-
-/**
- * Request suggestions for the given autosuggest control.
- * @scope protected
- * @param oAutoSuggestControl The autosuggest control to provide suggestions for.
- */
-StateSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:AutoSuggestControl*/,
- bTypeAhead /*:boolean*/) {
- var aSuggestions = [];
- var sTextboxValue = oAutoSuggestControl.textbox.value;
-
- if (sTextboxValue.length > 0){
-
- //search for matching states
- for (var i=0; i < this.states.length; i++) {
- if (this.states[i].toLowerCase().indexOf(sTextboxValue.toLowerCase()) == 0) {
- aSuggestions.push(this.states[i]);
- }
- }
- }
-
- //provide suggestions to the control
- oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead);
-};
diff --git a/src/usr/local/www/javascript/ticker.js b/src/usr/local/www/javascript/ticker.js
deleted file mode 100644
index defb1d8..0000000
--- a/src/usr/local/www/javascript/ticker.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id$ */
-/*
- ticker.js
- Copyright (C) 2012 Marcello Coutinho
- Copyright (C) 2012 Carlos Cesario - carloscesario@gmail.com
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
- pfSense_MODULE: utils
-
-*/
-function notice_action(action,msgid) {
- jQuery.ajax({
- type: 'post',
- cache: false,
- url: 'index.php',
- data: {closenotice: msgid},
- success: function(response) {
- jQuery('#menu_messages').html(response);
- }
- });
-}
-
-function pulsateText(elem) {
- jQuery(elem).effect("pulsate", { times:12 }, 500);
- jQuery(elem).effect("pulsate", { times:6 }, 1500);
- jQuery(elem).effect("pulsate", { times:3 }, 2500);
-}
-
-jQuery(document).ready(function() {
- pulsateText('#marquee-text');
- jQuery('#marquee-text a').hover(function () {
- jQuery(this).css('cursor','pointer');
- });
-});
-
-function alias_popup(alias_id,theme,loading) {
- domTT_update('ttalias_'+alias_id,"<a><img src='/themes/"+theme+"/images/misc/loader.gif'>"+loading+"</a>");
- jQuery.ajax({
- type: 'post',
- cache: false,
- url: "/index.php",
- data: {aliasid:alias_id, act:'alias_info_popup'},
- success: function(response) {
- //alert('<div>'+response.match(/<h1>.*<\/table>/i)+'<div>');
- domTT_update('ttalias_'+alias_id,'<div>'+response.match(/<h1>.*<\/table>/i)+'<div>');
- }
- });
-} \ No newline at end of file
diff --git a/src/usr/local/www/javascript/wizard/autosuggest.js b/src/usr/local/www/javascript/wizard/autosuggest.js
deleted file mode 100644
index d9b5ac0..0000000
--- a/src/usr/local/www/javascript/wizard/autosuggest.js
+++ /dev/null
@@ -1,337 +0,0 @@
-
-/**
- * An autosuggest textbox control.
- * @class
- * @scope public
- */
-function AutoSuggestControl(oTextbox /*:HTMLInputElement*/,
- oProvider /*:SuggestionProvider*/) {
-
- /**
- * The currently selected suggestions.
- * @scope private
- */
- this.cur /*:int*/ = -1;
-
- /**
- * The dropdown list layer.
- * @scope private
- */
- this.layer = null;
-
- /**
- * Suggestion provider for the autosuggest feature.
- * @scope private.
- */
- this.provider /*:SuggestionProvider*/ = oProvider;
-
- /**
- * The textbox to capture.
- * @scope private
- */
- this.textbox /*:HTMLInputElement*/ = oTextbox;
-
- //initialize the control
- this.init();
-
-}
-
-/**
- * Autosuggests one or more suggestions for what the user has typed.
- * If no suggestions are passed in, then no autosuggest occurs.
- * @scope private
- * @param aSuggestions An array of suggestion strings.
- * @param bTypeAhead If the control should provide a type ahead suggestion.
- */
-AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/,
- bTypeAhead /*:boolean*/) {
-
- //make sure there's at least one suggestion
- if (aSuggestions.length > 0) {
- if (bTypeAhead) {
- this.typeAhead(aSuggestions[0]);
- }
-
- this.showSuggestions(aSuggestions);
- } else {
- this.hideSuggestions();
- }
-};
-
-/**
- * Creates the dropdown layer to display multiple suggestions.
- * @scope private
- */
-AutoSuggestControl.prototype.createDropDown = function () {
-
- var oThis = this;
-
- //create the layer and assign styles
- this.layer = document.createElement("div");
- this.layer.className = "suggestions";
- this.layer.style.visibility = "hidden";
- this.layer.style.width = this.textbox.offsetWidth;
-
- //when the user clicks on the a suggestion, get the text (innerHTML)
- //and place it into a textbox
- this.layer.onmousedown =
- this.layer.onmouseup =
- this.layer.onmouseover = function (oEvent) {
- oEvent = oEvent || window.event;
- oTarget = oEvent.target || oEvent.srcElement;
-
- if (oEvent.type == "mousedown") {
- oThis.textbox.value = oTarget.firstChild.nodeValue;
- oThis.hideSuggestions();
- } else if (oEvent.type == "mouseover") {
- oThis.highlightSuggestion(oTarget);
- } else {
- oThis.textbox.focus();
- }
- };
-
-
- document.body.appendChild(this.layer);
-};
-
-/**
- * Gets the left coordinate of the textbox.
- * @scope private
- * @return The left coordinate of the textbox in pixels.
- */
-AutoSuggestControl.prototype.getLeft = function () /*:int*/ {
-
- var oNode = this.textbox;
- var iLeft = 0;
-
- while(oNode.tagName != "BODY") {
- iLeft += oNode.offsetLeft;
- oNode = oNode.offsetParent;
- }
-
- return iLeft;
-};
-
-/**
- * Gets the top coordinate of the textbox.
- * @scope private
- * @return The top coordinate of the textbox in pixels.
- */
-AutoSuggestControl.prototype.getTop = function () /*:int*/ {
-
- var oNode = this.textbox;
- var iTop = 0;
-
- while(oNode.tagName != "BODY") {
- iTop += oNode.offsetTop;
- oNode = oNode.offsetParent;
- }
-
- return iTop;
-};
-
-/**
- * Handles three keydown events.
- * @scope private
- * @param oEvent The event object for the keydown event.
- */
-AutoSuggestControl.prototype.handleKeyDown = function (oEvent /*:Event*/) {
-
- switch(oEvent.keyCode) {
- case 38: //up arrow
- this.previousSuggestion();
- break;
- case 40: //down arrow
- this.nextSuggestion();
- break;
- case 13: //enter
- this.hideSuggestions();
- break;
- }
-
-};
-
-/**
- * Handles keyup events.
- * @scope private
- * @param oEvent The event object for the keyup event.
- */
-AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) {
-
- var iKeyCode = oEvent.keyCode;
-
- //for backspace (8) and delete (46), shows suggestions without typeahead
- if (iKeyCode == 8 || iKeyCode == 46) {
- this.provider.requestSuggestions(this, false);
-
- //make sure not to interfere with non-character keys
- } else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) {
- //ignore
- } else {
- //request suggestions from the suggestion provider with typeahead
- this.provider.requestSuggestions(this, true);
- }
-};
-
-/**
- * Hides the suggestion dropdown.
- * @scope private
- */
-AutoSuggestControl.prototype.hideSuggestions = function () {
- this.layer.style.visibility = "hidden";
-};
-
-/**
- * Highlights the given node in the suggestions dropdown.
- * @scope private
- * @param oSuggestionNode The node representing a suggestion in the dropdown.
- */
-AutoSuggestControl.prototype.highlightSuggestion = function (oSuggestionNode) {
-
- for (var i=0; i < this.layer.childNodes.length; i++) {
- var oNode = this.layer.childNodes[i];
- if (oNode == oSuggestionNode) {
- oNode.className = "current";
- } else if (oNode.className == "current") {
- oNode.className = "";
- }
- }
-};
-
-/**
- * Initializes the textbox with event handlers for
- * auto suggest functionality.
- * @scope private
- */
-AutoSuggestControl.prototype.init = function () {
-
- //save a reference to this object
- var oThis = this;
-
- //assign the onkeyup event handler
- this.textbox.onkeyup = function (oEvent) {
-
- //check for the proper location of the event object
- if (!oEvent) {
- oEvent = window.event;
- }
-
- //call the handleKeyUp() method with the event object
- oThis.handleKeyUp(oEvent);
- };
-
- //assign onkeydown event handler
- this.textbox.onkeydown = function (oEvent) {
-
- //check for the proper location of the event object
- if (!oEvent) {
- oEvent = window.event;
- }
-
- //call the handleKeyDown() method with the event object
- oThis.handleKeyDown(oEvent);
- };
-
- //assign onblur event handler (hides suggestions)
- this.textbox.onblur = function () {
- oThis.hideSuggestions();
- };
-
- //create the suggestions dropdown
- this.createDropDown();
-};
-
-/**
- * Highlights the next suggestion in the dropdown and
- * places the suggestion into the textbox.
- * @scope private
- */
-AutoSuggestControl.prototype.nextSuggestion = function () {
- var cSuggestionNodes = this.layer.childNodes;
-
- if (cSuggestionNodes.length > 0 && this.cur < cSuggestionNodes.length-1) {
- var oNode = cSuggestionNodes[++this.cur];
- this.highlightSuggestion(oNode);
- this.textbox.value = oNode.firstChild.nodeValue;
- }
-};
-
-/**
- * Highlights the previous suggestion in the dropdown and
- * places the suggestion into the textbox.
- * @scope private
- */
-AutoSuggestControl.prototype.previousSuggestion = function () {
- var cSuggestionNodes = this.layer.childNodes;
-
- if (cSuggestionNodes.length > 0 && this.cur > 0) {
- var oNode = cSuggestionNodes[--this.cur];
- this.highlightSuggestion(oNode);
- this.textbox.value = oNode.firstChild.nodeValue;
- }
-};
-
-/**
- * Selects a range of text in the textbox.
- * @scope public
- * @param iStart The start index (base 0) of the selection.
- * @param iLength The number of characters to select.
- */
-AutoSuggestControl.prototype.selectRange = function (iStart /*:int*/, iLength /*:int*/) {
-
- //use text ranges for Internet Explorer
- if (this.textbox.createTextRange) {
- var oRange = this.textbox.createTextRange();
- oRange.moveStart("character", iStart);
- oRange.moveEnd("character", iLength - this.textbox.value.length);
- oRange.select();
-
- //use setSelectionRange() for Mozilla
- } else if (this.textbox.setSelectionRange) {
- this.textbox.setSelectionRange(iStart, iLength);
- }
-
- //set focus back to the textbox
- this.textbox.focus();
-};
-
-/**
- * Builds the suggestion layer contents, moves it into position,
- * and displays the layer.
- * @scope private
- * @param aSuggestions An array of suggestions for the control.
- */
-AutoSuggestControl.prototype.showSuggestions = function (aSuggestions /*:Array*/) {
-
- var oDiv = null;
- this.layer.innerHTML = ""; //clear contents of the layer
-
- for (var i=0; i < aSuggestions.length; i++) {
- oDiv = document.createElement("div");
- oDiv.appendChild(document.createTextNode(aSuggestions[i]));
- this.layer.appendChild(oDiv);
- }
-
- this.layer.style.left = this.getLeft() + "px";
- this.layer.style.top = (this.getTop()+this.textbox.offsetHeight) + "px";
- this.layer.style.width = this.textbox.offsetWidth + "px";
- this.layer.style.visibility = "visible";
-
-};
-
-/**
- * Inserts a suggestion into the textbox, highlighting the
- * suggested part of the text.
- * @scope private
- * @param sSuggestion The suggestion for the textbox.
- */
-AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) {
-
- //check for support of typeahead functionality
- if (this.textbox.createTextRange || this.textbox.setSelectionRange){
- var iLen = this.textbox.value.length;
- this.textbox.value = sSuggestion;
- this.selectRange(iLen, sSuggestion.length);
- }
-};
-
diff --git a/src/usr/local/www/javascript/wizard/disablekeys.js b/src/usr/local/www/javascript/wizard/disablekeys.js
deleted file mode 100644
index 5d6c87a..0000000
--- a/src/usr/local/www/javascript/wizard/disablekeys.js
+++ /dev/null
@@ -1,6 +0,0 @@
-function kH(e) {
- var pK = document.all? window.event.keyCode:e.which;
- return pK != 13;
-}
-document.onkeypress = kH;
-if (document.layers) document.captureEvents(Event.KEYPRESS); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/wizard/suggestions.js b/src/usr/local/www/javascript/wizard/suggestions.js
deleted file mode 100644
index 4d1e127..0000000
--- a/src/usr/local/www/javascript/wizard/suggestions.js
+++ /dev/null
@@ -1,33 +0,0 @@
-
-/**
- * Provides suggestions for state names (USA).
- * @class
- * @scope public
- */
-function StateSuggestions(text) {
- this.states = text;
-}
-
-/**
- * Request suggestions for the given autosuggest control.
- * @scope protected
- * @param oAutoSuggestControl The autosuggest control to provide suggestions for.
- */
-StateSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:AutoSuggestControl*/,
- bTypeAhead /*:boolean*/) {
- var aSuggestions = [];
- var sTextboxValue = oAutoSuggestControl.textbox.value;
-
- if (sTextboxValue.length > 0){
-
- //search for matching states
- for (var i=0; i < this.states.length; i++) {
- if (this.states[i].toLowerCase().indexOf(sTextboxValue.toLowerCase()) == 0) {
- aSuggestions.push(this.states[i]);
- }
- }
- }
-
- //provide suggestions to the control
- oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead);
-};
diff --git a/src/usr/local/www/jquery/jquery-1.11.2.min.js b/src/usr/local/www/jquery/jquery-1.11.2.min.js
new file mode 100644
index 0000000..e6a051d
--- /dev/null
+++ b/src/usr/local/www/jquery/jquery-1.11.2.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.2 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.2",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=mb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=nb(b);function qb(){}qb.prototype=d.filters=d.pseudos,d.setFilters=new qb,g=gb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?gb.error(a):z(a,i).slice(0)};function rb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
+return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)
+}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/src/usr/local/www/jquery/jquery-ui-1.11.2.min.js b/src/usr/local/www/jquery/jquery-ui-1.11.2.min.js
new file mode 100644
index 0000000..17eab79
--- /dev/null
+++ b/src/usr/local/www/jquery/jquery-ui-1.11.2.min.js
@@ -0,0 +1,13 @@
+/*! jQuery UI - v1.11.2 - 2014-10-16
+* http://jqueryui.com
+* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.2",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return n=!a&&o.length?e.widget.extend.apply(null,[n].concat(o)):n,a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))}),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.2",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,M=e.extend({},y),C=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?M.left-=d:"center"===n.my[0]&&(M.left-=d/2),"bottom"===n.my[1]?M.top-=c:"center"===n.my[1]&&(M.top-=c/2),M.left+=C[0],M.top+=C[1],a||(M.left=h(M.left),M.top=h(M.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](M,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+C[0],p[1]+C[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-M.left,i=t+m-d,s=v.top-M.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:M.left,top:M.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,e.top+p+f+m>u&&(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,e.top+p+f+m>d&&(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.accordion",{version:"1.11.2",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.panels=this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr("aria-selected","false"),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true",tabIndex:0,"aria-expanded":"true"})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.length&&(!t.length||e.index()<t.index()),l=this.options.animate||{},u=h&&l.down||l,d=function(){o._toggleComplete(i)};return"number"==typeof u&&(a=u),"string"==typeof u&&(n=u),n=n||u.easing||l.easing,a=a||u.duration||l.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:d,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?r+=i.now:"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,d):e.animate(this.showProps,a,n,d)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.2",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){if(!this.previousFilter){var i=e(t.currentTarget);i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)
+}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||"",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)},_filterMenuItems:function(t){var i=t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(e.trim(e(this).text()))})}}),e.widget("ui.autocomplete",{version:"1.11.2",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.2",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.2",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.2"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty())},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target);return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0
+},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,M,C,N,A,P,I,z,H,F,E,O,j,W,L=new Date,R=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(e,"isRTL"),B=this._get(e,"showButtonPanel"),J=this._get(e,"hideIfNoPrevNext"),q=this._get(e,"navigationAsDateFormat"),K=this._getNumberOfMonths(e),V=this._get(e,"showCurrentAtPos"),U=this._get(e,"stepMonths"),Q=1!==K[0]||1!==K[1],G=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),X=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-K[0]*K[1]+1,$.getDate())),t=X&&X>t?X:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=q?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-U,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":J?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=q?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+U,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":J?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?G:R,o=q?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;K[0]>w;w++){for(k="",this.maxRows=4,T=0;K[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",M="",Q){if(M+="<div class='ui-datepicker-group",K[1]>1)switch(T){case 0:M+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case K[1]-1:M+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:M+=" ui-datepicker-group-middle",S=""}M+="'>"}for(M+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,X,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",C=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)N=(x+u)%7,C+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[N]+"'>"+p[N]+"</span></th>";for(M+=C+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),z=Q?this.maxRows>I?this.maxRows:I:I,this.maxRows=z,H=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;z>F;F++){for(M+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(H)+"</td>":"",x=0;7>x;x++)O=g?g.apply(e.input?e.input[0]:null,[H]):[!0,""],j=H.getMonth()!==Z,W=j&&!y||!O[0]||X&&X>H||$&&H>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(j?" ui-datepicker-other-month":"")+(H.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===H.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(W?" "+this._unselectableClass+" ui-state-disabled":"")+(j&&!v?"":" "+O[1]+(H.getTime()===G.getTime()?" "+this._currentClass:"")+(H.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(j&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"&#39;")+"'")+(W?"":" data-handler='selectDay' data-event='click' data-month='"+H.getMonth()+"' data-year='"+H.getFullYear()+"'")+">"+(j&&!v?"&#xa0;":W?"<span class='ui-state-default'>"+H.getDate()+"</span>":"<a class='ui-state-default"+(H.getTime()===R.getTime()?" ui-state-highlight":"")+(H.getTime()===G.getTime()?" ui-state-active":"")+(j?" ui-priority-secondary":"")+"' href='#'>"+H.getDate()+"</a>")+"</td>",H.setDate(H.getDate()+1),H=this._daylightSavingAdjust(H);M+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),M+="</tbody></table>"+(Q?"</div>"+(K[0]>0&&T===K[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=M}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.2",e.datepicker,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.2",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===e(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)
+},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css("position"),top:e.placeholder.css("top"),left:e.placeholder.css("left")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger("deactivate",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n})),n?(a.isOver||(a.isOver=1,a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger("toSortable",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger("out",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger("fromSortable",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.2",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=this.element.children(this.handles[i]).first().show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),e(this.handles[i]).length},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=function(t){e(t).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0},h=function(t,s){e(t).each(function(){var t=e(this),n=e(this).data("ui-resizable-alsoresize"),a={},o=s&&s.length?s:t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var i=(n[t]||0)+(r[t]||0);i&&i>=0&&(a[t]=i||null)}),t.css(a)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):e.each(n.alsoResize,function(e,t){h(e,t)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=u-t.height,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.dialog",{version:"1.11.2",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0;
+if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.droppable",{version:"1.11.2",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable;var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.2",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};
+f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})},e.widget("ui.progressbar",{version:"1.11.2",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectable",e.ui.mouse,{version:"1.11.2",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.selectmenu",{version:"1.11.2",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this,i=this.element.attr("tabindex");this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:i||this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._setSelection(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_setSelection:function(){var e;this.range&&(window.getSelection?(e=window.getSelection(),e.removeAllRanges(),e.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(){var e;window.getSelection?(e=window.getSelection(),e.rangeCount&&(this.range=e.getRangeAt(0))):this.range=document.selection.createRange()},click:function(e){this._setSelection(),this._toggle(e)},keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.attr("value"),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.2",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var e=(this.options.max-this._valueMin())%this.options.step;this.max=this.options.max-e},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.2",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){var e=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===e.axis||this._isFloating(this.items[0].item):!1,this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this));
+return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-e(document).scrollTop()<o.scrollSensitivity?r=e(document).scrollTop(e(document).scrollTop()-o.scrollSpeed):e(window).height()-(t.pageY-e(document).scrollTop())<o.scrollSensitivity&&(r=e(document).scrollTop(e(document).scrollTop()+o.scrollSpeed)),t.pageX-e(document).scrollLeft()<o.scrollSensitivity?r=e(document).scrollLeft(e(document).scrollLeft()-o.scrollSpeed):e(window).width()-(t.pageX-e(document).scrollLeft())<o.scrollSensitivity&&(r=e(document).scrollLeft(e(document).scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?t.currentItem.children().each(function(){e("<td>&#160;</td>",t.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,e("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(e("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.spinner",{version:"1.11.2",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.2",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this,i=this.tabs,s=this.anchors,n=this.panels;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]
+}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.success(function(e){setTimeout(function(){o.html(e),s._trigger("load",i,r)},1)}).complete(function(e,t){setTimeout(function(){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.2",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t.element)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s.element[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){e.data("ui-tooltip-open")&&n._delay(function(){t&&(t.type=a),this._open(t,e,i)})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){u.of=e,o.is(":hidden")||o.position(u)}var a,o,r,h,l,u=e.extend({},this.options.position);if(s){if(a=this._find(i))return a.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),o=a.tooltip,this._addDescribedBy(i,o.attr("id")),o.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(l=s.clone(),l.removeAttr("id").find("[id]").removeAttr("id")):l=s,e("<div>").html(l).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):o.position(e.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.show&&this.options.show.delay&&(h=this.delayedShow=setInterval(function(){o.is(":visible")&&(n(u.of),clearInterval(h))},e.fx.interval)),this._trigger("open",t,{tooltip:o}),r={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}},i[0]!==this.element[0]&&(r.remove=function(){this._removeTooltip(o)}),t&&"mouseover"!==t.type||(r.mouseleave="close"),t&&"focusin"!==t.type||(r.focusout="close"),this._on(!0,i,r)}},close:function(t){var i,s=this,n=e(t?t.currentTarget:this.element),a=this._find(n);a&&(i=a.tooltip,a.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),a.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(e(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,i){e(i.element).attr("title",i.title),delete s.parents[t]}),a.closing=!0,this._trigger("close",t,{tooltip:i}),a.hiding||(a.closing=!1)))},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}})}); \ No newline at end of file
diff --git a/src/usr/local/www/jquery/pfSense.js b/src/usr/local/www/jquery/pfSense.js
new file mode 100644
index 0000000..15a518e
--- /dev/null
+++ b/src/usr/local/www/jquery/pfSense.js
@@ -0,0 +1,242 @@
+/*
+ * This file should only contain functions that will be used on more than 2 pages
+ */
+
+$(function() {
+ // Attach collapsable behaviour to select options
+ (function()
+ {
+ var selects = $('select[data-toggle="collapse"]');
+
+ selects.on('change', function(){
+ var options = $(this).find('option');
+ var selectedValue = $(this).find(':selected').val();
+
+ options.each(function(){
+ if ($(this).val() == selectedValue)
+ return;
+
+ targets = $('.toggle-'+ $(this).val() +'.in:not(.toggle-'+ selectedValue +')');
+
+ // Hide related collapsables which are visible (.in)
+ targets.collapse('hide');
+
+ // Disable all invisible inputs
+ targets.find(':input').prop('disabled', true);
+ });
+
+ $('.toggle-' + selectedValue).collapse('show').find(':input').prop('disabled', false);
+ });
+
+ // Trigger change to open currently selected item
+ selects.trigger('change');
+ })();
+
+
+ // Add +/- buttons to certain Groups; to allow adding multiple entries
+ // This time making the buttons col-2 wide so they can fit on the same line as the
+ // rest of the group (providing the total width of the group is col-8 or less)
+ (function()
+ {
+ var groups = $('div.form-group.user-duplication-horiz');
+ var controlsContainer = $('<div class="col-sm-2"></div>');
+ var plus = $('<a class="btn btn-sm btn-success">Add</a>');
+ var minus = $('<a class="btn btn-sm btn-warning">Delete</a>');
+
+ minus.on('click', function(){
+ $(this).parents('div.form-group').remove();
+ });
+
+ plus.on('click', function(){
+ var group = $(this).parents('div.form-group');
+
+ var clone = group.clone(true);
+ clone.find('*').val(''); //removeAttr('value');
+ clone.appendTo(group.parent());
+ });
+
+ groups.each(function(idx, group){
+ var controlsClone = controlsContainer.clone(true).appendTo(group);
+ minus.clone(true).appendTo(controlsClone);
+
+ if (group == group.parentNode.lastElementChild)
+ plus.clone(true).appendTo(controlsClone);
+ });
+ })();
+
+ // Add +/- buttons to certain Groups; to allow adding multiple entries
+ (function()
+ {
+ var groups = $('div.form-group.user-duplication');
+ var controlsContainer = $('<div class="col-sm-10 col-sm-offset-2 controls"></div>');
+ var plus = $('<a class="btn btn-xs btn-success">Add</a>');
+ var minus = $('<a class="btn btn-xs btn-warning">Delete</a>');
+
+ minus.on('click', function(){
+ $(this).parents('div.form-group').remove();
+ });
+
+ plus.on('click', function(){
+ var group = $(this).parents('div.form-group');
+
+ var clone = group.clone(true);
+ clone.find('*').val(''); //removeAttr('value');
+ clone.appendTo(group.parent());
+ });
+
+ groups.each(function(idx, group){
+ var controlsClone = controlsContainer.clone(true).appendTo(group);
+ minus.clone(true).appendTo(controlsClone);
+
+ if (group == group.parentNode.lastElementChild)
+ plus.clone(true).appendTo(controlsClone);
+ });
+ })();
+
+ // Find all ipaddress masks and make dynamic based on address family of input
+ $('span.pfIpMask + select').each(function (idx, select){
+ var input = $(select).prevAll('input[type=text]');
+
+ input.on('change', function(e){
+ var isV6 = (input.val().indexOf(':') != -1), min = 0, max = 128;
+ if (!isV6)
+ max = 32;
+
+ if (input.val() == "")
+ return;
+
+ while (select.options.length > max)
+ select.remove(0);
+
+ if (select.options.length < max)
+ {
+ for (var i=select.options.length; i<=max; i++)
+ select.options.add(new Option(i, i), 0);
+ }
+ });
+
+ // Fire immediately
+ input.change();
+ });
+
+ // Add confirm to all btn-danger buttons
+ $('.btn-danger').on('click', function(e){
+ var q = 'Are you sure you wish to '+ $.trim(this.textContent) +'?';
+
+ if ($(this).attr('title') != undefined)
+ q = $(this).attr('title')+'?';
+
+ if (!confirm(q))
+ e.preventDefault();
+ });
+
+ // Add toggle-all when there are multiple checkboxes and none of them are radio buttons
+ $('.control-label + .checkbox.multi').each(function() {
+ var a = $('<a class="btn btn-xs btn-default">toggle all</a>');
+
+ if(($(this).html().indexOf("type=\"radio\"") == -1)) {
+ a.on('click', function() {
+ var wrap = $(this).parents('.form-group').find('.checkbox.multi'),
+ all = wrap.find('input[type=checkbox]'),
+ checked = wrap.find('input[type=checkbox]:checked');
+
+ all.prop('checked', (all.length != checked.length));
+ });
+
+ a.appendTo($(this));
+ }
+ });
+
+ // Hide advanced inputs by default
+ if ($('.advanced').length > 0)
+ {
+ var advButt = $('<a id="toggle-advanced" class="btn btn-default">toggle advanced options</a>');
+ advButt.on('click', function() {
+ $('.advanced').parents('.form-group').collapse('toggle');
+ });
+
+ advButt.insertAfter($('#save'));
+
+ $('.advanced').parents('.form-group').collapse({toggle: true});
+ }
+
+ // Enable popovers globally
+ $('[data-toggle="popover"]').popover();
+
+ // Force correct initial state for toggleable checkboxes
+ $('input[type=checkbox][data-toggle="collapse"]:not(:checked)').each(function() {
+ $( $(this).data('target') ).addClass('collapse');
+ });
+ $('input[type=checkbox][data-toggle="disable"]:not(:checked)').each(function() {
+ $( $(this).data('target') ).prop('disabled', true);
+ });
+
+ // Focus first input
+ $(':input:enabled:visible:first').focus();
+
+ // Run in-page defined events
+ while (func = window.events.shift())
+ func();
+});
+
+// Implement data-toggle=disable
+// Source: https://github.com/synergic-cz/synergic-ui/blob/master/src/js/disable.js
+;(function($, window, document) {
+ 'use strict';
+
+ var Disable = function($element) {
+ this.$element = $element;
+ };
+
+ Disable.prototype.toggle = function() {
+ this.$element.prop('disabled', !this.$element.prop('disabled'));
+ };
+
+ function Plugin(options) {
+ $(document).trigger('toggle.sui.disable');
+
+ this.each(function() {
+ var $this = $(this);
+ var data = $this.data('sui.disable');
+
+ if (!data) {
+ $this.data('sui.disable', (data = new Disable($this)));
+ }
+
+ if (options === 'toggle') {
+ data.toggle();
+ }
+ });
+
+ $(document).trigger('toggled.sui.disable');
+
+ return this;
+ }
+
+ var old = $.fn.disable;
+
+ $.fn.disable = Plugin;
+ $.fn.disable.Constructor = Disable;
+
+ $.fn.disable.noConflict = function() {
+ $.fn.disable = old;
+ return this;
+ };
+
+ (function(Plugin, $, window) {
+ $(window).load(function() {
+ var $controls = $('[data-toggle=disable]');
+
+ $controls.each(function() {
+ var $this = $(this);
+ var eventType = $this.data('disable-event');
+ if (!eventType) {
+ eventType = 'change';
+ }
+ $this.on(eventType + '.sui.disable.data-api', function() {
+ Plugin.call($($this.data('target')), 'toggle');
+ });
+ });
+ });
+ }(Plugin, $, window, document));
+}(jQuery, window, document)); \ No newline at end of file
diff --git a/src/usr/local/www/license.php b/src/usr/local/www/license.php
index 2247d6a..ed1256d 100644
--- a/src/usr/local/www/license.php
+++ b/src/usr/local/www/license.php
@@ -27,7 +27,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -39,95 +39,116 @@
require("guiconfig.inc");
include("head.inc");
-
?>
+<div class="panel panel-default">
+ <div class="panel-heading"><h4><?=gettext("License")?></h4></div>
+ <div class="panel-body">
+ <p>
+ <strong><?=$g['product_name']?><?=gettext(" is Copyright")?> &copy; <?=$g['product_copyright_years']?><?=gettext(" by ")?><?=$g['product_copyright']?><br />
+ <?=gettext("All rights reserved")?>.</strong>
+ </p>
+ <p>
+ <strong><?=gettext("m0n0wall is Copyright ")?>&copy; <?=gettext("2002-2015 by Manuel Kasper")?>
+ (<a href="mailto:mk@neon1.net">mk@neon1.net</a>).<br />
+ <?=gettext("All rights reserved")?>.</strong>
+ </p>
+ <p>
+ <?=gettext("Redistribution and use in source and binary forms, with or without")?><br />
+ <?=gettext("modification, are permitted provided that the following conditions ".
+ "are met")?>:<br />
+ <br />
+ <?=gettext("1. Redistributions of source code must retain the above copyright ".
+ "notice,")?><br />
+ <?=gettext("this list of conditions and the following disclaimer")?>.<br />
+ <br />
+ <?=gettext("2. Redistributions in binary form must reproduce the above copyright")?><br />
+ <?=gettext("notice, this list of conditions and the following disclaimer in ".
+ "the")?><br />
+ <?=gettext("documentation and/or other materials provided with the distribution.")?><br />
+ <br />
+ <strong><?=gettext("THIS SOFTWARE IS PROVIDED ")?>&quot;<?=gettext("AS IS'' AND ANY EXPRESS ".
+ "OR IMPLIED WARRANTIES,")?><br />
+ <?=gettext("INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY")?><br />
+ <?=gettext("AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT ".
+ "SHALL THE")?><br />
+ <?=gettext("AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ".
+ "EXEMPLARY,")?><br />
+ <?=gettext("OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT ".
+ "OF")?><br />
+ <?=gettext("SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ".
+ "BUSINESS")?><br />
+ <?=gettext("INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER ".
+ "IN")?><br />
+ <?=gettext("CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)")?><br />
+ <?=gettext("ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED ".
+ "OF THE")?><br />
+ <?=gettext("POSSIBILITY OF SUCH DAMAGE")?></strong>.
+ </p>
+ <hr />
+ <p>
+ <?= "{$g['product_name']} " . gettext("is based upon/includes various free software packages, ".
+ "listed below.")?><br />
+ <?php printf(gettext("The authors of %s would like to thank the authors of these " .
+ "software packages for their efforts"),$g['product_name'])?>.
+ </p>
+ <p>
+ FreeBSD (<a href="http://www.freebsd.org" target="_blank">http://www.freebsd.org</a>)<br />
+ <?=gettext("Copyright")?> &copy;<?=gettext("1992-2015 The FreeBSD Project. All rights reserved")?>.<br />
+ <br />
+ <?=gettext("This product includes PHP, freely available from")?><a href="http://www.php.net/" target="_blank">http://www.php.net</a>.<br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("1999-2015 The PHP Group. All rights reserved.")?>.<br />
+ <br />
+ <?=gettext("LightTPD"); ?> (<a href="http://www.lighttpd.net" target="_blank">http://www.lighttpd.net)</a><br />
+ <?=gettext("Copyright"); ?> &copy;<?=gettext("2004, Jan Knescke, incremental")?><jan@kneschke.de>
+ <?=gettext("All rights reserved.")?><br />
+ <br />
+ <?=gettext("ISC DHCP server ")?>(<a href="http://www.isc.org/products/DHCP/" target="_blank">http://www.isc.org/products/DHCP</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("2004-2012 Internet Software Consortium, Inc.")?><br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("1995-2003 Internet Software Consortium")?><br />
+ <br />
+ <?=gettext("PF"); ?> (<a href="http://www.openbsd.org/faq/pf" target="_blank">http://www.openbsd.org</a>)<br />
+ <br />
+ <?=gettext("MPD - Multi-link PPP daemon for FreeBSD")?> (<a href="http://www.dellroad.org/mpd" target="_blank">http://www.dellroad.org/mpd</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; 2003-2004, Archie L. Cobbs, Michael Bretterklieber, Alexander Motin<br />
+ <?=gettext("All rights reserved.")?><br />
+ <br />
+ <?=gettext("Circular log support for FreeBSD syslogd ")?>(<a href="http://software.wheelhouse.org/syslogd/" target="_blank">http://software.wheelhouse.org/syslogd/</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; 2001 Jeff Wheelhouse (jdw@wwwi.com)<br />
+ <br />
+ <?=gettext("Dnsmasq - a DNS forwarder for NAT firewalls")?> (<a href="http://www.thekelleys.org.uk" target="_blank">http://www.thekelleys.org.uk</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; 2000-2012 Simon Kelley.<br />
+ <br />
+ <?=gettext("IPsec-Tools"); ?> (<a href="http://ipsec-tools.sourceforge.net/" target="_blank">http://ipsec-tools.sourceforge.net/</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("1995-2002 WIDE Project. All rights reserved.")?><br />
+ <br />
+ <?=gettext("msntp"); ?> (<a href="http://www.hpcf.cam.ac.uk/export" target="_blank">http://www.hpcf.cam.ac.uk/export</a>)<br />
+ <?=gettext("Copyright"); ?> &copy;<?=gettext(" 1996, 1997, 2000 N.M. Maclaren, University of Cambridge. ".
+ "All rights reserved.")?><br />
+ <br />
+ <?=gettext("UCD-SNMP"); ?> (<a href="http://www.ece.ucdavis.edu/ucd-snmp" target="_blank">http://www.ece.ucdavis.edu/ucd-snmp</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("1989, 1991, 1992 by Carnegie Mellon University.")?><br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("1996, 1998-2000 The Regents of the University of ".
+ "California. All rights reserved")?>.<br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("2001-2002, Network Associates Technology, Inc. ".
+ "All rights reserved.")?><br />
+ <?=gettext("Portions of this code are copyright")?> &copy; <?=gettext("2001-2002, Cambridge ".
+ "Broadband Ltd. All rights reserved.")?><br />
+ <br />
+ <?=gettext("choparp"); ?> (<a href="http://choparp.sourceforge.net/" target="_blank">http://choparp.sourceforge.net</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; 1997 Takamichi Tateoka (tree@mma.club.uec.ac.jp)<br />
+ <?=gettext("Copyright"); ?> &copy; 2002 Thomas Quinot (thomas@cuivre.fr.eu.org)<br />
+ <br />
+ <?=gettext("php-radius"); ?> (<a href="http://www.mavetju.org/programming/php.php" target="_blank">http://www.mavetju.org/programming/php.php</a>)<br />
+ <?=gettext("Copyright 2000, 2001, 2002 by Edwin Groothuis. All rights reserved.")?><br />
+ <?=gettext("This product includes software developed by Edwin Groothuis.")?><br />
+ <br />
+ <?=gettext("wol"); ?> (<a href="http://ahh.sourceforge.net/wol" target="_blank">http://ahh.sourceforge.net/wol</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; 2000,2001,2002,2003,2004 Thomas Krennwallner &lt;krennwallner@aon.at&gt;
+ <br />
+ <?=gettext("OpenVPN"); ?> (<a href="http://openvpn.net/" target="_blank">http://openvpn.net/</a>)
+ <?=gettext("Copyright (C) 2002-2005 OpenVPN Solutions LLC ")?>
+ </p>
+ </div>
+</div>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
- <?php include("fbegin.inc"); ?>
- <p class="pgtitle"><?=gettext("License");?></p>
-
- <p><strong><?=$g['product_name'];?> <?=gettext("is Copyright");?> &copy; <?=$g['product_copyright_years'];?> <?=gettext("by");?> <?=$g['product_copyright'];?><br />
- <?=gettext("All rights reserved");?>.</strong></p>
-
- <p><strong><?=gettext("m0n0wall is Copyright ");?>&copy; <?=gettext("2002-2015 by Manuel Kasper");?>
- (<a href="mailto:mk@neon1.net">mk@neon1.net</a>).<br />
- <?=gettext("All rights reserved");?>.</strong></p>
- <p> <?=gettext("Redistribution and use in source and binary forms, with or without");?><br />
- <?=gettext("modification, are permitted provided that the following conditions are met");?>:<br />
- <br />
- <?=gettext("1. Redistributions of source code must retain the above copyright notice,");?><br />
- <?=gettext("this list of conditions and the following disclaimer");?>.<br />
- <br />
- <?=gettext("2. Redistributions in binary form must reproduce the above copyright");?><br />
- <?=gettext("notice, this list of conditions and the following disclaimer in the");?><br />
- <?=gettext("documentation and/or other materials provided with the distribution.");?><br />
- <br />
- <strong><?=gettext("THIS SOFTWARE IS PROVIDED ");?>&quot;<?=gettext("AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,");?><br />
- <?=gettext("INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY");?><br />
- <?=gettext("AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE");?><br />
- <?=gettext("AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,");?><br />
- <?=gettext("OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF");?><br />
- <?=gettext("SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS");?><br />
- <?=gettext("INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN");?><br />
- <?=gettext("CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)");?><br />
- <?=gettext("ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE");?><br />
- <?=gettext("POSSIBILITY OF SUCH DAMAGE");?></strong>.</p>
- <hr size="1">
- <p><?= "{$g['product_name']} " . gettext("is based upon/includes various free software packages, listed below.");?><br />
- <?php printf(gettext("The authors of %s would like to thank the authors of these software packages for their efforts"), $g['product_name']);?>.</p>
- <p>FreeBSD (<a href="http://www.freebsd.org" target="_blank">http://www.freebsd.org</a>)<br />
- <?=gettext("Copyright");?> &copy;<?=gettext("1992-2015 The FreeBSD Project. All rights reserved");?>.<br />
- <br />
- <?=gettext("This product includes PHP, freely available from");?> <a href="http://www.php.net/" target="_blank">http://www.php.net</a>.<br />
- <?=gettext("Copyright"); ?> &copy; <?=gettext("1999-2015 The PHP Group. All rights reserved.");?>.<br />
- <br />
- <?=gettext("LightTPD"); ?> (<a href="http://www.lighttpd.net" target="_blank">http://www.lighttpd.net)</a><br />
- <?=gettext("Copyright"); ?> &copy;<?=gettext("2004, Jan Knescke, incremental");?><jan@kneschke.de>
- <?=gettext("All rights reserved.");?><br />
- <br />
- <?=gettext("ISC DHCP server ");?>(<a href="http://www.isc.org/products/DHCP/" target="_blank">http://www.isc.org/products/DHCP</a>)<br />
- <?=gettext("Copyright"); ?> &copy; <?=gettext("2004-2012 Internet Software Consortium, Inc.");?><br />
- <?=gettext("Copyright"); ?> &copy; <?=gettext("1995-2003 Internet Software Consortium");?><br />
- <br />
- <?=gettext("PF"); ?> (<a href="http://www.openbsd.org/faq/pf" target="_blank">http://www.openbsd.org</a>)<br />
- <br />
- <?=gettext("MPD - Multi-link PPP daemon for FreeBSD");?> (<a href="http://www.dellroad.org/mpd" target="_blank">http://www.dellroad.org/mpd</a>)<br />
- <?=gettext("Copyright"); ?> &copy; 2003-2004, Archie L. Cobbs, Michael Bretterklieber, Alexander Motin<br />
- <?=gettext("All rights reserved.");?><br />
- <br />
- <?=gettext("Circular log support for FreeBSD syslogd ");?>(<a href="http://software.wheelhouse.org/syslogd/" target="_blank">http://software.wheelhouse.org/syslogd/</a>)<br />
- <?=gettext("Copyright"); ?> &copy; 2001 Jeff Wheelhouse (jdw@wwwi.com)<br />
- <br />
- <?=gettext("Dnsmasq - a DNS forwarder for NAT firewalls");?> (<a href="http://www.thekelleys.org.uk" target="_blank">http://www.thekelleys.org.uk</a>)<br />
- <?=gettext("Copyright"); ?> &copy; 2000-2012 Simon Kelley.<br />
- <br />
- <?=gettext("IPsec-Tools"); ?> (<a href="http://ipsec-tools.sourceforge.net/" target="_blank">http://ipsec-tools.sourceforge.net/</a>)<br />
- <?=gettext("Copyright"); ?> &copy; <?=gettext("1995-2002 WIDE Project. All rights reserved.");?><br />
- <br />
- <?=gettext("msntp"); ?> (<a href="http://www.hpcf.cam.ac.uk/export" target="_blank">http://www.hpcf.cam.ac.uk/export</a>)<br />
- <?=gettext("Copyright"); ?> &copy;<?=gettext(" 1996, 1997, 2000 N.M. Maclaren, University of Cambridge. ".
- "All rights reserved.");?><br />
- <br />
- <?=gettext("UCD-SNMP"); ?> (<a href="http://www.ece.ucdavis.edu/ucd-snmp" target="_blank">http://www.ece.ucdavis.edu/ucd-snmp</a>)<br />
- <?=gettext("Copyright"); ?> &copy; <?=gettext("1989, 1991, 1992 by Carnegie Mellon University.");?><br />
- <?=gettext("Copyright"); ?> &copy; <?=gettext("1996, 1998-2000 The Regents of the University of California. All rights reserved");?>.<br />
- <?=gettext("Copyright"); ?> &copy; <?=gettext("2001-2002, Network Associates Technology, Inc. All rights reserved.");?><br />
- <?=gettext("Portions of this code are copyright");?> &copy; <?=gettext("2001-2002, Cambridge Broadband Ltd. All rights reserved.");?><br />
- <br />
- <?=gettext("choparp"); ?> (<a href="http://choparp.sourceforge.net/" target="_blank">http://choparp.sourceforge.net</a>)<br />
- <?=gettext("Copyright"); ?> &copy; 1997 Takamichi Tateoka (tree@mma.club.uec.ac.jp)<br />
- <?=gettext("Copyright"); ?> &copy; 2002 Thomas Quinot (thomas@cuivre.fr.eu.org)<br />
- <br />
- <?=gettext("php-radius"); ?> (<a href="http://www.mavetju.org/programming/php.php" target="_blank">http://www.mavetju.org/programming/php.php</a>)<br />
- <?=gettext("Copyright 2000, 2001, 2002 by Edwin Groothuis. All rights reserved.");?><br />
- <?=gettext("This product includes software developed by Edwin Groothuis.");?><br />
- <br />
- <?=gettext("wol"); ?> (<a href="http://ahh.sourceforge.net/wol" target="_blank">http://ahh.sourceforge.net/wol</a>)<br />
- <?=gettext("Copyright"); ?> &copy; 2000,2001,2002,2003,2004 Thomas Krennwallner &lt;krennwallner@aon.at&gt;
- <br />
- <?=gettext("OpenVPN"); ?> (<a href="http://openvpn.net/" target="_blank">http://openvpn.net/</a>)
- <?=gettext("Copyright (C) 2002-2005 OpenVPN Solutions LLC ");?>
- </p>
- <?php include("fend.inc"); ?>
-</body>
-</html>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/load_balancer_monitor.php b/src/usr/local/www/load_balancer_monitor.php
index 87884e5..2dd9f31 100644
--- a/src/usr/local/www/load_balancer_monitor.php
+++ b/src/usr/local/www/load_balancer_monitor.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -41,10 +41,6 @@
##|-PRIV
require_once("guiconfig.inc");
-require_once("functions.inc");
-require_once("filter.inc");
-require_once("shaper.inc");
-require_once("util.inc");
if (!is_array($config['load_balancer']['monitor_type'])) {
$config['load_balancer']['monitor_type'] = array();
@@ -86,53 +82,79 @@ if ($_GET['act'] == "del") {
}
}
-$pgtitle = array(gettext("Services"), gettext("Load Balancer"), gettext("Monitor"));
+$pgtitle = array(gettext("Services"),gettext("Load Balancer"),gettext("Monitor"));
$shortcut_section = "relayd";
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('loadbalancer'))
+ print_info_box_np(gettext("The load balancer configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
+
+/* active tabs */
+$tab_array = array();
+$tab_array[] = array(gettext("Pools"), false, "load_balancer_pool.php");
+$tab_array[] = array(gettext("Virtual Servers"), false, "load_balancer_virtual_server.php");
+$tab_array[] = array(gettext("Monitors"), true, "load_balancer_monitor.php");
+$tab_array[] = array(gettext("Settings"), false, "load_balancer_setting.php");
+display_top_tabs($tab_array);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
+
<form action="load_balancer_monitor.php" method="post">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('loadbalancer')): ?><br/>
-<?php print_info_box_np(gettext("The load balancer configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="load balancer monitor">
- <tr><td class="tabnavtbl">
- <?php
- /* active tabs */
- $tab_array = array();
- $tab_array[] = array(gettext("Pools"), false, "load_balancer_pool.php");
- $tab_array[] = array(gettext("Virtual Servers"), false, "load_balancer_virtual_server.php");
- $tab_array[] = array(gettext("Monitors"), true, "load_balancer_monitor.php");
- $tab_array[] = array(gettext("Settings"), false, "load_balancer_setting.php");
- display_top_tabs($tab_array);
- ?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Monitor')?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext('Name')?></th>
+ <th><?=gettext('Type')?></th>
+ <th><?=gettext('Description')?></th>
+ <th><?=gettext('Action')?></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- $t = new MainTable();
- $t->edit_uri('load_balancer_monitor_edit.php');
- $t->my_uri('load_balancer_monitor.php');
- $t->add_column(gettext('Name'), 'name', 20);
- $t->add_column(gettext('Type'), 'type', 10);
- $t->add_column(gettext('Description'), 'descr', 30);
- $t->add_button('edit');
- $t->add_button('dup');
- $t->add_button('del');
- $t->add_content_array($a_monitor);
- $t->display();
+$idx = 0;
+foreach($a_monitor as $monitor) {
+?>
+ <tr>
+ <td>
+ <?=$monitor['name']?>
+ </td>
+ <td>
+ <?=$monitor['type']?>
+ </td>
+ <td>
+ <?=$monitor['descr']?>
+ </td>
+ <td>
+ <a href="load_balancer_monitor_edit.php?id=<?=$idx?>" class="btn btn-xs btn-info"><?=gettext('Edit')?></a>
+ <a href="load_balancer_monitor.php?act=del&id=<?=$idx?>" class="btn btn-xs btn-danger"><?=gettext('Delete')?></a>
+ <a href="load_balancer_monitor_edit.php?act=dup&id=<?=$idx?>" class="btn btn-xs btn-default"><?=gettext('Duplicate')?></a>
+ </td>
+ </tr>
+<?php
+ $idx++;
+}
?>
- </div>
- </td>
- </tr>
-</table>
+ </tbody>
+ </table>
+ </div>
+
+ <nav class="action-buttons">
+ <a href="load_balancer_monitor_edit.php" class="btn btn-success"><?=gettext('Add')?></a>
+ </nav>
+
+ </div>
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+
+<?php
+
+include("foot.inc");
diff --git a/src/usr/local/www/load_balancer_monitor_edit.php b/src/usr/local/www/load_balancer_monitor_edit.php
index 532136b..b7134db 100644
--- a/src/usr/local/www/load_balancer_monitor_edit.php
+++ b/src/usr/local/www/load_balancer_monitor_edit.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -42,11 +42,7 @@
require("guiconfig.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/load_balancer_monitor.php');
-}
+$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/load_balancer_monitor.php');
if (!is_array($config['load_balancer']['monitor_type'])) {
$config['load_balancer']['monitor_type'] = array();
@@ -218,173 +214,170 @@ $types = array("icmp" => gettext("ICMP"), "tcp" => gettext("TCP"), "http" => get
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
+
+
<script type="text/javascript">
//<![CDATA[
-function updateType(t) {
- switch (t) {
-<?php
- /* OK, so this is sick using php to generate javascript, but it needed to be done */
- foreach ($types as $key => $val) {
- echo " case \"{$key}\": {\n";
- $t = $types;
- foreach ($t as $k => $v) {
- if ($k != $key) {
- echo " jQuery('#{$k}').hide();\n";
+events.push(function(){
+
+ // Hides all elements of the specified class. This will usually be a section
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ // Hide all sections except 't'
+ function updateType(t){
+ switch(t) {
+ <?php
+ /* OK, so this is sick using php to generate javascript, but it needed to be done */
+ foreach ($types as $key => $val) {
+ echo " case \"{$key}\": {\n";
+ $t = $types;
+ foreach ($t as $k => $v) {
+ if ($k != $key) {
+ echo " hideClass('{$k}', true);\n";
+ }
}
+ echo " }\n";
}
- echo " }\n";
- }
-?>
+ ?>
+ }
+
+ hideClass(t, false);
}
- jQuery('#' + t).show();
-}
+
+
+ // On click . .
+ $('#type').on('change', function() {
+ updateType($('#type').val());
+ });
+
+ // On page load
+ updateType($('#type').val());
+});
+
//]]>
</script>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-
-<form action="load_balancer_monitor_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="monitor entry">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Load Balancer - Monitor entry"); ?></td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <input name="name" type="text" <?if (isset($pconfig['name'])) echo "value=\"" . htmlspecialchars($pconfig['name']) . "\"";?> size="16" maxlength="16" />
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <input name="descr" type="text" <?if (isset($pconfig['descr'])) echo "value=\"" . htmlspecialchars($pconfig['descr']) . "\"";?> size="64" />
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Type"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <select id="type" name="type">
-<?
- foreach ($types as $key => $val) {
- if (isset($pconfig['type']) && $pconfig['type'] == $key) {
- $selected = " selected=\"selected\"";
- } else {
- $selected = "";
- }
- echo "<option value=\"{$key}\" onclick=\"updateType('{$key}');\"{$selected}>{$val}</option>\n";
- }
-?>
- </select>
- </td>
- </tr>
- <tr align="left" id="icmp"<?= $pconfig['type'] == "icmp" ? "" : " style=\"display:none;\""?>>
- <td></td>
- </tr>
- <tr align="left" id="tcp"<?= $pconfig['type'] == "tcp" ? "" : " style=\"display:none;\""?>>
- <td></td>
- </tr>
- <tr align="left" id="http"<?= $pconfig['type'] == "http" ? "" : " style=\"display:none;\""?>>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("HTTP"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="http">
- <tr align="left">
- <td valign="top" align="right" class="vtable"><?=gettext("Path"); ?></td>
- <td class="vtable" colspan="2">
- <input name="http_options_path" type="text" <?if (isset($pconfig['options']['path'])) echo "value=\"" . htmlspecialchars($pconfig['options']['path']) . "\"";?> size="64" />
- </td>
- </tr>
- <tr align="left">
- <td valign="top" align="right" class="vtable"><?=gettext("Host"); ?></td>
- <td class="vtable" colspan="2">
- <input name="http_options_host" type="text" <?if (isset($pconfig['options']['host'])) echo "value=\"" . htmlspecialchars($pconfig['options']['host']) . "\"";?> size="64" /><br /><?=gettext("Hostname for Host: header if needed."); ?>
- </td>
- </tr>
- <tr align="left">
- <td valign="top" align="right" class="vtable"><?=gettext("HTTP Code"); ?></td>
- <td class="vtable" colspan="2">
- <?= print_rfc2616_select("http_options_code", $pconfig['options']['code']); ?>
- </td>
- </tr>
-<!-- BILLM: XXX not supported digest checking just yet
- <tr align="left">
- <td width="22%" valign="top" class="vncell">MD5 Page Digest</td>
- <td width="78%" class="vtable" colspan="2">
- <input name="digest" type="text" <?if (isset($pconfig['digest'])) echo "value=\"" . htmlspecialchars($pconfig['digest']) . "\"";?>size="32"><br /><b>TODO: add fetch functionality here</b>
- </td>
- </tr>
--->
- </table>
- </td>
- </tr>
- <tr align="left" id="https"<?= $pconfig['type'] == "https" ? "" : " style=\"display:none;\""?>>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("HTTPS"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="https">
- <tr align="left">
- <td valign="top" align="right" class="vtable"><?=gettext("Path"); ?></td>
- <td class="vtable" colspan="2">
- <input name="https_options_path" type="text" <?if (isset($pconfig['options']['path'])) echo "value=\"" . htmlspecialchars($pconfig['options']['path']) ."\"";?> size="64" />
- </td>
- </tr>
- <tr align="left">
- <td valign="top" align="right" class="vtable"><?=gettext("Host"); ?></td>
- <td class="vtable" colspan="2">
- <input name="https_options_host" type="text" <?if (isset($pconfig['options']['host'])) echo "value=\"" . htmlspecialchars($pconfig['options']['host']) . "\"";?> size="64" /><br /><?=gettext("Hostname for Host: header if needed."); ?>
- </td>
- </tr>
- <tr align="left">
- <td valign="top" align="right" class="vtable"><?=gettext("HTTP Code"); ?></td>
- <td class="vtable" colspan="2">
- <?= print_rfc2616_select("https_options_code", $pconfig['options']['code']); ?>
- </td>
- </tr>
-<!-- BILLM: XXX not supported digest checking just yet
-
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq">MD5 Page Digest</td>
- <td width="78%" class="vtable" colspan="2">
- <input name="digest" type="text" <?if (isset($pconfig['digest'])) echo "value=\"" . htmlspecialchars($pconfig['digest']) . "\"";?>size="32"><br /><b>TODO: add fetch functionality here</b>
- </td>
- </tr>
--->
- </table>
- </td>
- </tr>
- <tr align="left" id="send"<?= $pconfig['type'] == "send" ? "" : " style=\"display:none;\""?>>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Send/Expect"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="send expect">
- <tr align="left">
- <td valign="top" align="right" class="vtable"><?=gettext("Send string"); ?></td>
- <td class="vtable" colspan="2">
- <input name="send_options_send" type="text" <?if (isset($pconfig['options']['send'])) echo "value=\"" . htmlspecialchars($pconfig['options']['send']) . "\"";?> size="64" />
- </td>
- </tr>
- <tr align="left">
- <td valign="top" align="right" class="vtable"><?=gettext("Expect string"); ?></td>
- <td class="vtable" colspan="2">
- <input name="send_options_expect" type="text" <?if (isset($pconfig['options']['expect'])) echo "value=\"" . htmlspecialchars($pconfig['options']['expect']) . "\"";?> size="64" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_monitor[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<br />
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'Submit',
+ gettext("Save")
+));
+
+$section = new Form_Section('Edit Load Balancer - Monitor entry');
+
+$section->addInput(new Form_Input(
+ 'name',
+ 'Name',
+ 'text',
+ $pconfig['name']
+));
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+));
+
+$section->addInput(new Form_Select(
+ 'type',
+ 'Type',
+ $pconfig['type'],
+ $types
+));
+
+$form->add($section);
+
+$section = new Form_Section('HTTP Options');
+$section->addClass('http');
+
+$section->addInput(new Form_Input(
+ 'http_options_path',
+ 'Path',
+ 'text',
+ $pconfig['options']['path']
+));
+
+$section->addInput(new Form_Input(
+ 'http_options_host',
+ 'Host',
+ 'text',
+ $pconfig['options']['host']
+))->setHelp('Hostname for Host: header if needed.');
+
+$section->addInput(new Form_Select(
+ 'http_options_code',
+ 'HTTP Code',
+ $pconfig['options']['code'],
+ $rfc2616
+));
+
+$form->add($section);
+
+$section = new Form_Section('HTTPS Options');
+$section->addClass('https');
+
+$section->addInput(new Form_Input(
+ 'https_options_path',
+ 'Path',
+ 'text',
+ $pconfig['options']['path']
+));
+
+$section->addInput(new Form_Input(
+ 'https_options_host',
+ 'Host',
+ 'text',
+ $pconfig['options']['host']
+))->setHelp('Hostname for Host: header if needed.');
+
+$section->addInput(new Form_Select(
+ 'https_options_code',
+ 'HTTPS Code',
+ $pconfig['options']['code'],
+ $rfc2616
+));
+
+$form->add($section);
+
+$section = new Form_Section('Send/Expect Options');
+$section->addClass('send');
+
+$section->addInput(new Form_Input(
+ 'send_options_send',
+ 'Send',
+ 'text',
+ $pconfig['options']['send']
+));
+
+$section->addInput(new Form_Input(
+ 'send_options_expect',
+ 'Expect',
+ 'text',
+ $pconfig['options']['expect']
+));
+
+if (isset($id) && $a_monitor[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+
+print($form);
+
+include("foot.inc");
diff --git a/src/usr/local/www/load_balancer_pool.php b/src/usr/local/www/load_balancer_pool.php
index 47f3a89..dbdbb1c 100644
--- a/src/usr/local/www/load_balancer_pool.php
+++ b/src/usr/local/www/load_balancer_pool.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -48,6 +48,7 @@ require_once("shaper.inc");
if (!is_array($config['load_balancer']['lbpool'])) {
$config['load_balancer']['lbpool'] = array();
}
+
$a_pool = &$config['load_balancer']['lbpool'];
@@ -91,69 +92,102 @@ $mondex = array();
for ($i = 0; isset($config['load_balancer']['monitor_type'][$i]); $i++) {
$mondex[$config['load_balancer']['monitor_type'][$i]['name']] = $i;
}
+
for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
$a_pool[$i]['monitor'] = "<a href=\"/load_balancer_monitor_edit.php?id={$mondex[$a_pool[$i]['monitor']]}\">" . htmlspecialchars($a_pool[$i]['monitor']) . "</a>";
}
-$pgtitle = array(gettext("Services"), gettext("Load Balancer"), gettext("Pool"));
+$pgtitle = array(gettext("Services"), gettext("Load Balancer"),gettext("Pool"));
$shortcut_section = "relayd";
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg);
+
+if (is_subsystem_dirty('loadbalancer'))
+ print_info_box_np(sprintf(gettext("The load balancer configuration has been changed%sYou must apply the changes in order for them to take effect."), "<br />"));
+
+/* active tabs */
+$tab_array = array();
+$tab_array[] = array(gettext("Pools"), true, "load_balancer_pool.php");
+$tab_array[] = array(gettext("Virtual Servers"), false, "load_balancer_virtual_server.php");
+$tab_array[] = array(gettext("Monitors"), false, "load_balancer_monitor.php");
+$tab_array[] = array(gettext("Settings"), false, "load_balancer_setting.php");
+display_top_tabs($tab_array);
+
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
<form action="load_balancer_pool.php" method="post">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('loadbalancer')): ?><br/>
-<?php print_info_box_np(sprintf(gettext("The load balancer configuration has been changed%sYou must apply the changes in order for them to take effect."), "<br />"));?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="load balancer pools">
- <tr><td class="tabnavtbl">
- <?php
- /* active tabs */
- $tab_array = array();
- $tab_array[] = array(gettext("Pools"), true, "load_balancer_pool.php");
- $tab_array[] = array(gettext("Virtual Servers"), false, "load_balancer_virtual_server.php");
- $tab_array[] = array(gettext("Monitors"), false, "load_balancer_monitor.php");
- $tab_array[] = array(gettext("Settings"), false, "load_balancer_setting.php");
- display_top_tabs($tab_array);
- ?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Pool')?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext('Name')?></th>
+ <th><?=gettext('Mode')?></th>
+ <th><?=gettext('Servers')?></th>
+ <th><?=gettext('Port')?></th>
+ <th><?=gettext('Monitor')?></th>
+ <th><?=gettext('Description')?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+
+$idx = 0;
+foreach($a_pool as $pool) {
+?>
+ <tr>
+ <td>
+ <?=$pool['name']?>
+ </td>
+ <td>
+ <?=$pool['mode']?>
+ </td>
+ <td>
<?php
- $t = new MainTable();
- $t->edit_uri('load_balancer_pool_edit.php');
- $t->my_uri('load_balancer_pool.php');
- $t->add_column(gettext('Name'), 'name', 10);
- $t->add_column(gettext('Mode'), 'mode', 10);
- $t->add_column(gettext('Servers'), 'servers', 15);
- $t->add_column(gettext('Port'), 'port', 10);
- $t->add_column(gettext('Monitor'), 'monitor', 10);
- $t->add_column(gettext('Description'), 'descr', 25);
- $t->add_button('edit');
- $t->add_button('dup');
- $t->add_button('del');
- $t->add_content_array($a_pool);
- $t->display();
+ $numsvrs = count($pool['servers']) - 1;
+
+ foreach ($pool['servers'] as $server => $ip) {
+ print($ip);
+ print(($server < $numsvrs) ? '<br />':'');
+ }
+
?>
- </div>
- </td>
- </tr>
- <tr>
- <td>
- <br />
- <span class="red"><strong><?=gettext("Hint:");?></strong></span>
- <br />
- <?= sprintf(gettext("The Load Balancer in %s 2.0 is for server load balancing, not Multi-WAN. For load balancing or failover for multiple WANs, use "), $g['product_name']);?>
- <a href="/system_gateway_groups.php"><?= gettext("Gateway Groups"); ?></a>
- </td>
- </tr>
-</table>
+ </td>
+ <td>
+ <?=$pool['port']?>
+ </td>
+ <td>
+ <?=$pool['monitor']?>
+ </td>
+ <td>
+ <?=$pool['descr']?>
+ </td>
+ <td>
+ <a href="load_balancer_pool_edit.php?id=<?=$idx?>" class="btn btn-xs btn-info"><?=gettext('Edit')?></a>
+ <a href="load_balancer_pool.php?act=del&id=<?=$idx?>" class="btn btn-xs btn-danger"><?=gettext('Delete')?></a>
+ <a href="load_balancer_pool_edit.php?act=dup&id=<?=$idx?>" class="btn btn-xs btn-default"><?=gettext('Duplicate')?></a>
+ </td>
+ </tr>
+<?php
+ $idx++;
+}
+?>
+ </tbody>
+ </table>
+ </div>
+
+ <nav class="action-buttons">
+ <a href="load_balancer_pool_edit.php" class="btn btn-success"><?=gettext('Add')?></a>
+ </nav>
+
+ </div>
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/load_balancer_pool_edit.php b/src/usr/local/www/load_balancer_pool_edit.php
index cf5c72f..876abe5 100644
--- a/src/usr/local/www/load_balancer_pool_edit.php
+++ b/src/usr/local/www/load_balancer_pool_edit.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -44,23 +44,18 @@ require("guiconfig.inc");
require_once("filter.inc");
require_once("util.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/load_balancer_pool.php');
-}
+$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/load_balancer_pool.php');
if (!is_array($config['load_balancer']['lbpool'])) {
$config['load_balancer']['lbpool'] = array();
}
+
$a_pool = &$config['load_balancer']['lbpool'];
-if (is_numericint($_GET['id'])) {
+if (is_numericint($_GET['id']))
$id = $_GET['id'];
-}
-if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+if (isset($_POST['id']) && is_numericint($_POST['id']))
$id = $_POST['id'];
-}
if (isset($id) && $a_pool[$id]) {
$pconfig['name'] = $a_pool[$id]['name'];
@@ -84,77 +79,71 @@ if ($_POST) {
/* input validation */
$reqdfields = explode(" ", "name mode port monitor servers");
- $reqdfieldsn = array(gettext("Name"), gettext("Mode"), gettext("Port"), gettext("Monitor"), gettext("Server List"));
+ $reqdfieldsn = array(gettext("Name"),gettext("Mode"),gettext("Port"),gettext("Monitor"),gettext("Server List"));
do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
/* Ensure that our pool names are unique */
- for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
- if (($_POST['name'] == $config['load_balancer']['lbpool'][$i]['name']) && ($i != $id)) {
+ for ($i=0; isset($config['load_balancer']['lbpool'][$i]); $i++)
+ if (($_POST['name'] == $config['load_balancer']['lbpool'][$i]['name']) && ($i != $id))
$input_errors[] = gettext("This pool name has already been used. Pool names must be unique.");
- }
- }
- if (preg_match('/[ \/]/', $_POST['name'])) {
+ if (preg_match('/[ \/]/', $_POST['name']))
$input_errors[] = gettext("You cannot use spaces or slashes in the 'name' field.");
- }
- if (strlen($_POST['name']) > 16) {
+ if (strlen($_POST['name']) > 16)
$input_errors[] = gettext("The 'name' field must be 16 characters or less.");
- }
- if (in_array($_POST['name'], $reserved_table_names)) {
+ if (in_array($_POST['name'], $reserved_table_names))
$input_errors[] = sprintf(gettext("The name '%s' is a reserved word and cannot be used."), $_POST['name']);
- }
- if (is_alias($_POST['name'])) {
+ if (is_alias($_POST['name']))
$input_errors[] = sprintf(gettext("Sorry, an alias is already named %s."), $_POST['name']);
- }
- if (!is_portoralias($_POST['port'])) {
+ if (!is_portoralias($_POST['port']))
$input_errors[] = gettext("The port must be an integer between 1 and 65535, or a port alias.");
- }
// May as well use is_port as we want a positive integer and such.
- if (!empty($_POST['retry']) && !is_port($_POST['retry'])) {
+ if (!empty($_POST['retry']) && !is_port($_POST['retry']))
$input_errors[] = gettext("The retry value must be an integer between 1 and 65535.");
- }
if (is_array($_POST['servers'])) {
- foreach ($pconfig['servers'] as $svrent) {
+ foreach($pconfig['servers'] as $svrent) {
if (!is_ipaddr($svrent) && !is_subnetv4($svrent)) {
$input_errors[] = sprintf(gettext("%s is not a valid IP address or IPv4 subnet (in \"enabled\" list)."), $svrent);
- } else if (is_subnetv4($svrent) && subnet_size($svrent) > 64) {
+ }
+ else if (is_subnetv4($svrent) && subnet_size($svrent) > 64) {
$input_errors[] = sprintf(gettext("%s is a subnet containing more than 64 IP addresses (in \"enabled\" list)."), $svrent);
}
}
}
+
if (is_array($_POST['serversdisabled'])) {
- foreach ($pconfig['serversdisabled'] as $svrent) {
+ foreach($pconfig['serversdisabled'] as $svrent) {
if (!is_ipaddr($svrent) && !is_subnetv4($svrent)) {
$input_errors[] = sprintf(gettext("%s is not a valid IP address or IPv4 subnet (in \"disabled\" list)."), $svrent);
- } else if (is_subnetv4($svrent) && subnet_size($svrent) > 64) {
+ }
+ else if (is_subnetv4($svrent) && subnet_size($svrent) > 64) {
$input_errors[] = sprintf(gettext("%s is a subnet containing more than 64 IP addresses (in \"disabled\" list)."), $svrent);
}
}
}
+
$m = array();
- for ($i = 0; isset($config['load_balancer']['monitor_type'][$i]); $i++) {
+
+ for ($i=0; isset($config['load_balancer']['monitor_type'][$i]); $i++)
$m[$config['load_balancer']['monitor_type'][$i]['name']] = $config['load_balancer']['monitor_type'][$i];
- }
- if (!isset($m[$_POST['monitor']])) {
+ if (!isset($m[$_POST['monitor']]))
$input_errors[] = gettext("Invalid monitor chosen.");
- }
if (!$input_errors) {
$poolent = array();
- if (isset($id) && $a_pool[$id]) {
+ if(isset($id) && $a_pool[$id])
$poolent = $a_pool[$id];
- }
- if ($poolent['name'] != "") {
+
+ if($poolent['name'] != "")
$changedesc .= sprintf(gettext(" modified '%s' pool:"), $poolent['name']);
- }
update_if_changed("name", $poolent['name'], $_POST['name']);
update_if_changed("mode", $poolent['mode'], $_POST['mode']);
@@ -168,14 +157,12 @@ if ($_POST) {
if (isset($id) && $a_pool[$id]) {
/* modify all virtual servers with this name */
for ($i = 0; isset($config['load_balancer']['virtual_server'][$i]); $i++) {
- if ($config['load_balancer']['virtual_server'][$i]['lbpool'] == $a_pool[$id]['name']) {
+ if ($config['load_balancer']['virtual_server'][$i]['lbpool'] == $a_pool[$id]['name'])
$config['load_balancer']['virtual_server'][$i]['lbpool'] = $poolent['name'];
- }
}
$a_pool[$id] = $poolent;
- } else {
+ } else
$a_pool[] = $poolent;
- }
if ($changecount > 0) {
/* Mark pool dirty */
@@ -188,181 +175,272 @@ if ($_POST) {
}
}
-$pgtitle = array(gettext("Services"), gettext("Load Balancer"), gettext("Pool"), gettext("Edit"));
+$pgtitle = array(gettext("Services"), gettext("Load Balancer"),gettext("Pool"),gettext("Edit"));
$shortcut_section = "relayd";
include("head.inc");
-
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
<script type="text/javascript">
//<![CDATA[
-function clearcombo() {
- for (var i = document.iform.serversSelect.options.length - 1; i >= 0; i--) {
- document.iform.serversSelect.options[i] = null;
+events.push(function(){
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
}
- document.iform.serversSelect.selectedIndex = -1;
-}
-//]]>
-</script>
-<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
-<script type="text/javascript" src="/javascript/suggestions.js"></script>
-
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-
-<form action="load_balancer_pool_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="load balancer pool entry">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Add/edit Load Balancer - Pool entry"); ?></td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <input name="name" type="text" <?if (isset($pconfig['name'])) echo "value=\"" . htmlspecialchars($pconfig['name']) . "\"";?> size="16" maxlength="16" />
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Mode"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <select id="mode" name="mode" onchange="enforceFailover(); checkPoolControls();">
- <option value="loadbalance" <?if (!isset($pconfig['mode']) || ($pconfig['mode'] == "loadbalance")) echo "selected=\"selected\"";?>><?=gettext("Load Balance");?></option>
- <option value="failover" <?if ($pconfig['mode'] == "failover") echo "selected=\"selected\"";?>><?=gettext("Manual Failover");?></option>
- </select>
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <input name="descr" type="text" <?if (isset($pconfig['descr'])) echo "value=\"" . htmlspecialchars($pconfig['descr']) . "\"";?> size="64" />
- </td>
- </tr>
-
- <tr align="left">
- <td width="22%" valign="top" id="monitorport_text" class="vncellreq"><?=gettext("Port"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <input class="formfldalias" id="port" name="port" type="text" <?if (isset($pconfig['port'])) echo "value=\"" . htmlspecialchars($pconfig['port']) . "\"";?> size="16" maxlength="16" /><br />
- <div id="monitorport_desc">
- <?=gettext("This is the port your servers are listening on."); ?><br />
- <?=gettext("You may also specify a port alias listed in Firewall -&gt; Aliases here."); ?>
- </div>
- <script type="text/javascript">
- //<![CDATA[
- var addressarray = <?= json_encode(get_alias_list(array("port", "url_ports", "urltable_ports"))) ?>;
- var oTextbox1 = new AutoSuggestControl(document.getElementById("port"), new StateSuggestions(addressarray));
- //]]>
- </script>
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" id="retry_text" class="vncell"><?=gettext("Retry"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <input name="retry" type="text" <?if (isset($pconfig['retry'])) echo "value=\"" . htmlspecialchars($pconfig['retry']) . "\"";?> size="16" maxlength="16" /><br />
- <div id="retry_desc"><?=gettext("Optionally specify how many times to retry checking a server before declaring it down."); ?></div>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Add item to pool"); ?></td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Monitor"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <?php if (count($config['load_balancer']['monitor_type'])): ?>
- <select id="monitor" name="monitor">
- <?php
- foreach ($config['load_balancer']['monitor_type'] as $monitor) {
- if ($monitor['name'] == $pconfig['monitor']) {
- $selected=" selected=\"selected\"";
- } else {
- $selected = "";
- }
- echo "<option value=\"{$monitor['name']}\"{$selected}>{$monitor['name']}</option>";
- }
- ?>
- </select>
- <?php else: ?>
- <b><?=gettext("NOTE"); ?>:</b> <?=gettext("Please add a monitor IP address on the monitors tab if you wish to use this feature."); ?>
- <?php endif; ?>
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Server IP Address"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <input name="ipaddr" type="text" size="16" style="float: left;" />
- <input class="formbtn" type="button" name="button1" value="<?=gettext("Add to pool"); ?>" onclick="AddServerToPool(document.iform); enforceFailover(); checkPoolControls();" /><br />
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Current Pool Members"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Members"); ?></td>
- <td width="78%" class="vtable" colspan="2" valign="top">
- <table summary="members">
- <tbody>
- <tr>
- <td align="center">
- <b><?=gettext("Pool Disabled"); ?></b>
- <br/>
- <select id="serversDisabledSelect" name="serversdisabled[]" multiple="multiple" size="5">
-<?php
- if (is_array($pconfig['serversdisabled'])) {
- foreach ($pconfig['serversdisabled'] as $svrent) {
- if ($svrent != '') echo " <option value=\"{$svrent}\">{$svrent}</option>\n";
+ // Select every option in the specified multiselect
+ function AllServers(id, selectAll) {
+ for (i = 0; i < id.length; i++) {
+ id.eq(i).prop('selected', selectAll);
+ }
+ }
+
+ // Move all selected options from one multiselect to another
+ function moveOptions(From, To) {
+ var len = From.length;
+ var option;
+
+ if(len > 1) {
+ for(i=0; i<len; i++) {
+ if(From.eq(i).is(':selected')) {
+ option = From.eq(i).val();
+ To.append(new Option(option, option));
+ From.eq(i).remove();
+ }
+ }
}
}
-?>
- </select>
- <input class="formbtn" type="button" name="removeDisabled" value="<?=gettext("Remove"); ?>" onclick="RemoveServerFromPool(document.iform, 'serversdisabled[]');" />
- </td>
-
- <td valign="middle">
- <input class="formbtn" type="button" id="moveToEnabled" name="moveToEnabled" value=">" onclick="moveOptions(document.iform.serversDisabledSelect, document.iform.serversSelect); checkPoolControls();" /><br />
- <input class="formbtn" type="button" id="moveToDisabled" name="moveToDisabled" value="<" onclick="moveOptions(document.iform.serversSelect, document.iform.serversDisabledSelect); checkPoolControls();" />
- </td>
-
- <td align="center">
- <b><?=gettext("Enabled (default)"); ?></b>
- <br/>
- <select id="serversSelect" name="servers[]" multiple="multiple" size="5">
-<?php
- if (is_array($pconfig['servers'])) {
- foreach ($pconfig['servers'] as $svrent) {
- echo " <option value=\"{$svrent}\">{$svrent}</option>\n";
+
+ function checkPoolControls() {
+
+ if ($("#mode").val() == "failover") {
+ disableInput('movetoenabled', $('[name="servers[]"] option').length > 0);
+ } else {
+ disableInput('movetoenabled',false);
}
}
-?>
- </select>
- <input class="formbtn" type="button" name="removeEnabled" value="<?=gettext("Remove"); ?>" onclick="RemoveServerFromPool(document.iform, 'servers[]');" />
- </td>
- </tr>
- </tbody>
- </table>
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <br />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="AllServers('serversSelect', true); AllServers('serversDisabledSelect', true);" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_pool[$id] && $_GET['act'] != 'dup'): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<br />
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+ // Move (copy/delete) all but one of the items in the Enabled (server) list to the Disabled list
+ function enforceFailover() {
+ if ($('#mode').val() != 'failover') {
+ return;
+ }
+
+ var len = $('[name="servers[]"] option').length;
+ var option;
+
+ if(len > 1) {
+ for(i=len-1; i>0; i--) {
+ option = $('[name="servers[]"] option').eq(i).val();
+ $('[name="serversdisabled[]"]').append(new Option(option, option));
+ $('[name="servers[]"] option').eq(i).remove();
+ }
+ }
+ }
+
+ // Make buttons plain buttons, not a submit
+ $("#btnaddtopool").prop('type','button');
+ $("#removeenabled").prop('type','button');
+ $("#removedisabled").prop('type','button');
+ $("#movetodisabled").prop('type','button');
+ $("#movetoenabled").prop('type','button');
+
+ // On click . .
+ $("#btnaddtopool").click(function() {
+ $('[name="servers[]"]').append(new Option($('#ipaddr').val(), $('#ipaddr').val()));
+ enforceFailover();
+ checkPoolControls();
+ });
+
+ $('#mode').on('change', function() {
+ enforceFailover();
+ checkPoolControls();
+ });
+
+ $("#removeenabled").click(function() {
+ $('[name="servers[]"] option:selected').remove();
+ });
+
+ $("#removedisabled").click(function() {
+ $('[name="serversdisabled[]"] option:selected').remove();
+ });
+
+ $("#movetodisabled").click(function() {
+ moveOptions($('[name="servers[]"] option'), $('[name="serversdisabled[]"]'));
+ });
+
+ $("#movetoenabled").click(function() {
+ moveOptions($('[name="serversdisabled[]"] option'), $('[name="servers[]"]'));
+ });
+
+ // On initial page load
+ checkPoolControls();
+
+ // On submit
+ $('form').submit(function(){
+ AllServers($('[name="servers[]"] option'), true);
+ AllServers($('[name="serversdisabled[]"] option'), true);
+ });
+
+});
+//]]>
+</script>
+
+<?php
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'Submit',
+ gettext("Save")
+));
+
+$section = new Form_Section('Add/edit Load Balancer - Pool entry');
+
+$section->addInput(new Form_Input(
+ 'name',
+ 'Name',
+ 'text',
+ $pconfig['name']
+));
+
+$section->addInput(new Form_Select(
+ 'mode',
+ 'Mode',
+ $pconfig['mode'],
+ array(
+ 'loadbalance' => 'Load Balance',
+ 'failover' => 'Manual Failover'
+ )
+));
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+));
+
+$section->addInput(new Form_Input(
+ 'port',
+ 'Port',
+ 'text',
+ $pconfig['port']
+))->setHelp('This is the port your servers are listening on. You may also specify a port alias listed in Firewall -> Aliases here.');
+
+$section->addInput(new Form_Input(
+ 'retry',
+ 'Retry',
+ 'number',
+ $pconfig['retry'],
+ ['min' => '1', 'max' => '65536']
+))->setHelp('Optionally specify how many times to retry checking a server before declaring it down.');
+
+$form->add($section);
+
+$section = new Form_Section('Add item to the pool');
+
+$monitorlist = array();
+
+foreach ($config['load_balancer']['monitor_type'] as $monitor)
+ $monitorlist[$monitor['name']] = $monitor['name'];
+
+if(count($config['load_balancer']['monitor_type'])) {
+ $section->addInput(new Form_Select(
+ 'monitor',
+ 'Monitor',
+ $pconfig['monitor'],
+ $monitorlist
+ ));
+} else {
+ $section->addInput(new Form_StaticText(
+ 'Monitor',
+ 'Please add a monitor IP address on the monitors tab if you wish to use this feature."'
+ ));
+}
+
+$group = new Form_Group('Server IP Address');
+
+$group->add(new Form_IpAddress(
+ 'ipaddr',
+ 'IP Address',
+ $pconfig['ipaddr']
+));
+
+$group->add(new Form_Button(
+ 'btnaddtopool',
+ 'Add to pool'
+))->removeClass('btn-primary')->addClass('btn-default');
+
+$section->add($group);
+
+$form->add($section);
+
+$section = new Form_Section('Current pool members');
+
+$group = new Form_Group('Members');
+
+$group->add(new Form_Select(
+ 'serversdisabled',
+ null,
+ $pconfig['serversdisabled'],
+ is_array($pconfig['serversdisabled']) ? array_combine($pconfig['serversdisabled'], $pconfig['serversdisabled']) : array(),
+ true
+))->setHelp('Disabled');
+
+$group->add(new Form_Select(
+ 'servers',
+ null,
+ $pconfig['servers'],
+ is_array($pconfig['servers']) ? array_combine($pconfig['servers'], $pconfig['servers']) : array(),
+ true
+))->setHelp('Enabled (Default)');
+
+$section->add($group);
+
+$group = new Form_Group('');
+
+$group->add(new Form_Button(
+ 'removedisabled',
+ 'Remove'
+))->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$group->add(new Form_Button(
+ 'removeenabled',
+ 'Remove'
+))->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->add($group);
+
+$group = new Form_Group('');
+
+$group->add(new Form_Button(
+ 'movetoenabled',
+ 'Move to enabled list >'
+))->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$group->add(new Form_Button(
+ 'movetodisabled',
+ '< Move to disabled list'
+))->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->add($group);
+
+if (isset($id) && $a_pool[$id] && $_GET['act'] != 'dup') {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/load_balancer_setting.php b/src/usr/local/www/load_balancer_setting.php
index d82f341..371c91f 100644
--- a/src/usr/local/www/load_balancer_setting.php
+++ b/src/usr/local/www/load_balancer_setting.php
@@ -32,7 +32,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -51,10 +51,10 @@ require_once("util.inc");
if (!is_array($config['load_balancer']['setting'])) {
$config['load_balancer']['setting'] = array();
}
+
$lbsetting = &$config['load_balancer']['setting'];
if ($_POST) {
-
if ($_POST['apply']) {
$retval = 0;
$retval |= filter_configure();
@@ -79,7 +79,7 @@ if ($_POST) {
if (!is_numeric($_POST['prefork'])) {
$input_errors[] = gettext("Prefork must be a numeric value");
} else {
- if (($_POST['prefork'] <= 0) || ($_POST['prefork'] > 32)) {
+ if (($_POST['prefork']<=0) || ($_POST['prefork']>32)) {
$input_errors[] = gettext("Prefork value must be between 1 and 32");
}
}
@@ -97,77 +97,57 @@ if ($_POST) {
}
}
-$pgtitle = array(gettext("Services"), gettext("Load Balancer"), gettext("Settings"));
+$pgtitle = array(gettext("Services"),gettext("Load Balancer"),gettext("Settings"));
$shortcut_section = "relayd";
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="load_balancer_setting.php" method="post">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('loadbalancer')): ?><br/>
-<?php print_info_box_np(gettext("The load balancer configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="load balancer settings">
- <tr>
- <td class="tabnavtbl">
-<?php
- /* active tabs */
- $tab_array = array();
- $tab_array[] = array(gettext("Pools"), false, "load_balancer_pool.php");
- $tab_array[] = array(gettext("Virtual Servers"), false, "load_balancer_virtual_server.php");
- $tab_array[] = array(gettext("Monitors"), false, "load_balancer_monitor.php");
- $tab_array[] = array(gettext("Settings"), true, "load_balancer_setting.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Relayd global settings"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("timeout") ; ?></td>
- <td width="78%" class="vtable">
- <input name="timeout" id="timeout" value="<?php if ($lbsetting['timeout'] <> "") echo $lbsetting['timeout']; ?>" class="formfld unknown" />
- <br />
- <?=gettext("Set the global timeout in milliseconds for checks. Leave blank to use the default value of 1000 ms "); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("interval") ; ?></td>
- <td width="78%" class="vtable">
- <input name="interval" id="interval" value="<?php if ($lbsetting['interval'] <> "") echo $lbsetting['interval']; ?>" class="formfld unknown" />
- <br />
- <?=gettext("Set the interval in seconds at which the member of a pool will be checked. Leave blank to use the default interval of 10 seconds"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("prefork") ; ?></td>
- <td width="78%" class="vtable">
- <input name="prefork" id="prefork" value="<?php if ($lbsetting['prefork'] <> "") echo $lbsetting['prefork']; ?>" class="formfld unknown" />
- <br />
- <?=gettext("Number of processes used by relayd for dns protocol. Leave blank to use the default value of 5 processes"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('loadbalancer'))
+ print_info_box_np(gettext("The load balancer configuration has been changed") . ' ' .
+ gettext("You must apply the changes in order for them to take effect."), 'Apply', null, false, 'danger');
+
+/* active tabs */
+$tab_array = array();
+$tab_array[] = array(gettext("Pools"), false, "load_balancer_pool.php");
+$tab_array[] = array(gettext("Virtual Servers"), false, "load_balancer_virtual_server.php");
+$tab_array[] = array(gettext("Monitors"), false, "load_balancer_monitor.php");
+$tab_array[] = array(gettext("Settings"), true, "load_balancer_setting.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Relayd Global Settings');
+
+$section->addInput(new Form_Input(
+ 'timeout',
+ 'Timeout',
+ 'text',
+ $pconfig['timeout']
+))->setHelp('Set the global timeout in milliseconds for checks. Leave blank to use the default value of 1000 ms');
+
+$section->addInput(new Form_Input(
+ 'interval',
+ 'Interval',
+ 'text',
+ $pconfig['interval']
+))->setHelp('Set the interval in seconds at which the member of a pool will be checked. Leave blank to use the default interval of 10 seconds');
+
+$section->addInput(new Form_Input(
+ 'prefork',
+ 'Prefork',
+ 'text',
+ $pconfig['prefork']
+))->setHelp('Number of processes used by relayd for dns protocol. Leave blank to use the default value of 5 processes');
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/logo-black.png b/src/usr/local/www/logo-black.png
new file mode 100644
index 0000000..124d674
--- /dev/null
+++ b/src/usr/local/www/logo-black.png
Binary files differ
diff --git a/src/usr/local/www/logo.png b/src/usr/local/www/logo.png
new file mode 100644
index 0000000..9362fcb
--- /dev/null
+++ b/src/usr/local/www/logo.png
Binary files differ
diff --git a/src/usr/local/www/logobig.jpg b/src/usr/local/www/logobig.jpg
deleted file mode 100755
index 2ef196d..0000000
--- a/src/usr/local/www/logobig.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/niftycssCode.css b/src/usr/local/www/niftycssCode.css
deleted file mode 100755
index ec4af80..0000000
--- a/src/usr/local/www/niftycssCode.css
+++ /dev/null
@@ -1,21 +0,0 @@
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 0px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px} \ No newline at end of file
diff --git a/src/usr/local/www/niftycssprintCode.css b/src/usr/local/www/niftycssprintCode.css
deleted file mode 100755
index e856b5b..0000000
--- a/src/usr/local/www/niftycssprintCode.css
+++ /dev/null
@@ -1 +0,0 @@
-.rtop,.rbottom,.artop,.arbottom{display: none}
diff --git a/src/usr/local/www/pkg_mgr.php b/src/usr/local/www/pkg_mgr.php
index 85f378f..aa0ee0f 100644
--- a/src/usr/local/www/pkg_mgr.php
+++ b/src/usr/local/www/pkg_mgr.php
@@ -47,175 +47,200 @@ require_once("globals.inc");
require_once("guiconfig.inc");
require_once("pkg-utils.inc");
+$timezone = $config['system']['timezone'];
+if (!$timezone)
+ $timezone = "Etc/UTC";
+
+date_default_timezone_set($timezone);
+
/* if upgrade in progress, alert user */
-if (is_subsystem_dirty('packagelock')) {
- $pgtitle = array(gettext("System"), gettext("Package Manager"));
+if(is_subsystem_dirty('packagelock')) {
+ $pgtitle = array(gettext("System"),gettext("Package Manager"));
include("head.inc");
- echo "<body link=\"#0000CC\" vlink=\"#0000CC\" alink=\"#0000CC\">\n";
- include("fbegin.inc");
- echo "Please wait while packages are reinstalled in the background.";
- include("fend.inc");
- echo "</body>";
- echo "</html>";
+ print_info_box_np("Please wait while packages are reinstalled in the background.");
+ include("foot.inc");
exit;
}
-function domTT_title($title_msg) {
- if (!empty($title_msg)) {
- $title_msg = preg_replace("/\s+/", " ", $title_msg);
- $title_msg = preg_replace("/'/", "\'", $title_msg);
- echo "onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\" onmouseover=\"domTT_activate(this, event, 'content', '{$title_msg}', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle');\"";
+
+//get_pkg_info only if cache file has more then $g[min_pkg_cache_file_time] seconds
+$pkg_cache_file_time=($g['min_pkg_cache_file_time'] ? $g['min_pkg_cache_file_time'] : 120);
+
+$xmlrpc_base_url = get_active_xml_rpc_base_url();
+if (!file_exists("{$g['tmp_path']}/pkg_info.cache") || (time() - filemtime("{$g['tmp_path']}/pkg_info.cache")) > $pkg_cache_file_time) {
+ $pkg_info = get_pkg_info('all', array("noembedded", "name", "category", "website", "version", "status", "descr", "maintainer", "required_version", "maximum_version", "pkginfolink", "config_file"));
+ //create cache file after get_pkg_info
+ if($pkg_info) {
+ $fout = fopen("{$g['tmp_path']}/pkg_info.cache", "w");
+ fwrite($fout, serialize($pkg_info));
+ fclose($fout);
+ //$pkg_sizes = get_pkg_sizes();
+ } else {
+ $using_cache = true;
+ if(file_exists("{$g['tmp_path']}/pkg_info.cache")) {
+ $savemsg = sprintf(gettext("Unable to retrieve package info from %s. Cached data will be used."), $xmlrpc_base_url);
+ $pkg_info = unserialize(@file_get_contents("{$g['tmp_path']}/pkg_info.cache"));
+ } else {
+ $savemsg = sprintf(gettext('Unable to communicate with %1$s. Please verify DNS and interface configuration, and that %2$s has functional Internet connectivity.'), $xmlrpc_base_url, $g['product_name']);
+ }
}
+} else {
+ $pkg_info = unserialize(@file_get_contents("{$g['tmp_path']}/pkg_info.cache"));
}
-$pkg_info = get_pkg_info();
+if (! empty($_GET))
+ if (isset($_GET['ver']))
+ $requested_version = htmlspecialchars($_GET['ver']);
-$closehead = false;
-$pgtitle = array(gettext("System"), gettext("Package Manager"));
+$pgtitle = array(gettext("System"),gettext("Package Manager"));
include("head.inc");
-?>
-<script type="text/javascript" src="javascript/domTT/domLib.js"></script>
-<script type="text/javascript" src="javascript/domTT/domTT.js"></script>
-<script type="text/javascript" src="javascript/domTT/behaviour.js"></script>
-<script type="text/javascript" src="javascript/domTT/fadomatic.js"></script>
-<script type="text/javascript" src="/javascript/row_helper_dynamic.js"></script>
-</head>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php
- include("fbegin.inc");
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="package manager">
- <tr><td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Available Packages"), true, "pkg_mgr.php");
- $tab_array[] = array(gettext("Installed Packages"), false, "pkg_mgr_installed.php");
- display_top_tabs($tab_array);
-?>
- </td></tr>
- <tr><td>
-<?php
- if ($pkg_info) {
- //Check categories
- $categories = array();
- foreach ($pkg_info as $pkg_data) {
- if (isset($pkg_data['categories'][0])) {
- $categories[$pkg_data['categories'][0]]++;
- }
- }
- ksort($categories);
- $cm_count = 0;
- $tab_array = array();
- $visible_categories = array();
- $categories_min_count = ($g['pkg_categories_min_count'] ? $g['pkg_categories_min_count'] : 3);
- $categories_max_display = ($g['pkg_categories_max_display'] ? $g['pkg_categories_max_display'] : 6);
-
- /* check selected category or define default category to show */
- if (isset($_REQUEST['category'])) {
- $menu_category = $_REQUEST['category'];
- } else if (isset($g['pkg_default_category'])) {
- $menu_category = $g['pkg_default_category'];
- } else {
- $menu_category = "All";
- }
+/* Print package server mismatch warning. See https://redmine.pfsense.org/issues/484 */
+if (!verify_all_package_servers())
+ print_info_box(package_server_mismatch_message());
+
+/* Print package server SSL warning. See https://redmine.pfsense.org/issues/484 */
+if (check_package_server_ssl() === false)
+ print_info_box(package_server_ssl_failure_message());
+
+if ($savemsg)
+ print_info_box($savemsg);
+
+$version = rtrim(file_get_contents("/etc/version"));
- $menu_category = (isset($_REQUEST['category']) ? $_REQUEST['category'] : "All");
- $show_category = ($menu_category == "Other" || $menu_category == "All");
+$tab_array = array();
+$tab_array[] = array(gettext("Available Packages"), $requested_version <> "" ? false : true, "pkg_mgr.php");
+$tab_array[] = array(gettext("Installed Packages"), false, "pkg_mgr_installed.php");
+display_top_tabs($tab_array);
- $tab_array[] = array(gettext("All"), $menu_category == "All" ? true : false, "pkg_mgr.php?category=All");
- foreach ($categories as $category => $c_count) {
- if ($c_count >= $categories_min_count && $cm_count <= $categories_max_display) {
- $tab_array[] = array(gettext($category) , $menu_category == $category ? true : false, "pkg_mgr.php?category={$category}");
- $visible_categories[]=$category;
- $cm_count++;
+$version = rtrim(file_get_contents("/etc/version"));
+if($pkg_info) {
+ $pkg_keys = array_keys($pkg_info);
+ natcasesort($pkg_keys);
+
+ //Check categories
+ $categories=array();
+ if(is_array($pkg_keys)) {
+ foreach($pkg_keys as $key) {
+ if (!package_skip_tests($pkg_info[$key],$requested_version))
+ $categories[$pkg_info[$key]['category']]++;
}
}
- $tab_array[] = array(gettext("Other Categories"), $menu_category == "Other" ? true : false, "pkg_mgr.php?category=Other");
- if (count($categories) > 1) {
- display_top_tabs($tab_array);
+ ksort($categories);
+ $cm_count=0;
+ $tab_array = array();
+ $visible_categories=array();
+ $categories_min_count=($g['pkg_categories_min_count'] ? $g['pkg_categories_min_count'] : 3);
+ $categories_max_display=($g['pkg_categories_max_display'] ? $g['pkg_categories_max_display'] : 6);
+
+ /* check selected category or define default category to show */
+ if (isset($_REQUEST['category']))
+ $menu_category = $_REQUEST['category'];
+ else if (isset($g['pkg_default_category']))
+ $menu_category = $g['pkg_default_category'];
+ else
+ $menu_category = "All";
+
+ $menu_category = (isset($_REQUEST['category']) ? $_REQUEST['category'] : "All");
+ $show_category = ($menu_category == "Other" || $menu_category == "All");
+
+ $tab_array[] = array(gettext("All"), $menu_category=="All" ? true : false, "pkg_mgr.php?category=All");
+ foreach ($categories as $category => $c_count) {
+ if ($c_count >= $categories_min_count && $cm_count <= $categories_max_display) {
+ $tab_array[] = array(gettext($category) , $menu_category==$category ? true : false, "pkg_mgr.php?category={$category}");
+ $visible_categories[]=$category;
+ $cm_count++;
}
}
-?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont sortable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="10%" class="listhdrr"><?=gettext("Name"); ?></td>
-<?php
- if ($show_category) {
- print '<td width="18%" class="listhdr">'.gettext("Category").'</td>'."\n";
- }
-?>
- <td width="<?php print $show_category ? "15%" : "20%"; ?>" class="listhdr"><?=gettext("Version"); ?></td>
- <td width="<?php print $show_category ? "58%" : "70%"; ?>" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="17">&nbsp;</td>
- </tr>
-<?php
- if (!$pkg_info) {
- echo "<tr><td colspan=\"5\"><center>" . gettext("There are currently no packages available for installation.") . "</td></tr>";
- } else {
- if (is_array($pkg_info)) {
- foreach ($pkg_info as $index):
- if (get_package_id($index['name']) >= 0) {
- continue;
- }
-
- $shortname = $index['name'];
- pkg_remove_prefix($shortname);
-
- /* Check package info link */
- if ($index['www'] && $index['www'] != 'UNKNOWN') {
- $pkginfolink = $index['www'];
- $pkginfo=gettext("Package info");
- } else {
- $pkginfolink = "https://forum.pfsense.org/index.php/board,15.0.html";
- $pkginfo=gettext("No package info, check the forum");
- }
-
- if ($menu_category == "All" || $index['categories'][0] == $menu_category || ($menu_category == "Other" && !in_array($index['categories'][0], $visible_categories))):
-?>
- <tr valign="top" class="<?= $index['categories'][0] ?>">
- <td class="listlr" <?=domTT_title(gettext("Click on package name to access its website."))?>>
- <a target="_blank" href="<?= $index['www'] ?>"><?=$shortname;?></a>
- </td>
-<?php
- if ($show_category) {
- print '<td class="listr">'.gettext($index['categories'][0]).'</td>'."\n";
- }
+ $tab_array[] = array(gettext("Other Categories"), $menu_category=="Other" ? true : false, "pkg_mgr.php?category=Other");
+ if (count($categories) > 1)
+ display_top_tabs($tab_array);
+}
-?>
- <td class="listr"><?=$index['version'];?></td>
- <td class="listbg" style="overflow:hidden; text-align:justify;" <?=domTT_title(gettext("Click package info for more details about ".ucfirst($shortname)." package."))?>>
- <?=str_replace("\n", '<br />', $index['desc']);?>
-<?php
- if (!$g['disablepackageinfo']):
-?>
- <br /><br />
- <a target='_blank' href='<?=$pkginfolink?>' style='align:center;color:#ffffff; filter:Glow(color=#ff0000, strength=12);'><?=$pkginfo?></a>
+if(!$pkg_info || !is_array($pkg_keys)):?>
+ <div class="alert alert-warning">
+ <?=gettext("There are currently no packages available for installation.")?>
+ </div>
+<?php else: ?>
+ <div class="table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><?=gettext("Name")?></th>
+<?php if ($show_category):?>
+ <th><?=gettext("Category")?></th>
+<?php endif;?>
+ <th><?=gettext("Status")?></th>
+<?php if (!$g['disablepackagehistory']):?>
+ <th><?=gettext("Version")?></th>
+<?php endif;?>
+ <th><?=gettext("Platform")?></th>
+ <th><?=gettext("Description")?></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- endif;
+ foreach($pkg_keys as $key):
+ $index = &$pkg_info[$key];
+ if(get_pkg_id($index['name']) >= 0 )
+ continue;
+
+ if (package_skip_tests($index,$requested_version))
+ continue;
+
+ /* get history/changelog git dir */
+ $commit_dir=explode("/",$index['config_file']);
+ $changeloglink = "https://github.com/pfsense/pfsense-packages/commits/master/config/";
+ if ($commit_dir[(count($commit_dir)-2)] == "config")
+ $changeloglink .= $commit_dir[(count($commit_dir)-1)];
+ else
+ $changeloglink .= $commit_dir[(count($commit_dir)-2)];
+
+ if ($menu_category != "All" && $index['category'] != $menu_category && !($menu_category == "Other" && !in_array($index['category'], $visible_categories)))
+ continue;
?>
- </td>
- <td valign="middle" class="list nowrap" width="17">
- <a href="pkg_mgr_install.php?id=<?=$shortname;?>"><img <?=domTT_title(gettext("Install ".ucfirst($shortname)." package."))?> src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
+ <tr>
+ <td>
+<?php if ($index['website']):?>
+ <a title="<?=gettext("Visit official website")?>" target="_blank" href="<?=htmlspecialchars($index['website'])?>">
+<?php endif; ?>
+ <?=htmlspecialchars($index['name'])?>
+ </a>
+ </td>
+<?php if ($show_category):?>
+ <td>
+ <?=gettext($index['category'])?>
+ </td>
+<?php endif;?>
+ <td>
+ <?=ucfirst(strtolower($index['status']))?>
+ </td>
+<?php if (!$g['disablepackagehistory']):?>
+ <td>
+ <a target="_blank" title="<?=gettext("View changelog")?>" href="<?=htmlspecialchars($changeloglink)?>">
+ <?=htmlspecialchars($index['version'])?>
+ </a>
+ </td>
+<?php endif;?>
+ <td>
+ <?=$index['required_version']?>
+ <?php if ($index['maximum_version']):?>
+ (&lt; $index['maximum_version'])
+ <?php endif;?>
+ </td>
+ <td>
+ <?=$index['descr']?>
+ </td>
+ <td>
+ <a title="<?=gettext("Click to install")?>" href="pkg_mgr_install.php?id=<?=$index['name']?>" class="btn btn-success">install</a>
+<?php if(!$g['disablepackageinfo'] && $index['pkginfolink'] && $index['pkginfolink'] != $index['website']):?>
+ <a target="_blank" title="<?=gettext("View more inforation")?>" href="<?=htmlspecialchars($index['pkginfolink'])?>" class="btn btn-default">info</a>
+<?php endif;?>
+ </td>
+ </tr>
<?php
- endif;
- endforeach;
- } else {
- echo "<tr><td colspan='5' align='center'>" . gettext("There are currently no packages available for installation.") . "</td></tr>";
- } /* if (is_array($pkg_info)) */
- } /* if (!$pkg_info) */
-?>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ endforeach;
+endif;?>
+ </tbody>
+ </table>
+ </div>
+<?php include("foot.inc")?> \ No newline at end of file
diff --git a/src/usr/local/www/pkg_mgr_install.php b/src/usr/local/www/pkg_mgr_install.php
index 1de2a40..afad62f 100644
--- a/src/usr/local/www/pkg_mgr_install.php
+++ b/src/usr/local/www/pkg_mgr_install.php
@@ -55,11 +55,8 @@ $static_output = "";
$static_status = "";
$sendto = "output";
-$pgtitle = array(gettext("System"), gettext("Package Manager"), gettext("Install Package"));
-include("head.inc");
-
if ($_POST) {
- if (isset($_POST['pkgcancel']) || (empty($_POST['id']) && $_POST['mode'] != 'reinstallall')) {
+ if (empty($_POST['id']) && $_POST['mode'] != 'reinstallall') {
header("Location: pkg_mgr_installed.php");
return;
}
@@ -86,26 +83,18 @@ if ($_POST) {
}
}
-?>
+$pgtitle = array(gettext("System"),gettext("Package Manager"),gettext("Install Package"));
+include("head.inc");
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
- <form action="pkg_mgr_install.php" method="post">
- <div id="mainareapkg">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="package manager install">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Available packages"), false, "pkg_mgr.php");
- $tab_array[] = array(gettext("Installed packages"), false, "pkg_mgr_installed.php");
- $tab_array[] = array(gettext("Package Installer"), true, "");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
-<?php
-if ((empty($_GET['mode']) && $_GET['id']) || (!empty($_GET['mode']) && (!empty($_GET['pkg']) || $_GET['mode'] == 'reinstallall') && ($_GET['mode'] != 'installedinfo' && $_GET['mode'] != 'showlog'))):
+$tab_array = array();
+$tab_array[] = array(gettext("Available packages"), false, "pkg_mgr.php");
+$tab_array[] = array(gettext("Installed packages"), false, "pkg_mgr_installed.php");
+$tab_array[] = array(gettext("Package Installer"), true, "");
+display_top_tabs($tab_array);
+?>
+<form action="pkg_mgr_install.php" method="post" class="form-horizontal">
+ <h2>Add / remove package</h2>
+<?php if ((empty($_GET['mode']) && $_GET['id']) || (!empty($_GET['mode']) && (!empty($_GET['pkg']) || $_GET['mode'] == 'reinstallall') && ($_GET['mode'] != 'installedinfo' && $_GET['mode'] != 'showlog'))):
if (empty($_GET['mode']) && $_GET['id']) {
$pkgname = str_replace(array("<", ">", ";", "&", "'", '"', '.', '/'), "", htmlspecialchars_decode($_GET['id'], ENT_QUOTES | ENT_HTML401));
$pkgmode = 'installed';
@@ -115,7 +104,7 @@ if ((empty($_GET['mode']) && $_GET['id']) || (!empty($_GET['mode']) && (!empty($
} else if ($_GET['mode'] == 'reinstallall') {
$pkgmode = 'reinstallall';
}
- $pkg_gui_xml_text = "";
+
switch ($pkgmode) {
case 'reinstallall':
$pkgname = 'All packages';
@@ -134,65 +123,33 @@ if ((empty($_GET['mode']) && $_GET['id']) || (!empty($_GET['mode']) && (!empty($
break;
}
?>
- <tr>
- <td class="tabcont" align="center">
- <table style="height:15;colspacing:0" width="420" border="0" cellpadding="0" cellspacing="0" summary="images">
- <tr>
- <td class="tabcont" align="center">Package: <b><?=$pkgname;?></b><?=$pkg_gui_xml_text;?> will be <?=$pkgtxt;?>.<br/>
- Please confirm the action.<br/>
- </td>
- <td class="tabcont" align="center">
- <input type="hidden" name="id" value="<?=$pkgname;?>" />
- <input type="hidden" name="mode" value="<?=$pkgmode;?>" />
- <input type="submit" name="pkgconfirm" id="pkgconfirm" value="Confirm"/>
- <input type="submit" name="pkgcancel" id="pkgcancel" value="Cancel"/>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-<?php
-endif;
-if (!empty($_POST['id']) || $_GET['mode'] == 'showlog' || ($_GET['mode'] == 'installedinfo' && !empty($_GET['pkg']))):
-?>
- <tr>
- <td class="tabcont" align="center">
- <table style="height:15;colspacing:0" width="420" border="0" cellpadding="0" cellspacing="0" summary="images">
- <tr>
- <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_left.gif')" height="15" width="5"></td>
- <td>
- <table id="progholder" style="height:15;colspacing:0" width="410" border="0" cellpadding="0" cellspacing="0" summary="progress bar">
- <tr>
- <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_gray.gif')" valign="top" align="left">
- <img src='./themes/<?= $g['theme']; ?>/images/misc/bar_blue.gif' width="0" height="15" name="progressbar" id="progressbar" alt="progress bar" />
- </td>
- </tr>
- </table>
- </td>
- <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_right.gif')" height="15" width="5">
- </td>
- </tr>
- </table>
- <br />
- <!-- status box -->
- <textarea cols="80" rows="1" name="status" id="status" wrap="hard"><?=gettext("Beginning package installation.");?></textarea>
- <br />
- <!-- command output box -->
- <textarea cols="80" rows="35" name="output" id="output" wrap="hard"></textarea>
- </td>
- </tr>
-<?php endif; ?>
- </table>
+ <div class="panel panel-default">
+ <div class="panel-body">
+ <p>Package: <b><?=$pkgname;?></b> will be <?=$pkgtxt;?>.</p>
+ </div>
+ <div class="panel-footer">
+ <input type="hidden" name="id" value="<?=$pkgname;?>" />
+ <input type="hidden" name="mode" value="<?=$pkgmode;?>" />
+ </div>
+ </div>
+<?php endif;?>
+
+<?php if (!empty($_POST['id']) || $_GET['mode'] == 'showlog' || ($_GET['mode'] == 'installedinfo' && !empty($_GET['pkg']))):?>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 id="status"><?=gettext("Beginning package installation.")?></h2>
</div>
- </form>
-<?php include("fend.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
-NiftyCheck();
-Rounded("div#mainareapkg","bl br","#FFF","#eeeeee","smooth");
-//]]>
-</script>
+ <div class="panel-body">
+ <textarea rows="15" class="form-control" id="output"></textarea>
+
+ <div class="progress">
+ <div id="progressbar" class="progress-bar progress-bar-striped" role="progressbar" aria-valuemin="0" aria-valuemax="100" style="width: 1%"><span class="sr-only">1% Complete</span></div>
+ </div>
+ </div>
+ </div>
+<?php endif?>
+</form>
<?php
ob_flush();
@@ -317,7 +274,5 @@ if ($_GET) {
/* Restore to read only fs */
conf_mount_ro();
}
-?>
-</body>
-</html>
+include('foot.inc')?> \ No newline at end of file
diff --git a/src/usr/local/www/pkg_mgr_installed.php b/src/usr/local/www/pkg_mgr_installed.php
index 3801271..91c90be 100644
--- a/src/usr/local/www/pkg_mgr_installed.php
+++ b/src/usr/local/www/pkg_mgr_installed.php
@@ -52,29 +52,13 @@ date_default_timezone_set($timezone);
if (is_subsystem_dirty('packagelock')) {
$pgtitle = array(gettext("System"), gettext("Package Manager"));
include("head.inc");
- echo "<body link=\"#0000CC\" vlink=\"#0000CC\" alink=\"#0000CC\">\n";
- include("fbegin.inc");
- echo "Please wait while packages are reinstalled in the background.";
- include("fend.inc");
- echo "</body>";
- echo "</html>";
+ print_info_box_np("Please wait while packages are reinstalled in the background.");
+ include("foot.inc");
exit;
}
-function domTT_title($title_msg, $return="echo") {
- if (!empty($title_msg)) {
- $title_msg = preg_replace("/\s+/", " ", $title_msg);
- $title_msg = preg_replace("/'/", "\'", $title_msg);
- $title= "onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\" onmouseover=\"domTT_activate(this, event, 'content', '{$title_msg}', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle');\"";
- if ($return =="echo") {
- echo $title;
- } else {
- return $title;
- }
- }
-}
-if (is_array($config['installedpackages']['package'])) {
- foreach ($config['installedpackages']['package'] as $instpkg) {
+if(is_array($config['installedpackages']['package'])) {
+ foreach($config['installedpackages']['package'] as $instpkg) {
$tocheck[] = $instpkg['name'];
}
$currentvers = get_pkg_info($tocheck, array('version', 'xmlver', 'pkginfolink', 'descr'));
@@ -83,177 +67,113 @@ $closehead = false;
$pgtitle = array(gettext("System"), gettext("Package Manager"));
include("head.inc");
-?>
-<script type="text/javascript" src="javascript/domTT/domLib.js"></script>
-<script type="text/javascript" src="javascript/domTT/domTT.js"></script>
-<script type="text/javascript" src="javascript/domTT/behaviour.js"></script>
-<script type="text/javascript" src="javascript/domTT/fadomatic.js"></script>
-<script type="text/javascript" src="/javascript/row_helper_dynamic.js"></script>
-</head>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
- <?php include("fbegin.inc");
-
- /* Print package server mismatch warning. See https://redmine.pfsense.org/issues/484 */
- if (!verify_all_package_servers()) {
- print_info_box(package_server_mismatch_message());
- }
-
- /* Print package server SSL warning. See https://redmine.pfsense.org/issues/484 */
- if (check_package_server_ssl() === false) {
- print_info_box(package_server_ssl_failure_message());
- }
-?>
-
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="packages installed">
+/* Print package server mismatch warning. See https://redmine.pfsense.org/issues/484 */
+if (!verify_all_package_servers())
+ print_info_box(package_server_mismatch_message());
+
+/* Print package server SSL warning. See https://redmine.pfsense.org/issues/484 */
+if (check_package_server_ssl() === false)
+ print_info_box(package_server_ssl_failure_message());
+
+$version = file_get_contents("/etc/version");
+$tab_array = array();
+$tab_array[] = array(gettext("Available Packages"), false, "pkg_mgr.php");
+// $tab_array[] = array("{$version} " . gettext("packages"), false, "pkg_mgr.php");
+// $tab_array[] = array("Packages for any platform", false, "pkg_mgr.php?ver=none");
+// $tab_array[] = array("Packages for a different platform", $requested_version == "other" ? true : false, "pkg_mgr.php?ver=other");
+$tab_array[] = array(gettext("Installed Packages"), true, "pkg_mgr_installed.php");
+display_top_tabs($tab_array);
+
+if(!is_array($config['installedpackages']['package'])):?>
+ <div class="alert alert-warning">
+ <?=gettext("There are no packages currently installed.")?>
+ </div>
+<?php else: ?>
+ <div class="table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
<tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Available Packages"), false, "pkg_mgr.php");
-// $tab_array[] = array("{$g['product_version']} " . gettext("packages"), false, "pkg_mgr.php");
-// $tab_array[] = array("Packages for any platform", false, "pkg_mgr.php?ver=none");
-// $tab_array[] = array("Packages for a different platform", $requested_version == "other" ? true : false, "pkg_mgr.php?ver=other");
- $tab_array[] = array(gettext("Installed Packages"), true, "pkg_mgr_installed.php");
- display_top_tabs($tab_array);
- ?>
- </td>
+ <th><span class="sr-only"><?=gettext("Status")?></span></th>
+ <th><?=gettext("Name")?></th>
+ <th><?=gettext("Category")?></th>
+ <th><?=gettext("Version")?></th>
+ <th><?=gettext("Description")?></th>
</tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="12%" class="listhdrr"><?=gettext("Name"); ?></td>
- <td width="16%" class="listhdrr"><?=gettext("Category"); ?></td>
- <td width="15%" class="listhdrr"><?=gettext("Version"); ?></td>
- <td width="53%" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="40">&nbsp;</td>
- </tr>
- <?php
- if (is_array($config['installedpackages']['package'])):
-
- $instpkgs = array();
- foreach ($config['installedpackages']['package'] as $instpkg) {
- $instpkgs[] = $instpkg['name'];
- }
- natcasesort($instpkgs);
-
- foreach ($instpkgs as $index => $pkgname):
-
- $pkg = $config['installedpackages']['package'][$index];
- if (!$pkg['name']) {
- continue;
- }
-
- // get history/changelog git dir
- $commit_dir = explode("/", $pkg['config_file']);
- $changeloglink = "https://github.com/pfsense/pfsense-packages/commits/master/config/" . $commit_dir[(count($commit_dir)-2)];
- #check package version
- $latest_package = $currentvers[$pkg['name']]['version'];
- if ($latest_package) {
- // we're running a newer version of the package
- if (strcmp($pkg['version'], $latest_package) > 0) {
- $tdclass = "listbggrey";
- if ($g['disablepackagehistory']) {
- $pkgver = "<a>" . gettext("Available") . ": " . $latest_package . "<br />";
- } else {
- $pkgver = "<a target='_blank' href='$changeloglink'>" . gettext("Available") . ": " . $latest_package . "<br />";
- }
- $pkgver .= gettext("Installed") . ": " . $pkg['version'] . "</a>";
- }
- // we're running an older version of the package
- if (strcmp($pkg['version'], $latest_package) < 0) {
- $tdclass = "listbg";
- if ($g['disablepackagehistory']) {
- $pkgver = "<a><font color='#ffffff'>" . gettext("Available") . ": " . $latest_package . "</font><br />";
- } else {
- $pkgver = "<a target='_blank' href='$changeloglink'><font color='#ffffff'>" . gettext("Available") . ": " . $latest_package . "<br />";
- }
- $pkgver .= gettext("Installed") . ": " . $pkg['version'] . "</font></a>";
- }
- // we're running the current version
- if (!strcmp($pkg['version'], $latest_package)) {
- $tdclass = "listr";
- if ($g['disablepackagehistory']) {
- $pkgver = "<a>{$pkg['version']}</a>";
- } else {
- $pkgver = "<a target='_blank' href='$changeloglink'>{$pkg['version']}</a>";
- }
- }
- $pkgdescr = $currentvers[$pkg['name']]['descr'];
- } else {
- // unknown available package version
- $tdclass = "listbg";
- if ($g['disablepackagehistory']) {
- $pkgver = "<a><font color='#ffffff'>" . gettext("Latest") . ": " . gettext("N/A") . "</font><br />";
- } else {
- $pkgver = "<a target='_blank' href='$changeloglink'><font color='#ffffff'>" . gettext("Latest") . ": " . gettext("N/A") . "<br />";
- }
- $pkgver .= gettext("Installed") . ": " . $pkg['version'] . "</font></a>";
- $pkgdescr = $pkg['descr'];
- }
- /* Check package info link */
- if ($pkg['pkginfolink']) {
- $pkginfolink = $pkg['pkginfolink'];
- $pkginfo=gettext("Package info");
- } else {
- $pkginfolink = "https://forum.pfsense.org/index.php/board,15.0.html";
- $pkginfo=gettext("No package info, check the forum");
- }
-
- ?>
- <tr valign="top">
- <td class="listlr">
- <?=$pkg['name'];?>
- </td>
- <td class="listr">
- <?=$pkg['category'];?>
- </td>
- <?php
- if (isset($g['disablepackagehistory'])) {
- echo "<td class='{$tdclass}'>{$pkgver}</td>";
- } else {
- echo "<td class='{$tdclass}' " . domTT_title(gettext("Click on " . ucfirst($pkg['name']) . " version to check its change log."), "return").">{$pkgver}</td>";
- }
- ?>
- <td class="listbg" style="overflow:hidden; text-align:justify;" <?=domTT_title(gettext("Click package info for more details about " . ucfirst($pkg['name']) . " package."))?>>
- <?=$pkgdescr;?>
- <?php if (!$g['disablepackageinfo']): ?>
- <br /><br />
- <a target='_blank' href='<?=$pkginfolink?>' style='align:center;color:#ffffff; filter:Glow(color=#ff0000, strength=12);'><?=$pkginfo?></a>
- <?php endif; ?>
- </td>
- <td valign="middle" class="list nowrap">
- <a href="pkg_mgr_install.php?mode=delete&amp;pkg=<?= $pkg['name']; ?>">
- <img <?=domTT_title(gettext("Remove " . ucfirst($pkg['name']) . " package."))?> src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" />
- </a>
- <br />
- <a href="pkg_mgr_install.php?mode=reinstallpkg&amp;pkg=<?= $pkg['name']; ?>">
- <img <?=domTT_title(gettext("Reinstall " . ucfirst($pkg['name']) . " package."));?> src="./themes/<?= $g['theme']; ?>/images/icons/icon_reinstall_pkg.gif" width="17" height="17" border="0" alt="reinstall" />
- </a>
- <a href="pkg_mgr_install.php?mode=reinstallxml&amp;pkg=<?= $pkg['name']; ?>">
- <img <?=domTT_title(gettext("Reinstall " . ucfirst($pkg['name']) . "'s GUI components."));?> src="./themes/<?= $g['theme']; ?>/images/icons/icon_reinstall_xml.gif" width="17" height="17" border="0" alt="reinstall" />
- </a>
- </td>
- </tr>
- <?php
- endforeach;
- else:
- ?>
- <tr>
- <td colspan="5" align="center">
- <?=gettext("There are no packages currently installed."); ?>
- </td>
- </tr>
- <?php
- endif;
- ?>
- </table>
- </div>
- </td>
- </tr>
- </table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </thead>
+ <tbody>
+<?php
+ $instpkgs = array();
+ foreach($config['installedpackages']['package'] as $instpkg) {
+ $instpkgs[] = $instpkg['name'];
+ }
+ natcasesort($instpkgs);
+
+ foreach ($instpkgs as $index => $pkgname):
+ $pkg = $config['installedpackages']['package'][$index];
+ if(!$pkg['name'])
+ continue;
+
+ // get history/changelog git dir
+ $commit_dir=explode("/",$pkg['config_file']);
+ $changeloglink ="https://github.com/pfsense/pfsense-packages/commits/master/config/".$commit_dir[(count($commit_dir)-2)];
+ #check package version
+ $latest_package = $currentvers[$pkg['name']]['version'];
+ if ($latest_package) {
+ // we're running a newer version of the package
+ if(strcmp($pkg['version'], $latest_package) > 0) {
+ $status = 'Newer then available ('. $latest_package .')';
+ $statusicon = 'exclamation';
+ }
+ // we're running an older version of the package
+ if(strcmp($pkg['version'], $latest_package) < 0) {
+ $status = 'Upgrade available to '.$latest_package;
+ $statusicon = 'plus';
+ }
+ // we're running the current version
+ if(!strcmp($pkg['version'], $latest_package)) {
+ $status = 'Up-to-date';
+ $statusicon = 'ok';
+ }
+ $pkgdescr = $currentvers[$pkg['name']]['descr'];
+ } else {
+ // unknown available package version
+ $status = 'Unknown';
+ $statusicon = 'question';
+ $pkgdescr = $pkg['descr'];
+ }
+?>
+ <tr>
+ <td>
+ <i title="<?=$status?>" class="icon icon-<?=$statusicon?>-sign"></i>
+ </td>
+ <td>
+ <?=$pkg['name']?>
+ </td>
+ <td>
+ <?=$pkg['category']?>
+ </td>
+ <td>
+<?php if (!$g['disablepackagehistory']):?>
+ <a target="_blank" title="<?=gettext("View changelog")?>" href="<?=htmlspecialchars($changeloglink)?>">
+<?php endif;?>
+ <?=htmlspecialchars($pkg['version'])?>
+ </a>
+ </td>
+ <td>
+ <?=$pkgdescr?>
+ </td>
+ <td>
+ <a href="pkg_mgr_install.php?mode=delete&amp;pkg=<?=$pkg['name']?>" class="btn btn-danger">remove</a>
+ <a href="pkg_mgr_install.php?mode=reinstallpkg&amp;pkg=<?=$pkg['name']?>" class="btn btn-info">reinstall</a>
+ <a href="pkg_mgr_install.php?mode=reinstallxml&amp;pkg=<?=$pkg['name']?>" class="btn btn-info"><?=gettext("reinstall GUI")?></a>
+<?php if(!$g['disablepackageinfo'] && $pkg['pkginfolink'] && $pkg['pkginfolink'] != $pkg['website']):?>
+ <a target="_blank" title="<?=gettext("View more inforation")?>" href="<?=htmlspecialchars($pkg['pkginfolink'])?>" class="btn btn-default">info</a>
+<?php endif;?>
+ </td>
+ </tr>
+<?php endforeach;?>
+ </tbody>
+</table>
+</div>
+<?php endif; ?>
+<?php include("foot.inc")?> \ No newline at end of file
diff --git a/src/usr/local/www/pkg_mgr_settings.php b/src/usr/local/www/pkg_mgr_settings.php
index 04a5151..da3c393 100644
--- a/src/usr/local/www/pkg_mgr_settings.php
+++ b/src/usr/local/www/pkg_mgr_settings.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: pkgs
+ pfSense_MODULE: pkgs
*/
##|+PRIV
@@ -56,108 +56,60 @@ if ($_POST) {
}
write_config();
}
+
+ write_config();
}
$curcfg = $config['system']['altpkgrepo'];
$closehead = false;
$pgtitle = array(gettext("System"), gettext("Package Settings"));
include("head.inc");
-?>
-<script type="text/javascript">
-//<![CDATA[
-
-function enable_altpkgrepourl(enable_over) {
- if (document.iform.alturlenable.checked || enable_over) {
- document.iform.pkgrepourl.disabled = 0;
- } else {
- document.iform.pkgrepourl.disabled = 1;
- }
-}
-//]]>
-</script>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc");
+// Print package server mismatch warning. See https://redmine.pfsense.org/issues/484
+if (!verify_all_package_servers())
+ print_info_box(package_server_mismatch_message());
- /* Print package server mismatch warning. See https://redmine.pfsense.org/issues/484 */
- if (!verify_all_package_servers()) {
- print_info_box(package_server_mismatch_message());
- }
+// Print package server SSL warning. See https://redmine.pfsense.org/issues/484
+if (check_package_server_ssl() === false)
+ print_info_box(package_server_ssl_failure_message());
- /* Print package server SSL warning. See https://redmine.pfsense.org/issues/484 */
- if (check_package_server_ssl() === false) {
- print_info_box(package_server_ssl_failure_message());
- }
-?>
+if ($savemsg)
+ print_info_box($savemsg);
-<?php if ($input_errors) print_input_errors($input_errors); ?>
+$version = file_get_contents("/etc/version");
+$tab_array = array();
+$tab_array[] = array(sprintf(gettext("%s packages"), $version), false, "pkg_mgr.php");
+$tab_array[] = array(gettext("Installed Packages"), false, "pkg_mgr_installed.php");
+$tab_array[] = array(gettext("Package Settings"), true, "pkg_mgr_settings.php");
+display_top_tabs($tab_array);
-<form action="pkg_mgr_settings.php" method="post" name="iform" id="iform">
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="package manager settings">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(sprintf(gettext("%s packages"), $g['product_version']), false, "pkg_mgr.php");
- $tab_array[] = array(gettext("Installed Packages"), false, "pkg_mgr_installed.php");
- $tab_array[] = array(gettext("Package Settings"), true, "pkg_mgr_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="vncell">
- <?php echo gettext("This page allows an alternate package repository to be configured, primarily for temporary use as a testing mechanism."); ?>
- <?php echo gettext("The contents of unofficial packages servers cannot be verified and may contain malicious files."); ?>
- <?php echo gettext("The package server settings should remain at their default values to ensure that verifiable and trusted packages are recevied."); ?>
- <br/><br/>
- <?php echo gettext("A warning is printed on the Dashboard and in the package manager when an unofficial package server is in use."); ?>
- <br/><br/>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Package Repository URL");?></td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Package Repository URL");?></td>
- <td class="vtable">
- <input name="alturlenable" type="checkbox" id="alturlenable" value="yes" onclick="enable_altpkgrepourl()" <?php if (isset($curcfg['enable'])) echo "checked=\"checked\""; ?> /> <?=gettext("Use a non-official server for packages");?> <br />
- <table summary="alternative URL">
- <tr>
- <td><?=gettext("Base URL:");?></td>
- <td>
- <input name="pkgrepourl" type="text" class="formfld url" id="pkgrepourl" size="64" value="<?php if ($curcfg['xmlrpcbaseurl']) echo htmlspecialchars($curcfg['xmlrpcbaseurl']); else echo $g['']; ?>" />
- </td>
- </tr>
- </table>
- <span class="vexpl">
- <?php printf(gettext("This is where %s will check for packages when the"), $g['product_name']);?> <a href="pkg_mgr.php"><?=gettext("System: Packages");?></a> <?=gettext("page is viewed.");?>
- </span>
- </td>
- </tr>
- <script type="text/javascript">
- //<![CDATA[
- enable_altpkgrepourl();
- //]]>
- </script>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+print_info_box(gettext('This page allows an alternate package repository to be configured, primarily for temporary use as a testing mechanism.' .
+ 'The contents of unofficial packages servers cannot be verified and may contain malicious files.' .
+ 'The package server settings should remain at their default values to ensure that verifiable and trusted packages are recevied.' .
+ 'A warning is printed on the Dashboard and in the package manager when an unofficial package server is in use.'), 'default');
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Alternate package repository');
+
+$section->addInput(new Form_Checkbox(
+ 'alturlenable',
+ 'Enable Alternate',
+ 'Use a non-official server for packages',
+ $curcfg['enable']
+))->toggles('.form-group:not(:first-child)');
+
+$section->addInput(new Form_Input(
+ 'pkgrepourl',
+ 'Package Repository URL',
+ 'text',
+ $curcfg['xmlrpcbaseurl'] ? $curcfg['xmlrpcbaseurl'] : $g['']
+))->setHelp(sprintf("This is where %s will check for packages when the",$g['product_name']) .
+ '<a href="pkg_mgr.php">' . ' ' . 'System: Packages' . ' </a>' . 'page is viewed.');
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/protochart/ProtoChart.js b/src/usr/local/www/protochart/ProtoChart.js
deleted file mode 100644
index 4e60f18..0000000
--- a/src/usr/local/www/protochart/ProtoChart.js
+++ /dev/null
@@ -1,2653 +0,0 @@
-/**
- * Class: ProtoChart
- * Version: v0.5 beta
- *
- * ProtoChart is a charting lib on top of Prototype.
- * This library is heavily motivated by excellent work done by:
- * * Flot <http://code.google.com/p/flot/>
- * * Flotr <http://solutoire.com/flotr/>
- *
- * Complete examples can be found at: <http://www.deensoft.com/lab/protochart>
- */
-
-/**
- * Events:
- * ProtoChart:mousemove - Fired when mouse is moved over the chart
- * ProtoChart:plotclick - Fired when graph is clicked
- * ProtoChart:dataclick - Fired when graph is clicked AND the click is on a data point
- * ProtoChart:selected - Fired when certain region on the graph is selected
- * ProtoChart:hit - Fired when mouse is moved near or over certain data point on the graph
- */
-
-
-if(!Proto) var Proto = {};
-
-Proto.Chart = Class.create({
- /**
- * Function:
- * {Object} elem
- * {Object} data
- * {Object} options
- */
- initialize: function(elem, data, options)
- {
- options = options || {};
- this.graphData = [];
- /**
- * Property: options
- *
- * Description: Various options can be set. More details in description.
- *
- * colors:
- * {Array} - pass in a array which contains strings of colors you want to use. Default has 6 color set.
- *
- * legend:
- * {BOOL} - show - if you want to show the legend. Default is false
- * {integer} - noColumns - Number of columns for the legend. Default is 1
- * {function} - labelFormatter - A function that returns a string. The function is called with a string and is expected to return a string. Default = null
- * {string} - labelBoxBorderColor - border color for the little label boxes. Default #CCC
- * {HTMLElem} - container - an HTML id or HTML element where the legend should be rendered. If left null means to put the legend on top of the Chart
- * {string} - position - position for the legend on the Chart. Default value 'ne'
- * {integer} - margin - default valud of 5
- * {string} - backgroundColor - default to null (which means auto-detect)
- * {float} - backgroundOpacity - leave it 0 to avoid background
- *
- * xaxis (yaxis) options:
- * {string} - mode - default is null but you can pass a string "time" to indicate time series
- * {integer} - min
- * {integer} - max
- * {float} - autoscaleMargin - in % to add if auto-setting min/max
- * {mixed} - ticks - either [1, 3] or [[1, "a"], 3] or a function which gets axis info and returns ticks
- * {function} - tickFormatter - A function that returns a string as a tick label. Default is null
- * {float} - tickDecimals
- * {integer} - tickSize
- * {integer} - minTickSize
- * {array} - monthNames
- * {string} - timeformat
- *
- * Points / Lines / Bars options:
- * {bool} - show, default is false
- * {integer} - radius: default is 3
- * {integer} - lineWidth : default is 2
- * {bool} - fill : default is true
- * {string} - fillColor: default is #ffffff
- *
- * Grid options:
- * {string} - color
- * {string} - backgroundColor - defualt is *null*
- * {string} - tickColor - default is *#dddddd*
- * {integer} - labelMargin - should be in pixels default is 3
- * {integer} - borderWidth - default *1*
- * {bool} - clickable - default *null* - pass in TRUE if you wish to monitor click events
- * {mixed} - coloredAreas - default *null* - pass in mixed object eg. {x1, x2}
- * {string} - coloredAreasColor - default *#f4f4f4*
- * {bool} - drawXAxis - default *true*
- * {bool} - drawYAxis - default *true*
- *
- * selection options:
- * {string} - mode : either "x", "y" or "xy"
- * {string} - color : string
- */
- this.options = this.merge(options,{
- colors: ["#edc240", "#00A8F0", "#C0D800", "#cb4b4b", "#4da74d", "#9440ed"],
- legend: {
- show: false,
- noColumns: 1,
- labelFormatter: null,
- labelBoxBorderColor: "#ccc",
- container: null,
- position: "ne",
- margin: 5,
- backgroundColor: null,
- backgroundOpacity: 0.85
- },
- xaxis: {
- mode: null,
- min: null,
- max: null,
- autoscaleMargin: null,
- ticks: null,
- tickFormatter: null,
- tickDecimals: null,
- tickSize: null,
- minTickSize: null,
- monthNames: null,
- timeformat: null
- },
- yaxis: {
- mode: null,
- min: null,
- max: null,
- ticks: null,
- tickFormatter: null,
- tickDecimals: null,
- tickSize: null,
- minTickSize: null,
- monthNames: null,
- timeformat: null,
- autoscaleMargin: 0.02
- },
-
- points: {
- show: false,
- radius: 3,
- lineWidth: 2,
- fill: true,
- fillColor: "#ffffff"
- },
- lines: {
- show: false,
- lineWidth: 2,
- fill: false,
- fillColor: null
- },
- bars: {
- show: false,
- lineWidth: 2,
- barWidth: 1,
- fill: true,
- fillColor: null,
- showShadow: false,
- fillOpacity: 0.4,
- autoScale: true
- },
- pies: {
- show: false,
- radius: 50,
- borderWidth: 1,
- fill: true,
- fillColor: null,
- fillOpacity: 0.90,
- labelWidth: 30,
- fontSize: 11,
- autoScale: true
- },
- grid: {
- color: "#545454",
- backgroundColor: null,
- tickColor: "#dddddd",
- labelMargin: 3,
- borderWidth: 1,
- clickable: null,
- coloredAreas: null,
- coloredAreasColor: "#f4f4f4",
- drawXAxis: true,
- drawYAxis: true
- },
- mouse: {
- track: false,
- position: 'se',
- fixedPosition: true,
- clsName: 'mouseValHolder',
- trackFormatter: this.defaultTrackFormatter,
- margin: 3,
- color: '#ff3f19',
- trackDecimals: 1,
- sensibility: 2,
- radius: 5,
- lineColor: '#cb4b4b'
- },
- selection: {
- mode: null,
- color: "#97CBFF"
- },
- allowDataClick: true,
- makeRandomColor: false,
- shadowSize: 4
- });
-
- /*
- * Local variables.
- */
- this.canvas = null;
- this.overlay = null;
- this.eventHolder = null;
- this.context = null;
- this.overlayContext = null;
-
- this.domObj = $(elem);
-
- this.xaxis = {};
- this.yaxis = {};
- this.chartOffset = {left: 0, right: 0, top: 0, bottom: 0};
- this.yLabelMaxWidth = 0;
- this.yLabelMaxHeight = 0;
- this.xLabelBoxWidth = 0;
- this.canvasWidth = 0;
- this.canvasHeight = 0;
- this.chartWidth = 0;
- this.chartHeight = 0;
- this.hozScale = 0;
- this.vertScale = 0;
- this.workarounds = {};
-
- this.domObj = $(elem);
-
- this.barDataRange = [];
-
- this.lastMousePos = { pageX: null, pageY: null };
- this.selection = { first: { x: -1, y: -1}, second: { x: -1, y: -1} };
- this.prevSelection = null;
- this.selectionInterval = null;
- this.ignoreClick = false;
- this.prevHit = null;
-
- if(this.options.makeRandomColor)
- this.options.color = this.makeRandomColor(this.options.colors);
-
- this.setData(data);
- this.constructCanvas();
- this.setupGrid();
- this.draw();
- },
- /**
- * Private function internally used.
- */
- merge: function(src, dest)
- {
- var result = dest || {};
- for(var i in src){
- result[i] = (typeof(src[i]) == 'object' && !(src[i].constructor == Array || src[i].constructor == RegExp)) ? this.merge(src[i], dest[i]) : result[i] = src[i];
- }
- return result;
- },
- /**
- * Function: setData
- * {Object} data
- *
- * Description:
- * Sets datasoruces properly then sets the Bar Width accordingly, then copies the default data options and then processes the graph data
- *
- * Returns: none
- *
- */
- setData: function(data)
- {
- this.graphData = this.parseData(data);
- this.setBarWidth();
- this.copyGraphDataOptions();
- this.processGraphData();
- },
- /**
- * Function: parseData
- * {Object} data
- *
- * Return:
- * {Object} result
- *
- * Description:
- * Takes the provided data object and converts it into generic data that we can understand. User can pass in data in 3 different ways:
- * - [d1, d2]
- * - [{data: d1, label: "data1"}, {data: d2, label: "data2"}]
- * - [d1, {data: d1, label: "data1"}]
- *
- * This function parses these senarios and makes it readable
- */
- parseData: function(data)
- {
- var res = [];
- data.each(function(d){
- var s;
- if(d.data) {
- s = {};
- for(var v in d) {
- s[v] = d[v];
- }
- }
- else {
- s = {data: d};
- }
- res.push(s);
- }.bind(this));
- return res;
- },
- /**
- * function: makeRandomColor
- * {Object} colorSet
- *
- * Return:
- * {Array} result - array containing random colors
- */
- makeRandomColor: function(colorSet)
- {
- var randNum = Math.floor(Math.random() * colorSet.length);
- var randArr = [];
- var newArr = [];
- randArr.push(randNum);
-
- while(randArr.length < colorSet.length)
- {
- var tempNum = Math.floor(Math.random() * colorSet.length);
-
- while(checkExisted(tempNum, randArr))
- tempNum = Math.floor(Math.random() * colorSet.length);
-
- randArr.push(tempNum);
- }
-
- randArr.each(function(ra){
- newArr.push(colorSet[ra]);
-
- }.bind(this));
- return newArr;
- },
- /**
- * function: checkExisted
- * {Object} needle
- * {Object} haystack
- *
- * return:
- * {bool} existed - true if it finds needle in the haystack
- */
- checkExisted: function(needle, haystack)
- {
- var existed = false;
- haystack.each(function(aNeedle){
- if(aNeedle == needle) {
- existed = true;
- throw $break;
- }
- }.bind(this));
- return existed;
- },
- /**
- * function: setBarWidth
- *
- * Description: sets the bar width for Bar Graph, you should enable *autoScale* property for bar graph
- */
- setBarWidth: function()
- {
- if(this.options.bars.show && this.options.bars.autoScale)
- {
- this.options.bars.barWidth = 1 / this.graphData.length / 1.2;
- }
- },
- /**
- * Function: copyGraphDataOptions
- *
- * Description: Private function that goes through each graph data (series) and assigned the graph
- * properties to it.
- */
- copyGraphDataOptions: function()
- {
- var i, neededColors = this.graphData.length, usedColors = [], assignedColors = [];
-
- this.graphData.each(function(gd){
- var sc = gd.color;
- if(sc) {
- --neededColors;
- if(Object.isNumber(sc)) {
- assignedColors.push(sc);
- }
- else {
- usedColors.push(this.parseColor(sc));
- }
- }
- }.bind(this));
-
-
- assignedColors.each(function(ac){
- neededColors = Math.max(neededColors, ac + 1);
- });
-
- var colors = [];
- var variation = 0;
- i = 0;
- while (colors.length < neededColors) {
- var c;
- if (this.options.colors.length == i) {
- c = new Proto.Color(100, 100, 100);
- }
- else {
- c = this.parseColor(this.options.colors[i]);
- }
-
- var sign = variation % 2 == 1 ? -1 : 1;
- var factor = 1 + sign * Math.ceil(variation / 2) * 0.2;
- c.scale(factor, factor, factor);
-
- colors.push(c);
-
- ++i;
- if (i >= this.options.colors.length) {
- i = 0;
- ++variation;
- }
- }
-
- var colorIndex = 0, s;
-
- this.graphData.each(function(gd){
- if(gd.color == null)
- {
- gd.color = colors[colorIndex].toString();
- ++colorIndex;
- }
- else if(Object.isNumber(gd.color)) {
- gd.color = colors[gd.color].toString();
- }
-
- gd.lines = Object.extend(Object.clone(this.options.lines), gd.lines);
- gd.points = Object.extend(Object.clone(this.options.points), gd.points);
- gd.bars = Object.extend(Object.clone(this.options.bars), gd.bars);
- gd.mouse = Object.extend(Object.clone(this.options.mouse), gd.mouse);
- if (gd.shadowSize == null) {
- gd.shadowSize = this.options.shadowSize;
- }
- }.bind(this));
-
- },
- /**
- * Function: processGraphData
- *
- * Description: processes graph data, setup xaxis and yaxis min and max points.
- */
- processGraphData: function() {
-
- this.xaxis.datamin = this.yaxis.datamin = Number.MAX_VALUE;
- this.xaxis.datamax = this.yaxis.datamax = Number.MIN_VALUE;
-
- this.graphData.each(function(gd) {
- var data = gd.data;
- data.each(function(d){
- if(d == null) {
- return;
- }
-
- var x = d[0], y = d[1];
- if(!x || !y || isNaN(x = +x) || isNaN(y = +y)) {
- d = null;
- return;
- }
-
- if (x < this.xaxis.datamin)
- this.xaxis.datamin = x;
- if (x > this.xaxis.datamax)
- this.xaxis.datamax = x;
- if (y < this.yaxis.datamin)
- this.yaxis.datamin = y;
- if (y > this.yaxis.datamax)
- this.yaxis.datamax = y;
- }.bind(this));
- }.bind(this));
-
-
- if (this.xaxis.datamin == Number.MAX_VALUE)
- this.xaxis.datamin = 0;
- if (this.yaxis.datamin == Number.MAX_VALUE)
- this.yaxis.datamin = 0;
- if (this.xaxis.datamax == Number.MIN_VALUE)
- this.xaxis.datamax = 1;
- if (this.yaxis.datamax == Number.MIN_VALUE)
- this.yaxis.datamax = 1;
- },
- /**
- * Function: constructCanvas
- *
- * Description: constructs the main canvas for drawing. It replicates the HTML elem (usually DIV) passed
- * in via constructor. If there is no height/width assigned to the HTML elem then we take a default size
- * of 400px (width) and 300px (height)
- */
- constructCanvas: function() {
-
- this.canvasWidth = this.domObj.getWidth();
- this.canvasHeight = this.domObj.getHeight();
- this.domObj.update(""); // clear target
- this.domObj.setStyle({
- "position": "relative"
- });
-
- if (this.canvasWidth <= 0) {
- this.canvasWdith = 400;
- }
- if(this.canvasHeight <= 0) {
- this.canvasHeight = 300;
- }
-
- this.canvas = (Prototype.Browser.IE) ? document.createElement("canvas") : new Element("CANVAS", {'width': this.canvasWidth, 'height': this.canvasHeight});
- Element.extend(this.canvas);
- this.canvas.style.width = this.canvasWidth + "px";
- this.canvas.style.height = this.canvasHeight + "px";
-
- this.domObj.appendChild(this.canvas);
-
- if (Prototype.Browser.IE) // excanvas hack
- {
- this.canvas = $(window.G_vmlCanvasManager.initElement(this.canvas));
- }
- this.canvas = $(this.canvas);
-
- this.context = this.canvas.getContext("2d");
-
- this.overlay = (Prototype.Browser.IE) ? document.createElement("canvas") : new Element("CANVAS", {'width': this.canvasWidth, 'height': this.canvasHeight});
- Element.extend(this.overlay);
- this.overlay.style.width = this.canvasWidth + "px";
- this.overlay.style.height = this.canvasHeight + "px";
- this.overlay.style.position = "absolute";
- this.overlay.style.left = "0px";
- this.overlay.style.right = "0px";
-
- this.overlay.setStyle({
- 'position': 'absolute',
- 'left': '0px',
- 'right': '0px'
- });
- this.domObj.appendChild(this.overlay);
-
- if (Prototype.Browser.IE) {
- this.overlay = $(window.G_vmlCanvasManager.initElement(this.overlay));
- }
-
- this.overlay = $(this.overlay);
- this.overlayContext = this.overlay.getContext("2d");
-
- if(this.options.selection.mode)
- {
- this.overlay.observe('mousedown', this.onMouseDown.bind(this));
- this.overlay.observe('mousemove', this.onMouseMove.bind(this));
- }
- if(this.options.grid.clickable) {
- this.overlay.observe('click', this.onClick.bind(this));
- }
- if(this.options.mouse.track)
- {
- this.overlay.observe('mousemove', this.onMouseMove.bind(this));
- }
- },
- /**
- * function: setupGrid
- *
- * Description: a container function that does a few interesting things.
- *
- * 1. calls <extendXRangeIfNeededByBar> function which makes sure that our axis are expanded if needed
- *
- * 2. calls <setRange> function providing xaxis options which fixes the ranges according to data points
- *
- * 3. calls <prepareTickGeneration> function for xaxis which generates ticks according to options provided by user
- *
- * 4. calls <setTicks> function for xaxis that sets the ticks
- *
- * similar sequence is called for y-axis.
- *
- * At the end if this is a pie chart than we insert Labels (around the pie chart) via <insertLabels> and we also call <insertLegend>
- */
- setupGrid: function()
- {
- if(this.options.bars.show)
- {
- this.xaxis.max += 0.5;
- this.xaxis.min -= 0.5;
- }
- //x-axis
- this.extendXRangeIfNeededByBar();
- this.setRange(this.xaxis, this.options.xaxis);
- this.prepareTickGeneration(this.xaxis, this.options.xaxis);
- this.setTicks(this.xaxis, this.options.xaxis);
-
-
- //y-axis
- this.setRange(this.yaxis, this.options.yaxis);
- this.prepareTickGeneration(this.yaxis, this.options.yaxis);
- this.setTicks(this.yaxis, this.options.yaxis);
- this.setSpacing();
-
- if(!this.options.pies.show)
- {
- this.insertLabels();
- }
- this.insertLegend();
- },
- /**
- * function: setRange
- *
- * parameters:
- * {Object} axis
- * {Object} axisOptions
- */
- setRange: function(axis, axisOptions) {
- var min = axisOptions.min != null ? axisOptions.min : axis.datamin;
- var max = axisOptions.max != null ? axisOptions.max : axis.datamax;
-
- if (max - min == 0.0) {
- // degenerate case
- var widen;
- if (max == 0.0)
- widen = 1.0;
- else
- widen = 0.01;
-
- min -= widen;
- max += widen;
- }
- else {
- // consider autoscaling
- var margin = axisOptions.autoscaleMargin;
- if (margin != null) {
- if (axisOptions.min == null) {
- min -= (max - min) * margin;
- // make sure we don't go below zero if all values
- // are positive
- if (min < 0 && axis.datamin >= 0)
- min = 0;
- }
- if (axisOptions.max == null) {
- max += (max - min) * margin;
- if (max > 0 && axis.datamax <= 0)
- max = 0;
- }
- }
- }
- axis.min = min;
- axis.max = max;
- },
- /**
- * function: prepareTickGeneration
- *
- * Parameters:
- * {Object} axis
- * {Object} axisOptions
- */
- prepareTickGeneration: function(axis, axisOptions) {
- // estimate number of ticks
- var noTicks;
- if (Object.isNumber(axisOptions.ticks) && axisOptions.ticks > 0)
- noTicks = axisOptions.ticks;
- else if (axis == this.xaxis)
- noTicks = this.canvasWidth / 100;
- else
- noTicks = this.canvasHeight / 60;
-
- var delta = (axis.max - axis.min) / noTicks;
- var size, generator, unit, formatter, i, magn, norm;
-
- if (axisOptions.mode == "time") {
- function formatDate(d, fmt, monthNames) {
- var leftPad = function(n) {
- n = "" + n;
- return n.length == 1 ? "0" + n : n;
- };
-
- var r = [];
- var escape = false;
- if (monthNames == null)
- monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
- for (var i = 0; i < fmt.length; ++i) {
- var c = fmt.charAt(i);
-
- if (escape) {
- switch (c) {
- case 'h': c = "" + d.getHours(); break;
- case 'H': c = leftPad(d.getHours()); break;
- case 'M': c = leftPad(d.getMinutes()); break;
- case 'S': c = leftPad(d.getSeconds()); break;
- case 'd': c = "" + d.getDate(); break;
- case 'm': c = "" + (d.getMonth() + 1); break;
- case 'y': c = "" + d.getFullYear(); break;
- case 'b': c = "" + monthNames[d.getMonth()]; break;
- }
- r.push(c);
- escape = false;
- }
- else {
- if (c == "%")
- escape = true;
- else
- r.push(c);
- }
- }
- return r.join("");
- }
-
-
- // map of app. size of time units in milliseconds
- var timeUnitSize = {
- "second": 1000,
- "minute": 60 * 1000,
- "hour": 60 * 60 * 1000,
- "day": 24 * 60 * 60 * 1000,
- "month": 30 * 24 * 60 * 60 * 1000,
- "year": 365.2425 * 24 * 60 * 60 * 1000
- };
-
-
- // the allowed tick sizes, after 1 year we use
- // an integer algorithm
- var spec = [
- [1, "second"], [2, "second"], [5, "second"], [10, "second"],
- [30, "second"],
- [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"],
- [30, "minute"],
- [1, "hour"], [2, "hour"], [4, "hour"],
- [8, "hour"], [12, "hour"],
- [1, "day"], [2, "day"], [3, "day"],
- [0.25, "month"], [0.5, "month"], [1, "month"],
- [2, "month"], [3, "month"], [6, "month"],
- [1, "year"]
- ];
-
- var minSize = 0;
- if (axisOptions.minTickSize != null) {
- if (typeof axisOptions.tickSize == "number")
- minSize = axisOptions.tickSize;
- else
- minSize = axisOptions.minTickSize[0] * timeUnitSize[axisOptions.minTickSize[1]];
- }
-
- for (i = 0; i < spec.length - 1; ++i) {
- if (delta < (spec[i][0] * timeUnitSize[spec[i][1]] + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) {
- break;
- }
- }
-
- size = spec[i][0];
- unit = spec[i][1];
-
- // special-case the possibility of several years
- if (unit == "year") {
- magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10));
- norm = (delta / timeUnitSize.year) / magn;
- if (norm < 1.5)
- size = 1;
- else if (norm < 3)
- size = 2;
- else if (norm < 7.5)
- size = 5;
- else
- size = 10;
-
- size *= magn;
- }
-
- if (axisOptions.tickSize) {
- size = axisOptions.tickSize[0];
- unit = axisOptions.tickSize[1];
- }
-
- var floorInBase = this.floorInBase; //gives us a reference to a global function..
-
- generator = function(axis) {
- var ticks = [],
- tickSize = axis.tickSize[0], unit = axis.tickSize[1],
- d = new Date(axis.min);
-
- var step = tickSize * timeUnitSize[unit];
-
-
-
- if (unit == "second")
- d.setSeconds(floorInBase(d.getSeconds(), tickSize));
- if (unit == "minute")
- d.setMinutes(floorInBase(d.getMinutes(), tickSize));
- if (unit == "hour")
- d.setHours(floorInBase(d.getHours(), tickSize));
- if (unit == "month")
- d.setMonth(floorInBase(d.getMonth(), tickSize));
- if (unit == "year")
- d.setFullYear(floorInBase(d.getFullYear(), tickSize));
-
- // reset smaller components
- d.setMilliseconds(0);
- if (step >= timeUnitSize.minute)
- d.setSeconds(0);
- if (step >= timeUnitSize.hour)
- d.setMinutes(0);
- if (step >= timeUnitSize.day)
- d.setHours(0);
- if (step >= timeUnitSize.day * 4)
- d.setDate(1);
- if (step >= timeUnitSize.year)
- d.setMonth(0);
-
-
- var carry = 0, v;
- do {
- v = d.getTime();
- ticks.push({ v: v, label: axis.tickFormatter(v, axis) });
- if (unit == "month") {
- if (tickSize < 1) {
- d.setDate(1);
- var start = d.getTime();
- d.setMonth(d.getMonth() + 1);
- var end = d.getTime();
- d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);
- carry = d.getHours();
- d.setHours(0);
- }
- else
- d.setMonth(d.getMonth() + tickSize);
- }
- else if (unit == "year") {
- d.setFullYear(d.getFullYear() + tickSize);
- }
- else
- d.setTime(v + step);
- } while (v < axis.max);
-
- return ticks;
- };
-
- formatter = function (v, axis) {
- var d = new Date(v);
-
- // first check global format
- if (axisOptions.timeformat != null)
- return formatDate(d, axisOptions.timeformat, axisOptions.monthNames);
-
- var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];
- var span = axis.max - axis.min;
-
- if (t < timeUnitSize.minute)
- fmt = "%h:%M:%S";
- else if (t < timeUnitSize.day) {
- if (span < 2 * timeUnitSize.day)
- fmt = "%h:%M";
- else
- fmt = "%b %d %h:%M";
- }
- else if (t < timeUnitSize.month)
- fmt = "%b %d";
- else if (t < timeUnitSize.year) {
- if (span < timeUnitSize.year)
- fmt = "%b";
- else
- fmt = "%b %y";
- }
- else
- fmt = "%y";
-
- return formatDate(d, fmt, axisOptions.monthNames);
- };
- }
- else {
- // pretty rounding of base-10 numbers
- var maxDec = axisOptions.tickDecimals;
- var dec = -Math.floor(Math.log(delta) / Math.LN10);
- if (maxDec != null && dec > maxDec)
- dec = maxDec;
-
- magn = Math.pow(10, -dec);
- norm = delta / magn; // norm is between 1.0 and 10.0
-
- if (norm < 1.5)
- size = 1;
- else if (norm < 3) {
- size = 2;
- // special case for 2.5, requires an extra decimal
- if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {
- size = 2.5;
- ++dec;
- }
- }
- else if (norm < 7.5)
- size = 5;
- else
- size = 10;
-
- size *= magn;
-
- if (axisOptions.minTickSize != null && size < axisOptions.minTickSize)
- size = axisOptions.minTickSize;
-
- if (axisOptions.tickSize != null)
- size = axisOptions.tickSize;
-
- axis.tickDecimals = Math.max(0, (maxDec != null) ? maxDec : dec);
-
- var floorInBase = this.floorInBase;
-
- generator = function (axis) {
- var ticks = [];
- var start = floorInBase(axis.min, axis.tickSize);
- // then spew out all possible ticks
- var i = 0, v;
- do {
- v = start + i * axis.tickSize;
- ticks.push({ v: v, label: axis.tickFormatter(v, axis) });
- ++i;
- } while (v < axis.max);
- return ticks;
- };
-
- formatter = function (v, axis) {
- if(v) {
- return v.toFixed(axis.tickDecimals);
- }
- return 0;
- };
- }
-
- axis.tickSize = unit ? [size, unit] : size;
- axis.tickGenerator = generator;
- if (Object.isFunction(axisOptions.tickFormatter))
- axis.tickFormatter = function (v, axis) { return "" + axisOptions.tickFormatter(v, axis); };
- else
- axis.tickFormatter = formatter;
- },
- /**
- * function: extendXRangeIfNeededByBar
- */
- extendXRangeIfNeededByBar: function() {
-
- if (this.options.xaxis.max == null) {
- // great, we're autoscaling, check if we might need a bump
- var newmax = this.xaxis.max;
- this.graphData.each(function(gd){
- if(gd.bars.show && gd.bars.barWidth + this.xaxis.datamax > newmax)
- {
- newmax = this.xaxis.datamax + gd.bars.barWidth;
- }
- }.bind(this));
- this.xaxis.nax = newmax;
-
- }
- },
- /**
- * function: setTicks
- *
- * parameters:
- * {Object} axis
- * {Object} axisOptions
- */
- setTicks: function(axis, axisOptions) {
- axis.ticks = [];
-
- if (axisOptions.ticks == null)
- axis.ticks = axis.tickGenerator(axis);
- else if (typeof axisOptions.ticks == "number") {
- if (axisOptions.ticks > 0)
- axis.ticks = axis.tickGenerator(axis);
- }
- else if (axisOptions.ticks) {
- var ticks = axisOptions.ticks;
-
- if (Object.isFunction(ticks))
- // generate the ticks
- ticks = ticks({ min: axis.min, max: axis.max });
-
- // clean up the user-supplied ticks, copy them over
- //var i, v;
- ticks.each(function(t, i){
- var v = null;
- var label = null;
- if(typeof t == 'object') {
- v = t[0];
- if(t.length > 1) { label = t[1]; }
- }
- else {
- v = t;
- }
- if(!label) {
- label = axis.tickFormatter(v, axis);
- }
- axis.ticks[i] = {v: v, label: label}
- }.bind(this));
-
- }
-
- if (axisOptions.autoscaleMargin != null && axis.ticks.length > 0) {
- if (axisOptions.min == null)
- axis.min = Math.min(axis.min, axis.ticks[0].v);
- if (axisOptions.max == null && axis.ticks.length > 1)
- axis.max = Math.min(axis.max, axis.ticks[axis.ticks.length - 1].v);
- }
- },
- /**
- * Function: setSpacing
- *
- * Parameters: none
- */
- setSpacing: function() {
- // calculate y label dimensions
- var i, labels = [], l;
- for (i = 0; i < this.yaxis.ticks.length; ++i) {
- l = this.yaxis.ticks[i].label;
-
- if (l)
- labels.push('<div class="tickLabel">' + l + '</div>');
- }
-
- if (labels.length > 0) {
- var dummyDiv = new Element('div', {'style': 'position:absolute;top:-10000px;font-size:smaller'});
- dummyDiv.update(labels.join(""));
- this.domObj.insert(dummyDiv);
- this.yLabelMaxWidth = dummyDiv.getWidth();
- this.yLabelMaxHeight = dummyDiv.select('div')[0].getHeight();
- dummyDiv.remove();
- }
-
- var maxOutset = this.options.grid.borderWidth;
- if (this.options.points.show)
- maxOutset = Math.max(maxOutset, this.options.points.radius + this.options.points.lineWidth/2);
- for (i = 0; i < this.graphData.length; ++i) {
- if (this.graphData[i].points.show)
- maxOutset = Math.max(maxOutset, this.graphData[i].points.radius + this.graphData[i].points.lineWidth/2);
- }
-
- this.chartOffset.left = this.chartOffset.right = this.chartOffset.top = this.chartOffset.bottom = maxOutset;
-
- this.chartOffset.left += this.yLabelMaxWidth + this.options.grid.labelMargin;
- this.chartWidth = this.canvasWidth - this.chartOffset.left - this.chartOffset.right;
-
- this.xLabelBoxWidth = this.chartWidth / 6;
- labels = [];
-
- for (i = 0; i < this.xaxis.ticks.length; ++i) {
- l = this.xaxis.ticks[i].label;
- if (l) {
- labels.push('<span class="tickLabel" width="' + this.xLabelBoxWidth + '">' + l + '</span>');
- }
- }
-
- var xLabelMaxHeight = 0;
- if (labels.length > 0) {
- var dummyDiv = new Element('div', {'style': 'position:absolute;top:-10000px;font-size:smaller'});
- dummyDiv.update(labels.join(""));
- this.domObj.appendChild(dummyDiv);
- xLabelMaxHeight = dummyDiv.getHeight();
- dummyDiv.remove();
- }
-
- this.chartOffset.bottom += xLabelMaxHeight + this.options.grid.labelMargin;
- this.chartHeight = this.canvasHeight - this.chartOffset.bottom - this.chartOffset.top;
- this.hozScale = this.chartWidth / (this.xaxis.max - this.xaxis.min);
- this.vertScale = this.chartHeight / (this.yaxis.max - this.yaxis.min);
- },
- /**
- * function: draw
- */
- draw: function() {
- if(this.options.bars.show)
- {
- this.extendXRangeIfNeededByBar();
- this.setSpacing();
- this.drawGrid();
- this.drawBarGraph(this.graphData, this.barDataRange);
- }
- else if(this.options.pies.show)
- {
- this.preparePieData(this.graphData);
- this.drawPieGraph(this.graphData);
- }
- else
- {
- this.drawGrid();
- for (var i = 0; i < this.graphData.length; i++) {
- this.drawGraph(this.graphData[i]);
- }
- }
- },
- /**
- * function: translateHoz
- *
- * Paramters:
- * {Object} x
- *
- * Description: Given a value this function translate it to relative x coord on canvas
- */
- translateHoz: function(x) {
- return (x - this.xaxis.min) * this.hozScale;
- },
- /**
- * function: translateVert
- *
- * parameters:
- * {Object} y
- *
- * Description: Given a value this function translate it to relative y coord on canvas
- */
- translateVert: function(y) {
- return this.chartHeight - (y - this.yaxis.min) * this.vertScale;
- },
- /**
- * function: drawGrid
- *
- * parameters: none
- *
- * description: draws the actual grid on the canvas
- */
- drawGrid: function() {
- var i;
-
- this.context.save();
- this.context.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
- this.context.translate(this.chartOffset.left, this.chartOffset.top);
-
- // draw background, if any
- if (this.options.grid.backgroundColor != null) {
- this.context.fillStyle = this.options.grid.backgroundColor;
- this.context.fillRect(0, 0, this.chartWidth, this.chartHeight);
- }
-
- // draw colored areas
- if (this.options.grid.coloredAreas) {
- var areas = this.options.grid.coloredAreas;
- if (Object.isFunction(areas)) {
- areas = areas({ xmin: this.xaxis.min, xmax: this.xaxis.max, ymin: this.yaxis.min, ymax: this.yaxis.max });
- }
-
- areas.each(function(a){
- // clip
- if (a.x1 == null || a.x1 < this.xaxis.min)
- a.x1 = this.xaxis.min;
- if (a.x2 == null || a.x2 > this.xaxis.max)
- a.x2 = this.xaxis.max;
- if (a.y1 == null || a.y1 < this.yaxis.min)
- a.y1 = this.yaxis.min;
- if (a.y2 == null || a.y2 > this.yaxis.max)
- a.y2 = this.yaxis.max;
-
- var tmp;
- if (a.x1 > a.x2) {
- tmp = a.x1;
- a.x1 = a.x2;
- a.x2 = tmp;
- }
- if (a.y1 > a.y2) {
- tmp = a.y1;
- a.y1 = a.y2;
- a.y2 = tmp;
- }
-
- if (a.x1 >= this.xaxis.max || a.x2 <= this.xaxis.min || a.x1 == a.x2
- || a.y1 >= this.yaxis.max || a.y2 <= this.yaxis.min || a.y1 == a.y2)
- return;
-
- this.context.fillStyle = a.color || this.options.grid.coloredAreasColor;
- this.context.fillRect(Math.floor(this.translateHoz(a.x1)), Math.floor(this.translateVert(a.y2)),
- Math.floor(this.translateHoz(a.x2) - this.translateHoz(a.x1)), Math.floor(this.translateVert(a.y1) - this.translateVert(a.y2)));
- }.bind(this));
-
-
- }
-
- // draw the inner grid
- this.context.lineWidth = 1;
- this.context.strokeStyle = this.options.grid.tickColor;
- this.context.beginPath();
- var v;
- if (this.options.grid.drawXAxis) {
- this.xaxis.ticks.each(function(aTick){
- v = aTick.v;
- if(v <= this.xaxis.min || v >= this.xaxis.max) {
- return;
- }
- this.context.moveTo(Math.floor(this.translateHoz(v)) + this.context.lineWidth / 2, 0);
- this.context.lineTo(Math.floor(this.translateHoz(v)) + this.context.lineWidth / 2, this.chartHeight);
- }.bind(this));
-
- }
-
- if (this.options.grid.drawYAxis) {
- this.yaxis.ticks.each(function(aTick){
- v = aTick.v;
- if(v <= this.yaxis.min || v >= this.yaxis.max) {
- return;
- }
- this.context.moveTo(0, Math.floor(this.translateVert(v)) + this.context.lineWidth / 2);
- this.context.lineTo(this.chartWidth, Math.floor(this.translateVert(v)) + this.context.lineWidth / 2);
- }.bind(this));
-
- }
- this.context.stroke();
-
- if (this.options.grid.borderWidth) {
- // draw border
- this.context.lineWidth = this.options.grid.borderWidth;
- this.context.strokeStyle = this.options.grid.color;
- this.context.lineJoin = "round";
- this.context.strokeRect(0, 0, this.chartWidth, this.chartHeight);
- this.context.restore();
- }
- },
- /**
- * function: insertLabels
- *
- * parameters: none
- *
- * description: inserts the label with proper spacing. Both on X and Y axis
- */
- insertLabels: function() {
- this.domObj.select(".tickLabels").invoke('remove');
-
- var i, tick;
- var html = '<div class="tickLabels" style="font-size:smaller;color:' + this.options.grid.color + '">';
-
- // do the x-axis
- this.xaxis.ticks.each(function(tick){
- if (!tick.label || tick.v < this.xaxis.min || tick.v > this.xaxis.max)
- return;
- html += '<div style="position:absolute;top:' + (this.chartOffset.top + this.chartHeight + this.options.grid.labelMargin) + 'px;left:' + (this.chartOffset.left + this.translateHoz(tick.v) - this.xLabelBoxWidth/2) + 'px;width:' + this.xLabelBoxWidth + 'px;text-align:center" class="tickLabel">' + tick.label + "</div>";
-
- }.bind(this));
-
- // do the y-axis
- this.yaxis.ticks.each(function(tick){
- if (!tick.label || tick.v < this.yaxis.min || tick.v > this.yaxis.max)
- return;
- html += '<div id="ylabels" style="position:absolute;top:' + (this.chartOffset.top + this.translateVert(tick.v) - this.yLabelMaxHeight/2) + 'px;left:0;width:' + this.yLabelMaxWidth + 'px;text-align:right" class="tickLabel">' + tick.label + "</div>";
- }.bind(this));
-
- html += '</div>';
-
- this.domObj.insert(html);
- },
- /**
- * function: drawGraph
- *
- * Paramters:
- * {Object} graphData
- *
- * Description: given a graphData (series) this function calls a proper lower level method to draw it.
- */
- drawGraph: function(graphData) {
- if (graphData.lines.show || (!graphData.bars.show && !graphData.points.show))
- this.drawGraphLines(graphData);
- if (graphData.bars.show)
- this.drawGraphBar(graphData);
- if (graphData.points.show)
- this.drawGraphPoints(graphData);
- },
- /**
- * function: plotLine
- *
- * parameters:
- * {Object} data
- * {Object} offset
- *
- * description:
- * Helper function that plots a line based on the data provided
- */
- plotLine: function(data, offset) {
- var prev, cur = null, drawx = null, drawy = null;
-
- this.context.beginPath();
- for (var i = 0; i < data.length; ++i) {
- prev = cur;
- cur = data[i];
-
- if (prev == null || cur == null)
- continue;
-
- var x1 = prev[0], y1 = prev[1],
- x2 = cur[0], y2 = cur[1];
-
- // clip with ymin
- if (y1 <= y2 && y1 < this.yaxis.min) {
- if (y2 < this.yaxis.min)
- continue; // line segment is outside
- // compute new intersection point
- x1 = (this.yaxis.min - y1) / (y2 - y1) * (x2 - x1) + x1;
- y1 = this.yaxis.min;
- }
- else if (y2 <= y1 && y2 < this.yaxis.min) {
- if (y1 < this.yaxis.min)
- continue;
- x2 = (this.yaxis.min - y1) / (y2 - y1) * (x2 - x1) + x1;
- y2 = this.yaxis.min;
- }
-
- // clip with ymax
- if (y1 >= y2 && y1 > this.yaxis.max) {
- if (y2 > this.yaxis.max)
- continue;
- x1 = (this.yaxis.max - y1) / (y2 - y1) * (x2 - x1) + x1;
- y1 = this.yaxis.max;
- }
- else if (y2 >= y1 && y2 > this.yaxis.max) {
- if (y1 > this.yaxis.max)
- continue;
- x2 = (this.yaxis.max - y1) / (y2 - y1) * (x2 - x1) + x1;
- y2 = this.yaxis.max;
- }
-
- // clip with xmin
- if (x1 <= x2 && x1 < this.xaxis.min) {
- if (x2 < this.xaxis.min)
- continue;
- y1 = (this.xaxis.min - x1) / (x2 - x1) * (y2 - y1) + y1;
- x1 = this.xaxis.min;
- }
- else if (x2 <= x1 && x2 < this.xaxis.min) {
- if (x1 < this.xaxis.min)
- continue;
- y2 = (this.xaxis.min - x1) / (x2 - x1) * (y2 - y1) + y1;
- x2 = this.xaxis.min;
- }
-
- // clip with xmax
- if (x1 >= x2 && x1 > this.xaxis.max) {
- if (x2 > this.xaxis.max)
- continue;
- y1 = (this.xaxis.max - x1) / (x2 - x1) * (y2 - y1) + y1;
- x1 = this.xaxis.max;
- }
- else if (x2 >= x1 && x2 > this.xaxis.max) {
- if (x1 > this.xaxis.max)
- continue;
- y2 = (this.xaxis.max - x1) / (x2 - x1) * (y2 - y1) + y1;
- x2 = this.xaxis.max;
- }
-
- if (drawx != this.translateHoz(x1) || drawy != this.translateVert(y1) + offset)
- this.context.moveTo(this.translateHoz(x1), this.translateVert(y1) + offset);
-
- drawx = this.translateHoz(x2);
- drawy = this.translateVert(y2) + offset;
- this.context.lineTo(drawx, drawy);
- }
- this.context.stroke();
- },
- /**
- * function: plotLineArea
- *
- * parameters:
- * {Object} data
- *
- * description:
- * Helper functoin that plots a colored line graph. This function
- * takes the data nad then fill in the area on the graph properly
- */
- plotLineArea: function(data) {
- var prev, cur = null;
-
- var bottom = Math.min(Math.max(0, this.yaxis.min), this.yaxis.max);
- var top, lastX = 0;
-
- var areaOpen = false;
-
- for (var i = 0; i < data.length; ++i) {
- prev = cur;
- cur = data[i];
-
- if (areaOpen && prev != null && cur == null) {
- // close area
- this.context.lineTo(this.translateHoz(lastX), this.translateVert(bottom));
- this.context.fill();
- areaOpen = false;
- continue;
- }
-
- if (prev == null || cur == null)
- continue;
-
- var x1 = prev[0], y1 = prev[1],
- x2 = cur[0], y2 = cur[1];
-
- // clip x values
-
- // clip with xmin
- if (x1 <= x2 && x1 < this.xaxis.min) {
- if (x2 < this.xaxis.min)
- continue;
- y1 = (this.xaxis.min - x1) / (x2 - x1) * (y2 - y1) + y1;
- x1 = this.xaxis.min;
- }
- else if (x2 <= x1 && x2 < this.xaxis.min) {
- if (x1 < this.xaxis.min)
- continue;
- y2 = (this.xaxis.min - x1) / (x2 - x1) * (y2 - y1) + y1;
- x2 = this.xaxis.min;
- }
-
- // clip with xmax
- if (x1 >= x2 && x1 > this.xaxis.max) {
- if (x2 > this.xaxis.max)
- continue;
- y1 = (this.xaxis.max - x1) / (x2 - x1) * (y2 - y1) + y1;
- x1 = this.xaxis.max;
- }
- else if (x2 >= x1 && x2 > this.xaxis.max) {
- if (x1 > this.xaxis.max)
- continue;
- y2 = (this.xaxis.max - x1) / (x2 - x1) * (y2 - y1) + y1;
- x2 = this.xaxis.max;
- }
-
- if (!areaOpen) {
- // open area
- this.context.beginPath();
- this.context.moveTo(this.translateHoz(x1), this.translateVert(bottom));
- areaOpen = true;
- }
-
- // now first check the case where both is outside
- if (y1 >= this.yaxis.max && y2 >= this.yaxis.max) {
- this.context.lineTo(this.translateHoz(x1), this.translateVert(this.yaxis.max));
- this.context.lineTo(this.translateHoz(x2), this.translateVert(this.yaxis.max));
- continue;
- }
- else if (y1 <= this.yaxis.min && y2 <= this.yaxis.min) {
- this.context.lineTo(this.translateHoz(x1), this.translateVert(this.yaxis.min));
- this.context.lineTo(this.translateHoz(x2), this.translateVert(this.yaxis.min));
- continue;
- }
-
- var x1old = x1, x2old = x2;
-
- // clip with ymin
- if (y1 <= y2 && y1 < this.yaxis.min && y2 >= this.yaxis.min) {
- x1 = (this.yaxis.min - y1) / (y2 - y1) * (x2 - x1) + x1;
- y1 = this.yaxis.min;
- }
- else if (y2 <= y1 && y2 < this.yaxis.min && y1 >= this.yaxis.min) {
- x2 = (this.yaxis.min - y1) / (y2 - y1) * (x2 - x1) + x1;
- y2 = this.yaxis.min;
- }
-
- // clip with ymax
- if (y1 >= y2 && y1 > this.yaxis.max && y2 <= this.yaxis.max) {
- x1 = (this.yaxis.max - y1) / (y2 - y1) * (x2 - x1) + x1;
- y1 = this.yaxis.max;
- }
- else if (y2 >= y1 && y2 > this.yaxis.max && y1 <= this.yaxis.max) {
- x2 = (this.yaxis.max - y1) / (y2 - y1) * (x2 - x1) + x1;
- y2 = this.yaxis.max;
- }
-
-
- // if the x value was changed we got a rectangle
- // to fill
- if (x1 != x1old) {
- if (y1 <= this.yaxis.min)
- top = this.yaxis.min;
- else
- top = this.yaxis.max;
-
- this.context.lineTo(this.translateHoz(x1old), this.translateVert(top));
- this.context.lineTo(this.translateHoz(x1), this.translateVert(top));
- }
-
- // fill the triangles
- this.context.lineTo(this.translateHoz(x1), this.translateVert(y1));
- this.context.lineTo(this.translateHoz(x2), this.translateVert(y2));
-
- // fill the other rectangle if it's there
- if (x2 != x2old) {
- if (y2 <= this.yaxis.min)
- top = this.yaxis.min;
- else
- top = this.yaxis.max;
-
- this.context.lineTo(this.translateHoz(x2old), this.translateVert(top));
- this.context.lineTo(this.translateHoz(x2), this.translateVert(top));
- }
-
- lastX = Math.max(x2, x2old);
- }
-
- if (areaOpen) {
- this.context.lineTo(this.translateHoz(lastX), this.translateVert(bottom));
- this.context.fill();
- }
- },
- /**
- * function: drawGraphLines
- *
- * parameters:
- * {Object} graphData
- *
- * description:
- * Main function that daws the line graph. This function is called
- * if <options> lines property is set to show or no other type of
- * graph is specified. This function depends on <plotLineArea> and
- * <plotLine> functions.
- */
- drawGraphLines: function(graphData) {
- this.context.save();
- this.context.translate(this.chartOffset.left, this.chartOffset.top);
- this.context.lineJoin = "round";
-
- var lw = graphData.lines.lineWidth;
- var sw = graphData.shadowSize;
- // FIXME: consider another form of shadow when filling is turned on
- if (sw > 0) {
- // draw shadow in two steps
- this.context.lineWidth = sw / 2;
- this.context.strokeStyle = "rgba(0,0,0,0.1)";
- this.plotLine(graphData.data, lw/2 + sw/2 + this.context.lineWidth/2);
-
- this.context.lineWidth = sw / 2;
- this.context.strokeStyle = "rgba(0,0,0,0.2)";
- this.plotLine(graphData.data, lw/2 + this.context.lineWidth/2);
- }
-
- this.context.lineWidth = lw;
- this.context.strokeStyle = graphData.color;
- if (graphData.lines.fill) {
- this.context.fillStyle = graphData.lines.fillColor != null ? graphData.lines.fillColor : this.parseColor(graphData.color).scale(null, null, null, 0.4).toString();
- this.plotLineArea(graphData.data, 0);
- }
-
- this.plotLine(graphData.data, 0);
- this.context.restore();
- },
- /**
- * function: plotPoints
- *
- * parameters:
- * {Object} data
- * {Object} radius
- * {Object} fill
- *
- * description:
- * Helper function that draws the point graph according to the data provided. Size of each
- * point is provided by radius variable and fill specifies if points
- * are filled
- */
- plotPoints: function(data, radius, fill) {
- for (var i = 0; i < data.length; ++i) {
- if (data[i] == null)
- continue;
-
- var x = data[i][0], y = data[i][1];
- if (x < this.xaxis.min || x > this.xaxis.max || y < this.yaxis.min || y > this.yaxis.max)
- continue;
-
- this.context.beginPath();
- this.context.arc(this.translateHoz(x), this.translateVert(y), radius, 0, 2 * Math.PI, true);
- if (fill)
- this.context.fill();
- this.context.stroke();
- }
- },
- /**
- * function: plotPointShadows
- *
- * parameters:
- * {Object} data
- * {Object} offset
- * {Object} radius
- *
- * description:
- * Helper function that draws the shadows for the points.
- */
- plotPointShadows: function(data, offset, radius) {
- for (var i = 0; i < data.length; ++i) {
- if (data[i] == null)
- continue;
-
- var x = data[i][0], y = data[i][1];
- if (x < this.xaxis.min || x > this.xaxis.max || y < this.yaxis.min || y > this.yaxis.max)
- continue;
- this.context.beginPath();
- this.context.arc(this.translateHoz(x), this.translateVert(y) + offset, radius, 0, Math.PI, false);
- this.context.stroke();
- }
- },
- /**
- * function: drawGraphPoints
- *
- * paramters:
- * {Object} graphData
- *
- * description:
- * Draws the point graph onto the canvas. This function depends on helper
- * functions <plotPointShadows> and <plotPoints>
- */
- drawGraphPoints: function(graphData) {
- this.context.save();
- this.context.translate(this.chartOffset.left, this.chartOffset.top);
-
- var lw = graphData.lines.lineWidth;
- var sw = graphData.shadowSize;
- if (sw > 0) {
- // draw shadow in two steps
- this.context.lineWidth = sw / 2;
- this.context.strokeStyle = "rgba(0,0,0,0.1)";
- this.plotPointShadows(graphData.data, sw/2 + this.context.lineWidth/2, graphData.points.radius);
-
- this.context.lineWidth = sw / 2;
- this.context.strokeStyle = "rgba(0,0,0,0.2)";
- this.plotPointShadows(graphData.data, this.context.lineWidth/2, graphData.points.radius);
- }
-
- this.context.lineWidth = graphData.points.lineWidth;
- this.context.strokeStyle = graphData.color;
- this.context.fillStyle = graphData.points.fillColor != null ? graphData.points.fillColor : graphData.color;
- this.plotPoints(graphData.data, graphData.points.radius, graphData.points.fill);
- this.context.restore();
- },
- /**
- * function: preparePieData
- *
- * parameters:
- * {Object} graphData
- *
- * Description:
- * Helper function that manipulates the given data stream so that it can
- * be plotted as a Pie Chart
- */
- preparePieData: function(graphData)
- {
- for(i = 0; i < graphData.length; i++)
- {
- var data = 0;
- for(j = 0; j < graphData[i].data.length; j++){
- data += parseInt(graphData[i].data[j][1]);
- }
- graphData[i].data = data;
- }
- },
- /**
- * function: drawPieShadow
- *
- * {Object} anchorX
- * {Object} anchorY
- * {Object} radius
- *
- * description:
- * Helper function that draws a shadow for the Pie Chart. This just draws
- * a circle with offset that simulates shadow. We do not give each piece
- * of the pie an individual shadow.
- */
- drawPieShadow: function(anchorX, anchorY, radius)
- {
- this.context.beginPath();
- this.context.moveTo(anchorX, anchorY);
- this.context.fillStyle = 'rgba(0,0,0,' + 0.1 + ')';
- startAngle = 0;
- endAngle = (Math.PI/180)*360;
- this.context.arc(anchorX + 2, anchorY +2, radius + (this.options.shadowSize/2), startAngle, endAngle, false);
- this.context.fill();
- this.context.closePath();
- },
- /**
- * function: drawPieGraph
- *
- * parameters:
- * {Object} graphData
- *
- * description:
- * Draws the actual pie chart. This function depends on helper function
- * <drawPieShadow> to draw the actual shadow
- */
- drawPieGraph: function(graphData)
- {
- var sumData = 0;
- var radius = 0;
- var centerX = this.chartWidth/2;
- var centerY = this.chartHeight/2;
- var startAngle = 0;
- var endAngle = 0;
- var fontSize = this.options.pies.fontSize;
- var labelWidth = this.options.pies.labelWidth;
-
- //determine Pie Radius
- if(!this.options.pies.autoScale)
- radius = this.options.pies.radius;
- else
- radius = (this.chartHeight * 0.85)/2;
-
- var labelRadius = radius * 1.05;
-
- for(i = 0; i < graphData.length; i++)
- sumData += graphData[i].data;
-
- // used to adjust labels so that everything adds up to 100%
- totalPct = 0;
-
- //lets draw the shadow first.. we don't need an individual shadow to every pie rather we just
- //draw a circle underneath to simulate the shadow...
- this.drawPieShadow(centerX, centerY, radius, 0, 0);
-
- //lets draw the actual pie chart now.
- graphData.each(function(gd, j){
- var pct = gd.data / sumData;
- startAngle = endAngle;
- endAngle += pct * (2 * Math.PI);
- var sliceMiddle = (endAngle - startAngle) / 2 + startAngle;
- var labelX = centerX + Math.cos(sliceMiddle) * labelRadius;
- var labelY = centerY + Math.sin(sliceMiddle) * labelRadius;
- var anchorX = centerX;
- var anchorY = centerY;
- var textAlign = null;
- var verticalAlign = null;
- var left = 0;
- var top = 0;
-
- //draw pie:
- //drawing pie
- this.context.beginPath();
- this.context.moveTo(anchorX, anchorY);
- this.context.arc(anchorX, anchorY, radius, startAngle, endAngle, false);
- this.context.closePath();
- this.context.fillStyle = this.parseColor(gd.color).scale(null, null, null, this.options.pies.fillOpacity).toString();
-
- if(this.options.pies.fill) { this.context.fill(); }
-
- // drawing labels
- if (sliceMiddle <= 0.25 * (2 * Math.PI))
- {
- // text on top and align left
- textAlign = "left";
- verticalAlign = "top";
- left = labelX;
- top = labelY + fontSize;
- }
- else if (sliceMiddle > 0.25 * (2 * Math.PI) && sliceMiddle <= 0.5 * (2 * Math.PI))
- {
- // text on bottom and align left
- textAlign = "left";
- verticalAlign = "bottom";
- left = labelX - labelWidth;
- top = labelY;
- }
- else if (sliceMiddle > 0.5 * (2 * Math.PI) && sliceMiddle <= 0.75 * (2 * Math.PI))
- {
- // text on bottom and align right
- textAlign = "right";
- verticalAlign = "bottom";
- left = labelX - labelWidth;
- top = labelY - fontSize;
- }
- else
- {
- // text on top and align right
- textAlign = "right";
- verticalAlign = "bottom";
- left = labelX;
- top = labelY - fontSize;
- }
-
- left = left + "px";
- top = top + "px";
- var textVal = Math.round(pct * 100);
-
- if (j == graphData.length - 1) {
- if (textVal + totalPct < 100) {
- textVal = textVal + 1;
- } else if (textVal + totalPct > 100) {
- textVal = textVal - 1;
- };
- }
-
- var html = "<div style=\"position: absolute;zindex:11; width:" + labelWidth + "px;fontSize:" + fontSize + "px;overflow:hidden;top:"+ top + ";left:"+ left + ";textAlign:" + textAlign + ";verticalAlign:" + verticalAlign +"\">" + textVal + "%</div>";
- //$(html).appendTo(target);
- this.domObj.insert(html);
-
- totalPct = totalPct + textVal;
- }.bind(this));
-
- },
- /**
- * function: drawBarGraph
- *
- * parameters:
- * {Object} graphData
- * {Object} barDataRange
- *
- * description:
- * Goes through each series in graphdata and passes it onto <drawBarGraphs> function
- */
- drawBarGraph: function(graphData, barDataRange)
- {
- graphData.each(function(gd, i){
- this.drawGraphBars(gd, i, graphData.size(), barDataRange);
- }.bind(this));
- },
- /**
- * function: drawGraphBar
- *
- * parameters:
- * {Object} graphData
- *
- * description:
- * This function is called when an individual series in GraphData is bar graph and plots it
- */
- drawGraphBar: function(graphData)
- {
- this.drawGraphBars(graphData, 0, this.graphData.length, this.barDataRange);
- },
- /**
- * function: plotBars
- *
- * parameters:
- * {Object} graphData
- * {Object} data
- * {Object} barWidth
- * {Object} offset
- * {Object} fill
- * {Object} counter
- * {Object} total
- * {Object} barDataRange
- *
- * description:
- * Helper function that draws the bar graph based on data.
- */
- plotBars: function(graphData, data, barWidth, offset, fill,counter, total, barDataRange) {
- var shift = 0;
-
- if(total % 2 == 0)
- {
- shift = (1 + ((counter - total /2 ) - 1)) * barWidth;
- }
- else
- {
- var interval = 0.5;
- if(counter == (total/2 - interval )) {
- shift = - barWidth * interval;
- }
- else {
- shift = (interval + (counter - Math.round(total/2))) * barWidth;
- }
- }
-
- var rangeData = [];
- data.each(function(d){
- if(!d) return;
-
- var x = d[0], y = d[1];
- var drawLeft = true, drawTop = true, drawRight = true;
- var left = x + shift, right = x + barWidth + shift, bottom = 0, top = y;
- var rangeDataPoint = {};
- rangeDataPoint.left = left;
- rangeDataPoint.right = right;
- rangeDataPoint.value = top;
- rangeData.push(rangeDataPoint);
-
- if (right < this.xaxis.min || left > this.xaxis.max || top < this.yaxis.min || bottom > this.yaxis.max)
- return;
-
- // clip
- if (left < this.xaxis.min) {
- left = this.xaxis.min;
- drawLeft = false;
- }
-
- if (right > this.xaxis.max) {
- right = this.xaxis.max;
- drawRight = false;
- }
-
- if (bottom < this.yaxis.min)
- bottom = this.yaxis.min;
-
- if (top > this.yaxis.max) {
- top = this.yaxis.max;
- drawTop = false;
- }
-
- if(graphData.bars.showShadow && graphData.shadowSize > 0)
- this.plotShadowOutline(graphData, this.context.strokeStyle, left, bottom, top, right, drawLeft, drawRight, drawTop);
-
- // fill the bar
- if (fill) {
- this.context.beginPath();
- this.context.moveTo(this.translateHoz(left), this.translateVert(bottom) + offset);
- this.context.lineTo(this.translateHoz(left), this.translateVert(top) + offset);
- this.context.lineTo(this.translateHoz(right), this.translateVert(top) + offset);
- this.context.lineTo(this.translateHoz(right), this.translateVert(bottom) + offset);
- this.context.fill();
- }
-
- // draw outline
- if (drawLeft || drawRight || drawTop) {
- this.context.beginPath();
- this.context.moveTo(this.translateHoz(left), this.translateVert(bottom) + offset);
- if (drawLeft)
- this.context.lineTo(this.translateHoz(left), this.translateVert(top) + offset);
- else
- this.context.moveTo(this.translateHoz(left), this.translateVert(top) + offset);
-
- if (drawTop)
- this.context.lineTo(this.translateHoz(right), this.translateVert(top) + offset);
- else
- this.context.moveTo(this.translateHoz(right), this.translateVert(top) + offset);
- if (drawRight)
- this.context.lineTo(this.translateHoz(right), this.translateVert(bottom) + offset);
- else
- this.context.moveTo(this.translateHoz(right), this.translateVert(bottom) + offset);
- this.context.stroke();
- }
- }.bind(this));
-
- barDataRange.push(rangeData);
- },
- /**
- * function: plotShadowOutline
- *
- * parameters:
- * {Object} graphData
- * {Object} orgStrokeStyle
- * {Object} left
- * {Object} bottom
- * {Object} top
- * {Object} right
- * {Object} drawLeft
- * {Object} drawRight
- * {Object} drawTop
- *
- * description:
- * Helper function that draws a outline simulating shadow for bar chart
- */
- plotShadowOutline: function(graphData, orgStrokeStyle, left, bottom, top, right, drawLeft, drawRight, drawTop)
- {
- var orgOpac = 0.3;
-
- for(var n = 1; n <= this.options.shadowSize/2; n++)
- {
- var opac = orgOpac * n;
- this.context.beginPath();
- this.context.strokeStyle = "rgba(0,0,0," + opac + ")";
-
- this.context.moveTo(this.translateHoz(left) + n, this.translateVert(bottom));
-
- if(drawLeft)
- this.context.lineTo(this.translateHoz(left) + n, this.translateVert(top) - n);
- else
- this.context.moveTo(this.translateHoz(left) + n, this.translateVert(top) - n);
-
- if(drawTop)
- this.context.lineTo(this.translateHoz(right) + n, this.translateVert(top) - n);
- else
- this.context.moveTo(this.translateHoz(right) + n, this.translateVert(top) - n);
-
- if(drawRight)
- this.context.lineTo(this.translateHoz(right) + n, this.translateVert(bottom));
- else
- this.context.lineTo(this.translateHoz(right) + n, this.translateVert(bottom));
-
- this.context.stroke();
- this.context.closePath();
- }
-
- this.context.strokeStyle = orgStrokeStyle;
- },
- /**
- * function: drawGraphBars
- *
- * parameters:
- * {Object} graphData
- * {Object} counter
- * {Object} total
- * {Object} barDataRange
- *
- * description:
- * Draws the actual bar graphs. Calls <plotBars> to draw the individual bar
- */
- drawGraphBars: function(graphData, counter, total, barDataRange){
- this.context.save();
- this.context.translate(this.chartOffset.left, this.chartOffset.top);
- this.context.lineJoin = "round";
-
- var bw = graphData.bars.barWidth;
- var lw = Math.min(graphData.bars.lineWidth, bw);
-
-
- this.context.lineWidth = lw;
- this.context.strokeStyle = graphData.color;
- if (graphData.bars.fill) {
- this.context.fillStyle = graphData.bars.fillColor != null ? graphData.bars.fillColor : this.parseColor(graphData.color).scale(null, null, null, this.options.bars.fillOpacity).toString();
- }
- this.plotBars(graphData, graphData.data, bw, 0, graphData.bars.fill, counter, total, barDataRange);
- this.context.restore();
- },
- /**
- * function: insertLegend
- *
- * description:
- * inserts legend onto the graph. *legend: {show: true}* must be set in <options>
- * for for this to work.
- */
- insertLegend: function() {
- this.domObj.select(".legend").invoke('remove');
-
- if (!this.options.legend.show)
- return;
-
- var fragments = [];
- var rowStarted = false;
- this.graphData.each(function(gd, index){
- if(!gd.label) {
- return;
- }
- if(index % this.options.legend.noColumns == 0) {
- if(rowStarted) {
- fragments.push('</tr>');
- }
- fragments.push('<tr>');
- rowStarted = true;
- }
- var label = gd.label;
- if(this.options.legend.labelFormatter != null) {
- label = this.options.legend.labelFormatter(label);
- }
-
- fragments.push(
- '<td class="legendColorBox"><div style="border:1px solid ' + this.options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:14px;height:10px;background-color:' + gd.color + ';overflow:hidden"></div></div></td>' +
- '<td class="legendLabel">' + label + '</td>');
-
- }.bind(this));
-
- if (rowStarted)
- fragments.push('</tr>');
-
- if(fragments.length > 0){
- var table = '<table style="font-size:smaller;color:' + this.options.grid.color + '">' + fragments.join("") + '</table>';
- if($(this.options.legend.container) != null){
- $(this.options.legend.container).insert(table);
- }else{
- var pos = '';
- var p = this.options.legend.position, m = this.options.legend.margin;
-
- if(p.charAt(0) == 'n') pos += 'top:' + (m + this.chartOffset.top) + 'px;';
- else if(p.charAt(0) == 's') pos += 'bottom:' + (m + this.chartOffset.bottom) + 'px;';
- if(p.charAt(1) == 'e') pos += 'right:' + (m + this.chartOffset.right) + 'px;';
- else if(p.charAt(1) == 'w') pos += 'left:' + (m + this.chartOffset.bottom) + 'px;';
- var div = this.domObj.insert('<div class="ProtoChart-legend" style="border: 1px solid '+this.options.legend.borderColor+'; position:absolute;z-index:2;' + pos +'">' + table + '</div>').getElementsBySelector('div.ProtoChart-legend').first();
-
- if(this.options.legend.backgroundOpacity != 0.0){
- var c = this.options.legend.backgroundColor;
- if(c == null){
- var tmp = (this.options.grid.backgroundColor != null) ? this.options.grid.backgroundColor : this.extractColor(div);
- c = this.parseColor(tmp).adjust(null, null, null, 1).toString();
- }
- this.domObj.insert('<div class="ProtoChart-legend-bg" style="position:absolute;width:' + div.getWidth() + 'px;height:' + div.getHeight() + 'px;' + pos +'background-color:' + c + ';"> </div>').select('div.ProtoChart-legend-bg').first().setStyle({
- 'opacity': this.options.legend.backgroundOpacity
- });
- }
- }
- }
- },
- /**
- * Function: onMouseMove
- *
- * parameters:
- * event: {Object} ev
- *
- * Description:
- * Called whenever the mouse is moved on the graph. This takes care of the mousetracking.
- * This event also fires <ProtoChart:mousemove> event, which gets current position of the
- * mouse as a parameters.
- */
- onMouseMove: function(ev) {
- var e = ev || window.event;
- if (e.pageX == null && e.clientX != null) {
- var de = document.documentElement, b = $(document.body);
- this.lastMousePos.pageX = e.clientX + (de && de.scrollLeft || b.scrollLeft || 0);
- this.lastMousePos.pageY = e.clientY + (de && de.scrollTop || b.scrollTop || 0);
- }
- else {
- this.lastMousePos.pageX = e.pageX;
- this.lastMousePos.pageY = e.pageY;
- }
-
- var offset = this.overlay.cumulativeOffset();
- var pos = {
- x: this.xaxis.min + (e.pageX - offset.left - this.chartOffset.left) / this.hozScale,
- y: this.yaxis.max - (e.pageY - offset.top - this.chartOffset.top) / this.vertScale
- };
-
- if(this.options.mouse.track && this.selectionInterval == null) {
- this.hit(ev, pos);
- }
- this.domObj.fire("ProtoChart:mousemove", [ pos ]);
- },
- /**
- * Function: onMouseDown
- *
- * Parameters:
- * Event - {Object} e
- *
- * Description:
- * Called whenever the mouse is clicked.
- */
- onMouseDown: function(e) {
- if (e.which != 1) // only accept left-click
- return;
-
- document.body.focus();
-
- if (document.onselectstart !== undefined && this.workarounds.onselectstart == null) {
- this.workarounds.onselectstart = document.onselectstart;
- document.onselectstart = function () { return false; };
- }
- if (document.ondrag !== undefined && this.workarounds.ondrag == null) {
- this.workarounds.ondrag = document.ondrag;
- document.ondrag = function () { return false; };
- }
-
- this.setSelectionPos(this.selection.first, e);
-
- if (this.selectionInterval != null)
- clearInterval(this.selectionInterval);
- this.lastMousePos.pageX = null;
- this.selectionInterval = setInterval(this.updateSelectionOnMouseMove.bind(this), 200);
-
- this.overlay.observe("mouseup", this.onSelectionMouseUp.bind(this));
- },
- /**
- * Function: onClick
- * parameters:
- * Event - {Object} e
- * Description:
- * Handles the "click" event on the chart. This function fires <ProtoChart:plotclick> event. If
- * <options.allowDataClick> is enabled then it also fires <ProtoChart:dataclick> event which gives
- * you access to exact data point where user clicked.
- */
- onClick: function(e) {
- if (this.ignoreClick) {
- this.ignoreClick = false;
- return;
- }
- var offset = this.overlay.cumulativeOffset();
- var pos ={
- x: this.xaxis.min + (e.pageX - offset.left - this.chartOffset.left) / this.hozScale,
- y: this.yaxis.max - (e.pageY - offset.top - this.chartOffset.top) / this.vertScale
- };
- this.domObj.fire("ProtoChart:plotclick", [ pos ]);
-
- if(this.options.allowDataClick)
- {
- var dataPoint = {};
- if(this.options.points.show)
- {
- dataPoint = this.getDataClickPoint(pos, this.options);
- this.domObj.fire("ProtoChart:dataclick", [dataPoint]);
- }
- else if(this.options.lines.show && this.options.points.show)
- {
- dataPoint = this.getDataClickPoint(pos, this.options);
- this.domObj.fire("ProtoChart:dataclick", [dataPoint]);
- }
- else if(this.options.bars.show)
- {
- if(this.barDataRange.length > 0)
- {
- dataPoint = this.getDataClickPoint(pos, this.options, this.barDataRange);
- this.domObj.fire("ProtoChart:dataclick", [dataPoint]);
- }
- }
- }
- },
- /**
- * Internal function used by onClick method.
- */
- getDataClickPoint: function(pos, options, barDataRange)
- {
- pos.x = parseInt(pos.x);
- pos.y = parseInt(pos.y);
- var yClick = pos.y.toFixed(0);
- var dataVal = {};
-
- dataVal.position = pos;
- dataVal.value = '';
-
- if(options.points.show)
- {
- this.graphData.each(function(gd){
- var temp = gd.data;
- var xClick = parseInt(pos.x.toFixed(0));
- if(xClick < 0) { xClick = 0; }
- if(temp[xClick] && yClick >= temp[xClick][1] - (this.options.points.radius * 10) && yClick <= temp[xClick][1] + (this.options.points.radius * 10)) {
- dataVal.value = temp[xClick][1];
- throw $break;
- }
-
- }.bind(this));
- }
- else if(options.bars.show)
- {
- xClick = pos.x;
- this.barDataRange.each(function(barData){
- barData.each(function(data){
- var temp = data;
- if(xClick > temp.left && xClick < temp.right) {
- dataVal.value = temp.value;
- throw $break;
- }
- }.bind(this));
- }.bind(this));
-
- }
-
- return dataVal;
- },
- /**
- * Function: triggerSelectedEvent
- *
- * Description:
- * Internal function called when a selection on the graph is made. This function
- * fires <ProtoChart:selected> event which has a parameter representing the selection
- * {
- * x1: {int}, y1: {int},
- * x2: {int}, y2: {int}
- * }
- */
- triggerSelectedEvent: function() {
- var x1, x2, y1, y2;
- if (this.selection.first.x <= this.selection.second.x) {
- x1 = this.selection.first.x;
- x2 = this.selection.second.x;
- }
- else {
- x1 = this.selection.second.x;
- x2 = this.selection.first.x;
- }
-
- if (this.selection.first.y >= this.selection.second.y) {
- y1 = this.selection.first.y;
- y2 = this.selection.second.y;
- }
- else {
- y1 = this.selection.second.y;
- y2 = this.selection.first.y;
- }
-
- x1 = this.xaxis.min + x1 / this.hozScale;
- x2 = this.xaxis.min + x2 / this.hozScale;
-
- y1 = this.yaxis.max - y1 / this.vertScale;
- y2 = this.yaxis.max - y2 / this.vertScale;
-
- this.domObj.fire("ProtoChart:selected", [ { x1: x1, y1: y1, x2: x2, y2: y2 } ]);
- },
- /**
- * Internal function
- */
- onSelectionMouseUp: function(e) {
- if (document.onselectstart !== undefined)
- document.onselectstart = this.workarounds.onselectstart;
- if (document.ondrag !== undefined)
- document.ondrag = this.workarounds.ondrag;
-
- if (this.selectionInterval != null) {
- clearInterval(this.selectionInterval);
- this.selectionInterval = null;
- }
-
- this.setSelectionPos(this.selection.second, e);
- this.clearSelection();
- if (!this.selectionIsSane() || e.which != 1)
- return false;
-
- this.drawSelection();
- this.triggerSelectedEvent();
- this.ignoreClick = true;
-
- return false;
- },
- setSelectionPos: function(pos, e) {
- var offset = $(this.overlay).cumulativeOffset();
- if (this.options.selection.mode == "y") {
- if (pos == this.selection.first)
- pos.x = 0;
- else
- pos.x = this.chartWidth;
- }
- else {
- pos.x = e.pageX - offset.left - this.chartOffset.left;
- pos.x = Math.min(Math.max(0, pos.x), this.chartWidth);
- }
-
- if (this.options.selection.mode == "x") {
- if (pos == this.selection.first)
- pos.y = 0;
- else
- pos.y = this.chartHeight;
- }
- else {
- pos.y = e.pageY - offset.top - this.chartOffset.top;
- pos.y = Math.min(Math.max(0, pos.y), this.chartHeight);
- }
- },
- updateSelectionOnMouseMove: function() {
- if (this.lastMousePos.pageX == null)
- return;
-
- this.setSelectionPos(this.selection.second, this.lastMousePos);
- this.clearSelection();
- if (this.selectionIsSane())
- this.drawSelection();
- },
- clearSelection: function() {
- if (this.prevSelection == null)
- return;
-
- var x = Math.min(this.prevSelection.first.x, this.prevSelection.second.x),
- y = Math.min(this.prevSelection.first.y, this.prevSelection.second.y),
- w = Math.abs(this.prevSelection.second.x - this.prevSelection.first.x),
- h = Math.abs(this.prevSelection.second.y - this.prevSelection.first.y);
-
- this.overlayContext.clearRect(x + this.chartOffset.left - this.overlayContext.lineWidth,
- y + this.chartOffset.top - this.overlayContext.lineWidth,
- w + this.overlayContext.lineWidth*2,
- h + this.overlayContext.lineWidth*2);
-
- this.prevSelection = null;
- },
- /**
- * Function: setSelection
- *
- * Parameters:
- * Area - {Object} area represented as a range like: {x1: 3, y1: 3, x2: 4, y2: 8}
- *
- * Description:
- * Sets the current graph selection to the provided range. Calls <drawSelection> and
- * <triggerSelectedEvent> functions internally.
- */
- setSelection: function(area) {
- this.clearSelection();
-
- if (this.options.selection.mode == "x") {
- this.selection.first.y = 0;
- this.selection.second.y = this.chartHeight;
- }
- else {
- this.selection.first.y = (this.yaxis.max - area.y1) * this.vertScale;
- this.selection.second.y = (this.yaxis.max - area.y2) * this.vertScale;
- }
- if (this.options.selection.mode == "y") {
- this.selection.first.x = 0;
- this.selection.second.x = this.chartWidth;
- }
- else {
- this.selection.first.x = (area.x1 - this.xaxis.min) * this.hozScale;
- this.selection.second.x = (area.x2 - this.xaxis.min) * this.hozScale;
- }
-
- this.drawSelection();
- this.triggerSelectedEvent();
- },
- /**
- * Function: drawSelection
- * Description: Internal function called to draw the selection made on the graph.
- */
- drawSelection: function() {
- if (this.prevSelection != null &&
- this.selection.first.x == this.prevSelection.first.x &&
- this.selection.first.y == this.prevSelection.first.y &&
- this.selection.second.x == this.prevSelection.second.x &&
- this.selection.second.y == this.prevSelection.second.y)
- {
- return;
- }
-
- this.overlayContext.strokeStyle = this.parseColor(this.options.selection.color).scale(null, null, null, 0.8).toString();
- this.overlayContext.lineWidth = 1;
- this.context.lineJoin = "round";
- this.overlayContext.fillStyle = this.parseColor(this.options.selection.color).scale(null, null, null, 0.4).toString();
-
- this.prevSelection = { first: { x: this.selection.first.x,
- y: this.selection.first.y },
- second: { x: this.selection.second.x,
- y: this.selection.second.y } };
-
- var x = Math.min(this.selection.first.x, this.selection.second.x),
- y = Math.min(this.selection.first.y, this.selection.second.y),
- w = Math.abs(this.selection.second.x - this.selection.first.x),
- h = Math.abs(this.selection.second.y - this.selection.first.y);
-
- this.overlayContext.fillRect(x + this.chartOffset.left, y + this.chartOffset.top, w, h);
- this.overlayContext.strokeRect(x + this.chartOffset.left, y + this.chartOffset.top, w, h);
- },
- /**
- * Internal function
- */
- selectionIsSane: function() {
- var minSize = 5;
- return Math.abs(this.selection.second.x - this.selection.first.x) >= minSize &&
- Math.abs(this.selection.second.y - this.selection.first.y) >= minSize;
- },
- /**
- * Internal function that formats the track. This is the format the text is shown when mouse
- * tracking is enabled.
- */
- defaultTrackFormatter: function(val)
- {
- return '['+val.x+', '+val.y+']';
- },
- /**
- * Function: clearHit
- */
- clearHit: function(){
- if(this.prevHit){
- this.overlayContext.clearRect(
- this.translateHoz(this.prevHit.x) + this.chartOffset.left - this.options.mouse.radius*2,
- this.translateVert(this.prevHit.y) + this.chartOffset.top - this.options.mouse.radius*2,
- this.options.mouse.radius*3 + this.options.points.lineWidth*3,
- this.options.mouse.radius*3 + this.options.points.lineWidth*3
- );
- this.prevHit = null;
- }
- },
- /**
- * Function: hit
- *
- * Parameters:
- * event - {Object} event object
- * mouse - {Object} mouse object that is used to keep track of mouse movement
- *
- * Description:
- * If hit occurs this function will fire a ProtoChart:hit event.
- */
- hit: function(event, mouse){
- /**
- * Nearest data element.
- */
- var n = {
- dist:Number.MAX_VALUE,
- x:null,
- y:null,
- mouse:null
- };
-
-
- for(var i = 0, data, xsens, ysens; i < this.graphData.length; i++){
- if(!this.graphData[i].mouse.track) continue;
- data = this.graphData[i].data;
- xsens = (this.hozScale*this.graphData[i].mouse.sensibility);
- ysens = (this.vertScale*this.graphData[i].mouse.sensibility);
- for(var j = 0, xabs, yabs; j < data.length; j++){
- xabs = this.hozScale*Math.abs(data[j][0] - mouse.x);
- yabs = this.vertScale*Math.abs(data[j][1] - mouse.y);
-
- if(xabs < xsens && yabs < ysens && (xabs+yabs) < n.dist){
- n.dist = (xabs+yabs);
- n.x = data[j][0];
- n.y = data[j][1];
- n.mouse = this.graphData[i].mouse;
- }
- }
- }
-
- if(n.mouse && n.mouse.track && !this.prevHit || (this.prevHit && n.x != this.prevHit.x && n.y != this.prevHit.y)){
- var el = this.domObj.select('.'+this.options.mouse.clsName).first();
- if(!el){
- var pos = '', p = this.options.mouse.position, m = this.options.mouse.margin;
- if(p.charAt(0) == 'n') pos += 'top:' + (m + this.chartOffset.top) + 'px;';
- else if(p.charAt(0) == 's') pos += 'bottom:' + (m + this.chartOffset.bottom) + 'px;';
- if(p.charAt(1) == 'e') pos += 'right:' + (m + this.chartOffset.right) + 'px;';
- else if(p.charAt(1) == 'w') pos += 'left:' + (m + this.chartOffset.bottom) + 'px;';
-
- this.domObj.insert('<div class="'+this.options.mouse.clsName+'" style="display:none;position:absolute;'+pos+'"></div>');
- return;
- }
- if(n.x !== null && n.y !== null){
- el.setStyle({display:'block'});
-
- this.clearHit();
- if(n.mouse.lineColor != null){
- this.overlayContext.save();
- this.overlayContext.translate(this.chartOffset.left, this.chartOffset.top);
- this.overlayContext.lineWidth = this.options.points.lineWidth;
- this.overlayContext.strokeStyle = n.mouse.lineColor;
- this.overlayContext.fillStyle = '#ffffff';
- this.overlayContext.beginPath();
-
-
- this.overlayContext.arc(this.translateHoz(n.x), this.translateVert(n.y), this.options.mouse.radius, 0, 2 * Math.PI, true);
- this.overlayContext.fill();
- this.overlayContext.stroke();
- this.overlayContext.restore();
- }
- this.prevHit = n;
-
- var decimals = n.mouse.trackDecimals;
- if(decimals == null || decimals < 0) decimals = 0;
- if(!this.options.mouse.fixedPosition)
- {
- el.setStyle({
- left: (this.translateHoz(n.x) + this.options.mouse.radius + 10) + "px",
- top: (this.translateVert(n.y) + this.options.mouse.radius + 10) + "px"
- });
- }
- el.innerHTML = n.mouse.trackFormatter({x: n.x.toFixed(decimals), y: n.y.toFixed(decimals)});
- this.domObj.fire( 'ProtoChart:hit', [n] )
- }else if(this.options.prevHit){
- el.setStyle({display:'none'});
- this.clearHit();
- }
- }
- },
- /**
- * Internal function
- */
- floorInBase: function(n, base) {
- return base * Math.floor(n / base);
- },
- /**
- * Function: extractColor
- *
- * Parameters:
- * element - HTML element or ID of an HTML element
- *
- * Returns:
- * color in string format
- */
- extractColor: function(element)
- {
- var color;
- do
- {
- color = $(element).getStyle('background-color').toLowerCase();
- if(color != '' && color != 'transparent')
- {
- break;
- }
- element = element.up(0); //or else just get the parent ....
- } while(element.nodeName.toLowerCase() != 'body');
-
- //safari fix
- if(color == 'rgba(0, 0, 0, 0)')
- return 'transparent';
- return color;
- },
- /**
- * Function: parseColor
- *
- * Parameters:
- * str - color string in different formats
- *
- * Returns:
- * a Proto.Color Object - use toString() function to retreive the color in rgba/rgb format
- */
- parseColor: function(str)
- {
- var result;
-
- /**
- * rgb(num,num,num)
- */
- if((result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str)))
- return new Proto.Color(parseInt(result[1]), parseInt(result[2]), parseInt(result[3]));
-
- /**
- * rgba(num,num,num,num)
- */
- if((result = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)))
- return new Proto.Color(parseInt(result[1]), parseInt(result[2]), parseInt(result[3]), parseFloat(result[4]));
-
- /**
- * rgb(num%,num%,num%)
- */
- if((result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str)))
- return new Proto.Color(parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55);
-
- /**
- * rgba(num%,num%,num%,num)
- */
- if((result = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)))
- return new Proto.Color(parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55, parseFloat(result[4]));
-
- /**
- * #a0b1c2
- */
- if((result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str)))
- return new Proto.Color(parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16));
-
- /**
- * #fff
- */
- if((result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str)))
- return new Proto.Color(parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16));
-
- /**
- * Otherwise, check if user wants transparent .. or we just return a standard color;
- */
- var name = str.strip().toLowerCase();
- if(name == 'transparent'){
- return new Proto.Color(255, 255, 255, 0);
- }
-
- return new Proto.Color(100,100,100, 1);
-
- }
-});
-
-if(!Proto) var Proto = {};
-
-/**
- * Class: Proto.Color
- *
- * Helper class that manipulates colors using RGBA values.
- *
- */
-
-Proto.Color = Class.create({
- initialize: function(r, g, b, a) {
- this.rgba = ['r', 'g', 'b', 'a'];
- var x = 4;
- while(-1<--x) {
- this[this.rgba[x]] = arguments[x] || ((x==3) ? 1.0 : 0);
- }
- },
- toString: function() {
- if(this.a >= 1.0) {
- return "rgb(" + [this.r, this.g, this.b].join(",") +")";
- }
- else {
- return "rgba("+[this.r, this.g, this.b, this.a].join(",")+")";
- }
- },
- scale: function(rf, gf, bf, af) {
- x = 4;
- while(-1<--x) {
- if(arguments[x] != null) {
- this[this.rgba[x]] *= arguments[x];
- }
- }
- return this.normalize();
- },
- adjust: function(rd, gd, bd, ad) {
- x = 4; //rgba.length
- while (-1<--x) {
- if (arguments[x] != null)
- this[this.rgba[x]] += arguments[x];
- }
- return this.normalize();
- },
- clone: function() {
- return new Proto.Color(this.r, this.b, this.g, this.a);
- },
- limit: function(val,minVal,maxVal) {
- return Math.max(Math.min(val, maxVal), minVal);
- },
- normalize: function() {
- this.r = this.limit(parseInt(this.r), 0, 255);
- this.g = this.limit(parseInt(this.g), 0, 255);
- this.b = this.limit(parseInt(this.b), 0, 255);
- this.a = this.limit(this.a, 0, 1);
- return this;
- }
-}); \ No newline at end of file
diff --git a/src/usr/local/www/protochart/excanvas-compressed.js b/src/usr/local/www/protochart/excanvas-compressed.js
deleted file mode 100644
index 9d71658..0000000
--- a/src/usr/local/www/protochart/excanvas-compressed.js
+++ /dev/null
@@ -1,19 +0,0 @@
-if(!window.CanvasRenderingContext2D){(function(){var I=Math,i=I.round,L=I.sin,M=I.cos,m=10,A=m/2,Q={init:function(a){var b=a||document;if(/MSIE/.test(navigator.userAgent)&&!window.opera){var c=this;b.attachEvent("onreadystatechange",function(){c.r(b)})}},r:function(a){if(a.readyState=="complete"){if(!a.namespaces["s"]){a.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml")}var b=a.createStyleSheet();b.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}";
-var c=a.getElementsByTagName("canvas");for(var d=0;d<c.length;d++){if(!c[d].getContext){this.initElement(c[d])}}}},q:function(a){var b=a.outerHTML,c=a.ownerDocument.createElement(b);if(b.slice(-2)!="/>"){var d="/"+a.tagName,e;while((e=a.nextSibling)&&e.tagName!=d){e.removeNode()}if(e){e.removeNode()}}a.parentNode.replaceChild(c,a);return c},initElement:function(a){a=this.q(a);a.getContext=function(){if(this.l){return this.l}return this.l=new K(this)};a.attachEvent("onpropertychange",V);a.attachEvent("onresize",
-W);var b=a.attributes;if(b.width&&b.width.specified){a.style.width=b.width.nodeValue+"px"}else{a.width=a.clientWidth}if(b.height&&b.height.specified){a.style.height=b.height.nodeValue+"px"}else{a.height=a.clientHeight}return a}};function V(a){var b=a.srcElement;switch(a.propertyName){case "width":b.style.width=b.attributes.width.nodeValue+"px";b.getContext().clearRect();break;case "height":b.style.height=b.attributes.height.nodeValue+"px";b.getContext().clearRect();break}}function W(a){var b=a.srcElement;
-if(b.firstChild){b.firstChild.style.width=b.clientWidth+"px";b.firstChild.style.height=b.clientHeight+"px"}}Q.init();var R=[];for(var E=0;E<16;E++){for(var F=0;F<16;F++){R[E*16+F]=E.toString(16)+F.toString(16)}}function J(){return[[1,0,0],[0,1,0],[0,0,1]]}function G(a,b){var c=J();for(var d=0;d<3;d++){for(var e=0;e<3;e++){var g=0;for(var h=0;h<3;h++){g+=a[d][h]*b[h][e]}c[d][e]=g}}return c}function N(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=
-a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX=a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.d=a.d;b.e=a.e}function O(a){var b,c=1;a=String(a);if(a.substring(0,3)=="rgb"){var d=a.indexOf("(",3),e=a.indexOf(")",d+1),g=a.substring(d+1,e).split(",");b="#";for(var h=0;h<3;h++){b+=R[Number(g[h])]}if(g.length==4&&a.substr(3,1)=="a"){c=g[3]}}else{b=a}return[b,c]}function S(a){switch(a){case "butt":return"flat";case "round":return"round";
-case "square":default:return"square"}}function K(a){this.a=J();this.m=[];this.k=[];this.c=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=m*1;this.globalAlpha=1;this.canvas=a;var b=a.ownerDocument.createElement("div");b.style.width=a.clientWidth+"px";b.style.height=a.clientHeight+"px";b.style.overflow="hidden";b.style.position="absolute";a.appendChild(b);this.j=b;this.d=1;this.e=1}var j=K.prototype;j.clearRect=function(){this.j.innerHTML=
-"";this.c=[]};j.beginPath=function(){this.c=[]};j.moveTo=function(a,b){this.c.push({type:"moveTo",x:a,y:b});this.f=a;this.g=b};j.lineTo=function(a,b){this.c.push({type:"lineTo",x:a,y:b});this.f=a;this.g=b};j.bezierCurveTo=function(a,b,c,d,e,g){this.c.push({type:"bezierCurveTo",cp1x:a,cp1y:b,cp2x:c,cp2y:d,x:e,y:g});this.f=e;this.g=g};j.quadraticCurveTo=function(a,b,c,d){var e=this.f+0.6666666666666666*(a-this.f),g=this.g+0.6666666666666666*(b-this.g),h=e+(c-this.f)/3,l=g+(d-this.g)/3;this.bezierCurveTo(e,
-g,h,l,c,d)};j.arc=function(a,b,c,d,e,g){c*=m;var h=g?"at":"wa",l=a+M(d)*c-A,n=b+L(d)*c-A,o=a+M(e)*c-A,f=b+L(e)*c-A;if(l==o&&!g){l+=0.125}this.c.push({type:h,x:a,y:b,radius:c,xStart:l,yStart:n,xEnd:o,yEnd:f})};j.rect=function(a,b,c,d){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath()};j.strokeRect=function(a,b,c,d){this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath();this.stroke()};j.fillRect=function(a,
-b,c,d){this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath();this.fill()};j.createLinearGradient=function(a,b,c,d){var e=new H("gradient");return e};j.createRadialGradient=function(a,b,c,d,e,g){var h=new H("gradientradial");h.n=c;h.o=g;h.i.x=a;h.i.y=b;return h};j.drawImage=function(a,b){var c,d,e,g,h,l,n,o,f=a.runtimeStyle.width,k=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var q=a.width,r=a.height;a.runtimeStyle.width=
-f;a.runtimeStyle.height=k;if(arguments.length==3){c=arguments[1];d=arguments[2];h=(l=0);n=(e=q);o=(g=r)}else if(arguments.length==5){c=arguments[1];d=arguments[2];e=arguments[3];g=arguments[4];h=(l=0);n=q;o=r}else if(arguments.length==9){h=arguments[1];l=arguments[2];n=arguments[3];o=arguments[4];c=arguments[5];d=arguments[6];e=arguments[7];g=arguments[8]}else{throw"Invalid number of arguments";}var s=this.b(c,d),t=[],v=10,w=10;t.push(" <g_vml_:group",' coordsize="',m*v,",",m*w,'"',' coordorigin="0,0"',
-' style="width:',v,";height:",w,";position:absolute;");if(this.a[0][0]!=1||this.a[0][1]){var x=[];x.push("M11='",this.a[0][0],"',","M12='",this.a[1][0],"',","M21='",this.a[0][1],"',","M22='",this.a[1][1],"',","Dx='",i(s.x/m),"',","Dy='",i(s.y/m),"'");var p=s,y=this.b(c+e,d),z=this.b(c,d+g),B=this.b(c+e,d+g);p.x=Math.max(p.x,y.x,z.x,B.x);p.y=Math.max(p.y,y.y,z.y,B.y);t.push("padding:0 ",i(p.x/m),"px ",i(p.y/m),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",x.join(""),", sizingmethod='clip');")}else{t.push("top:",
-i(s.y/m),"px;left:",i(s.x/m),"px;")}t.push(' ">','<g_vml_:image src="',a.src,'"',' style="width:',m*e,";"," height:",m*g,';"',' cropleft="',h/q,'"',' croptop="',l/r,'"',' cropright="',(q-h-n)/q,'"',' cropbottom="',(r-l-o)/r,'"'," />","</g_vml_:group>");this.j.insertAdjacentHTML("BeforeEnd",t.join(""))};j.stroke=function(a){var b=[],c=O(a?this.fillStyle:this.strokeStyle),d=c[0],e=c[1]*this.globalAlpha,g=10,h=10;b.push("<g_vml_:shape",' fillcolor="',d,'"',' filled="',Boolean(a),'"',' style="position:absolute;width:',
-g,";height:",h,';"',' coordorigin="0 0" coordsize="',m*g," ",m*h,'"',' stroked="',!a,'"',' strokeweight="',this.lineWidth,'"',' strokecolor="',d,'"',' path="');var l={x:null,y:null},n={x:null,y:null};for(var o=0;o<this.c.length;o++){var f=this.c[o];if(f.type=="moveTo"){b.push(" m ");var k=this.b(f.x,f.y);b.push(i(k.x),",",i(k.y))}else if(f.type=="lineTo"){b.push(" l ");var k=this.b(f.x,f.y);b.push(i(k.x),",",i(k.y))}else if(f.type=="close"){b.push(" x ")}else if(f.type=="bezierCurveTo"){b.push(" c ");
-var k=this.b(f.x,f.y),q=this.b(f.cp1x,f.cp1y),r=this.b(f.cp2x,f.cp2y);b.push(i(q.x),",",i(q.y),",",i(r.x),",",i(r.y),",",i(k.x),",",i(k.y))}else if(f.type=="at"||f.type=="wa"){b.push(" ",f.type," ");var k=this.b(f.x,f.y),s=this.b(f.xStart,f.yStart),t=this.b(f.xEnd,f.yEnd);b.push(i(k.x-this.d*f.radius),",",i(k.y-this.e*f.radius)," ",i(k.x+this.d*f.radius),",",i(k.y+this.e*f.radius)," ",i(s.x),",",i(s.y)," ",i(t.x),",",i(t.y))}if(k){if(l.x==null||k.x<l.x){l.x=k.x}if(n.x==null||k.x>n.x){n.x=k.x}if(l.y==
-null||k.y<l.y){l.y=k.y}if(n.y==null||k.y>n.y){n.y=k.y}}}b.push(' ">');if(typeof this.fillStyle=="object"){var v={x:"50%",y:"50%"},w=n.x-l.x,x=n.y-l.y,p=w>x?w:x;v.x=i(this.fillStyle.i.x/w*100+50)+"%";v.y=i(this.fillStyle.i.y/x*100+50)+"%";var y=[];if(this.fillStyle.p=="gradientradial"){var z=this.fillStyle.n/p*100,B=this.fillStyle.o/p*100-z}else{var z=0,B=100}var C={offset:null,color:null},D={offset:null,color:null};this.fillStyle.h.sort(function(T,U){return T.offset-U.offset});for(var o=0;o<this.fillStyle.h.length;o++){var u=
-this.fillStyle.h[o];y.push(u.offset*B+z,"% ",u.color,",");if(u.offset>C.offset||C.offset==null){C.offset=u.offset;C.color=u.color}if(u.offset<D.offset||D.offset==null){D.offset=u.offset;D.color=u.color}}y.pop();b.push("<g_vml_:fill",' color="',D.color,'"',' color2="',C.color,'"',' type="',this.fillStyle.p,'"',' focusposition="',v.x,", ",v.y,'"',' colors="',y.join(""),'"',' opacity="',e,'" />')}else if(a){b.push('<g_vml_:fill color="',d,'" opacity="',e,'" />')}else{b.push("<g_vml_:stroke",' opacity="',
-e,'"',' joinstyle="',this.lineJoin,'"',' miterlimit="',this.miterLimit,'"',' endcap="',S(this.lineCap),'"',' weight="',this.lineWidth,'px"',' color="',d,'" />')}b.push("</g_vml_:shape>");this.j.insertAdjacentHTML("beforeEnd",b.join(""));this.c=[]};j.fill=function(){this.stroke(true)};j.closePath=function(){this.c.push({type:"close"})};j.b=function(a,b){return{x:m*(a*this.a[0][0]+b*this.a[1][0]+this.a[2][0])-A,y:m*(a*this.a[0][1]+b*this.a[1][1]+this.a[2][1])-A}};j.save=function(){var a={};N(this,a);
-this.k.push(a);this.m.push(this.a);this.a=G(J(),this.a)};j.restore=function(){N(this.k.pop(),this);this.a=this.m.pop()};j.translate=function(a,b){var c=[[1,0,0],[0,1,0],[a,b,1]];this.a=G(c,this.a)};j.rotate=function(a){var b=M(a),c=L(a),d=[[b,c,0],[-c,b,0],[0,0,1]];this.a=G(d,this.a)};j.scale=function(a,b){this.d*=a;this.e*=b;var c=[[a,0,0],[0,b,0],[0,0,1]];this.a=G(c,this.a)};j.clip=function(){};j.arcTo=function(){};j.createPattern=function(){return new P};function H(a){this.p=a;this.n=0;this.o=
-0;this.h=[];this.i={x:0,y:0}}H.prototype.addColorStop=function(a,b){b=O(b);this.h.push({offset:1-a,color:b})};function P(){}G_vmlCanvasManager=Q;CanvasRenderingContext2D=K;CanvasGradient=H;CanvasPattern=P})()};
diff --git a/src/usr/local/www/protochart/excanvas.js b/src/usr/local/www/protochart/excanvas.js
deleted file mode 100644
index f8780b6..0000000
--- a/src/usr/local/www/protochart/excanvas.js
+++ /dev/null
@@ -1,785 +0,0 @@
-// Copyright 2006 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-
-// Known Issues:
-//
-// * Patterns are not implemented.
-// * Radial gradient are not implemented. The VML version of these look very
-// different from the canvas one.
-// * Clipping paths are not implemented.
-// * Coordsize. The width and height attribute have higher priority than the
-// width and height style values which isn't correct.
-// * Painting mode isn't implemented.
-// * Canvas width/height should is using content-box by default. IE in
-// Quirks mode will draw the canvas using border-box. Either change your
-// doctype to HTML5
-// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype)
-// or use Box Sizing Behavior from WebFX
-// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html)
-// * Optimize. There is always room for speed improvements.
-
-// only add this code if we do not already have a canvas implementation
-if (!window.CanvasRenderingContext2D) {
-
-(function () {
-
- // alias some functions to make (compiled) code shorter
- var m = Math;
- var mr = m.round;
- var ms = m.sin;
- var mc = m.cos;
-
- // this is used for sub pixel precision
- var Z = 10;
- var Z2 = Z / 2;
-
- var G_vmlCanvasManager_ = {
- init: function (opt_doc) {
- var doc = opt_doc || document;
- if (/MSIE/.test(navigator.userAgent) && !window.opera) {
- var self = this;
- doc.attachEvent("onreadystatechange", function () {
- self.init_(doc);
- });
- }
- },
-
- init_: function (doc) {
- if (doc.readyState == "complete") {
- // create xmlns
- if (!doc.namespaces["g_vml_"]) {
- doc.namespaces.add("g_vml_", "urn:schemas-microsoft-com:vml");
- }
-
- // setup default css
- var ss = doc.createStyleSheet();
- ss.cssText = "canvas{display:inline-block;overflow:hidden;" +
- // default size is 300x150 in Gecko and Opera
- "text-align:left;width:300px;height:150px}" +
- "g_vml_\\:*{behavior:url(#default#VML)}";
-
- // find all canvas elements
- var els = doc.getElementsByTagName("canvas");
- for (var i = 0; i < els.length; i++) {
- if (!els[i].getContext) {
- this.initElement(els[i]);
- }
- }
- }
- },
-
- fixElement_: function (el) {
- // in IE before version 5.5 we would need to add HTML: to the tag name
- // but we do not care about IE before version 6
- var outerHTML = el.outerHTML;
-
- var newEl = el.ownerDocument.createElement(outerHTML);
- // if the tag is still open IE has created the children as siblings and
- // it has also created a tag with the name "/FOO"
- if (outerHTML.slice(-2) != "/>") {
- var tagName = "/" + el.tagName;
- var ns;
- // remove content
- while ((ns = el.nextSibling) && ns.tagName != tagName) {
- ns.removeNode();
- }
- // remove the incorrect closing tag
- if (ns) {
- ns.removeNode();
- }
- }
- el.parentNode.replaceChild(newEl, el);
- return newEl;
- },
-
- /**
- * Public initializes a canvas element so that it can be used as canvas
- * element from now on. This is called automatically before the page is
- * loaded but if you are creating elements using createElement you need to
- * make sure this is called on the element.
- * @param {HTMLElement} el The canvas element to initialize.
- * @return {HTMLElement} the element that was created.
- */
- initElement: function (el) {
- el = this.fixElement_(el);
- el.getContext = function () {
- if (this.context_) {
- return this.context_;
- }
- return this.context_ = new CanvasRenderingContext2D_(this);
- };
-
- // do not use inline function because that will leak memory
- el.attachEvent('onpropertychange', onPropertyChange);
- el.attachEvent('onresize', onResize);
-
- var attrs = el.attributes;
- if (attrs.width && attrs.width.specified) {
- // TODO: use runtimeStyle and coordsize
- // el.getContext().setWidth_(attrs.width.nodeValue);
- el.style.width = attrs.width.nodeValue + "px";
- } else {
- el.width = el.clientWidth;
- }
- if (attrs.height && attrs.height.specified) {
- // TODO: use runtimeStyle and coordsize
- // el.getContext().setHeight_(attrs.height.nodeValue);
- el.style.height = attrs.height.nodeValue + "px";
- } else {
- el.height = el.clientHeight;
- }
- //el.getContext().setCoordsize_()
- return el;
- }
- };
-
- function onPropertyChange(e) {
- var el = e.srcElement;
-
- switch (e.propertyName) {
- case 'width':
- el.style.width = el.attributes.width.nodeValue + "px";
- el.getContext().clearRect();
- break;
- case 'height':
- el.style.height = el.attributes.height.nodeValue + "px";
- el.getContext().clearRect();
- break;
- }
- }
-
- function onResize(e) {
- var el = e.srcElement;
- if (el.firstChild) {
- el.firstChild.style.width = el.clientWidth + 'px';
- el.firstChild.style.height = el.clientHeight + 'px';
- }
- }
-
- G_vmlCanvasManager_.init();
-
- // precompute "00" to "FF"
- var dec2hex = [];
- for (var i = 0; i < 16; i++) {
- for (var j = 0; j < 16; j++) {
- dec2hex[i * 16 + j] = i.toString(16) + j.toString(16);
- }
- }
-
- function createMatrixIdentity() {
- return [
- [1, 0, 0],
- [0, 1, 0],
- [0, 0, 1]
- ];
- }
-
- function matrixMultiply(m1, m2) {
- var result = createMatrixIdentity();
-
- for (var x = 0; x < 3; x++) {
- for (var y = 0; y < 3; y++) {
- var sum = 0;
-
- for (var z = 0; z < 3; z++) {
- sum += m1[x][z] * m2[z][y];
- }
-
- result[x][y] = sum;
- }
- }
- return result;
- }
-
- function copyState(o1, o2) {
- o2.fillStyle = o1.fillStyle;
- o2.lineCap = o1.lineCap;
- o2.lineJoin = o1.lineJoin;
- o2.lineWidth = o1.lineWidth;
- o2.miterLimit = o1.miterLimit;
- o2.shadowBlur = o1.shadowBlur;
- o2.shadowColor = o1.shadowColor;
- o2.shadowOffsetX = o1.shadowOffsetX;
- o2.shadowOffsetY = o1.shadowOffsetY;
- o2.strokeStyle = o1.strokeStyle;
- o2.arcScaleX_ = o1.arcScaleX_;
- o2.arcScaleY_ = o1.arcScaleY_;
- }
-
- function processStyle(styleString) {
- var str, alpha = 1;
-
- styleString = String(styleString);
- if (styleString.substring(0, 3) == "rgb") {
- var start = styleString.indexOf("(", 3);
- var end = styleString.indexOf(")", start + 1);
- var guts = styleString.substring(start + 1, end).split(",");
-
- str = "#";
- for (var i = 0; i < 3; i++) {
- str += dec2hex[Number(guts[i])];
- }
-
- if ((guts.length == 4) && (styleString.substr(3, 1) == "a")) {
- alpha = guts[3];
- }
- } else {
- str = styleString;
- }
-
- return [str, alpha];
- }
-
- function processLineCap(lineCap) {
- switch (lineCap) {
- case "butt":
- return "flat";
- case "round":
- return "round";
- case "square":
- default:
- return "square";
- }
- }
-
- /**
- * This class implements CanvasRenderingContext2D interface as described by
- * the WHATWG.
- * @param {HTMLElement} surfaceElement The element that the 2D context should
- * be associated with
- */
- function CanvasRenderingContext2D_(surfaceElement) {
- this.m_ = createMatrixIdentity();
-
- this.mStack_ = [];
- this.aStack_ = [];
- this.currentPath_ = [];
-
- // Canvas context properties
- this.strokeStyle = "#000";
- this.fillStyle = "#000";
-
- this.lineWidth = 1;
- this.lineJoin = "miter";
- this.lineCap = "butt";
- this.miterLimit = Z * 1;
- this.globalAlpha = 1;
- this.canvas = surfaceElement;
-
- var el = surfaceElement.ownerDocument.createElement('div');
- el.style.width = surfaceElement.clientWidth + 'px';
- el.style.height = surfaceElement.clientHeight + 'px';
- el.style.overflow = 'hidden';
- el.style.position = 'absolute';
- surfaceElement.appendChild(el);
-
- this.element_ = el;
- this.arcScaleX_ = 1;
- this.arcScaleY_ = 1;
- }
-
- var contextPrototype = CanvasRenderingContext2D_.prototype;
- contextPrototype.clearRect = function() {
- this.element_.innerHTML = "";
- this.currentPath_ = [];
- };
-
- contextPrototype.beginPath = function() {
- // TODO: Branch current matrix so that save/restore has no effect
- // as per safari docs.
-
- this.currentPath_ = [];
- };
-
- contextPrototype.moveTo = function(aX, aY) {
- this.currentPath_.push({type: "moveTo", x: aX, y: aY});
- this.currentX_ = aX;
- this.currentY_ = aY;
- };
-
- contextPrototype.lineTo = function(aX, aY) {
- this.currentPath_.push({type: "lineTo", x: aX, y: aY});
- this.currentX_ = aX;
- this.currentY_ = aY;
- };
-
- contextPrototype.bezierCurveTo = function(aCP1x, aCP1y,
- aCP2x, aCP2y,
- aX, aY) {
- this.currentPath_.push({type: "bezierCurveTo",
- cp1x: aCP1x,
- cp1y: aCP1y,
- cp2x: aCP2x,
- cp2y: aCP2y,
- x: aX,
- y: aY});
- this.currentX_ = aX;
- this.currentY_ = aY;
- };
-
- contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) {
- // the following is lifted almost directly from
- // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes
- var cp1x = this.currentX_ + 2.0 / 3.0 * (aCPx - this.currentX_);
- var cp1y = this.currentY_ + 2.0 / 3.0 * (aCPy - this.currentY_);
- var cp2x = cp1x + (aX - this.currentX_) / 3.0;
- var cp2y = cp1y + (aY - this.currentY_) / 3.0;
- this.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, aX, aY);
- };
-
- contextPrototype.arc = function(aX, aY, aRadius,
- aStartAngle, aEndAngle, aClockwise) {
- aRadius *= Z;
- var arcType = aClockwise ? "at" : "wa";
-
- var xStart = aX + (mc(aStartAngle) * aRadius) - Z2;
- var yStart = aY + (ms(aStartAngle) * aRadius) - Z2;
-
- var xEnd = aX + (mc(aEndAngle) * aRadius) - Z2;
- var yEnd = aY + (ms(aEndAngle) * aRadius) - Z2;
-
- // IE won't render arches drawn counter clockwise if xStart == xEnd.
- if (xStart == xEnd && !aClockwise) {
- xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something
- // that can be represented in binary
- }
-
- this.currentPath_.push({type: arcType,
- x: aX,
- y: aY,
- radius: aRadius,
- xStart: xStart,
- yStart: yStart,
- xEnd: xEnd,
- yEnd: yEnd});
-
- };
-
- contextPrototype.rect = function(aX, aY, aWidth, aHeight) {
- this.moveTo(aX, aY);
- this.lineTo(aX + aWidth, aY);
- this.lineTo(aX + aWidth, aY + aHeight);
- this.lineTo(aX, aY + aHeight);
- this.closePath();
- };
-
- contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) {
- // Will destroy any existing path (same as FF behaviour)
- this.beginPath();
- this.moveTo(aX, aY);
- this.lineTo(aX + aWidth, aY);
- this.lineTo(aX + aWidth, aY + aHeight);
- this.lineTo(aX, aY + aHeight);
- this.closePath();
- this.stroke();
- };
-
- contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) {
- // Will destroy any existing path (same as FF behaviour)
- this.beginPath();
- this.moveTo(aX, aY);
- this.lineTo(aX + aWidth, aY);
- this.lineTo(aX + aWidth, aY + aHeight);
- this.lineTo(aX, aY + aHeight);
- this.closePath();
- this.fill();
- };
-
- contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) {
- var gradient = new CanvasGradient_("gradient");
- return gradient;
- };
-
- contextPrototype.createRadialGradient = function(aX0, aY0,
- aR0, aX1,
- aY1, aR1) {
- var gradient = new CanvasGradient_("gradientradial");
- gradient.radius1_ = aR0;
- gradient.radius2_ = aR1;
- gradient.focus_.x = aX0;
- gradient.focus_.y = aY0;
- return gradient;
- };
-
- contextPrototype.drawImage = function (image, var_args) {
- var dx, dy, dw, dh, sx, sy, sw, sh;
-
- // to find the original width we overide the width and height
- var oldRuntimeWidth = image.runtimeStyle.width;
- var oldRuntimeHeight = image.runtimeStyle.height;
- image.runtimeStyle.width = 'auto';
- image.runtimeStyle.height = 'auto';
-
- // get the original size
- var w = image.width;
- var h = image.height;
-
- // and remove overides
- image.runtimeStyle.width = oldRuntimeWidth;
- image.runtimeStyle.height = oldRuntimeHeight;
-
- if (arguments.length == 3) {
- dx = arguments[1];
- dy = arguments[2];
- sx = sy = 0;
- sw = dw = w;
- sh = dh = h;
- } else if (arguments.length == 5) {
- dx = arguments[1];
- dy = arguments[2];
- dw = arguments[3];
- dh = arguments[4];
- sx = sy = 0;
- sw = w;
- sh = h;
- } else if (arguments.length == 9) {
- sx = arguments[1];
- sy = arguments[2];
- sw = arguments[3];
- sh = arguments[4];
- dx = arguments[5];
- dy = arguments[6];
- dw = arguments[7];
- dh = arguments[8];
- } else {
- throw "Invalid number of arguments";
- }
-
- var d = this.getCoords_(dx, dy);
-
- var w2 = sw / 2;
- var h2 = sh / 2;
-
- var vmlStr = [];
-
- var W = 10;
- var H = 10;
-
- // For some reason that I've now forgotten, using divs didn't work
- vmlStr.push(' <g_vml_:group',
- ' coordsize="', Z * W, ',', Z * H, '"',
- ' coordorigin="0,0"' ,
- ' style="width:', W, ';height:', H, ';position:absolute;');
-
- // If filters are necessary (rotation exists), create them
- // filters are bog-slow, so only create them if abbsolutely necessary
- // The following check doesn't account for skews (which don't exist
- // in the canvas spec (yet) anyway.
-
- if (this.m_[0][0] != 1 || this.m_[0][1]) {
- var filter = [];
-
- // Note the 12/21 reversal
- filter.push("M11='", this.m_[0][0], "',",
- "M12='", this.m_[1][0], "',",
- "M21='", this.m_[0][1], "',",
- "M22='", this.m_[1][1], "',",
- "Dx='", mr(d.x / Z), "',",
- "Dy='", mr(d.y / Z), "'");
-
- // Bounding box calculation (need to minimize displayed area so that
- // filters don't waste time on unused pixels.
- var max = d;
- var c2 = this.getCoords_(dx + dw, dy);
- var c3 = this.getCoords_(dx, dy + dh);
- var c4 = this.getCoords_(dx + dw, dy + dh);
-
- max.x = Math.max(max.x, c2.x, c3.x, c4.x);
- max.y = Math.max(max.y, c2.y, c3.y, c4.y);
-
- vmlStr.push("padding:0 ", mr(max.x / Z), "px ", mr(max.y / Z),
- "px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",
- filter.join(""), ", sizingmethod='clip');");
- } else {
- vmlStr.push("top:", mr(d.y / Z), "px;left:", mr(d.x / Z), "px;");
- }
-
- vmlStr.push(' ">' ,
- '<g_vml_:image src="', image.src, '"',
- ' style="width:', Z * dw, ';',
- ' height:', Z * dh, ';"',
- ' cropleft="', sx / w, '"',
- ' croptop="', sy / h, '"',
- ' cropright="', (w - sx - sw) / w, '"',
- ' cropbottom="', (h - sy - sh) / h, '"',
- ' />',
- '</g_vml_:group>');
-
- this.element_.insertAdjacentHTML("BeforeEnd",
- vmlStr.join(""));
- };
-
- contextPrototype.stroke = function(aFill) {
- var lineStr = [];
- var lineOpen = false;
- var a = processStyle(aFill ? this.fillStyle : this.strokeStyle);
- var color = a[0];
- var opacity = a[1] * this.globalAlpha;
-
- var W = 10;
- var H = 10;
-
- lineStr.push('<g_vml_:shape',
- ' fillcolor="', color, '"',
- ' filled="', Boolean(aFill), '"',
- ' style="position:absolute;width:', W, ';height:', H, ';"',
- ' coordorigin="0 0" coordsize="', Z * W, ' ', Z * H, '"',
- ' stroked="', !aFill, '"',
- ' strokeweight="', this.lineWidth, '"',
- ' strokecolor="', color, '"',
- ' path="');
-
- var newSeq = false;
- var min = {x: null, y: null};
- var max = {x: null, y: null};
-
- for (var i = 0; i < this.currentPath_.length; i++) {
- var p = this.currentPath_[i];
-
- if (p.type == "moveTo") {
- lineStr.push(" m ");
- var c = this.getCoords_(p.x, p.y);
- lineStr.push(mr(c.x), ",", mr(c.y));
- } else if (p.type == "lineTo") {
- lineStr.push(" l ");
- var c = this.getCoords_(p.x, p.y);
- lineStr.push(mr(c.x), ",", mr(c.y));
- } else if (p.type == "close") {
- lineStr.push(" x ");
- } else if (p.type == "bezierCurveTo") {
- lineStr.push(" c ");
- var c = this.getCoords_(p.x, p.y);
- var c1 = this.getCoords_(p.cp1x, p.cp1y);
- var c2 = this.getCoords_(p.cp2x, p.cp2y);
- lineStr.push(mr(c1.x), ",", mr(c1.y), ",",
- mr(c2.x), ",", mr(c2.y), ",",
- mr(c.x), ",", mr(c.y));
- } else if (p.type == "at" || p.type == "wa") {
- lineStr.push(" ", p.type, " ");
- var c = this.getCoords_(p.x, p.y);
- var cStart = this.getCoords_(p.xStart, p.yStart);
- var cEnd = this.getCoords_(p.xEnd, p.yEnd);
-
- lineStr.push(mr(c.x - this.arcScaleX_ * p.radius), ",",
- mr(c.y - this.arcScaleY_ * p.radius), " ",
- mr(c.x + this.arcScaleX_ * p.radius), ",",
- mr(c.y + this.arcScaleY_ * p.radius), " ",
- mr(cStart.x), ",", mr(cStart.y), " ",
- mr(cEnd.x), ",", mr(cEnd.y));
- }
-
-
- // TODO: Following is broken for curves due to
- // move to proper paths.
-
- // Figure out dimensions so we can do gradient fills
- // properly
- if(c) {
- if (min.x == null || c.x < min.x) {
- min.x = c.x;
- }
- if (max.x == null || c.x > max.x) {
- max.x = c.x;
- }
- if (min.y == null || c.y < min.y) {
- min.y = c.y;
- }
- if (max.y == null || c.y > max.y) {
- max.y = c.y;
- }
- }
- }
- lineStr.push(' ">');
-
- if (typeof this.fillStyle == "object") {
- var focus = {x: "50%", y: "50%"};
- var width = (max.x - min.x);
- var height = (max.y - min.y);
- var dimension = (width > height) ? width : height;
-
- focus.x = mr((this.fillStyle.focus_.x / width) * 100 + 50) + "%";
- focus.y = mr((this.fillStyle.focus_.y / height) * 100 + 50) + "%";
-
- var colors = [];
-
- // inside radius (%)
- if (this.fillStyle.type_ == "gradientradial") {
- var inside = (this.fillStyle.radius1_ / dimension * 100);
-
- // percentage that outside radius exceeds inside radius
- var expansion = (this.fillStyle.radius2_ / dimension * 100) - inside;
- } else {
- var inside = 0;
- var expansion = 100;
- }
-
- var insidecolor = {offset: null, color: null};
- var outsidecolor = {offset: null, color: null};
-
- // We need to sort 'colors' by percentage, from 0 > 100 otherwise ie
- // won't interpret it correctly
- this.fillStyle.colors_.sort(function (cs1, cs2) {
- return cs1.offset - cs2.offset;
- });
-
- for (var i = 0; i < this.fillStyle.colors_.length; i++) {
- var fs = this.fillStyle.colors_[i];
-
- colors.push( (fs.offset * expansion) + inside, "% ", fs.color, ",");
-
- if (fs.offset > insidecolor.offset || insidecolor.offset == null) {
- insidecolor.offset = fs.offset;
- insidecolor.color = fs.color;
- }
-
- if (fs.offset < outsidecolor.offset || outsidecolor.offset == null) {
- outsidecolor.offset = fs.offset;
- outsidecolor.color = fs.color;
- }
- }
- colors.pop();
-
- lineStr.push('<g_vml_:fill',
- ' color="', outsidecolor.color, '"',
- ' color2="', insidecolor.color, '"',
- ' type="', this.fillStyle.type_, '"',
- ' focusposition="', focus.x, ', ', focus.y, '"',
- ' colors="', colors.join(""), '"',
- ' opacity="', opacity, '" />');
- } else if (aFill) {
- lineStr.push('<g_vml_:fill color="', color, '" opacity="', opacity, '" />');
- } else {
- lineStr.push(
- '<g_vml_:stroke',
- ' opacity="', opacity,'"',
- ' joinstyle="', this.lineJoin, '"',
- ' miterlimit="', this.miterLimit, '"',
- ' endcap="', processLineCap(this.lineCap) ,'"',
- ' weight="', this.lineWidth, 'px"',
- ' color="', color,'" />'
- );
- }
-
- lineStr.push("</g_vml_:shape>");
-
- this.element_.insertAdjacentHTML("beforeEnd", lineStr.join(""));
-
- //this.currentPath_ = [];
- };
-
- contextPrototype.fill = function() {
- this.stroke(true);
- };
-
- contextPrototype.closePath = function() {
- this.currentPath_.push({type: "close"});
- };
-
- /**
- * @private
- */
- contextPrototype.getCoords_ = function(aX, aY) {
- return {
- x: Z * (aX * this.m_[0][0] + aY * this.m_[1][0] + this.m_[2][0]) - Z2,
- y: Z * (aX * this.m_[0][1] + aY * this.m_[1][1] + this.m_[2][1]) - Z2
- };
- };
-
- contextPrototype.save = function() {
- var o = {};
- copyState(this, o);
- this.aStack_.push(o);
- this.mStack_.push(this.m_);
- this.m_ = matrixMultiply(createMatrixIdentity(), this.m_);
- };
-
- contextPrototype.restore = function() {
- copyState(this.aStack_.pop(), this);
- this.m_ = this.mStack_.pop();
- };
-
- contextPrototype.translate = function(aX, aY) {
- var m1 = [
- [1, 0, 0],
- [0, 1, 0],
- [aX, aY, 1]
- ];
-
- this.m_ = matrixMultiply(m1, this.m_);
- };
-
- contextPrototype.rotate = function(aRot) {
- var c = mc(aRot);
- var s = ms(aRot);
-
- var m1 = [
- [c, s, 0],
- [-s, c, 0],
- [0, 0, 1]
- ];
-
- this.m_ = matrixMultiply(m1, this.m_);
- };
-
- contextPrototype.scale = function(aX, aY) {
- this.arcScaleX_ *= aX;
- this.arcScaleY_ *= aY;
- var m1 = [
- [aX, 0, 0],
- [0, aY, 0],
- [0, 0, 1]
- ];
-
- this.m_ = matrixMultiply(m1, this.m_);
- };
-
- /******** STUBS ********/
- contextPrototype.clip = function() {
- // TODO: Implement
- };
-
- contextPrototype.arcTo = function() {
- // TODO: Implement
- };
-
- contextPrototype.createPattern = function() {
- return new CanvasPattern_;
- };
-
- // Gradient / Pattern Stubs
- function CanvasGradient_(aType) {
- this.type_ = aType;
- this.radius1_ = 0;
- this.radius2_ = 0;
- this.colors_ = [];
- this.focus_ = {x: 0, y: 0};
- }
-
- CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) {
- aColor = processStyle(aColor);
- this.colors_.push({offset: 1-aOffset, color: aColor});
- };
-
- function CanvasPattern_() {}
-
- // set up externs
- G_vmlCanvasManager = G_vmlCanvasManager_;
- CanvasRenderingContext2D = CanvasRenderingContext2D_;
- CanvasGradient = CanvasGradient_;
- CanvasPattern = CanvasPattern_;
-
-})();
-
-} // if
diff --git a/src/usr/local/www/reboot.php b/src/usr/local/www/reboot.php
index 3a986ac..dc4b2c6 100755
--- a/src/usr/local/www/reboot.php
+++ b/src/usr/local/www/reboot.php
@@ -37,36 +37,47 @@
##|*MATCH=reboot.php*
##|-PRIV
+// Set DEBUG to true to prevent the system_reboot() function from being called
+define("DEBUG", false);
+
require("guiconfig.inc");
require("functions.inc");
require("captiveportal.inc");
-if ($_POST['Submit'] == " " . gettext("No") . " ") {
- header("Location: index.php");
- exit;
-}
-
-$pgtitle = array(gettext("Diagnostics"), gettext("Reboot System"));
+$pgtitle = array(gettext("Diagnostics"),gettext("Reboot System"));
include("head.inc");
+
+if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+?>
+ <meta http-equiv="refresh" content="70;url=/">
+ <div class="alert alert-success" role="alert">
+ <?=gettext("The system is rebooting now. This may take one minute or so.")?>
+ </div>
+<?php
+
+ if(DEBUG)
+ print("Not actually rebooting (DEBUG is set true)");
+ else
+ system_reboot();
+
+} else {
+
+
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($_POST['Submit'] == " " . gettext("Yes") . " "): ?>
-<meta http-equiv=\"refresh\" content=\"70;url=/\">
-<?php print_info_box(gettext("The system is rebooting now. This may take one minute.")); ?>
-<pre>
-<?php system_reboot(); ?>
-</pre>
-<?php else: ?>
-<form action="reboot.php" method="post">
- <p><strong><?=gettext("Are you sure you want to reboot the system?");?></strong></p>
- <p>
- <input name="Submit" type="submit" class="formbtn" value=" <?=gettext("Yes");?> " />
- <input name="Submit" type="submit" class="formbtn" value=" <?=gettext("No");?> " />
- </p>
-</form>
-<?php endif; ?>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Are you sure you want to reboot the system?</h2></div>
+ <div class="panel-body">Click "Yes" to reboot the system immediately, or "No" to go to the system dashboard without rebooting. (There will be a brief delay before the dashboard appears.)<br /><br />
+ <form action="reboot.php" method="post">
+ <input type="submit" class="btn btn-danger pull-center" name="Submit" value="Yes">
+ <a href="/" class="btn btn-default">No</a>
+ </form>
+ </div>
+</div>
+
+<?php
+
+}
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_captiveportal.php b/src/usr/local/www/services_captiveportal.php
index 515bcbb..04a9e20 100644
--- a/src/usr/local/www/services_captiveportal.php
+++ b/src/usr/local/www/services_captiveportal.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: captiveportal
+ pfSense_MODULE: captiveportal
*/
##|+PRIV
@@ -279,9 +279,11 @@ if ($_POST) {
}
}
}
+
if ($_POST['idletimeout'] && (!is_numeric($_POST['idletimeout']) || ($_POST['idletimeout'] < 1))) {
$input_errors[] = gettext("The idle timeout must be at least 1 minute.");
}
+
if ($_POST['freelogins_count'] && (!is_numeric($_POST['freelogins_count']))) {
$input_errors[] = gettext("The pass-through credit count must be a number or left blank.");
} else if ($_POST['freelogins_count'] && is_numeric($_POST['freelogins_count']) && ($_POST['freelogins_count'] >= 1)) {
@@ -289,36 +291,47 @@ if ($_POST) {
$input_errors[] = gettext("The waiting period to restore pass-through credits must be above 0 hours.");
}
}
+
if (($_POST['radiusip'] && !is_ipaddr($_POST['radiusip']))) {
$input_errors[] = sprintf(gettext("A valid IP address must be specified. [%s]"), $_POST['radiusip']);
}
+
if (($_POST['radiusip2'] && !is_ipaddr($_POST['radiusip2']))) {
$input_errors[] = sprintf(gettext("A valid IP address must be specified. [%s]"), $_POST['radiusip2']);
}
+
if (($_POST['radiusip3'] && !is_ipaddr($_POST['radiusip3']))) {
$input_errors[] = sprintf(gettext("A valid IP address must be specified. [%s]"), $_POST['radiusip3']);
}
+
if (($_POST['radiusip4'] && !is_ipaddr($_POST['radiusip4']))) {
$input_errors[] = sprintf(gettext("A valid IP address must be specified. [%s]"), $_POST['radiusip4']);
}
+
if (($_POST['radiusport'] && !is_port($_POST['radiusport']))) {
$input_errors[] = sprintf(gettext("A valid port number must be specified. [%s]"), $_POST['radiusport']);
}
+
if (($_POST['radiusport2'] && !is_port($_POST['radiusport2']))) {
$input_errors[] = sprintf(gettext("A valid port number must be specified. [%s]"), $_POST['radiusport2']);
}
+
if (($_POST['radiusport3'] && !is_port($_POST['radiusport3']))) {
$input_errors[] = sprintf(gettext("A valid port number must be specified. [%s]"), $_POST['radiusport3']);
}
+
if (($_POST['radiusport4'] && !is_port($_POST['radiusport4']))) {
$input_errors[] = sprintf(gettext("A valid port number must be specified. [%s]"), $_POST['radiusport4']);
}
+
if (($_POST['radiusacctport'] && !is_port($_POST['radiusacctport']))) {
$input_errors[] = sprintf(gettext("A valid port number must be specified. [%s]"), $_POST['radiusacctport']);
}
+
if ($_POST['maxproc'] && (!is_numeric($_POST['maxproc']) || ($_POST['maxproc'] < 4) || ($_POST['maxproc'] > 100))) {
$input_errors[] = gettext("The maximum number of concurrent connections per client IP address may not be larger than the global maximum.");
}
+
if (trim($_POST['radiusnasid']) !== "" && !preg_match("/^[\x21-\x7e]{3,253}$/i", trim($_POST['radiusnasid']))) {
$input_errors[] = gettext("The NAS-Identifier must be 3-253 characters long and should only contain ASCII characters.");
}
@@ -333,6 +346,7 @@ if ($_POST) {
$newcp['zoneid'] += 2; /* Reserve space for SSL config if needed */
}
}
+
$cpzoneid = $newcp['zoneid'];
}
$oldifaces = explode(",", $newcp['interface']);
@@ -425,6 +439,7 @@ if ($_POST) {
$newcp['radmac_format'] = $_POST['radmac_format'] ? $_POST['radmac_format'] : false;
$newcp['reverseacct'] = $_POST['reverseacct'] ? true : false;
$newcp['radiusnasid'] = trim($_POST['radiusnasid']);
+
if (!is_array($newcp['page'])) {
$newcp['page'] = array();
}
@@ -445,12 +460,14 @@ if ($_POST) {
/* Clear up unselected interfaces */
$newifaces = explode(",", $newcp['interface']);
$toremove = array_diff($oldifaces, $newifaces);
+
if (!empty($toremove)) {
foreach ($toremove as $removeif) {
$removeif = get_real_interface($removeif);
mwexec("/sbin/ipfw zone {$cpzoneid} mdel {$removeif}");
}
}
+
captiveportal_configure_zone($newcp);
unset($newcp, $newifaces, $toremove);
filter_configure();
@@ -462,792 +479,782 @@ if ($_POST) {
}
}
}
+
+function build_radiusnas_list() {
+ $list = array();
+
+ $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $ifdesc => $ifdescr) {
+ $ipaddr = get_interface_ip($ifdesc);
+ if (is_ipaddr($ipaddr)) {
+ $list[$ifdescr] = $ifdescr . ' - ' . $ipaddr;
+ }
+ }
+
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $sn) {
+ if ($sn['mode'] == "proxyarp" && $sn['type'] == "network") {
+ $start = ip2long32(gen_subnet($sn['subnet'], $sn['subnet_bits']));
+ $end = ip2long32(gen_subnet_max($sn['subnet'], $sn['subnet_bits']));
+ $len = $end - $start;
+
+ for ($i = 0; $i <= $len; $i++) {
+ $snip = long2ip32($start+$i);
+ $list[$snip] = $sn['descr'] . ' - ' . $snip;
+ }
+ } else
+ $list[$sn['subnet']] = $sn['descr'] . ' - ' . $sn['subnet'];
+ }
+ }
+
+ return($list);
+}
+
+function build_cert_list() {
+ global $a_cert;
+
+ $list = array();
+
+ foreach($a_cert as $cert)
+ $list[$cert['refid']] = $cert['descr'];
+
+ return($list);
+}
+
$closehead = false;
include("head.inc");
-?>
-<script type="text/javascript">
-//<![CDATA[
-function enable_change(enable_change) {
- var endis, radius_endis;
- endis = !(document.iform.enable.checked || enable_change);
- localauth_endis = !((!endis && document.iform.auth_method[1].checked) || enable_change);
- radius_endis = !((!endis && document.iform.auth_method[2].checked) || enable_change);
- https_endis = !((!endis && document.iform.httpslogin_enable.checked) || enable_change);
-
- document.iform.cinterface.disabled = endis;
- //document.iform.maxproc.disabled = endis;
- document.iform.maxprocperip.disabled = endis;
- document.iform.idletimeout.disabled = endis;
- document.iform.freelogins_count.disabled = endis;
- document.iform.freelogins_resettimeout.disabled = endis;
- document.iform.freelogins_updatetimeouts.disabled = endis;
- document.iform.timeout.disabled = endis;
- document.iform.preauthurl.disabled = endis;
- document.iform.blockedmacsurl.disabled = endis;
- document.iform.redirurl.disabled = endis;
- document.iform.localauth_priv.disabled = localauth_endis;
- document.iform.radiusip.disabled = radius_endis;
- document.iform.radiusip2.disabled = radius_endis;
- document.iform.radiusip3.disabled = radius_endis;
- document.iform.radiusip4.disabled = radius_endis;
- document.iform.radiusport.disabled = radius_endis;
- document.iform.radiusport3.disabled = radius_endis;
- document.iform.radiusport4.disabled = radius_endis;
- document.iform.radiusport2.disabled = radius_endis;
- document.iform.radiuskey.disabled = radius_endis;
- document.iform.radiuskey2.disabled = radius_endis;
- document.iform.radiuskey3.disabled = radius_endis;
- document.iform.radiuskey4.disabled = radius_endis;
- document.iform.radacct_enable.disabled = radius_endis;
- document.iform.peruserbw.disabled = endis;
- document.iform.bwdefaultdn.disabled = endis;
- document.iform.bwdefaultup.disabled = endis;
- document.iform.reauthenticate.disabled = radius_endis;
- document.iform.auth_method[0].disabled = endis;
- document.iform.auth_method[1].disabled = endis;
- document.iform.auth_method[2].disabled = endis;
- document.iform.radius_protocol[0].disabled = radius_endis;
- document.iform.radius_protocol[1].disabled = radius_endis;
- document.iform.radius_protocol[2].disabled = radius_endis;
- document.iform.radius_protocol[3].disabled = radius_endis;
- document.iform.radmac_enable.disabled = radius_endis;
- document.iform.httpslogin_enable.disabled = endis;
- document.iform.radmac_format.disabled = radius_endis;
- document.iform.httpsname.disabled = https_endis;
- document.iform.certref.disabled = https_endis;
- document.iform.nohttpsforwards.disabled = https_endis;
- document.iform.logoutwin_enable.disabled = endis;
- document.iform.nomacfilter.disabled = endis;
- document.iform.noconcurrentlogins.disabled = endis;
- document.iform.radiusvendor.disabled = radius_endis;
- document.iform.radiussession_timeout.disabled = radius_endis;
- document.iform.radiussrcip_attribute.disabled = radius_endis;
- document.iform.htmlfile.disabled = endis;
- document.iform.errfile.disabled = endis;
- document.iform.logoutfile.disabled = endis;
-
- document.iform.radiusacctport.disabled = (radius_endis || !document.iform.radacct_enable.checked) && !enable_change;
-
- document.iform.radmac_secret.disabled = (radius_endis || !document.iform.radmac_enable.checked) && !enable_change;
-
- var radacct_dis = (radius_endis || !document.iform.radacct_enable.checked) && !enable_change;
- document.iform.reauthenticateacct[0].disabled = radacct_dis;
- document.iform.reauthenticateacct[1].disabled = radacct_dis;
- document.iform.reauthenticateacct[2].disabled = radacct_dis;
- document.iform.reverseacct.disabled = (radius_endis || !document.iform.radacct_enable.checked) && !enable_change;
- document.iform.radiusnasid.disabled = radius_endis;
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+$tab_array = array();
+$tab_array[] = array(gettext("Captive portal(s)"), true, "services_captiveportal.php?zone={$cpzone}");
+$tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Allowed IP addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
+$tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
+display_top_tabs($tab_array, true);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Captive Portal Configuration');
+
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'Enable',
+ 'Enable Captive Portal',
+ $pconfig['enable']
+));
+
+$section->addInput(new Form_Select(
+ 'cinterface',
+ 'Interfaces',
+ explode(",", $pconfig['cinterface']),
+ get_configured_interface_with_descr(),
+ true
+))->addClass('general')->setHelp('Select the interface(s) to enable for captive portal.');
+
+$section->addInput(new Form_Input(
+ 'maxprocperip',
+ 'Maximum concurrent connections',
+ 'number',
+ $pconfig['maxprocperip'],
+ ['min' => '0', 'max' => '100']
+))->setHelp('Timits the number of concurrent connections to the captive portal HTTP(S) server. This does not set how many users can be logged in ' .
+ 'to the captive portal, but rather how many users can load the portal page or authenticate at the same time! ' .
+ 'Possible setting allowed is: minimum 4 connections per client IP address, with a total maximum of 100 connections.');
+
+$section->addInput(new Form_Input(
+ 'idletimeout',
+ 'Idle timeout (Minutes)',
+ 'number',
+ $pconfig['idletimeout']
+))->setHelp('Clients will be disconnected after this amount of inactivity. They may log in again immediately, though. Leave this field blank for no idle timeout.');
+
+$section->addInput(new Form_Input(
+ 'timeout',
+ 'Hard timeout (Minutes)',
+ 'number',
+ $pconfig['timeout']
+))->setHelp('Clients will be disconnected after this amount of time, regardless of activity. They may log in again immediately, though. ' .
+ 'Leave this field blank for no hard timeout (not recommended unless an idle timeout is set).');
+
+$section->addInput(new Form_Input(
+ 'freelogins_count',
+ 'Pass-through credits per MAC address.',
+ 'number',
+ $pconfig['freelogins_count']
+))->setHelp('Allows passing through the captive portal without authentication a limited number of times per MAC address. Once used up, ' .
+ 'the client can only log in with valid credentials until the waiting period specified below has expired. Recommended to set ' .
+ 'a hard timeout and/or idle timeout when using this for it to be effective.');
+
+$section->addInput(new Form_Checkbox(
+ 'freelogins_updatetimeouts',
+ 'Reset waiting period',
+ 'Enable waiting period reset on attempted access',
+ $pconfig['freelogins_updatetimeouts']
+))->setHelp('If enabled, the waiting period is reset to the original duration if access is attempted when all pass-through credits have already been exhausted.');
+
+$section->addInput(new Form_Checkbox(
+ 'logoutwin_enable',
+ 'Logout popup window',
+ 'Enable logout popup window',
+ $pconfig['logoutwin_enable']
+))->setHelp('If enabled, a popup window will appear when clients are allowed through the captive portal. ' .
+ 'This allows clients to explicitly disconnect themselves before the idle or hard timeout occurs.');
+
+$section->addInput(new Form_Input(
+ 'preauthurl',
+ 'Pre-authentication redirect URL',
+ 'text',
+ $pconfig['preauthurl']
+))->setHelp('Use this field to set $PORTAL_REDIRURL$ variable which can be accessed using your custom captive portal index.php page or error pages.');
+
+$section->addInput(new Form_Input(
+ 'redirurl',
+ 'After authentication Redirection URL',
+ 'text',
+ $pconfig['redirurl']
+))->setHelp('Clients will be redirected to this URL instead of the one they initially tried to access after they\'ve authenticated');
+
+$section->addInput(new Form_Input(
+ 'blockedmacsurl',
+ 'Blocked MAC address redirect URL',
+ 'text',
+ $pconfig['blockedmacsurl']
+))->setHelp('Blocked MAC addresses will be redirected to this URL when attempting access.');
+
+$section->addInput(new Form_Checkbox(
+ 'noconcurrentlogins',
+ 'Concurrent user logins',
+ 'Disable Concurrent user logins',
+ $pconfig['noconcurrentlogins']
+))->setHelp('If enabled only the most recent login per username will be active. Subsequent logins will cause machines previously logged in with the ' .
+ 'same username to be disconnected.');
+
+$section->addInput(new Form_Checkbox(
+ 'nomacfilter',
+ 'MAC filtering',
+ 'Disable MAC filtering',
+ $pconfig['nomacfilter']
+))->setHelp('If enabled no attempts will be made to ensure that the MAC address of clients stays the same while they are logged in. ' .
+ 'This is required when the MAC address of the client cannot be determined (usually because there are routers betweenpfSenseand the clients). ' .
+ 'If this is enabled, RADIUS MAC authentication cannot be used.');
+
+$section->addInput(new Form_Checkbox(
+ 'passthrumacadd',
+ 'Pass-through MAC Auto Entry',
+ 'Enable Pass-through MAC automatic additions',
+ $pconfig['passthrumacadd']
+))->setHelp(sprintf('If this enabled a MAC passthrough entry is automatically added after the user has successfully authenticated. Users of that MAC address will ' .
+ 'never have to authenticate again. To remove the passthrough MAC entry you either have to log in and remove it manually from the ' .
+ '%s or send a POST from another system.' .
+ 'If this is enabled, RADIUS MAC authentication cannot be used. Also, the logout window will not be shown.', '<a href="services_captiveportal_mac.php">MAC tab</a>'));
+
+$section->addInput(new Form_Checkbox(
+ 'passthrumacaddusername',
+ null,
+ 'Enable Pass-through MAC automatic addition with username',
+ $pconfig['passthrumacaddusername']
+))->setHelp(sprintf('If enabled with the automatically MAC passthrough entry created, the username used during authentication will be saved. ' .
+ 'To remove the passthrough MAC entry you either have to log in and remove it manually from the %s or send a POST from another system.',
+ '<a href="services_captiveportal_mac.php">MAC tab</a>'));
+
+$section->addInput(new Form_Checkbox(
+ 'peruserbw',
+ 'Per-user bandwidth restriction',
+ 'Enable per-user bandwidth restriction',
+ $pconfig['peruserbw']
+));
+
+$section->addInput(new Form_Input(
+ 'bwdefaultdn',
+ 'Default download (Kbit/s)',
+ 'number',
+ $pconfig['bwdefaultdn']
+));
+
+$section->addInput(new Form_Input(
+ 'bwdefaultup',
+ 'Default download (Kbit/s)',
+ 'number',
+ $pconfig['bwdefaultup']
+))->setHelp('If this option is set, the captive portal will restrict each user who logs in to the specified default bandwidth. ' .
+ 'RADIUS can override the default settings. Leave empty or set to 0 for no limit.');
+
+$form->add($section);
+
+$section = new Form_Section('Authentication');
+$section->addClass('Authentication');
+
+$group = new Form_Group('Authentication method');
+
+$group->add(new Form_Checkbox(
+ 'auth_method',
+ null,
+ 'No Authentication',
+ $pconfig['auth_method'] == 'none',
+ 'none'
+))->displayasRadio();
+
+$group->add(new Form_Checkbox(
+ 'auth_method',
+ null,
+ 'Local/Vouchers',
+ $pconfig['auth_method'] == 'local',
+ 'local'
+))->displayasRadio()->setHelp('<a href="system_usermanager.php">User Manager</a>');
+
+$group->add(new Form_Checkbox(
+ 'auth_method',
+ null,
+ 'RADIUS Authentication',
+ $pconfig['auth_method'] == 'radius',
+ 'radius'
+))->displayasRadio();
+
+$section->add($group);
+
+$section->addInput(new Form_Checkbox(
+ 'localauth_priv',
+ null,
+ 'Allow only users/groups with "Captive portal login" privilege set',
+ $pconfig['localauth_priv']
+));
+
+$group = new Form_Group('Radius protocol');
+
+$group->add(new Form_Checkbox(
+ 'radius_protocol',
+ null,
+ 'PAP',
+ $pconfig['radius_protocol'] == 'PAP',
+ 'PAP'
+))->displayasRadio();
+
+$group->add(new Form_Checkbox(
+ 'radius_protocol',
+ null,
+ 'CHAP-MD5',
+ $pconfig['radius_protocol'] == 'CHAP_MD5',
+ 'CHAP_MD5'
+))->displayasRadio();
+
+$group->add(new Form_Checkbox(
+ 'radius_protocol',
+ null,
+ 'MSCHAPv1',
+ $pconfig['radius_protocol'] == 'MSCHAPv1',
+ 'MSCHAPv1'
+))->displayasRadio();
+
+$group->add(new Form_Checkbox(
+ 'radius_protocol',
+ null,
+ 'MSCHAPv2',
+ $pconfig['radius_protocol'] == 'MSCHAPv2',
+ 'SCHAPv2'
+))->displayasRadio();
+
+$section->add($group);
+
+$form->add($section);
+
+$section = new Form_Section('Primary Authentication Source');
+$section->addClass('Primary');
+
+$group = new Form_Group('Primary RADIUS server');
+
+$group->add(new Form_IpAddress(
+ 'radiusip',
+ null,
+ $pconfig['radiusip']
+));
+
+$group->add(new Form_Input(
+ 'radiusport',
+ null,
+ 'number',
+ $pconfig['radiusport']
+));
+
+$group->add(new Form_Input(
+ 'radiuskey',
+ null,
+ 'text',
+ $pconfig['radiuskey']
+));
+
+$section->add($group);
+
+$group = new Form_Group('Secondary RADIUS server');
+
+$group->add(new Form_IpAddress(
+ 'radiusip2',
+ null,
+ $pconfig['radiusip2']
+))->setHelp('IP address of the RADIUS server to authenticate against.');
+
+$group->add(new Form_Input(
+ 'radiusport2',
+ null,
+ 'number',
+ $pconfig['radiusport2']
+))->setHelp('Leave blank for default (1812)');
+
+$group->add(new Form_Input(
+ 'radiuskey3',
+ null,
+ 'text',
+ $pconfig['radiuskey3']
+))->setHelp('Leave blank to not use a RADIUS shared secret (not recommended)');
+
+$section->add($group);
+
+$form->add($section);
+
+$section = new Form_Section('Secondary Authentication Source');
+$section->addClass('Secondary');
+
+$group = new Form_Group('Primary RADIUS server');
+
+$group->add(new Form_IpAddress(
+ 'radiusip4',
+ null,
+ $pconfig['radiusip4']
+));
+
+$group->add(new Form_Input(
+ 'radiusport4',
+ null,
+ 'number',
+ $pconfig['radiusport4']
+));
+
+$group->add(new Form_Input(
+ 'radiuskey4',
+ null,
+ 'text',
+ $pconfig['radiuskey4']
+));
+
+$section->add($group);
+
+$group = new Form_Group('Secondary RADIUS server');
+
+$group->add(new Form_IpAddress(
+ 'radiusip',
+ null,
+ $pconfig['radiusip']
+))->setHelp('IP address of the RADIUS server to authenticate against.');
+
+$group->add(new Form_Input(
+ 'radiusport',
+ null,
+ 'number',
+ $pconfig['radiusport']
+))->setHelp('Leave blank for default (1812)');
+
+$group->add(new Form_Input(
+ 'radiuskey',
+ null,
+ 'text',
+ $pconfig['radiuskey']
+))->setHelp('Leave blank to not use a RADIUS shared secret (not recommended)');
+
+$section->add($group);
+$form->add($section);
+
+$section = new Form_Section('Accounting');
+$section->addClass('Accounting');
+
+$section->addInput(new Form_Checkbox(
+ 'radacct_enable',
+ 'RADIUS',
+ 'Send RADIUS accounting packets to the primary RADIUS server.',
+ $pconfig['radacct_enable']
+));
+
+$section->addInput(new Form_Input(
+ 'radiusacctport',
+ 'Accounting Port',
+ 'text',
+ $pconfig['radiusacctport']
+))->setHelp('Leave blank to use the default port (1813).');
+
+$group = new Form_Group('Accounting updates');
+
+$group->add(new Form_Checkbox(
+ 'reauthenticateacct',
+ null,
+ 'No Accounting updates',
+ !$pconfig['reauthenticateacct']
+))->displayasRadio();
+
+$group->add(new Form_Checkbox(
+ 'reauthenticateacct',
+ null,
+ 'Stop/stop Accounting',
+ $pconfig['reauthenticateacct'] == 'stopstart'
+))->displayasRadio();
+
+$group->add(new Form_Checkbox(
+ 'reauthenticateacct',
+ null,
+ 'Interim update',
+ $pconfig['reauthenticateacct'] == 'interimupdate'
+))->displayasRadio();
+
+$section->add($group);
+
+$form->add($section);
+
+$section = new Form_Section('RADIUS options');
+$section->addClass('Radius');
+
+$section->addInput(new Form_Checkbox(
+ 'reauthenticate',
+ 'Reathentication',
+ 'Reauthenticate connected users every minute',
+ $pconfig['reauthenticate']
+))->setHelp('If reauthentication is enabled, Access-Requests will be sent to the RADIUS server for each user that is logged in every minute. ' .
+ 'If an Access-Reject is received for a user, that user is disconnected from the captive portal immediately.');
+
+$section->addInput(new Form_Checkbox(
+ 'radmac_enable',
+ 'RADIUS MAC Authentication',
+ 'Enable RADIUS MAC authentication',
+ $pconfig['radmac_enable']
+))->setHelp('If this option is enabled, the captive portal will try to authenticate users by sending their MAC address as the username ' .
+ 'and the password entered below to the RADIUS server.');
+
+$section->addInput(new Form_Input(
+ 'radmac_secret',
+ 'MAC authentication secret',
+ 'text',
+ $pconfig['radmac_secret']
+));
+
+$section->addInput(new Form_Select(
+ 'radiussrcip_attribute',
+ 'RADIUS NAS IP Attribute',
+ $pconfig['radiussrcip_attribute'],
+ build_radiusnas_list()
+))->setHelp('Choose the IP to use for calling station attribute.');
+
+$section->addInput(new Form_Checkbox(
+ 'radiussession_timeout',
+ 'Session timeout',
+ 'Use RADIUS Session-Timeout attributes',
+ $pconfig['radiussession_timeout']
+))->setHelp('When enabled, clients will be disconnected after the amount of time retrieved from the RADIUS Session-Timeout attribute.');
+
+$section->addInput(new Form_Select(
+ 'radiusvendor',
+ 'Type',
+ $pconfig['radiusvendor'],
+ ['default' => 'default', 'cisco' => 'cisco']
+))->setHelp('If RADIUS type is set to Cisco, in Access-Requests the value of Calling-Station-ID will be set to the client\'s IP address and the ' .
+ 'Called-Station-Id to the client\'s MAC address. Default behavior is Calling-Station-Id = client\'s MAC address and ' .
+ 'Called-Station-ID = pfSense\'s WAN IP address.');
+
+$section->addInput(new Form_Checkbox(
+ 'reverseacct',
+ 'Accounting style',
+ 'Invert Acct-Input-Octets and Acct-Output-Octets',
+ $pconfig['reverseacct']
+))->setHelp('When enabled, data counts for RADIUS accounting packets will be taken from the client perspective, not the NAS. ' .
+ 'Acct-Input-Octets will represent download, and Acct-Output-Octets will represent upload.');
+
+$section->addInput(new Form_Input(
+ 'radiusnasid',
+ 'NAS Identifier',
+ 'text',
+ $pconfig['radiusnasid']
+))->setHelp('Specify a NAS identifier to override the default value (pfSense.localdomain)');
+
+$section->addInput(new Form_Select(
+ 'radmac_format',
+ 'MAC address format',
+ $pconfig['radmac_format'],
+ ['default' => 'Default', 'singledash' => 'Single dash', 'ietf' => 'IETF', 'cisco' => 'Cisco', 'unformatted' => 'Unformatted']
+))->setHelp('This option changes the MAC address format used in the whole RADIUS system. Change this if you also need to change the username format for ' .
+ 'RADIUS MAC authentication.' . '<br />' .
+ 'Default: 00:11:22:33:44:55' . '<br />' .
+ 'Single dash: 001122-334455' . '<br />' .
+ 'IETF: 00-11-22-33-44-55' . '<br />' .
+ 'Cisco: 0011.2233.4455' . '<br />' .
+ 'Unformatted: 001122334455');
+
+$form->add($section);
+
+$section = new Form_Section('HTTPS options');
+$section->addClass('HTTPS');
+
+$section->addInput(new Form_Checkbox(
+ 'httpslogin_enable',
+ 'Login',
+ 'Enable HTTPS login',
+ $pconfig['httpslogin_enable']
+))->setHelp('When enabled, the username and password will be transmitted over an HTTPS connection to protect against eavesdroppers. ' .
+ 'A server name and certificate must also be specified below.');
+
+$section->addInput(new Form_Input(
+ 'httpsname',
+ 'HTTPS server name',
+ 'text',
+ $pconfig['httpsname']
+))->setHelp('This name will be used in the form action for the HTTPS POST and should match the Common Name (CN) in your certificate ' .
+ '(otherwise, the client browser will most likely display a security warning). ' .
+ 'Make sure captive portal clients can resolve this name in DNS and verify on the client that the IP resolves to the correct interface IP on pfSense.');
+
+$section->addInput(new Form_Select(
+ 'certref',
+ 'SSL Certigicate',
+ $pconfig['certref'],
+ build_cert_list()
+))->setHelp('If no certificates are defined, you may define one here: ' . '<a href="system_certmanager.php">System &gt; Cert Manager</a>');
+
+$section->addInput(new Form_Checkbox(
+ 'nohttpsforwards',
+ 'HTTPS Forwards',
+ 'Disable HTTPS Forwards',
+ $pconfig['nohttpsforwards']
+))->setHelp('If this option is set, attempts to connect to SSL/HTTPS (Port 443) sites will not be forwarded to the captive portal' .
+ 'This prevents certificate errors from being presented to the user even if HTTPS logins are enabled. ' .
+ 'Users must attempt a connecton to an HTTP (Port 80) site to get forwarded to the captive portal. ' .
+ 'If HTTPS logins are enabled, the user will be redirected to the HTTPS login page.');
+
+$form->add($section);
+
+$section = new Form_Section('HTML page contents');
+$section->addClass('HTML');
+
+$section->addInput(new Form_Input(
+ 'htmlfile',
+ 'Portal page contents',
+ 'file',
+ $pconfig['htmlfile']
+))->setHelp('Upload an HTML/PHP file for the portal page here (leave blank to keep the current one). Make sure to include a form (POST to "$PORTAL_ACTION$") ' .
+ 'with a submit button (name="accept") and a hidden field with name="redirurl" and value="$PORTAL_REDIRURL$". ' .
+ 'Include the "auth_user" and "auth_pass" and/or "auth_voucher" input fields if authentication is enabled, otherwise it will always fail.' . '<br />' .
+ 'Example code for the form:' . '<br />' .
+ '&lt;form method=&quot;post&quot; action=&quot;$PORTAL_ACTION$&quot;&gt;<br />
+ &nbsp;&nbsp;&nbsp;&lt;input name=&quot;auth_user&quot; type=&quot;text&quot;&gt;<br />
+ &nbsp;&nbsp;&nbsp;&lt;input name=&quot;auth_pass&quot; type=&quot;password&quot;&gt;<br />
+ &nbsp;&nbsp;&nbsp;&lt;input name=&quot;auth_voucher&quot; type=&quot;text&quot;&gt;<br />
+ &nbsp;&nbsp;&nbsp;&lt;input name=&quot;redirurl&quot; type=&quot;hidden&quot; value=&quot;$PORTAL_REDIRURL$&quot;&gt;<br />
+ &nbsp;&nbsp;&nbsp;&lt;input name=&quot;accept&quot; type=&quot;submit&quot; value=&quot;Continue&quot;&gt;<br />
+ &lt;/form&gt;')->addClass('btn btn-info btn-sm');
+
+if ($pconfig['page']['htmltext']) {
+ $section->addInput(new Form_Button(
+ 'btnview',
+ 'View current page',
+ $href
+ ))->removeClass('btn-primary')->addClass('btn btn-default btn-xs');
+
+ $section->addInput(new Form_Button(
+ 'btndownload',
+ 'Download current page',
+ '?zone=' . $cpzone . '&amp;act=gethtmlhtml'
+ ))->removeClass('btn-primary')->addClass('btn btn-info btn-xs');
+
+ $section->addInput(new Form_Button(
+ 'btndownload',
+ 'Restore default portal page',
+ '?zone=' . $cpzone . '&amp;act=delhtmlhtml'
+ ))->removeClass('btn-primary')->addClass('btn btn-danger btn-xs');
}
-//]]>
-</script>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<form action="services_captiveportal.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="captive portal">
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Captive portal(s)"), true, "services_captiveportal.php?zone={$cpzone}");
- $tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Allowed IP addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
- $tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
- display_top_tabs($tab_array, true);
+
+$section->addInput(new Form_Input(
+ 'errfile',
+ 'Auth error page contents',
+ 'file',
+ $pconfig['errfile']
+))->setHelp('The contents of the HTML/PHP file that you upload here are displayed when an authentication error occurs. ' .
+ 'You may include "$PORTAL_MESSAGE$", which will be replaced by the error or reply messages from the RADIUS ' .
+ 'server, if any.')->addClass('btn btn-info btn-sm');
+
+if ($pconfig['page']['errtext']) {
+ $section->addInput(new Form_Button(
+ 'btnview',
+ 'View current page',
+ '?zone=' . $cpzone . '&amp;act=viewerrhtml'
+ ))->removeClass('btn-primary')->addClass('btn btn-default btn-xs');
+
+ $section->addInput(new Form_Button(
+ 'btndownload',
+ 'Download current page',
+ '?zone=' . $cpzone . '&amp;act=geterrhtml'
+ ))->removeClass('btn-primary')->addClass('btn btn-info btn-xs');
+
+ $section->addInput(new Form_Button(
+ 'btndownload',
+ 'Restore default portal page',
+ '?zone=' . $cpzone . '&amp;act=delerrhtml'
+ ))->removeClass('btn-primary')->addClass('btn btn-danger btn-xs');
+}
+
+$section->addInput(new Form_Input(
+ 'logoutfile',
+ 'Logout page contents',
+ 'file',
+ $pconfig['logoutfile']
+))->setHelp('The contents of the HTML/PHP file that you upload here are displayed on authentication success when the logout popup is enabled.')->addClass('btn btn-info btn-sm');
+
+if ($pconfig['page']['logouttext']) {
+ $section->addInput(new Form_Button(
+ 'btnview',
+ 'View current page',
+ '?zone=' . $cpzone . '&amp;act=viewlogouthtml'
+ ))->removeClass('btn-primary')->addClass('btn btn-default btn-xs');
+
+ $section->addInput(new Form_Button(
+ 'btndownload',
+ 'Download current page',
+ '?zone=' . $cpzone . '&amp;act=getlogouthtml'
+ ))->removeClass('btn-primary')->addClass('btn btn-info btn-xs');
+
+ $section->addInput(new Form_Button(
+ 'btndownload',
+ 'Restore default portal page',
+ '?zone=' . $cpzone . '&amp;act=dellogouthtml'
+ ))->removeClass('btn-primary')->addClass('btn btn-danger btn-xs');
+}
+$section->addInput(new Form_Input(
+ 'zone',
+ null,
+ 'hidden',
+ $cpzone
+));
+
+$form->add($section);
+print($form);
+
+print_info_box(gettext('Warning:' . '<br />' . 'Changing any settings on this page will disconnect all clients! ' .
+ 'Don\'t forget to enable the DHCP server on your captive portal interface! ' .
+ 'Make sure that the default/maximum DHCP lease time is higher than the timeout entered on this page. ' .
+ 'Also, the DNS forwarder needs to be enabled for DNS lookups by unauthenticated clients to work.'));
+
?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main">
- <tr>
- <td width="22%" valign="top" class="vtable">&nbsp;</td>
- <td width="78%" class="vtable">
- <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
- <strong><?=gettext("Enable captive portal"); ?> </strong>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interfaces"); ?></td>
- <td width="78%" class="vtable">
- <select name="cinterface[]" multiple="multiple" size="<?php echo count($config['interfaces']); ?>" class="formselect" id="cinterface">
- <?php
- $interfaces = get_configured_interface_with_descr();
- $cselected = explode(",", $pconfig['cinterface']);
- foreach ($interfaces as $iface => $ifacename): ?>
- <option value="<?=$iface;?>" <?php if (in_array($iface, $cselected)) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
- <?php
- endforeach;
- ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Select the interface(s) to enable for captive portal."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Maximum concurrent connections"); ?></td>
- <td class="vtable">
- <table cellpadding="0" cellspacing="0" summary="connections">
- <tr>
- <td>
- <input name="maxprocperip" type="text" class="formfld unknown" id="maxprocperip" size="5" value="<?=htmlspecialchars($pconfig['maxprocperip']);?>" /> <?=gettext("per client IP address (0 = no limit)"); ?>
- </td>
- </tr>
- </table>
- <?=gettext("This setting limits the number of concurrent connections to the captive portal HTTP(S) server. This does not set how many users can be logged in " .
- "to the captive portal, but rather how many users can load the portal page or authenticate at the same time! " .
- "Possible setting allowed is: minimum 4 connections per client IP address, with a total maximum of 100 connections."); ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Idle timeout"); ?></td>
- <td class="vtable">
- <input name="idletimeout" type="text" class="formfld unknown" id="idletimeout" size="6" value="<?=htmlspecialchars($pconfig['idletimeout']);?>" />
- <?=gettext("minutes"); ?><br />
- <?=gettext("Clients will be disconnected after this amount of inactivity. They may log in again immediately, though. Leave this field blank for no idle timeout."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Hard timeout"); ?></td>
- <td width="78%" class="vtable">
- <input name="timeout" type="text" class="formfld unknown" id="timeout" size="6" value="<?=htmlspecialchars($pconfig['timeout']);?>" />
- <?=gettext("minutes"); ?><br />
- <?=gettext("Clients will be disconnected after this amount of time, regardless of activity. They may log in again immediately, though. Leave this field blank for no hard timeout (not recommended unless an idle timeout is set)."); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Pass-through credits allowed per MAC address"); ?></td>
- <td width="78%" class="vtable">
- <input name="freelogins_count" type="text" class="formfld unknown" id="freelogins_count" size="6" value="<?=htmlspecialchars($pconfig['freelogins_count']);?>" />
- <?=gettext("per client MAC address (0 or blank = none)"); ?><br />
- <?=gettext("This setting allows passing through the captive portal without authentication a limited number of times per MAC address. Once used up, the client can only log in with valid credentials until the waiting period specified below has expired. Recommended to set a hard timeout and/or idle timeout when using this for it to be effective."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Waiting period to restore pass-through credits"); ?></td>
- <td width="78%" class="vtable">
- <input name="freelogins_resettimeout" type="text" class="formfld unknown" id="freelogins_resettimeout" size="6" value="<?=htmlspecialchars($pconfig['freelogins_resettimeout']);?>" />
- <?=gettext("hours"); ?><br />
- <?=gettext("Clients will have their available pass-through credits restored to the original count after this amount of time since using the first one. This must be above 0 hours if pass-through credits are enabled."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Reset waiting period on attempted access"); ?></td>
- <td width="78%" class="vtable">
- <input name="freelogins_updatetimeouts" type="checkbox" class="formfld" id="freelogins_updatetimeouts" value="yes" <?php if ($pconfig['freelogins_updatetimeouts']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable waiting period reset on attempted access"); ?></strong><br />
- <?=gettext("If enabled, the waiting period is reset to the original duration if access is attempted when all pass-through credits have already been exhausted."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Logout popup window"); ?></td>
- <td width="78%" class="vtable">
- <input name="logoutwin_enable" type="checkbox" class="formfld" id="logoutwin_enable" value="yes" <?php if ($pconfig['logoutwin_enable']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable logout popup window"); ?></strong><br />
- <?=gettext("If enabled, a popup window will appear when clients are allowed through the captive portal. This allows clients to explicitly disconnect themselves before the idle or hard timeout occurs."); ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Pre-authentication redirect URL"); ?> </td>
- <td class="vtable">
- <input name="preauthurl" type="text" class="formfld url" id="preauthurl" size="60" value="<?=htmlspecialchars($pconfig['preauthurl']);?>" /><br />
- <?php printf(gettext("Use this field to set \$PORTAL_REDIRURL\$ variable which can be accessed using your custom captive portal index.php page or error pages."));?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("After authentication Redirection URL"); ?></td>
- <td class="vtable">
- <input name="redirurl" type="text" class="formfld url" id="redirurl" size="60" value="<?=htmlspecialchars($pconfig['redirurl']);?>" />
- <br />
- <?=gettext("If you provide a URL here, clients will be redirected to that URL instead of the one they initially tried to access after they've authenticated."); ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Blocked MAC address redirect URL"); ?> </td>
- <td class="vtable">
- <input name="blockedmacsurl" type="text" class="formfld url" id="blockedmacsurl" size="60" value="<?=htmlspecialchars($pconfig['blockedmacsurl']);?>" /><br />
- <?php printf(gettext("If you provide a URL here, MAC addresses set to be blocked will be redirect to that URL when attempt to access anything."));?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Concurrent user logins"); ?></td>
- <td class="vtable">
- <input name="noconcurrentlogins" type="checkbox" class="formfld" id="noconcurrentlogins" value="yes" <?php if ($pconfig['noconcurrentlogins']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable concurrent logins"); ?></strong><br />
- <?=gettext("If this option is set, only the most recent login per username will be active. Subsequent logins will cause machines previously logged in with the same username to be disconnected."); ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("MAC filtering"); ?> </td>
- <td class="vtable">
- <input name="nomacfilter" type="checkbox" class="formfld" id="nomacfilter" value="yes" <?php if ($pconfig['nomacfilter']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable MAC filtering"); ?></strong><br />
- <?=gettext("If this option is set, no attempts will be made to ensure that the MAC address of clients stays the same while they're logged in." .
- "This is required when the MAC address of the client cannot be determined (usually because there are routers between"); ?> <?php echo $g['product_name'] ?> <?=gettext("and the clients)."); ?>
- <?=gettext("If this is enabled, RADIUS MAC authentication cannot be used."); ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Pass-through MAC Auto Entry"); ?></td>
- <td class="vtable">
- <input name="passthrumacadd" type="checkbox" class="formfld" id="passthrumacadd" value="yes" <?php if ($pconfig['passthrumacadd']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable Pass-through MAC automatic additions"); ?></strong><br />
- <?=gettext("If this option is set, a MAC passthrough entry is automatically added after the user has successfully authenticated. Users of that MAC address will never have to authenticate again."); ?>
- <?=gettext("To remove the passthrough MAC entry you either have to log in and remove it manually from the"); ?> <a href="services_captiveportal_mac.php"><?=gettext("MAC tab"); ?></a> <?=gettext("or send a POST from another system to remove it."); ?>
- <?=gettext("If this is enabled, RADIUS MAC authentication cannot be used. Also, the logout window will not be shown."); ?>
- <br /><br />
- <input name="passthrumacaddusername" type="checkbox" class="formfld" id="passthrumacaddusername" value="yes" <?php if ($pconfig['passthrumacaddusername']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable Pass-through MAC automatic addition with username"); ?></strong><br />
- <?=gettext("If this option is set, with the automatically MAC passthrough entry created the username, used during authentication, will be saved."); ?>
- <?=gettext("To remove the passthrough MAC entry you either have to log in and remove it manually from the"); ?> <a href="services_captiveportal_mac.php"><?=gettext("MAC tab"); ?></a> <?=gettext("or send a POST from another system to remove it."); ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Per-user bandwidth restriction"); ?></td>
- <td class="vtable">
- <input name="peruserbw" type="checkbox" class="formfld" id="peruserbw" value="yes" <?php if ($pconfig['peruserbw']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable per-user bandwidth restriction"); ?></strong><br /><br />
- <table cellpadding="0" cellspacing="0" summary="bandwidth">
- <tr>
- <td><?=gettext("Default download"); ?></td>
- <td>
- <input type="text" class="formfld unknown" name="bwdefaultdn" id="bwdefaultdn" size="10" value="<?=htmlspecialchars($pconfig['bwdefaultdn']);?>" /> <?=gettext("Kbit/s"); ?>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Default upload"); ?></td>
- <td>
- <input type="text" class="formfld unknown" name="bwdefaultup" id="bwdefaultup" size="10" value="<?=htmlspecialchars($pconfig['bwdefaultup']);?>" /> <?=gettext("Kbit/s"); ?>
- </td>
- </tr>
- </table>
- <br />
- <?=gettext("If this option is set, the captive portal will restrict each user who logs in to the specified default bandwidth. RADIUS can override the default settings. Leave empty or set to 0 for no limit."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Authentication"); ?></td>
- <td width="78%" class="vtable">
- <table cellpadding="0" cellspacing="0" summary="authentication">
- <tr>
- <td colspan="2">
- <input name="auth_method" type="radio" id="auth_method" value="none" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] != "local" && $pconfig['auth_method'] != "radius") echo "checked=\"checked\""; ?> />
- <?=gettext("No Authentication"); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <input name="auth_method" type="radio" id="auth_method" value="local" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] == "local") echo "checked=\"checked\""; ?> />
- <?=gettext("Local"); ?> <a href="system_usermanager.php"><?=gettext("User Manager"); ?></a> / <?=gettext("Vouchers"); ?>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>
- <input name="localauth_priv" type="checkbox" id="localauth_priv" value="yes" onclick="enable_change(false)" <?php if ($pconfig['localauth_priv'] == "yes") echo "checked=\"checked\""; ?> />
- <?=gettext("Allow only users/groups with 'Captive portal login' privilege set"); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <input name="auth_method" type="radio" id="auth_method" value="radius" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] == "radius") echo "checked=\"checked\""; ?> />
- <?=gettext("RADIUS Authentication"); ?>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS Protocol"); ?></td>
- <td width="78%" class="vtable">
- <table cellpadding="0" cellspacing="0" summary="radius">
- <tr>
- <td colspan="2">
- <input name="radius_protocol" type="radio" id="radius_protocol" value="PAP" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] == "radius" && $pconfig['radius_protocol'] != "CHAP_MD5" && $pconfig['radius_protocol'] != "MSCHAPv1" && $pconfig['radius_protocol'] != "MSCHAPv2") echo "checked=\"checked\""; ?> />
- <?=gettext("PAP"); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <input name="radius_protocol" type="radio" id="radius_protocol" value="CHAP_MD5" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] == "radius" && $pconfig['radius_protocol'] == "CHAP_MD5") echo "checked=\"checked\""; ?> />
- <?=gettext("CHAP_MD5"); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <input name="radius_protocol" type="radio" id="radius_protocol" value="MSCHAPv1" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] == "radius" && $pconfig['radius_protocol'] == "MSCHAPv1") echo "checked=\"checked\""; ?> />
- <?=gettext("MSCHAPv1"); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <input name="radius_protocol" type="radio" id="radius_protocol" value="MSCHAPv2" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] == "radius" && $pconfig['radius_protocol'] == "MSCHAPv2") echo "checked=\"checked\""; ?> />
- <?=gettext("MSCHAPv2"); ?>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>&nbsp;</td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>&nbsp;</td>
- </tr>
- </table>
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="primary athentication">
- <tr>
- <td colspan="2" valign="top" class="listtopic">Primary Authentication Source</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="optsect_t2"><?=gettext("Primary RADIUS server"); ?></td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("IP address"); ?></td>
- <td class="vtable">
- <input name="radiusip" type="text" class="formfld unknown" id="radiusip" size="20" value="<?=htmlspecialchars($pconfig['radiusip']);?>" /><br />
- <?=gettext("Enter the IP address of the RADIUS server which users of the captive portal have to authenticate against."); ?>
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Port"); ?></td>
- <td class="vtable">
- <input name="radiusport" type="text" class="formfld unknown" id="radiusport" size="5" value="<?=htmlspecialchars($pconfig['radiusport']);?>" /><br />
- <?=gettext("Leave this field blank to use the default port (1812)."); ?>
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Shared secret"); ?>&nbsp;&nbsp;</td>
- <td class="vtable">
- <input name="radiuskey" type="text" class="formfld unknown" id="radiuskey" size="16" value="<?=htmlspecialchars($pconfig['radiuskey']);?>" /><br />
- <?=gettext("Leave this field blank to not use a RADIUS shared secret (not recommended)."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="optsect_t2"><?=gettext("Secondary RADIUS server"); ?></td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("IP address"); ?></td>
- <td class="vtable">
- <input name="radiusip2" type="text" class="formfld unknown" id="radiusip2" size="20" value="<?=htmlspecialchars($pconfig['radiusip2']);?>" /><br />
- <?=gettext("If you have a second RADIUS server, you can activate it by entering its IP address here."); ?>
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Port"); ?></td>
- <td class="vtable">
- <input name="radiusport2" type="text" class="formfld unknown" id="radiusport2" size="5" value="<?=htmlspecialchars($pconfig['radiusport2']);?>" />
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Shared secret"); ?>&nbsp;&nbsp;</td>
- <td class="vtable">
- <input name="radiuskey2" type="text" class="formfld unknown" id="radiuskey2" size="16" value="<?=htmlspecialchars($pconfig['radiuskey2']);?>" />
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic">Secondary Authentication Source</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="optsect_t2"><?=gettext("Primary RADIUS server"); ?></td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("IP address"); ?></td>
- <td class="vtable">
- <input name="radiusip3" type="text" class="formfld unknown" id="radiusip3" size="20" value="<?=htmlspecialchars($pconfig['radiusip3']);?>" /><br />
- <?=gettext("If you have a third RADIUS server, you can activate it by entering its IP address here."); ?>
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Port"); ?></td>
- <td class="vtable">
- <input name="radiusport3" type="text" class="formfld unknown" id="radiusport3" size="5" value="<?=htmlspecialchars($pconfig['radiusport3']);?>" />
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Shared secret"); ?>&nbsp;&nbsp;</td>
- <td class="vtable">
- <input name="radiuskey3" type="text" class="formfld unknown" id="radiuskey3" size="16" value="<?=htmlspecialchars($pconfig['radiuskey3']);?>" />
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="optsect_t2"><?=gettext("Secondary RADIUS server"); ?></td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("IP address"); ?></td>
- <td class="vtable">
- <input name="radiusip4" type="text" class="formfld unknown" id="radiusip4" size="20" value="<?=htmlspecialchars($pconfig['radiusip4']);?>" /><br />
- <?=gettext("If you have a fourth RADIUS server, you can activate it by entering its IP address here."); ?>
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Port"); ?></td>
- <td class="vtable">
- <input name="radiusport4" type="text" class="formfld unknown" id="radiusport4" size="5" value="<?=htmlspecialchars($pconfig['radiusport4']);?>" />
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Shared secret"); ?>&nbsp;&nbsp;</td>
- <td class="vtable">
- <input name="radiuskey4" type="text" class="formfld unknown" id="radiuskey4" size="16" value="<?=htmlspecialchars($pconfig['radiuskey4']);?>" />
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Accounting"); ?></td>
- </tr>
- <tr>
- <td class="vncell">&nbsp;</td>
- <td class="vtable">
- <input name="radacct_enable" type="checkbox" id="radacct_enable" value="yes" onclick="enable_change(false)" <?php if ($pconfig['radacct_enable']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("send RADIUS accounting packets"); ?></strong><br />
- <?=gettext("If this is enabled, RADIUS accounting packets will be sent to the primary RADIUS server."); ?>
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Accounting port"); ?></td>
- <td class="vtable">
- <input name="radiusacctport" type="text" class="formfld unknown" id="radiusacctport" size="5" value="<?=htmlspecialchars($pconfig['radiusacctport']);?>" /><br />
- <?=gettext("Leave blank to use the default port (1813)."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Accounting updates"); ?></td>
- <td class="vtable">
- <input name="reauthenticateacct" type="radio" value="" <?php if (!$pconfig['reauthenticateacct']) echo "checked=\"checked\""; ?> /> <?=gettext("no accounting updates"); ?><br />
- <input name="reauthenticateacct" type="radio" value="stopstart" <?php if ($pconfig['reauthenticateacct'] == "stopstart") echo "checked=\"checked\""; ?> /> <?=gettext("stop/start accounting"); ?><br />
- <input name="reauthenticateacct" type="radio" value="interimupdate" <?php if ($pconfig['reauthenticateacct'] == "interimupdate") echo "checked=\"checked\""; ?> /> <?=gettext("interim update"); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("RADIUS options"); ?></td>
- </tr>
- <tr>
- <td class="vncell"><?=gettext("Reauthentication"); ?></td>
- <td class="vtable">
- <input name="reauthenticate" type="checkbox" id="reauthenticate" value="yes" onclick="enable_change(false)" <?php if ($pconfig['reauthenticate']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Reauthenticate connected users every minute"); ?></strong><br />
- <?=gettext("If reauthentication is enabled, Access-Requests will be sent to the RADIUS server for each user that is " .
- "logged in every minute. If an Access-Reject is received for a user, that user is disconnected from the captive portal immediately."); ?>
- </td>
- </tr>
- <tr>
- <td class=""><?=gettext("RADIUS MAC authentication"); ?></td>
- <td class="">
- <input name="radmac_enable" type="checkbox" id="radmac_enable" value="yes" onclick="enable_change(false)" <?php if ($pconfig['radmac_enable']) echo "checked=\"checked\""; ?> /><strong><?=gettext("Enable RADIUS MAC authentication"); ?></strong><br />
- <?=gettext("If this option is enabled, the captive portal will try to authenticate users by sending their MAC address as the username and the password " .
- "entered below to the RADIUS server."); ?>
- </td>
- </tr>
- <tr>
- <td class="vncell"><?=gettext("MAC authentication secret"); ?></td>
- <td class="vtable">
- <input name="radmac_secret" type="text" class="formfld unknown" id="radmac_secret" size="16" value="<?=htmlspecialchars($pconfig['radmac_secret']);?>" />
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("RADIUS NAS IP attribute"); ?></td>
- <td class="vtable">
- <select name="radiussrcip_attribute" id="radiussrcip_attribute">
- <?php
- $iflist = get_configured_interface_with_descr();
- foreach ($iflist as $ifdesc => $ifdescr) {
- $ipaddr = get_interface_ip($ifdesc);
- if (is_ipaddr($ipaddr)) {
- $selected = "";
- if ($ifdesc == $pconfig['radiussrcip_attribute']) {
- $selected= "selected=\"selected\"";
- }
- echo "<option value='{$ifdesc}' {$selected}>{$ifdescr} - {$ipaddr}</option>\n";
- }
- }
- if (is_array($config['virtualip']['vip'])) {
- foreach ($config['virtualip']['vip'] as $sn) {
- if ($sn['mode'] == "proxyarp" && $sn['type'] == "network") {
- $start = ip2long32(gen_subnet($sn['subnet'], $sn['subnet_bits']));
- $end = ip2long32(gen_subnet_max($sn['subnet'], $sn['subnet_bits']));
- $len = $end - $start;
-
- for ($i = 0; $i <= $len; $i++) {
- $snip = long2ip32($start+$i);
- echo "<option value='{$snip}' {$selected}>" . htmlspecialchars("{$sn['descr']} - {$snip}") . "></option>\n";
- }
- } else {
- echo "<option value='{$sn['subnet']}' {$selected}>" . htmlspecialchars("{$sn['descr']} - {$sn['subnet']}") . "></option>\n";
- }
- }
- }
- ?>
- </select><br />
- <?=gettext("Choose the IP to use for calling station attribute."); ?>
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Session-Timeout"); ?></td>
- <td class="vtable">
- <input name="radiussession_timeout" type="checkbox" id="radiussession_timeout" value="yes" <?php if ($pconfig['radiussession_timeout']) echo "checked=\"checked\""; ?> /><strong><?=gettext("Use RADIUS Session-Timeout attributes"); ?></strong><br />
- <?=gettext("When this is enabled, clients will be disconnected after the amount of time retrieved from the RADIUS Session-Timeout attribute."); ?>
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Type"); ?></td>
- <td class="vtable">
- <select name="radiusvendor" id="radiusvendor">
- <option value="default"><?php echo gettext("default"); ?></option>
- <?php
- $radiusvendors = array("cisco");
- foreach ($radiusvendors as $radiusvendor) {
- if ($pconfig['radiusvendor'] == $radiusvendor) {
- echo "<option selected=\"selected\" value=\"$radiusvendor\">$radiusvendor</option>\n";
- } else {
- echo "<option value=\"$radiusvendor\">$radiusvendor</option>\n";
- }
- }
- ?>
- </select><br />
- <?php printf(gettext("If RADIUS type is set to Cisco, in Access-Requests the value of Calling-Station-Id will be set to the client's IP address and " .
- "the Called-Station-Id to the client's MAC address. Default behavior is Calling-Station-Id = client's MAC address and Called-Station-Id = %s's WAN IP address."),
- $g['product_name']);?>
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("Accounting Style"); ?></td>
- <td class="vtable">
- <input name="reverseacct" type="checkbox" id="reverseacct" value="yes" <?php if ($pconfig['reverseacct']) echo "checked=\"checked\""; ?> /><strong><?=gettext("Invert Acct-Input-Octets and Acct-Output-Octets"); ?></strong><br />
- <?=gettext("When this is enabled, data counts for RADIUS accounting packets will be taken from the client perspective, not the NAS. Acct-Input-Octets will represent download, and Acct-Output-Octets will represent upload."); ?>
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("NAS Identifier"); ?></td>
- <td class="vtable">
- <input name="radiusnasid" type="text" maxlength="253" class="formfld unknown" id="radiusnasid" value="<?=htmlspecialchars($pconfig['radiusnasid']);?>" /><br />
- <?=gettext("Specify a NAS identifier to override the default value") . " (" . php_uname("n") . ")"; ?>
- </td>
- </tr>
- <tr>
- <td class="vncell" valign="top"><?=gettext("MAC address format"); ?></td>
- <td class="vtable">
- <select name="radmac_format" id="radmac_format">
- <option value="default"><?php echo gettext("default"); ?></option>
- <?php
- $macformats = array("singledash", "ietf", "cisco", "unformatted");
- foreach ($macformats as $macformat) {
- if ($pconfig['radmac_format'] == $macformat) {
- echo "<option selected=\"selected\" value=\"$macformat\">", gettext($macformat), "</option>\n";
- } else {
- echo "<option value=\"$macformat\">", gettext($macformat), "</option>\n";
- }
- }
- ?>
- </select><br />
- <?=gettext("This option changes the MAC address format used in the whole RADIUS system. Change this if you also"); ?>
- <?=gettext("need to change the username format for RADIUS MAC authentication."); ?><br />
- <?=gettext("default:"); ?> 00:11:22:33:44:55<br />
- <?=gettext("singledash:"); ?> 001122-334455<br />
- <?=gettext("ietf:"); ?> 00-11-22-33-44-55<br />
- <?=gettext("cisco:"); ?> 0011.2233.4455<br />
- <?=gettext("unformatted:"); ?> 001122334455
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("HTTPS login"); ?></td>
- <td class="vtable">
- <input name="httpslogin_enable" type="checkbox" class="formfld" id="httpslogin_enable" value="yes" onclick="enable_change(false)" <?php if ($pconfig['httpslogin_enable']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable HTTPS login"); ?></strong><br />
- <?=gettext("If enabled, the username and password will be transmitted over an HTTPS connection to protect against eavesdroppers. A server name and certificate must also be specified below."); ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("HTTPS server name"); ?> </td>
- <td class="vtable">
- <input name="httpsname" type="text" class="formfld unknown" id="httpsname" size="30" value="<?=htmlspecialchars($pconfig['httpsname']);?>" /><br />
- <?php printf(gettext("This name will be used in the form action for the HTTPS POST and should match the Common Name (CN) in your certificate (otherwise, the client browser will most likely display a security warning). Make sure captive portal clients can resolve this name in DNS and verify on the client that the IP resolves to the correct interface IP on %s."), $g['product_name']);?>
- </td>
- </tr>
- <tr id="ssl_opts">
- <td width="22%" valign="top" class="vncell"><?=gettext("SSL Certificate"); ?></td>
- <td width="78%" class="vtable">
- <?php if (count($a_cert)): ?>
- <select name="certref" id="certref" class="formselect">
- <?php
- foreach ($a_cert as $cert):
- $selected = "";
- if ($pconfig['certref'] == $cert['refid']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$cert['refid'];?>"<?=$selected;?>><?=htmlspecialchars($cert['descr']);?></option>
- <?php endforeach; ?>
- </select>
- <?php else: ?>
- <b><?=gettext("No Certificates defined."); ?></b> <br />Create one under <a href="system_certmanager.php">System &gt; Cert Manager</a>.
- <?php endif; ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Disable HTTPS forwards"); ?></td>
- <td class="vtable">
- <input name="nohttpsforwards" type="checkbox" class="formfld" id="nohttpsforwards" value="yes" <?php if ($pconfig['nohttpsforwards']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable HTTPS forwards"); ?></strong><br/>
- <?=gettext("If this option is set, attempts to connect to SSL/HTTPS (Port 443) sites will not be forwarded to the captive portal. This prevents certificate errors from being presented to the user even if HTTPS logins are enabled. Users must attempt a connecton to an HTTP (Port 80) site to get forwarded to the captive portal. If HTTPS logins are enabled, the user will be redirected to the HTTPS login page."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Portal page contents"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input type="file" name="htmlfile" class="formfld file" id="htmlfile" /><br />
- <?php
- list($host) = explode(":", $_SERVER['HTTP_HOST']);
- $zoneid = $pconfig['zoneid'] ? $pconfig['zoneid'] : 8000;
- if ($pconfig['httpslogin_enable']) {
- $port = $pconfig['listenporthttps'] ? $pconfig['listenporthttps'] : ($zoneid + 8001);
- $href = "https://{$host}:{$port}";
- } else {
- $port = $pconfig['listenporthttp'] ? $pconfig['listenporthttp'] : ($zoneid + 8000);
- $href = "http://{$host}:{$port}";
- }
- ?>
- <?php if ($pconfig['page']['htmltext']): ?>
- <a href="<?=$href?>" target="_blank"><?=gettext("View current page"); ?></a>
- <br />
- <a href="?zone=<?=$cpzone?>&amp;act=gethtmlhtml" target="_blank"><?=gettext("Download current page"); ?></a>
- <br />
- <a href="?zone=<?=$cpzone?>&amp;act=delhtmlhtml" onclick="return confirm('Do you really want to restore default page?')" target="_blank">
- <?=gettext("Restore default portal page"); ?>
- </a>
- <br />
- <br />
- <?php endif; ?>
- <?php
- printf(
- gettext('Upload an HTML/PHP file for the portal page here (leave blank to keep the current one). ' .
- 'Make sure to include a form (POST to %1$s) with a submit button (%2$s) and a hidden field with %3$s and %4$s. ' .
- 'Include the %5$s and %6$s and/or %7$s input fields if authentication is enabled, otherwise it will always fail.'),
- '&quot;$PORTAL_ACTION$&quot;',
- "name=&quot;accept&quot;",
- "name=&quot;redirurl&quot;",
- 'value=&quot;$PORTAL_REDIRURL$&quot;',
- "&quot;auth_user&quot;",
- "&quot;auth_pass&quot;",
- "&quot;auth_voucher&quot;");
- ?>
- <?=gettext("Example code for the form:"); ?><br />
- <br />
- <tt>&lt;form method=&quot;post&quot; action=&quot;$PORTAL_ACTION$&quot;&gt;<br />
- &nbsp;&nbsp;&nbsp;&lt;input name=&quot;auth_user&quot; type=&quot;text&quot;&gt;<br />
- &nbsp;&nbsp;&nbsp;&lt;input name=&quot;auth_pass&quot; type=&quot;password&quot;&gt;<br />
- &nbsp;&nbsp;&nbsp;&lt;input name=&quot;auth_voucher&quot; type=&quot;text&quot;&gt;<br />
- &nbsp;&nbsp;&nbsp;&lt;input name=&quot;redirurl&quot; type=&quot;hidden&quot; value=&quot;$PORTAL_REDIRURL$&quot;&gt;<br />
- &nbsp;&nbsp;&nbsp;&lt;input name=&quot;accept&quot; type=&quot;submit&quot; value=&quot;Continue&quot;&gt;<br />
- &lt;/form&gt;</tt>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Authentication"); ?><br />
- <?=gettext("error page"); ?><br />
- <?=gettext("contents"); ?>
- </td>
- <td class="vtable">
- <input name="errfile" type="file" class="formfld file" id="errfile" /><br />
- <?php if ($pconfig['page']['errtext']): ?>
- <a href="?zone=<?=$cpzone?>&amp;act=viewerrhtml" target="_blank"><?=gettext("View current page"); ?></a>
- <br />
- <a href="?zone=<?=$cpzone?>&amp;act=geterrhtml" target="_blank"><?=gettext("Download current page"); ?></a>
- <br />
- <a href="?zone=<?=$cpzone?>&amp;act=delerrhtml" onclick="return confirm('Do you really want to restore default page?')" target="_blank">
- <?=gettext("Restore default error page"); ?>
- </a>
- <br />
- <br />
- <?php endif; ?>
- <?=gettext("The contents of the HTML/PHP file that you upload here are displayed when an authentication error occurs. " .
- "You may include"); ?> &quot;$PORTAL_MESSAGE$&quot;, <?=gettext("which will be replaced by the error or reply messages from the RADIUS server, if any."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Logout"); ?><br />
- <?=gettext("page"); ?><br />
- <?=gettext("contents"); ?></td>
- <td class="vtable">
- <input name="logoutfile" type="file" class="formfld file" id="logoutfile" /><br />
- <?php if ($pconfig['page']['logouttext']): ?>
- <a href="?zone=<?=$cpzone?>&amp;act=viewlogouthtml" target="_blank"><?=gettext("View current page"); ?></a>
- <br />
- <a href="?zone=<?=$cpzone?>&amp;act=getlogouthtml" target="_blank"><?=gettext("Download current page"); ?></a>
- <br />
- <a href="?zone=<?=$cpzone?>&amp;act=dellogouthtml" onclick="return confirm('Do you really want to restore default page?')" target="_blank">
- <?=gettext("Restore default logout page"); ?>
- </a>
- <br />
- <br />
- <?php endif; ?>
- <?=gettext("The contents of the HTML/PHP file that you upload here are displayed on authentication success when the logout popup is enabled."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <?php echo "<input name='zone' id='zone' type='hidden' value='" . htmlspecialchars($cpzone, ENT_QUOTES | ENT_HTML401) . "' />"; ?>
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
- <a href="services_captiveportal_zones.php"><input name="Cancel" type="button" class="formbtn" value="<?=gettext("Cancel"); ?>" onclick="enable_change(true)" /></a>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <span class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Note:"); ?><br />
- </strong>
- </span>
- <?=gettext("Changing any settings on this page will disconnect all clients! Don't forget to enable the DHCP server on your captive portal interface! Make sure that the default/maximum DHCP lease time is higher than the timeout entered on this page. Also, the DNS Forwarder or Resolver needs to be enabled for DNS lookups by unauthenticated clients to work."); ?>
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
-</form>
+
<script type="text/javascript">
//<![CDATA[
-enable_change(false);
+events.push(function(){
+ //---------- "Standard" show/hide functions ---------------------------------------------------
+
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ // Hides all elements of the specified class belonging to a multiselect.
+ function hideMultiClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).parent().parent().hide();
+ else
+ $('.' + s_class).parent().parent().show();
+ }
+
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
+
+ // Hides the <div> in which the specified checkbox lives so that the checkbox, its label and help text are hidden
+ function hideCheckbox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
+ }
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
+ }
+
+ // ------- Show/hide sections based on checkbox settings --------------------------------------
+ function hideSections(hide) {
+ hideClass('Authentication', hide);
+ hideRadius();
+ hideHTTPS();
+ hideClass('HTTPS', hide);
+ hideClass('HTML', hide);
+ hideGeneral(hide)
+ }
+
+ function hideRadius() {
+ hide = (!$('#enable').prop('checked') || (!($('input[name="auth_method"]:checked').val() == 'radius')));
+
+ hideClass('Primary', hide);
+ hideClass('Secondary', hide);
+ hideClass('Accounting', hide);
+ hideClass('Radius', hide);
+
+ disableInput('localauth_priv', !($('input[name="auth_method"]:checked').val() == 'local'));
+ }
+
+ function hideHTTPS() {
+ hide = (!$('#httpslogin_enable').prop('checked') || !$('#enable').prop('checked'));
+
+ hideInput('httpsname', hide);
+ hideInput('certref', hide);
+ hideCheckbox('nohttpsforwards', hide);
+ }
+
+ function hideGeneral(hide) {
+ hideMultiClass('general', hide);
+ hideInput('maxprocperip', hide);
+ hideInput('idletimeout', hide);
+ hideInput('timeout', hide);
+ hideInput('freelogins_count', hide);
+ hideCheckbox('freelogins_updatetimeouts', hide);
+ hideCheckbox('logoutwin_enable', hide);
+ hideInput('preauthurl', hide);
+ hideInput('redirurl', hide);
+ hideInput('blockedmacsurl', hide);
+ hideCheckbox('noconcurrentlogins', hide);
+ hideCheckbox('nomacfilter', hide);
+ hideCheckbox('passthrumacadd', hide);
+ hideCheckbox('passthrumacaddusername', hide);
+ hideCheckbox('peruserbw', hide);
+ hideInput('bwdefaultdn', hide);
+ hideInput('bwdefaultup', hide);
+ }
+
+ // ---------- Click checkbox handlers ---------------------------------------------------------
+ $("#enable").click(function() {
+ hideSections(!this.checked);
+ });
+
+ $('input[name="auth_method"]').on('change', function() {
+ hideRadius();
+ });
+
+
+ $("#httpslogin_enable").click(function() {
+ hideHTTPS(!this.checked);
+ });
+
+ // ---------- On itial page load --------------------------------------------------------------
+ hideSections(!$('#enable').prop('checked'));
+ disableInput('localauth_priv', !($('input[name="auth_method"]:checked').val() == 'local'));
+});
//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_captiveportal_filemanager.php b/src/usr/local/www/services_captiveportal_filemanager.php
index f672938..afd1610 100644
--- a/src/usr/local/www/services_captiveportal_filemanager.php
+++ b/src/usr/local/www/services_captiveportal_filemanager.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: captiveportal
+ pfSense_MODULE: captiveportal
*/
##|+PRIV
@@ -139,129 +139,152 @@ if ($_POST) {
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
+$tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Allowed IP addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
+$tab_array[] = array(gettext("File Manager"), true, "services_captiveportal_filemanager.php?zone={$cpzone}");
+display_top_tabs($tab_array, true);
+
+require('classes/Form.class.php');
+
+if ($_GET['act'] == 'add') {
+
+ $form = new Form(new Form_Button(
+ 'Submit',
+ 'Upload'
+ ));
+
+ $form->setMultipartEncoding();
+
+ $section = new Form_Section('Upload a new file');
+
+ $section->addInput(new Form_Input(
+ 'zone',
+ null,
+ 'hidden',
+ $cpzone
+ ));
+
+ $section->addInput(new Form_Input(
+ 'new',
+ 'File',
+ 'file'
+ ));
+
+
+ $form->add($section);
+ print($form);
+}
+
+if (is_array($a_cp[$cpzone]['element'])):
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="services_captiveportal_filemanager.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
-<input type="hidden" name="zone" id="zone" value="<?=htmlspecialchars($cpzone);?>" />
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="captiveportal file manager">
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
- $tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Allowed IP addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
- $tab_array[] = array(gettext("File Manager"), true, "services_captiveportal_filemanager.php?zone={$cpzone}");
- display_top_tabs($tab_array, true);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
- <table width="80%" border="0" cellpadding="0" cellspacing="0" summary="main">
- <tr>
- <td width="70%" class="listhdrr"><?=gettext("Name"); ?></td>
- <td width="20%" class="listhdr"><?=gettext("Size"); ?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
- <tr>
- <td width="17" height="17"></td>
- <td>
- <a href="services_captiveportal_filemanager.php?zone=<?=$cpzone;?>&amp;act=add"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add file"); ?>" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Installed Files")?></h2></div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Name"); ?></th>
+ <th><?=gettext("Size"); ?></th>
+ <th>
+ <!-- Buttons -->
+ </th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- if (is_array($a_cp[$cpzone]['element'])):
- $i = 0;
- foreach ($a_cp[$cpzone]['element'] as $element):
+ $i = 0;
+ foreach ($a_cp[$cpzone]['element'] as $element):
?>
- <tr>
- <td class="listlr"><?=htmlspecialchars($element['name']);?></td>
- <td class="listr" align="right"><?=format_bytes($element['size']);?></td>
- <td valign="middle" class="list nowrap">
- <a href="services_captiveportal_filemanager.php?zone=<?=$cpzone;?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this file?"); ?>')"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete file"); ?>" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
+ <tr>
+ <td><?=htmlspecialchars($element['name'])?></td>
+ <td><?=format_bytes($element['size'])?></td>
+ <td>
+ <a href="services_captiveportal_filemanager.php?zone=<?=$cpzone?>&amp;act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger">Delete</a>
+ </td>
+ </tr>
<?php
- $i++;
- endforeach;
- endif;
-?>
+ $i++;
+ endforeach;
-<?php
- if ($total_size > 0):
+ if($total_size > 0) :
?>
- <tr>
- <td class="listlr" style="background-color: #eee"><strong><?=gettext("TOTAL"); ?></strong></td>
- <td class="listr" style="background-color: #eee" align="right"><strong><?=format_bytes($total_size);?></strong></td>
- <td valign="middle" class="list nowrap"></td>
- </tr>
+ <tr>
+ <th>
+ Total
+ </th>
+ <th>
+ <?=format_bytes($total_size);?>
+ </th>
+ <th></th>
+ </tr>
+<?php endif; ?>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
<?php
- endif;
+endif;
- if ($_GET['act'] == 'add'):
?>
- <tr>
- <td class="listlr" colspan="2">
- <input type="file" name="new" class="formfld file" size="40" id="new" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Upload"); ?>" />
- </td>
- <td valign="middle" class="list nowrap">
- <a href="services_captiveportal_filemanager.php?zone=<?=$cpzone;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("cancel"); ?>" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
+ <nav class="action-buttons">
+ <button id="btnnotes" class="btn btn-default">Show Notes</button>
+<?php if (!$_GET['act'] == 'add'): ?>
+ <a href="services_captiveportal_filemanager.php?zone=<?=$cpzone?>&amp;act=add" class="btn btn-success">Add</a>
+<?php endif; ?>
+ </nav>
<?php
- else:
+// The notes displayed on the page are large, the page content comparitively small. A "Note" button
+// is provided so that you only see the notes if you ask for them
?>
- <tr>
- <td class="list" colspan="2"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td width="17" height="17"></td>
- <td>
- <a href="services_captiveportal_filemanager.php?zone=<?=$cpzone;?>&amp;act=add"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add file"); ?>" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+<div class="help-block panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Notes</h2></div>
+ <div class="panel-body">
+ <?=gettext("Any files that you upload here with the filename prefix of captiveportal- will " .
+ "be made available in the root directory of the captive portal HTTP(S) server. " .
+ "You may reference them directly from your portal page HTML code using relative paths. " .
+ "Example: you've uploaded an image with the name 'captiveportal-test.jpg' using the " .
+ "file manager. Then you can include it in your portal page like this:")?><br /><br />
+ <pre>&lt;img src=&quot;captiveportal-test.jpg&quot; width=... height=...&gt;</pre><br /><br />
+ <?=gettext("In addition, you can also upload .php files for execution. You can pass the filename " .
+ "to your custom page from the initial page by using text similar to:")?><br /><br />
+ <pre>&lt;a href="/captiveportal-aup.php?zone=$PORTAL_ZONE$&amp;redirurl=$PORTAL_REDIRURL$"&gt;<?=gettext("Acceptable usage policy"); ?>&lt;/a&gt;</pre><br /><br />
+ <?=sprintf(gettext("The total size limit for all files is %s."), format_bytes($g['captiveportal_element_sizelimit']))?>
+ </div>
+</div>
+
+<script>
+//<![CDATA[
+events.push(function(){
+
+ var hidenotes = true;
+
+ // Hides all elements of the specified class.
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ hideClass('help-block', hidenotes);
+
+ $(function () {
+ $('#btnnotes').on('click', function () {
+ hidenotes = !hidenotes;
+ hideClass('notes', hidenotes);
+ });
+ });
+});
+</script>
<?php
- endif;
-?>
- </table>
- <span class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Note:"); ?><br />
- </strong>
- </span>
- <?=gettext("Any files that you upload here with the filename prefix of captiveportal- will " .
- "be made available in the root directory of the captive portal HTTP(S) server. " .
- "You may reference them directly from your portal page HTML code using relative paths. " .
- "Example: you've uploaded an image with the name 'captiveportal-test.jpg' using the " .
- "file manager. Then you can include it in your portal page like this:"); ?>
- <br /><br />
- <tt>&lt;img src=&quot;captiveportal-test.jpg&quot; width=... height=...&gt;</tt>
- <br /><br />
- <?=gettext("In addition, you can also upload .php files for execution. You can pass the filename " .
- "to your custom page from the initial page by using text similar to:"); ?>
- <br /><br />
- <tt>&lt;a href="/captiveportal-aup.php?zone=$PORTAL_ZONE$&amp;redirurl=$PORTAL_REDIRURL$"&gt;<?=gettext("Acceptable usage policy"); ?>&lt;/a&gt;</tt>
- <br /><br />
- <?php printf(gettext("The total size limit for all files is %s."), format_bytes($g['captiveportal_element_sizelimit']));?>
- </span>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_captiveportal_hostname.php b/src/usr/local/www/services_captiveportal_hostname.php
index 939fb23..0256fc2 100644
--- a/src/usr/local/www/services_captiveportal_hostname.php
+++ b/src/usr/local/www/services_captiveportal_hostname.php
@@ -32,7 +32,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /sbin/ipfw
- pfSense_MODULE: captiveportal
+ pfSense_MODULE: captiveportal
*/
##|+PRIV
@@ -42,6 +42,13 @@
##|*MATCH=services_captiveportal_hostname.php*
##|-PRIV
+$directionicons = array('to' => '&#x2192;', 'from' => '&#x2190;', 'both' => '&#x21c4;');
+
+$notestr =
+ gettext('Adding new hostnames will allow a DNS hostname access to/from the captive portal without being taken to the portal page.' .
+ 'This can be used for a web server serving images for the portal page, or a DNS server on another network, for example. ' .
+ 'By specifying <em>from</em> addresses, it may be used to always allow pass-through access from a client behind the captive portal.');
+
require("guiconfig.inc");
require("functions.inc");
require_once("filter.inc");
@@ -89,6 +96,7 @@ if ($_GET['act'] == "del" && !empty($cpzone) && isset($cpzoneid)) {
pfSense_pipe_action("pipe delete {$ipfw['dnpipe']}");
pfSense_pipe_action("pipe delete " . ($ipfw['dnpipe']+1));
}
+
pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XDEL, 3, $ip, $sn);
pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XDEL, 4, $ip, $sn);
}
@@ -102,131 +110,69 @@ if ($_GET['act'] == "del" && !empty($cpzone) && isset($cpzoneid)) {
}
}
-
include("head.inc");
+
+if ($savemsg)
+ print_info_box($savemsg);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
+$tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Allowed IP Addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Allowed Hostnames"), true, "services_captiveportal_hostname.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
+$tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
+display_top_tabs($tab_array, true);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="services_captiveportal_hostname.php" method="post">
-<input type="hidden" name="zone" id="zone" value="<?=htmlspecialchars($cpzone);?>" />
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="captiveportal hostname">
- <tr>
- <td class="tabnavtbl">
+<div class="table-responsive">
+ <table class="table table-hover table-striped table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Hostname"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ <th><!-- Buttons --></th>
+ </tr>
+ </thead>
+
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
- $tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Allowed IP Addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Allowed Hostnames"), true, "services_captiveportal_hostname.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
- $tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
- display_top_tabs($tab_array, true);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="main">
- <tr>
- <td width="60%" class="listhdrr"><?=gettext("Hostname"); ?></td>
- <td width="40%" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td width="17" height="17"></td>
- <td>
- <a href="services_captiveportal_hostname_edit.php?zone=<?=$cpzone;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add address"); ?>" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+if (is_array($a_cp[$cpzone]['allowedhostname'])): ?>
+ <tbody>
<?php
- if (is_array($a_cp[$cpzone]['allowedhostname'])):
- $i = 0;
- foreach ($a_cp[$cpzone]['allowedhostname'] as $ip):
-?>
- <tr ondblclick="document.location='services_captiveportal_hostname_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i;?>'">
- <td class="listlr">
+$i = 0;
+foreach ($a_cp[$cpzone]['allowedhostname'] as $ip): ?>
+ <tr>
+ <td>
+ <?=$directionicons[$ip['dir']]?>&nbsp;<?=strtolower($ip['hostname'])?>
+ </td>
+ <td >
+ <?=htmlspecialchars($ip['descr'])?>
+ </td>
+ <td>
+ <a href="services_captiveportal_hostname_edit.php?zone=<?=$cpzone?>&amp;id=<?=$i?>" class="btn btn-xs btn-info">Edit</a>
+ <a href="services_captiveportal_hostname.php?zone=<?=$cpzone?>&amp;act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger">Delete</a>
+ </td>
+ </tr>
<?php
- if ($ip['dir'] == "to") {
- echo "any <img src=\"/themes/{$g['theme']}/images/icons/icon_in.gif\" width=\"11\" height=\"11\" align=\"middle\" alt=\"in\" /> ";
- }
- if ($ip['dir'] == "both") {
- echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_pass.gif\" width=\"11\" height=\"11\" align=\"middle\" alt=\"pass\" /> ";
- }
- echo strtolower($ip['hostname']);
- if ($ip['dir'] == "from") {
- echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_in.gif\" width=\"11\" height=\"11\" align=\"middle\" alt=\"in\" /> any";
- }
+$i++;
+endforeach; ?>
+ <tbody>
+ </table>
+ <?=$directionicons['to'] . ' = ' . sprintf(gettext('All connections %sto%s the hostname are allowed'), '<u>','</u>') . ', '?>
+ <?=$directionicons['from'] . ' = ' . sprintf(gettext('All connections %sfrom%s the hostname are allowed'), '<u>','</u>') . ', '?>
+ <?=$directionicons['both'] . ' = ' . sprintf(gettext('All connections %sto or from%s are allowed'), '<u>','</u>')?>
+<?php
+else :
?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($ip['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <a href="services_captiveportal_hostname_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit address"); ?>" width="17" height="17" border="0" alt="add" /></a>
- &nbsp;<a href="services_captiveportal_hostname.php?zone=<?=$cpzone;?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this address?"); ?>')"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete address"); ?>" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
+ </tbody>
+ </table>
<?php
- $i++;
- endforeach;
- endif;
+endif;
?>
- <tr>
- <td class="list" colspan="2">&nbsp;</td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td width="17" height="17"></td>
- <td>
- <a href="services_captiveportal_hostname_edit.php?zone=<?=$cpzone;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add address"); ?>" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list">
- <p class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Note:"); ?><br />
- </strong>
- </span>
- <?=gettext("Adding allowed Hostnames will allow a DNS hostname access to/from access through the captive portal without being taken to the portal page. This can be used for a web server serving images for the portal page or a DNS server on another network, for example. By specifying <em>from</em> addresses, it may be used to always allow pass-through access from a client behind the captive portal."); ?>
- </p>
- <table border="0" cellspacing="0" cellpadding="0" summary="icons">
- <tr>
- <td>
- <span class="vexpl"><?=gettext("any"); ?> <img src="/themes/<?=$g['theme'];?>/images/icons/icon_in.gif" width="11" height="11" align="middle" alt="in" /> x.x.x.x </span>
- </td>
- <td>
- <span class="vexpl"><?=gettext("All connections"); ?> <strong><?=gettext("to"); ?></strong> <?=gettext("the Hostname are allowed"); ?></span>
- </td>
- </tr>
- <tr>
- <td colspan="5" height="4"></td>
- </tr>
- <tr>
- <td>x.x.x.x <span class="vexpl"><img src="/themes/<?=$g['theme'];?>/images/icons/icon_in.gif" width="11" height="11" align="middle" alt="in" /></span> <?=gettext("any"); ?>&nbsp;&nbsp;&nbsp; </td>
- <td><span class="vexpl"><?=gettext("All connections"); ?> <strong><?=gettext("from"); ?></strong> <?=gettext("the Hostname are allowed"); ?> </span></td>
- </tr>
- <tr>
- <td><span class="vexpl"><img src="/themes/<?=$g['theme'];?>/images/icons/icon_pass.gif" width="11" height="11" align="right" alt="pass" /></span>&nbsp;&nbsp;&nbsp;&nbsp; </td>
- <td><span class="vexpl"> All connections <strong>to</strong> and <strong>from</strong> the Hostname are allowed </span></td>
- </tr>
- </table>
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ <nav class="action-buttons">
+ <a href="services_captiveportal_hostname_edit.php?zone=<?=$cpzone?>&amp;act=add" class="btn btn-success">Add</a>
+ </nav>
+</div>
+<?php
+print_info_box($notestr);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_captiveportal_hostname_edit.php b/src/usr/local/www/services_captiveportal_hostname_edit.php
index 674e220..2bd49ff 100644
--- a/src/usr/local/www/services_captiveportal_hostname_edit.php
+++ b/src/usr/local/www/services_captiveportal_hostname_edit.php
@@ -32,7 +32,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /sbin/ipfw
- pfSense_MODULE: captiveportal
+ pfSense_MODULE: captiveportal
*/
##|+PRIV
@@ -101,7 +101,6 @@ if (isset($id) && $a_allowedhostnames[$id]) {
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -165,80 +164,84 @@ if ($_POST) {
}
}
+function build_dir_list() {
+ $dirs = array(gettext("Both"),gettext("From"),gettext("To"));
+ $dirlist = array();
+
+ foreach ($dirs as $dir) {
+ $dirlist[strtolower($dir)] = $dir;
+ }
+
+ return($dirlist);
+}
+
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="services_captiveportal_hostname_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="captiveportal hostname edit">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Direction"); ?></td>
- <td width="78%" class="vtable">
- <select name="dir" class="formfld">
- <?php
- $dirs = array(gettext("Both"), gettext("From"), gettext("To")) ;
- foreach ($dirs as $dir):
- ?>
- <option value="<?=strtolower($dir);?>" <?php if (strtolower($dir) == strtolower($pconfig['dir'])) echo "selected=\"selected\"";?> >
- <?=htmlspecialchars($dir);?>
- </option>
- <?php
- endforeach;
- ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Use"); ?> <em><?=gettext("From"); ?></em> <?=gettext("to always allow an Hostname through the captive portal (without authentication)"); ?>.
- <?=gettext("Use"); ?> <em><?=gettext("To"); ?></em> <?=gettext("to allow access from all clients (even non-authenticated ones) behind the portal to this Hostname"); ?>.
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="hostname" type="text" class="formfld unknown" id="hostname" size="17" value="<?=htmlspecialchars($pconfig['hostname']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Hostname");?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Bandwidth up"); ?></td>
- <td width="78%" class="vtable">
- <input name="bw_up" type="text" class="formfld unknown" id="bw_up" size="10" value="<?=htmlspecialchars($pconfig['bw_up']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Enter a upload limit to be enforced on this Hostname in Kbit/s"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Bandwidth down"); ?></td>
- <td width="78%" class="vtable">
- <input name="bw_down" type="text" class="formfld unknown" id="bw_down" size="10" value="<?=htmlspecialchars($pconfig['bw_down']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Enter a download limit to be enforced on this Hostname in Kbit/s"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input name="zone" type="hidden" value="<?=htmlspecialchars($cpzone);?>" />
- <?php if (isset($id) && $a_allowedhostnames[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'Submit',
+ gettext("Save")
+));
+
+$section = new Form_Section('Captive Portal Hostname settings');
+
+$section->addInput(new Form_Select(
+ 'dir',
+ 'Direction',
+ strtolower($pconfig['dir']),
+ build_dir_list()
+))->setHelp('Use "From" to always allow an Hostname through the captive portal (without authentication). ' .
+ 'Use "To" to allow access from all clients (even non-authenticated ones) behind the portal to this Hostname.');
+
+$section->addInput(new Form_Input(
+ 'hostname',
+ 'Hostname',
+ 'text',
+ $pconfig['hostname']
+));
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$section->addInput(new Form_Input(
+ 'bw_up',
+ 'Bandwidth up',
+ 'text',
+ $pconfig['bw_up']
+))->setHelp('Enter a upload limit to be enforced on this Hostname in Kbit/s');
+
+$section->addInput(new Form_Input(
+ 'bw_down',
+ 'Bandwidth down',
+ 'text',
+ $pconfig['bw_down']
+))->setHelp('Enter a download limit to be enforced on this Hostname in Kbit/s');
+
+$section->addInput(new Form_Input(
+ 'zone',
+ null,
+ 'hidden',
+ $cpzone
+));
+
+if (isset($id) && $a_allowedhostnames[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_captiveportal_ip.php b/src/usr/local/www/services_captiveportal_ip.php
index c475aeb..dd449c4 100644
--- a/src/usr/local/www/services_captiveportal_ip.php
+++ b/src/usr/local/www/services_captiveportal_ip.php
@@ -30,7 +30,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /sbin/ipfw
- pfSense_MODULE: captiveportal
+ pfSense_MODULE: captiveportal
*/
##|+PRIV
@@ -40,6 +40,8 @@
##|*MATCH=services_captiveportal_ip.php*
##|-PRIV
+$directionicons = array('to' => '&#x2192;', 'from' => '&#x2190;', 'both' => '&#x21c4;');
+
require("guiconfig.inc");
require("functions.inc");
require_once("filter.inc");
@@ -70,6 +72,7 @@ $shortcut_section = "captiveportal";
if ($_GET['act'] == "del" && !empty($cpzone) && isset($cpzoneid)) {
$a_allowedips =& $config['captiveportal'][$cpzone]['allowedip'];
+
if ($a_allowedips[$_GET['id']]) {
$ipent = $a_allowedips[$_GET['id']];
@@ -94,115 +97,75 @@ if ($_GET['act'] == "del" && !empty($cpzone) && isset($cpzoneid)) {
}
}
-
include("head.inc");
+
+if ($savemsg)
+ print_info_box($savemsg);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
+$tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Allowed IP Addresses"), true, "services_captiveportal_ip.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
+$tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
+display_top_tabs($tab_array, true);
+
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="services_captiveportal_ip.php" method="post">
- <input type="hidden" name="zone" id="zone" value="<?=htmlspecialchars($cpzone);?>" />
- <?php if ($savemsg) print_info_box($savemsg); ?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="captiveportal ip addresses">
- <tr>
- <td class="tabnavtbl">
+<div class="table-responsive">
+ <table class="table table-hover table-striped table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("IP Addresses"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ <th><!-- Buttons --></th>
+ </tr>
+ </thead>
+
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
- $tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Allowed IP addresses"), true, "services_captiveportal_ip.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
- $tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
- display_top_tabs($tab_array, true);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="main">
- <tr>
- <td width="40%" class="listhdrr"><?=gettext("IP address"); ?></td>
- <td width="50%" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td width="17" height="17"></td>
- <td>
- <a href="services_captiveportal_ip_edit.php?zone=<?=$cpzone;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add address"); ?>" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+if (is_array($a_cp[$cpzone]['allowedip'])): ?>
+ <tbody>
<?php
- if (is_array($a_cp[$cpzone]['allowedip'])):
- $i = 0;
- foreach ($a_cp[$cpzone]['allowedip'] as $ip):
-?>
- <tr ondblclick="document.location='services_captiveportal_ip_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i;?>'">
- <td class="listlr">
+ $i = 0;
+ foreach ($a_cp[$cpzone]['allowedip'] as $ip): ?>
+ <tr>
+ <td>
+ <?=$directionicons[$ip['dir']]?>&nbsp;<?=$ip['ip']?>
+ <?=($ip['sn'] != "32" && is_numeric($ip['sn'])) ? '/' . $ip['sn'] : ''?>
+ </td>
+ <td >
+ <?=htmlspecialchars($ip['descr'])?>
+ </td>
+ <td>
+ <a href="services_captiveportal_ip_edit.php?zone=<?=$cpzone?>&amp;id=<?=$i?>" class="btn btn-xs btn-info">Edit</a>
+ <a href="services_captiveportal_ip.php?zone=<?=$cpzone?>&amp;act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger">Delete</a>
+ </td>
+ </tr>
<?php
- if ($ip['dir'] == "to") {
- echo "any <img src=\"/themes/{$g['theme']}/images/icons/icon_in.gif\" width=\"11\" height=\"11\" align=\"middle\" alt=\"in\" /> ";
- }
- if ($ip['dir'] == "both") {
- echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_pass.gif\" width=\"11\" height=\"11\" align=\"middle\" alt=\"pass\" /> ";
- }
- echo strtolower($ip['ip']);
- if ($ip['sn'] != "32" && is_numeric($ip['sn'])) {
- $sn = $ip['sn'];
- echo "/$sn";
- }
- if ($ip['dir'] == "from") {
- echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_in.gif\" width=\"11\" height=\"11\" align=\"middle\" alt=\"any\" /> any";
- }
-?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($ip['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <a href="services_captiveportal_ip_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit address"); ?>" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;
- <a href="services_captiveportal_ip.php?zone=<?=$cpzone;?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this address?"); ?>')"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete address"); ?>" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
+ $i++;
+ endforeach; ?>
+ <tbody>
+ </table>
+
+ <?=$directionicons['to'] . ' = ' . sprintf(gettext('All connections %sto%s the address are allowed'), '<u>','</u>') . ', '?>
+ <?=$directionicons['from'] . ' = ' . sprintf(gettext('All connections %sfrom%s the address are allowed'), '<u>','</u>') . ', '?>
+ <?=$directionicons['both'] . ' = ' . sprintf(gettext('All connections %sto or from%s are allowed'), '<u>','</u>')?>
<?php
- $i++;
- endforeach;
- endif;
+else :
?>
- <tr>
- <td class="list" colspan="2">&nbsp;</td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td width="17" height="17"></td>
- <td>
- <a href="services_captiveportal_ip_edit.php?zone=<?=$cpzone;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add address"); ?>" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list">
- <p class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Note:"); ?><br />
- </strong>
- </span>
- <?=gettext("Adding allowed IP addresses will allow IP access to/from these addresses through the captive portal without being taken to the portal page. This can be used for a web server serving images for the portal page or a DNS server on another network, for example."); ?>
- </p>
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- </table>
- </td>
- </tr>
+ </tbody>
</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php
+endif;
+?>
+</div>
+
+<nav class="action-buttons">
+ <a href="services_captiveportal_ip_edit.php?zone=<?=$cpzone?>&amp;act=add" class="btn btn-success">Add</a>
+</nav>
+
+<?php
+print_info_box(gettext('Adding allowed IP addresses will allow IP access to/from these addresses through the captive portal without being taken to the portal page. ' .
+ 'This can be used for a web server serving images for the portal page or a DNS server on another network, for example.'));
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_captiveportal_ip_edit.php b/src/usr/local/www/services_captiveportal_ip_edit.php
index c5e5544..0db6df5 100644
--- a/src/usr/local/www/services_captiveportal_ip_edit.php
+++ b/src/usr/local/www/services_captiveportal_ip_edit.php
@@ -97,7 +97,6 @@ if (isset($id) && $a_allowedips[$id]) {
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -156,6 +155,7 @@ if ($_POST) {
} else {
$a_allowedips[] = $ip;
}
+
allowedips_sort();
write_config();
@@ -173,10 +173,12 @@ if ($_POST) {
$rules .= "pipe delete " . ($ipfw['dnpipe']+1 . "\n");
}
}
+
$rules .= captiveportal_allowedip_configure_entry($ip);
if (is_array($ipfw)) {
captiveportal_free_dn_ruleno($ipfw['dnpipe']);
}
+
$uniqid = uniqid("{$cpzone}_allowed");
@file_put_contents("{$g['tmp_path']}/{$uniqid}_tmp", $rules);
mwexec("/sbin/ipfw -x {$cpzoneid} -q {$g['tmp_path']}/{$uniqid}_tmp");
@@ -188,66 +190,74 @@ if ($_POST) {
}
}
+function build_dir_list() {
+ $dirs = array(gettext("Both"),gettext("From"),gettext("To"));
+ $dirlist = array();
+
+ foreach ($dirs as $dir) {
+ $dirlist[strtolower($dir)] = $dir;
+ }
+
+ return($dirlist);
+}
+
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="services_captiveportal_ip_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="captiveportal allow ip edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit allowed ip rule");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("IP address"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="ip" type="text" class="formfld unknown" id="ip" size="17" value="<?=htmlspecialchars($pconfig['ip']);?>" />
- /<select name='sn' class="formselect" id='sn'>
- <?php for ($i = 32; $i >= 1; $i--): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['sn']) echo "selected=\"selected\""; ?>><?=$i;?></option>
- <?php endfor; ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("IP address and subnet mask. Use /32 for a single IP");?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Bandwidth up"); ?></td>
- <td width="78%" class="vtable">
- <input name="bw_up" type="text" class="formfld unknown" id="bw_up" size="10" value="<?=htmlspecialchars($pconfig['bw_up']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Enter a upload limit to be enforced on this IP address in Kbit/s"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Bandwidth down"); ?></td>
- <td width="78%" class="vtable">
- <input name="bw_down" type="text" class="formfld unknown" id="bw_down" size="10" value="<?=htmlspecialchars($pconfig['bw_down']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Enter a download limit to be enforced on this IP address in Kbit/s"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input name="zone" type="hidden" value="<?=htmlspecialchars($cpzone);?>" />
- <?php if (isset($id) && $a_allowedips[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Edit Captive Portal IP rule');
+
+$section->addInput(new Form_IpAddress(
+ 'ip',
+ 'IP Address',
+ $pconfig['ip']
+))->addMask(sn, $pconfig['sn'], 32);
+
+
+$section->addInput(new Form_Select(
+ 'dir',
+ 'Direction',
+ strtolower($pconfig['dir']),
+ build_dir_list()
+))->setHelp('Use "From" to always allow aaccess to an address through the captive portal (without authentication). ' .
+ 'Use "To" to allow access from all clients (even non-authenticated ones) behind the portal to this Hostname.');
+
+$section->addInput(new Form_Input(
+ 'bw_up',
+ 'Bandwidth up',
+ 'text',
+ $pconfig['bw_up']
+))->setHelp('Enter an upload limit to be enforced on this address in Kbit/s');
+
+$section->addInput(new Form_Input(
+ 'bw_down',
+ 'Bandwidth down',
+ 'text',
+ $pconfig['bw_down']
+))->setHelp('Enter a download limit to be enforced on this address in Kbit/s');
+
+$section->addInput(new Form_Input(
+ 'zone',
+ null,
+ 'hidden',
+ $cpzone
+));
+
+if (isset($id) && $a_allowedips[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_captiveportal_mac.php b/src/usr/local/www/services_captiveportal_mac.php
index d6c1af3..fdf82d3 100644
--- a/src/usr/local/www/services_captiveportal_mac.php
+++ b/src/usr/local/www/services_captiveportal_mac.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: captiveportal
+ pfSense_MODULE: captiveportal
*/
##|+PRIV
@@ -53,6 +53,7 @@ if (isset($_POST['zone'])) {
$cpzone = $_POST['zone'];
}
+
if (empty($cpzone) || empty($config['captiveportal'][$cpzone])) {
header("Location: services_captiveportal_zones.php");
exit;
@@ -66,8 +67,10 @@ $a_cp =& $config['captiveportal'];
$pgtitle = array(gettext("Services"), gettext("Captive portal"), $a_cp[$cpzone]['zone']);
$shortcut_section = "captiveportal";
-if ($_POST) {
+$actsmbl = array('pass' => '<font color="green" size="4">&#x2714;</font>&nbsp;Pass',
+ 'block' => '<font color="red" size="4">&#x2718;</font>&nbsp;Block');
+if ($_POST) {
$pconfig = $_POST;
if ($_POST['apply']) {
@@ -93,6 +96,7 @@ if ($_POST) {
echo gettext("No entry exists yet!") ."\n";
exit;
}
+
if (empty($_POST['zone'])) {
echo gettext("Please set the zone on which the operation should be allowed");
exit;
@@ -110,6 +114,7 @@ if ($_POST) {
echo gettext("No entry exists for this username:") . " " . $_POST['username'] . "\n";
}
}
+
if ($_POST['delmac']) {
$found = false;
foreach ($a_passthrumacs as $idx => $macent) {
@@ -138,6 +143,7 @@ if ($_POST) {
if ($_GET['act'] == "del") {
$a_passthrumacs =& $a_cp[$cpzone]['passthrumac'];
+
if ($a_passthrumacs[$_GET['id']]) {
$cpzoneid = $a_cp[$cpzone]['zoneid'];
$rules = captiveportal_passthrumac_delete_entry($a_passthrumacs[$_GET['id']]);
@@ -154,91 +160,72 @@ if ($_GET['act'] == "del") {
include("head.inc");
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('passthrumac'))
+ print_info_box_np(gettext("The captive portal MAC address configuration has been changed.<br />You must apply the changes in order for them to take effect."));
+
+$tab_array = array();
+$tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
+$tab_array[] = array(gettext("MAC"), true, "services_captiveportal_mac.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Allowed IP addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
+$tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
+display_top_tabs($tab_array, true);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="services_captiveportal_mac.php" method="post">
-<input type="hidden" name="zone" id="zone" value="<?=htmlspecialchars($cpzone);?>" />
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('passthrumac')): ?><p>
-<?php print_info_box_np(gettext("The captive portal MAC address configuration has been changed.<br />You must apply the changes in order for them to take effect."));?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="captiveportal mac">
- <tr>
- <td class="tabnavtbl">
+<div class="table-responsive">
+ <table class="table table-hover table-striped table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext('Action')?></th>
+ <th><?=gettext("MAC address")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><!-- Buttons --></th>
+ </tr>
+ </thead>
+
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
- $tab_array[] = array(gettext("MAC"), true, "services_captiveportal_mac.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Allowed IP addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
- $tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
- display_top_tabs($tab_array, true);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="main">
- <tr>
- <td width="3%" class="list"></td>
- <td width="37%" class="listhdrr"><?=gettext("MAC address"); ?></td>
- <td width="50%" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="10%" class="list"></td>
- </tr>
+if (is_array($a_cp[$cpzone]['passthrumac'])): ?>
+ <tbody>
+<?php
+$i = 0;
+foreach ($a_cp[$cpzone]['passthrumac'] as $mac): ?>
+ <tr>
+ <td>
+ <?=$actsmbl[$mac['action']]?>
+ </td>
+ <td>
+ <?=$mac['mac']?>
+ </td>
+ <td >
+ <?=htmlspecialchars($mac['descr'])?>
+ </td>
+ <td>
+ <a href="services_captiveportal_mac_edit.php?zone=<?=$cpzone?>&amp;id=<?=$i?>" class="btn btn-xs btn-info">Edit</a>
+ <a href="services_captiveportal_mac.php?zone=<?=$cpzone?>&amp;act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger">Delete</a>
+ </td>
+ </tr>
+<?php
+$i++;
+endforeach; ?>
+ <tbody>
+ </table>
<?php
- if (is_array($a_cp[$cpzone]['passthrumac'])):
- $i = 0;
- foreach ($a_cp[$cpzone]['passthrumac'] as $mac):
+else :
?>
- <tr ondblclick="document.location='services_captiveportal_mac_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i;?>'">
- <td valign="middle" class="list nowrap">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$mac['action'];?>.gif" width="11" height="11" border="0" alt="icon" />
- </td>
- <td class="listlr">
- <?=$mac['mac'];?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($mac['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <a href="services_captiveportal_mac_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i;?>">
- <img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit host"); ?>" width="17" height="17" border="0" alt="edit" />
- </a>
- &nbsp;
- <a href="services_captiveportal_mac.php?zone=<?=$cpzone;?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this host?"); ?>')">
- <img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete host"); ?>" width="17" height="17" border="0" alt="delte" />
- </a>
- </td>
- </tr>
+ </tbody>
+ </table>
<?php
- $i++;
- endforeach;
- endif;
+endif;
?>
- <tr>
- <td class="list" colspan="3">&nbsp;</td>
- <td class="list">
- <a href="services_captiveportal_mac_edit.php?zone=<?=$cpzone;?>">
- <img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add host"); ?>" width="17" height="17" border="0" alt="add" />
- </a>
- </td>
- </tr>
- <tr>
- <td colspan="3" class="list">
- <span class="vexpl">
- <span class="red"><strong><?=gettext("Note:"); ?><br /></strong></span>
- <?=gettext("Adding MAC addresses as 'pass' MACs allows them access through the captive portal automatically without being taken to the portal page."); ?>
- </span>
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ <nav class="action-buttons">
+ <a href="services_captiveportal_ip_edit.php?zone=<?=$cpzone?>&amp;act=add" class="btn btn-success">Add</a>
+ </nav>
+</div>
+
+<?php
+print_info_box(gettext('Adding MAC addresses as "pass" MACs allows them access through the captive portal automatically without being taken to the portal page.'));
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_captiveportal_mac_edit.php b/src/usr/local/www/services_captiveportal_mac_edit.php
index 191c9bb..4f28531 100644
--- a/src/usr/local/www/services_captiveportal_mac_edit.php
+++ b/src/usr/local/www/services_captiveportal_mac_edit.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: captiveportal
+ pfSense_MODULE: captiveportal
*/
##|+PRIV
@@ -98,7 +98,6 @@ if (isset($id) && $a_passthrumacs[$id]) {
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -183,88 +182,106 @@ if ($_POST) {
exit;
}
}
+
+// Get the MAC address
+$ip = $_SERVER['REMOTE_ADDR'];
+$mymac = `/usr/sbin/arp -an | grep '('{$ip}')' | head -n 1 | cut -d" " -f4`;
+$mymac = str_replace("\n","",$mymac);
+
include("head.inc");
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Edit MAC address rules');
+
+$section->addInput(new Form_Select(
+ 'action',
+ 'Action',
+ strtolower($pconfig['action']),
+ array('pass' => 'Pass', 'block' => 'Block')
+))->setHelp('Choose what to do with packets coming from this MAC address.');
+
+$macaddress = new Form_Input(
+ 'mac',
+ 'MAC Address',
+ 'text',
+ $pconfig['mac'],
+ ['placeholder' => 'xx:xx:xx:xx:xx:xx']
+);
+
+$btnmymac = new Form_Button(
+ 'btnmymac',
+ 'Copy My MAC'
+ );
+
+$btnmymac->removeClass('btn-primary')->addClass('btn-success btn-sm');
+
+$group = new Form_Group('MAC controls');
+$group->add($macaddress);
+$group->add($btnmymac);
+$group->setHelp('MAC address (6 hex octets separated by colons)');
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'bw_up',
+ 'Bandwidth up',
+ 'text',
+ $pconfig['bw_up']
+))->setHelp('Enter an upload limit to be enforced on this MAC in Kbit/s');
+
+$section->addInput(new Form_Input(
+ 'bw_down',
+ 'Bandwidth down',
+ 'text',
+ $pconfig['bw_down']
+))->setHelp('Enter a download limit to be enforced on this MAC in Kbit/s');
+
+$section->addInput(new Form_Input(
+ 'zone',
+ null,
+ 'hidden',
+ $cpzone
+));
+
+if (isset($id) && $a_passthrumacs[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+if (isset($pconfig['username']) && $pconfig['username']) {
+ $section->addInput(new Form_Input(
+ 'username',
+ null,
+ 'hidden',
+ $pconfig['username']
+ ));
+}
+
+$form->add($section);
+print($form);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="services_captiveportal_mac_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="captiveportal mac edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit MAC address rules");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Action"); ?></td>
- <td width="78%" class="vtable">
- <select name="action" class="formselect">
-<?php
- $actions = explode(" ", "Pass Block");
- foreach ($actions as $action):
-?>
- <option value="<?=strtolower($action);?>"<?php if (strtolower($action) == strtolower($pconfig['action'])) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($action);?>
- </option>
-<?php
- endforeach;
-?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Choose what to do with packets coming from this MAC address"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("MAC address"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="mac" type="text" class="formfld unknown" id="mac" size="17" value="<?=htmlspecialchars($pconfig['mac']);?>" />
-<?php
- $ip = getenv('REMOTE_ADDR');
- $mac = `/usr/sbin/arp -an | grep {$ip} | cut -d" " -f4`;
- $mac = str_replace("\n", "", $mac);
-?>
- <a onclick="document.forms[0].mac.value='<?=$mac?>';" href="#"><?=gettext("Copy my MAC address");?></a>
- <br />
- <span class="vexpl"><?=gettext("MAC address (6 hex octets separated by colons)"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Bandwidth up"); ?></td>
- <td width="78%" class="vtable">
- <input name="bw_up" type="text" class="formfld unknown" id="bw_up" size="10" value="<?=htmlspecialchars($pconfig['bw_up']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Enter a upload limit to be enforced on this MAC address in Kbit/s"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Bandwidth down"); ?></td>
- <td width="78%" class="vtable">
- <input name="bw_down" type="text" class="formfld unknown" id="bw_down" size="10" value="<?=htmlspecialchars($pconfig['bw_down']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Enter a download limit to be enforced on this MAC address in Kbit/s"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input name="zone" type="hidden" value="<?=htmlspecialchars($cpzone);?>" />
- <?php if (isset($id) && $a_passthrumacs[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- <?php if (isset($pconfig['username']) && $pconfig['username']): ?>
- <input name="username" type="hidden" value="<?=htmlspecialchars($pconfig['username']);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<script>
+//<![CDATA[
+events.push(function(){
+ // Make the ‘Copy My MAC’ button a plain button, not a submit button
+ $("#btnmymac").prop('type','button');
+
+ // On click, copy the hidden 'mymac' text to the 'mac' input
+ $("#btnmymac").click(function() {
+ $('#mac').val('<?=$mymac?>');
+ });
+});
+//]]>
+</script>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_captiveportal_vouchers.php b/src/usr/local/www/services_captiveportal_vouchers.php
index 0bc7dae..b80d3a0 100644
--- a/src/usr/local/www/services_captiveportal_vouchers.php
+++ b/src/usr/local/www/services_captiveportal_vouchers.php
@@ -29,7 +29,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /usr/local/bin/voucher /usr/bin/openssl
- pfSense_MODULE: captiveportal
+ pfSense_MODULE: captiveportal
*/
##|+PRIV
@@ -50,16 +50,10 @@ require("shaper.inc");
require("captiveportal.inc");
require_once("voucher.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_captiveportal_vouchers.php');
-}
-
$cpzone = $_GET['zone'];
-if (isset($_POST['zone'])) {
- $cpzone = $_POST['zone'];
-}
+
+if (isset($_POST['zone']))
+ $cpzone = $_POST['zone'];
if (empty($cpzone)) {
header("Location: services_captiveportal_zones.php");
@@ -72,14 +66,7 @@ if ($_REQUEST['generatekey']) {
$privatekey = str_replace("\n", "\\n", file_get_contents("/tmp/key64.private"));
$publickey = str_replace("\n", "\\n", file_get_contents("/tmp/key64.public"));
exec("rm /tmp/key64.private /tmp/key64.public");
- $alertmessage = gettext("You will need to recreate any existing Voucher Rolls due to the public and private key changes. Click cancel if you do not wish to recreate the vouchers.");
- echo <<<EOF
- jQuery('#publickey').val('{$publickey}');
- jQuery('#privatekey').val('{$privatekey}');
- alert('{$alertmessage}');
- jQuery('#publickey').effect('highlight');
- jQuery('#privatekey').effect('highlight');
-EOF;
+ print json_encode(['public' => $publickey, 'private' => $privatekey]);
exit;
}
@@ -98,7 +85,6 @@ if (empty($a_cp[$cpzone])) {
exit;
}
-
$pgtitle = array(gettext("Services"), gettext("Captive portal"), gettext("Vouchers"), $a_cp[$cpzone]['zone']);
$shortcut_section = "captiveportal-vouchers";
@@ -130,6 +116,7 @@ if (!isset($config['voucher'][$cpzone]['exponent'])) {
break;
}
}
+
$config['voucher'][$cpzone]['exponent'] = $exponent;
unset($exponent);
}
@@ -217,7 +204,6 @@ $pconfig['vouchersyncpass'] = $config['voucher'][$cpzone]['vouchersyncpass'];
$pconfig['vouchersyncusername'] = $config['voucher'][$cpzone]['vouchersyncusername'];
if ($_POST) {
-
unset($input_errors);
if ($_POST['postafterlogin']) {
@@ -409,307 +395,262 @@ EOF;
}
$closehead = false;
include("head.inc");
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg. 'success');
+
+$tab_array = array();
+$tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
+$tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Allowed IP addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Vouchers"), true, "services_captiveportal_vouchers.php?zone={$cpzone}");
+$tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
+display_top_tabs($tab_array, true);
+
+// We draw a simple table first, then present the controls to work with it
?>
-<script type="text/javascript">
-//<![CDATA[
-function generatenewkey() {
- jQuery('#publickey').val('One moment please...');
- jQuery('#privatekey').val('One moment please...');
- jQuery.ajax("services_captiveportal_vouchers.php?zone=<?php echo($cpzone); ?>&generatekey=true", {
- type: 'get',
- success: function(data) {
- eval(data);
- }
- });
-}
-function before_save() {
- document.iform.charset.disabled = false;
- document.iform.rollbits.disabled = false;
- document.iform.ticketbits.disabled = false;
- document.iform.checksumbits.disabled = false;
- document.iform.magic.disabled = false;
- document.iform.publickey.disabled = false;
- document.iform.privatekey.disabled = false;
- document.iform.msgnoaccess.disabled = false;
- document.iform.msgexpired.disabled = false;
- for (var x = 0; x < <?php echo count($a_roll); ?>; x++) {
- jQuery('#addeditdelete' + x).show();
- }
- jQuery('#addnewroll').show();
-}
-function enable_change(enable_change) {
- var endis;
- endis = !(document.iform.enable.checked || enable_change);
- document.iform.charset.disabled = endis;
- document.iform.rollbits.disabled = endis;
- document.iform.ticketbits.disabled = endis;
- document.iform.checksumbits.disabled = endis;
- document.iform.magic.disabled = endis;
- document.iform.publickey.disabled = endis;
- document.iform.privatekey.disabled = endis;
- document.iform.msgnoaccess.disabled = endis;
- document.iform.msgexpired.disabled = endis;
- document.iform.vouchersyncdbip.disabled = endis;
- document.iform.vouchersyncport.disabled = endis;
- document.iform.vouchersyncpass.disabled = endis;
- document.iform.vouchersyncusername.disabled = endis;
- if (document.iform.vouchersyncusername.value != "") {
- document.iform.charset.disabled = true;
- document.iform.rollbits.disabled = true;
- document.iform.ticketbits.disabled = true;
- document.iform.checksumbits.disabled = true;
- document.iform.magic.disabled = true;
- document.iform.publickey.disabled = true;
- document.iform.privatekey.disabled = true;
- document.iform.msgnoaccess.disabled = true;
- document.iform.msgexpired.disabled = true;
- for (var x = 0; x < <?php echo count($a_roll); ?>; x++) {
- jQuery('#addeditdelete' + x).hide();
- }
- jQuery('#addnewroll').hide();
- } else {
- for (var x = 0; x < <?php echo count($a_roll); ?>; x++) {
- jQuery('#addeditdelete' + x).show();
- }
- jQuery('#addnewroll').show();
- }
-}
-//]]>
-</script>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<form action="services_captiveportal_vouchers.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab pane">
- <tr>
- <td class="tabnavtbl">
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Synchronized from <?=$pconfig['vouchersyncdbip']?></h2></div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Roll")?> #</th>
+ <th><?=gettext("Minutes/Ticket")?></th>
+ <th># <?=gettext("of Tickets")?></th>
+ <th><?=gettext("Comment")?></th>
+ <th><?=gettext("Action")?></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+$i = 0;
+foreach($a_roll as $rollent):
+?>
+ <tr>
+ <td>
+ <?=htmlspecialchars($rollent['number']); ?>&nbsp;
+ </td>
+ <td>
+ <?=htmlspecialchars($rollent['minutes'])?>&nbsp;
+ </td>
+ <td>
+ <?=htmlspecialchars($rollent['count'])?>&nbsp;
+ </td>
+ <td>
+ <?=htmlspecialchars($rollent['descr']); ?>&nbsp;
+ </td>
+ <td>
+ <!-- These buttons are hidden/shown on checking hte 'enable' checkbox -->
+ <a href="services_captiveportal_vouchers_edit.php?zone=<?=$cpzone?>&amp;id=<?=$i; ?>" class="btn btn-info btn-xs"><?=gettext("Edit")?></a>
+ <a href="services_captiveportal_vouchers.php?zone=<?=$cpzone?>&amp;act=del&amp;id=<?=$i; ?>" class="btn btn-danger btn-xs"><?=gettext("Delete")?></a>
+ <a href="services_captiveportal_vouchers.php?zone=<?=$cpzone?>&amp;act=csv&amp;id=<?=$i; ?>" class="btn btn-success btn-xs" data-toggle="tooltip" title="Generate vouchers for this roll to a .csv file""><?=gettext("Generate")?></a>
+ </td>
+ </tr>
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
- $tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Allowed IP addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Vouchers"), true, "services_captiveportal_vouchers.php?zone={$cpzone}");
- $tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
- display_top_tabs($tab_array, true);
+ $i++;
+endforeach;
?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="checkbox pane">
- <tr>
- <td width="22%" valign="top" class="vtable">&nbsp;</td>
- <td width="78%" class="vtable">
- <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
- <strong><?=gettext("Enable Vouchers"); ?></strong>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell">
- <?=gettext("Voucher Rolls"); ?>
- <?php
- if ($pconfig['vouchersyncdbip']) {
- echo "<br />(Synchronized from {$pconfig['vouchersyncdbip']})";
- }
- ?>
- </td>
- <td class="vtable">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="content pane">
- <tr>
- <td width="10%" class="listhdrr"><?=gettext("Roll"); ?> #</td>
- <td width="20%" class="listhdrr"><?=gettext("Minutes/Ticket"); ?></td>
- <td width="20%" class="listhdrr"># <?=gettext("of Tickets"); ?></td>
- <td width="35%" class="listhdr"><?=gettext("Comment"); ?></td>
- <td width="15%" class="list"></td>
- </tr>
- <?php $i = 0; foreach ($a_roll as $rollent): ?>
- <tr>
- <td class="listlr">
- <?=htmlspecialchars($rollent['number']); ?>&nbsp;
- </td>
- <td class="listr">
- <?=htmlspecialchars($rollent['minutes']);?>&nbsp;
- </td>
- <td class="listr">
- <?=htmlspecialchars($rollent['count']);?>&nbsp;
- </td>
- <td class="listr">
- <?=htmlspecialchars($rollent['descr']); ?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <div id='addeditdelete<?=$i?>'>
- <?php if ($pconfig['enable']): ?>
- <a href="services_captiveportal_vouchers_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i; ?>"><img src="/themes/<?=$g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit voucher"); ?>" width="17" height="17" border="0" alt="<?=gettext("edit voucher"); ?>" /></a>
- <a href="services_captiveportal_vouchers.php?zone=<?=$cpzone;?>&amp;act=del&amp;id=<?=$i; ?>" onclick="return confirm('<?=gettext("Do you really want to delete this voucher? This makes all vouchers from this roll invalid"); ?>')"><img src="/themes/<?=$g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete vouchers"); ?>" width="17" height="17" border="0" alt="<?=gettext("delete vouchers"); ?>" /></a>
- <a href="services_captiveportal_vouchers.php?zone=<?=$cpzone;?>&amp;act=csv&amp;id=<?=$i; ?>"><img src="/themes/<?=$g['theme']; ?>/images/icons/icon_log_s.gif" title="<?=gettext("generate vouchers for this roll to CSV file"); ?>" width="11" height="15" border="0" alt="<?=gettext("generate vouchers for this roll to CSV file"); ?>" /></a>
- <?php endif;?>
- </div>
- </td>
- </tr>
- <?php $i++; endforeach; ?>
- <tr>
- <td class="list" colspan="4"></td>
- <?php
- if ($pconfig['enable']) {
- echo "<td class=\"list\"><div id='addnewroll'> <a href=\"services_captiveportal_vouchers_edit.php?zone={$cpzone}\"><img src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" title=\"" . gettext("add voucher") . "\" width=\"17\" height=\"17\" border=\"0\" alt=\"" . gettext("add voucher") . "\" /></a></div></td>";
- }
- ?>
- </tr>
- </table>
- <?php if ($pconfig['enable']): ?>
- <?=gettext("Create, generate and activate Rolls with Vouchers that allow access through the " .
- "captive portal for the configured time. Once a voucher is activated, " .
- "its clock is started and runs uninterrupted until it expires. During that " .
- "time, the voucher can be re-used from the same or a different computer. If the voucher " .
- "is used again from another computer, the previous session is stopped."); ?>
- <?php else: ?>
- <?=gettext("Enable Voucher support first using the checkbox above and hit Save at the bottom."); ?>
- <?php endif;?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq">
- <?=gettext("Voucher public key"); ?>
- </td>
- <td class="vtable">
- <textarea name="publickey" cols="65" rows="4" id="publickey" class="formpre"><?=htmlspecialchars($pconfig['publickey']);?></textarea>
- <br />
- <?=gettext("Paste an RSA public key (64 Bit or smaller) in PEM format here. This key is used to decrypt vouchers."); ?> <a href='#' onclick='generatenewkey();'><?=gettext('Generate');?></a> <?=gettext('new key');?>.
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Voucher private key"); ?></td>
- <td class="vtable">
- <textarea name="privatekey" cols="65" rows="5" id="privatekey" class="formpre"><?=htmlspecialchars($pconfig['privatekey']);?></textarea>
- <br />
- <?=gettext("Paste an RSA private key (64 Bit or smaller) in PEM format here. This key is only used to generate encrypted vouchers and doesn't need to be available if the vouchers have been generated offline."); ?> <a href='#' onclick='generatenewkey();'> <?=gettext('Generate');?></a> <?=gettext('new key');?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Character set"); ?></td>
- <td width="78%" class="vtable">
- <input name="charset" type="text" class="formfld" id="charset" size="80" value="<?=htmlspecialchars($pconfig['charset']);?>" />
- <br />
- <?=gettext("Tickets are generated with the specified character set. It should contain printable characters (numbers, lower case and upper case letters) that are hard to confuse with others. Avoid e.g. 0/O and l/1."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"># <?=gettext("of Roll Bits"); ?></td>
- <td width="78%" class="vtable">
- <input name="rollbits" type="text" class="formfld" id="rollbits" size="2" value="<?=htmlspecialchars($pconfig['rollbits']);?>" />
- <br />
- <?=gettext("Reserves a range in each voucher to store the Roll # it belongs to. Allowed range: 1..31. Sum of Roll+Ticket+Checksum bits must be one Bit less than the RSA key size."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"># <?=gettext("of Ticket Bits"); ?></td>
- <td width="78%" class="vtable">
- <input name="ticketbits" type="text" class="formfld" id="ticketbits" size="2" value="<?=htmlspecialchars($pconfig['ticketbits']);?>" />
- <br />
- <?=gettext("Reserves a range in each voucher to store the Ticket# it belongs to. Allowed range: 1..16. Using 16 bits allows a roll to have up to 65535 vouchers. A bit array, stored in RAM and in the config, is used to mark if a voucher has been used. A bit array for 65535 vouchers requires 8 KB of storage."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"># <?=gettext("of Checksum Bits"); ?></td>
- <td width="78%" class="vtable">
- <input name="checksumbits" type="text" class="formfld" id="checksumbits" size="2" value="<?=htmlspecialchars($pconfig['checksumbits']);?>" />
- <br />
- <?=gettext("Reserves a range in each voucher to store a simple checksum over Roll # and Ticket#. Allowed range is 0..31."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Magic Number"); ?></td>
- <td width="78%" class="vtable">
- <input name="magic" type="text" class="formfld" id="magic" size="20" value="<?=htmlspecialchars($pconfig['magic']);?>" />
- <br />
- <?=gettext("Magic number stored in every voucher. Verified during voucher check. Size depends on how many bits are left by Roll+Ticket+Checksum bits. If all bits are used, no magic number will be used and checked."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Invalid Voucher Message"); ?></td>
- <td width="78%" class="vtable">
- <input name="msgnoaccess" type="text" class="formfld" id="msgnoaccess" size="80" value="<?=htmlspecialchars($pconfig['msgnoaccess']);?>" />
- <br /><?=gettext("Error message displayed for invalid vouchers on captive portal error page"); ?> ($PORTAL_MESSAGE$).
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Expired Voucher Message"); ?></td>
- <td width="78%" class="vtable">
- <input name="msgexpired" type="text" class="formfld" id="msgexpired" size="80" value="<?=htmlspecialchars($pconfig['msgexpired']);?>" />
- <br /><?=gettext("Error message displayed for expired vouchers on captive portal error page"); ?> ($PORTAL_MESSAGE$).
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- &nbsp;
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Voucher database synchronization"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Synchronize Voucher Database IP"); ?></td>
- <td width="78%" class="vtable">
- <input name="vouchersyncdbip" type="text" class="formfld" id="vouchersyncdbip" size="17" value="<?=htmlspecialchars($pconfig['vouchersyncdbip']);?>" />
- <br /><?=gettext("IP address of master nodes webConfigurator to synchronize voucher database and used vouchers from."); ?>
- <br /><?=gettext("NOTE: this should be setup on the slave nodes and not the primary node!"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Voucher sync port"); ?></td>
- <td width="78%" class="vtable">
- <input name="vouchersyncport" type="text" class="formfld" id="vouchersyncport" size="7" value="<?=htmlspecialchars($pconfig['vouchersyncport']);?>" />
- <br /><?=gettext("This is the port of the master voucher nodes webConfigurator. Example: 443"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Voucher sync username"); ?></td>
- <td width="78%" class="vtable">
- <input name="vouchersyncusername" type="text" class="formfld" id="vouchersyncusername" size="25" value="<?=htmlspecialchars($pconfig['vouchersyncusername']);?>" autocomplete="off" />
- <br /><?=gettext("This is the username of the master voucher nodes webConfigurator."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Voucher sync password"); ?></td>
- <td width="78%" class="vtable">
- <input name="vouchersyncpass" type="password" class="formfld" id="vouchersyncpass" size="25" value="<?=htmlspecialchars($pconfig['vouchersyncpass']);?>" autocomplete="off" />
- <br /><?=gettext("This is the password of the master voucher nodes webConfigurator."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input type="hidden" name="zone" id="zone" value="<?=htmlspecialchars($cpzone);?>" />
- <input type="hidden" name="exponent" id="exponent" value="<?=$pconfig['exponent'];?>" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true); before_save();" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list">
- <p class="vexpl">
- <span class="red"><strong> <?=gettext("Note:"); ?><br /> </strong></span>
- <?=gettext("Changing any Voucher parameter (apart from managing the list of Rolls) on this page will render existing vouchers useless if they were generated with different settings."); ?>
- <br />
- <?=gettext("Specifying the Voucher Database Synchronization options will not record any other value from the other options. They will be retrieved/synced from the master."); ?>
- </p>
- </td>
- </tr>
+ </tbody>
</table>
- </td>
- </tr>
-</table>
-</form>
-<script type="text/javascript">
-//<![CDATA[
-enable_change(false);
-//]]>
+ </div>
+ </div>
+</div>
+<?php
+if ($pconfig['enable']) : ?>
+ <nav class="action-buttons">
+ <a href="services_captiveportal_vouchers_edit.php?zone=<?$cpzone?>" class="btn btn-success"><?=gettext("Add Voucher")?></a>
+ </nav>
+<?php
+endif;
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Create, generate and activate Rolls with Vouchers');
+
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'Enable',
+ 'Enable the creation, generation and activation of rolls with vouchers',
+ $pconfig['enable']
+ ));
+
+$form->add($section);
+
+$section = new Form_Section('Create, generate and activate Rolls with Vouchers');
+$section->addClass('rolledit');
+
+$section->addInput(new Form_TextArea(
+ 'publickey',
+ 'Voucher Public Key',
+ $pconfig['publickey']
+))->setHelp('Paste an RSA public key (64 Bit or smaller) in PEM format here. This key is used to decrypt vouchers.');
+
+$section->addInput(new Form_TextArea(
+ 'privatekey',
+ 'Voucher Private Key',
+ $pconfig['privatekey']
+))->setHelp('Paste an RSA private key (64 Bit or smaller) in PEM format here. This key is only used to generate encrypted vouchers and doesn\'t need to be available if the vouchers have been generated offline.');
+
+$section->addInput(new Form_Input(
+ 'charset',
+ 'Character set',
+ 'text',
+ $pconfig['charset']
+))->setHelp('Tickets are generated with the specified character set. It should contain printable characters (numbers, lower case and upper case letters) that are hard to confuse with others. Avoid e.g. 0/O and l/1.');
+
+$section->addInput(new Form_Input(
+ 'rollbits',
+ '# of Roll bits',
+ 'text',
+ $pconfig['rollbits']
+))->setHelp('Reserves a range in each voucher to store the Roll # it belongs to. Allowed range: 1..31. Sum of Roll+Ticket+Checksum bits must be one Bit less than the RSA key size.');
+
+$section->addInput(new Form_Input(
+ 'ticketbits',
+ '# of Ticket bits',
+ 'text',
+ $pconfig['ticketbits']
+))->setHelp('Reserves a range in each voucher to store the Ticket# it belongs to. Allowed range: 1..16. ' .
+ 'Using 16 bits allows a roll to have up to 65535 vouchers. ' .
+ 'A bit array, stored in RAM and in the config, is used to mark if a voucher has been used. A bit array for 65535 vouchers requires 8 KB of storage. ');
+
+$section->addInput(new Form_Input(
+ 'checksumbits',
+ '# of Checksum bits',
+ 'text',
+ $pconfig['checksumbits']
+))->setHelp('Reserves a range in each voucher to store a simple checksum over Roll # and Ticket#. Allowed range is 0..31.');
+
+$section->addInput(new Form_Input(
+ 'magic',
+ 'Magic number',
+ 'text',
+ $pconfig['magic']
+))->setHelp('Magic number stored in every voucher. Verified during voucher check. ' .
+ 'Size depends on how many bits are left by Roll+Ticket+Checksum bits. If all bits are used, no magic number will be used and checked.');
+
+$section->addInput(new Form_Input(
+ 'msgnoaccess',
+ 'Invalid voucher message',
+ 'text',
+ $pconfig['msgnoaccess']
+))->setHelp('Error message displayed for invalid vouchers on captive portal error page ($PORTAL_MESSAGE$).');
+
+
+$section->addInput(new Form_Input(
+ 'msgexpired',
+ 'Expired voucher message',
+ 'text',
+ $pconfig['msgexpired']
+))->setHelp('Error message displayed for expired vouchers on captive portal error page ($PORTAL_MESSAGE$).');
+
+$form->add($section);
+
+$section = new Form_Section('Voucher database synchronization');
+$section->addClass('rolledit');
+
+$section->addInput(new Form_IpAddress(
+ 'vouchersyncdbip',
+ 'Synchronize Voucher Database IP',
+ $pconfig['vouchersyncdbip']
+))->setHelp('IP address of master nodes webConfigurator to synchronize voucher database and used vouchers from.' . '<br />' .
+ 'NOTE: this should be setup on the slave nodes and not the primary node!');
+
+$section->addInput(new Form_Input(
+ 'vouchersyncport',
+ 'Voucher sync port',
+ 'text',
+ $pconfig['vouchersyncport']
+))->setHelp('The port of the master voucher node\'s webConfigurator. Example: 443 ');
+
+$section->addInput(new Form_Input(
+ 'vouchersyncusername',
+ 'Voucher sync username',
+ 'text',
+ $pconfig['vouchersyncusername']
+))->setHelp('This is the username of the master voucher nodes webConfigurator.');
+
+$section->addInput(new Form_Input(
+ 'vouchersyncpass',
+ 'Voucher sync password',
+ 'password',
+ $pconfig['vouchersyncuserpass']
+))->setHelp('This is the password of the master voucher nodes webConfigurator.');
+
+$section->addInput(new Form_Input(
+ 'zone',
+ null,
+ 'hidden',
+ $cpzone
+));
+
+$section->addInput(new Form_Input(
+ 'exponent',
+ null,
+ 'hidden',
+ $pconfig['exponent']
+));
+
+$form->add($section);
+print($form);
+?>
+<div class="rolledit">
+<?php
+ print_info_box(gettext('Changing any Voucher parameter (apart from managing the list of Rolls) on this page will render existing vouchers useless if they were generated with different settings. ' .
+ 'Specifying the Voucher Database Synchronization options will not record any other value from the other options. They will be retrieved/synced from the master.'));
+?>
+</div>
+
+<script>
+events.push(function(){
+
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ function setShowHide (show) {
+ hideClass('rolledit', !show);
+
+ if(show)
+ $('td:nth-child(5),th:nth-child(5)').show();
+ else
+ $('td:nth-child(5),th:nth-child(5)').hide();
+ }
+
+ // Show/hide on checkbox change
+ $('#enable').click(function() {
+ setShowHide($('#enable').is(":checked"));
+ })
+
+ // Set initial state
+ setShowHide($('#enable').is(":checked"));
+
+ var generateButton = $('<a class="btn btn-xs btn-default">Generate new keys</a>');
+ generateButton.on('click', function(){
+ $.ajax({
+ type: 'get',
+ url: 'services_captiveportal_vouchers.php?generatekey=true',
+ dataType: 'json',
+ success: function(data){
+ $('#publickey').val(data.public.replace(/\\n/g, '\n'));
+ $('#privatekey').val(data.private.replace(/\\n/g, '\n'));
+ }
+ });
+ });
+ generateButton.appendTo($('#publickey + .help-block')[0]);
+});
+
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_captiveportal_vouchers_edit.php b/src/usr/local/www/services_captiveportal_vouchers_edit.php
index 0aa6a45..cc05aee 100644
--- a/src/usr/local/www/services_captiveportal_vouchers_edit.php
+++ b/src/usr/local/www/services_captiveportal_vouchers_edit.php
@@ -70,6 +70,7 @@ if (!is_array($config['voucher'])) {
if (!is_array($config['voucher'][$cpzone]['roll'])) {
$config['voucher'][$cpzone]['roll'] = array();
}
+
$a_roll = &$config['voucher'][$cpzone]['roll'];
if (is_numericint($_GET['id'])) {
@@ -87,8 +88,8 @@ if (isset($id) && $a_roll[$id]) {
$pconfig['descr'] = $a_roll[$id]['descr'];
}
-$maxnumber = (1<<$config['voucher'][$cpzone]['rollbits']) -1; // Highest Roll#
-$maxcount = (1<<$config['voucher'][$cpzone]['ticketbits']) -1; // Highest Ticket#
+$maxnumber = (1<<$config['voucher'][$cpzone]['rollbits']) -1; // Highest Roll#
+$maxcount = (1<<$config['voucher'][$cpzone]['ticketbits']) -1; // Highest Ticket#
if ($_POST) {
@@ -134,14 +135,15 @@ if ($_POST) {
/* New Roll or modified voucher count: create bitmask */
$voucherlck = lock("voucher{$cpzone}");
+
if ($_POST['count'] != $rollent['count']) {
$rollent['count'] = $_POST['count'];
- $len = ($rollent['count']>>3) + 1; // count / 8 +1
- $rollent['used'] = base64_encode(str_repeat("\000", $len)); // 4 bitmask
+ $len = ($rollent['count']>>3) + 1; // count / 8 +1
+ $rollent['used'] = base64_encode(str_repeat("\000",$len)); // 4 bitmask
$rollent['active'] = array();
voucher_write_used_db($rollent['number'], $rollent['used']);
- voucher_write_active_db($rollent['number'], array()); // create empty DB
- voucher_log(LOG_INFO, sprintf(gettext('All %1$s vouchers from Roll %2$s marked unused'), $rollent['count'], $rollent['number']));
+ voucher_write_active_db($rollent['number'], array()); // create empty DB
+ voucher_log(LOG_INFO,sprintf(gettext('All %1$s vouchers from Roll %2$s marked unused'), $rollent['count'], $rollent['number']));
} else {
// existing roll has been modified but without changing the count
// read active and used DB from ramdisk and store it in XML config
@@ -149,7 +151,7 @@ if ($_POST) {
$activent = array();
$db = array();
$active_vouchers = voucher_read_active_db($rollent['number'], $rollent['minutes']);
- foreach ($active_vouchers as $voucher => $line) {
+ foreach($active_vouchers as $voucher => $line) {
list($timestamp, $minutes) = explode(",", $line);
$activent['voucher'] = $voucher;
$activent['timestamp'] = $timestamp;
@@ -158,13 +160,13 @@ if ($_POST) {
}
$rollent['active'] = $db;
}
+
unlock($voucherlck);
- if (isset($id) && $a_roll[$id]) {
+ if (isset($id) && $a_roll[$id])
$a_roll[$id] = $rollent;
- } else {
+ else
$a_roll[] = $rollent;
- }
write_config();
@@ -174,57 +176,65 @@ if ($_POST) {
}
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<form action="services_captiveportal_vouchers_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="content pane">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Roll"); ?>#</td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="number" type="text" class="formfld" id="number" size="10" value="<?=htmlspecialchars($pconfig['number']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Enter the Roll"); ?># (0..<?=htmlspecialchars($maxnumber);?>) <?=gettext("found on top of the generated/printed vouchers"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Minutes per Ticket"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="minutes" type="text" class="formfld" id="minutes" size="10" value="<?=htmlspecialchars($pconfig['minutes']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Defines the time in minutes that a user is allowed access. The clock starts ticking the first time a voucher is used for authentication"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Count"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="count" type="text" class="formfld" id="count" size="10" value="<?=htmlspecialchars($pconfig['count']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Enter the number of vouchers"); ?> (1..<?=htmlspecialchars($maxcount);?>) <?=gettext("found on top of the generated/printed vouchers. WARNING: Changing this number for an existing Roll will mark all vouchers as unused again"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Comment"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="descr" type="text" class="formfld" id="descr" size="60" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Can be used to further identify this roll. Ignored by the system"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input name="zone" type="hidden" value="<?=htmlspecialchars($cpzone);?>" />
- <?php if (isset($id) && $a_roll[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Voucher rolls');
+
+$section->addInput(new Form_Input(
+ 'number',
+ 'Roll #',
+ 'text',
+ $pconfig['number']
+))->setHelp('Enter the Roll# (0..%d) found on top of the generated/printed vouchers', [$maxnumber]);
+
+$section->addInput(new Form_Input(
+ 'minutes',
+ 'Minutes per ticket',
+ 'text',
+ $pconfig['minutes']
+))->setHelp('Defines the time in minutes that a user is allowed access. The clock starts ticking the first time a voucher is used for authentication.');
+
+$section->addInput(new Form_Input(
+ 'count',
+ 'Count',
+ 'text',
+ $pconfig['count']
+))->setHelp('Enter the number of vouchers (1..%d) found on top of the generated/printed vouchers. WARNING: Changing this number for an existing Roll will mark all vouchers as unused again', [$maxcount]);
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Comment',
+ 'text',
+ $pconfig['descr']
+))->setHelp('Can be used to further identify this roll. Ignored by the system.');
+
+$section->addInput(new Form_Input(
+ 'zone',
+ null,
+ 'hidden',
+ $cpzone
+));
+
+if (isset($id) && $a_roll[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $pconfig['id']
+ ));
+}
+
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_captiveportal_zones_edit.php b/src/usr/local/www/services_captiveportal_zones_edit.php
index fa37c80..340b684 100644
--- a/src/usr/local/www/services_captiveportal_zones_edit.php
+++ b/src/usr/local/www/services_captiveportal_zones_edit.php
@@ -27,7 +27,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: captiveportal
+ pfSense_MODULE: captiveportal
*/
##|+PRIV
@@ -52,7 +52,6 @@ if (!is_array($config['captiveportal'])) {
$a_cp =& $config['captiveportal'];
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -63,7 +62,7 @@ if ($_POST) {
do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
if (preg_match('/[^A-Za-z0-9_]/', $_POST['zone'])) {
- $input_errors[] = gettext("The zone name can only contain letters, digits, and underscores (_).");
+ $input_errors[] = gettext("The zone name can only contain letters, digits, and underscores ( _ ).");
}
foreach ($a_cp as $cpkey => $cpent) {
@@ -85,40 +84,33 @@ if ($_POST) {
exit;
}
}
+
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
- <form action="services_captiveportal_zones_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="captive portal edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Captive Portal Zones");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Zone name"); ?></td>
- <td width="78%" class="vtable">
- <input name="zone" type="text" class="formfld unknown" id="zone" size="64" />
- <br />
- <span class="vexpl"><?=gettext("Zone name. Can only contain letters, digits, and underscores (_)."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" />
- <br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Continue"); ?>" />
- </td>
- </tr>
- </table>
- </form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'submit',
+ 'Continue'
+));
+
+$section = new Form_Section('Edit Captive Portal Zones');
+
+$section->addInput(new Form_Input(
+ 'zone',
+ 'Zone name'
+))->setPattern('[0-9A-Za-z_]+')->setHelp('Zone name. Can only contain letters, digits, and underscores (_).');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Zone description'
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$form->add($section);
+
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_dhcp_edit.php b/src/usr/local/www/services_dhcp_edit.php
index 1fc947b..1ab0987 100644
--- a/src/usr/local/www/services_dhcp_edit.php
+++ b/src/usr/local/www/services_dhcp_edit.php
@@ -31,7 +31,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /usr/sbin/arp
- pfSense_MODULE: dhcpserver
+ pfSense_MODULE: dhcpserver
*/
##|+PRIV
@@ -60,16 +60,10 @@ if (!$g['services_dhcp_server_enable']) {
require("guiconfig.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_dhcp.php');
-}
-
$if = $_GET['if'];
-if ($_POST['if']) {
+
+if ($_POST['if'])
$if = $_POST['if'];
-}
if (!$if) {
header("Location: services_dhcp.php");
@@ -158,7 +152,6 @@ if (isset($id) && $a_maps[$id]) {
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -189,9 +182,11 @@ if ($_POST) {
}
}
}
+
if (($_POST['ipaddr'] && !is_ipaddr($_POST['ipaddr']))) {
$input_errors[] = gettext("A valid IP address must be specified.");
}
+
if (($_POST['mac'] && !is_macaddr($_POST['mac']))) {
$input_errors[] = gettext("A valid MAC address must be specified.");
}
@@ -378,248 +373,367 @@ if ($_POST) {
}
}
+// Get our MAC address
+$ip = $_SERVER['REMOTE_ADDR'];
+$mymac = `/usr/sbin/arp -an | grep '('{$ip}')' | cut -d" " -f4`;
+$mymac = str_replace("\n","",$mymac);
+
$closehead = false;
$pgtitle = array(gettext("Services"), gettext("DHCP"), gettext("Edit static mapping"));
$shortcut_section = "dhcp";
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section(sprintf("Static DHCP Mapping on %s", $ifcfgdescr));
+
+$macaddress = new Form_Input(
+ 'mac',
+ 'MAC Address',
+ 'text',
+ $pconfig['mac'],
+ ['placeholder' => 'xx:xx:xx:xx:xx:xx']
+);
+
+$btnmymac = new Form_Button(
+ 'btnmymac',
+ 'Copy My MAC'
+ );
+
+$btnmymac->removeClass('btn-primary')->addClass('btn-success btn-sm');
+
+$group = new Form_Group('MAC controls');
+$group->add($macaddress);
+$group->add($btnmymac);
+$group->setHelp('MAC address (6 hex octets separated by colons)');
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'cid',
+ 'Client Identifier',
+ 'text',
+ $pconfig['cid']
+));
+
+$section->addInput(new Form_IpAddress(
+ 'ipaddr',
+ 'IP Address',
+ $pconfig['ipaddr']
+))->setHelp('If an IPv4 address is entered, the address must be outside of the pool.' . '<br />' .
+ 'If no IPv4 address is given, one will be dynamically allocated from the pool.');
+
+$section->addInput(new Form_Input(
+ 'hostnme',
+ 'Hostname',
+ 'text',
+ $pconfig['hostname']
+))->setHelp('Name of the host, without domain part.');
+
+if($netboot_enabled) {
+ $section->addInput(new Form_Input(
+ 'filename',
+ 'Netboot filename',
+ 'text',
+ $pconfig['filename']
+ ))->setHelp('Name of the file that should be loaded when this host boots off of the network, overrides setting on main page.');
+
+ $section->addInput(new Form_Input(
+ 'rootpath',
+ 'Root Path',
+ 'text',
+ $pconfig['rootpath']
+ ))->setHelp('Enter the root-path-string, overrides setting on main page.');
+}
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['hostname']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$section->addInput(new Form_Checkbox(
+ 'arp_table_static_entry',
+ 'ARP Table Static Entry',
+ 'Create an ARP Table Static Entry for this MAC & IP Address pair.',
+ $pconfig['arp_table_static_entry']
+));
+
+$group = new Form_Group('WINS Servers');
+
+$group->add(new Form_Input(
+ 'wins1',
+ null,
+ 'text',
+ $pconfig['wins1'],
+ ['placeholder' => 'WINS 1']
+));
+
+$group->add(new Form_Input(
+ 'win2',
+ null,
+ 'text',
+ $pconfig['win2'],
+ ['placeholder' => 'WINS 2']
+));
+
+$section->add($group);
+$group = new Form_Group('DNS Servers');
+
+$group->add(new Form_Input(
+ 'dns1',
+ null,
+ 'text',
+ $pconfig['dns1'],
+ ['placeholder' => 'DNS1 1']
+));
+
+$group->add(new Form_Input(
+ 'dns2',
+ null,
+ 'text',
+ $pconfig['dns2'],
+ ['placeholder' => 'DNS 2']
+));
+
+$group->add(new Form_Input(
+ 'dns3',
+ null,
+ 'text',
+ $pconfig['dns3'],
+ ['placeholder' => 'DNS 3']
+));
+
+$group->add(new Form_Input(
+ 'dns4',
+ null,
+ 'text',
+ $pconfig['dns4'],
+ ['placeholder' => 'DNS 4']
+));
+
+$group->setHelp('NOTE: leave blank to use the system default DNS servers - this interface\'s IP if DNS forwarder is enabled, otherwise the servers configured on the General page.');
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'gateway',
+ 'Gateway',
+ 'text',
+ $pconfig['gateway']
+))->setHelp('The default is to use the IP on this interface of the firewall as the gateway. Specify an alternate gateway here if this is not the correct gateway for your network.');
+
+$section->addInput(new Form_Input(
+ 'domain',
+ 'Domain name',
+ 'text',
+ $pconfig['domain']
+))->setHelp('The default is to use the domain name of this system as the default domain name provided by DHCP. You may specify an alternate domain name here. ');
+
+$section->addInput(new Form_Input(
+ 'domainsearchlist',
+ 'Domain search list',
+ 'text',
+ $pconfig['domainsearchlist']
+))->setHelp('The DHCP server can optionally provide a domain search list. Use the semicolon character as separator');
+
+$section->addInput(new Form_Input(
+ 'deftime',
+ 'Default lease time (Seconds)',
+ 'text',
+ $pconfig['deftime']
+))->setHelp('Used for clients that do not ask for a specific expiration time. The default is 7200 seconds.');
+
+$section->addInput(new Form_Input(
+ 'maxtime',
+ 'Maximum lease time (Seconds)',
+ 'text',
+ $pconfig['maxtime']
+))->setHelp('This is the maximum lease time for clients that ask for a specific expiration time. The default is 86400 seconds.');
+
+$btndyndns = new Form_Button(
+ 'btndyndns',
+ 'Advanced'
+);
+
+$btndyndns->removeClass('btn-primary')->addClass('btn-success btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'Dynamic DNS',
+ $btndyndns . '&nbsp;' . 'Show dynamic DNS settings'
+));
+
+$section->addInput(new Form_Checkbox(
+ 'ddnsupdate',
+ 'DHCP Registration',
+ 'Enable registration of DHCP client names in DNS.',
+ $pconfig['ddnsupdate']
+));
+
+$section->addInput(new Form_Input(
+ 'ddnsdomain',
+ 'DDNS Domain',
+ 'text',
+ $pconfig['ddnsdomain']
+))->setHelp('Leave blank to disable dynamic DNS registration. Enter the dynamic DNS domain which will be used to register client names in the DNS server.');
+
+$section->addInput(new Form_IpAddress(
+ 'ddnsdomainprimary',
+ 'DDNS Server IP',
+ $pconfig['ddnsdomainprimary']
+))->setHelp('Enter the primary domain name server IP address for the dynamic domain name.');
+
+$section->addInput(new Form_Input(
+ 'ddnsdomainkeyname',
+ 'DDNS Domain Key name',
+ 'text',
+ $pconfig['ddnsdomainkeyname']
+))->setHelp('Enter the dynamic DNS domain key name which will be used to register client names in the DNS server.');
+
+$section->addInput(new Form_Input(
+ 'ddnsdomainkey',
+ 'DDNS Domain Key secret',
+ 'text',
+ $pconfig['ddnsdomainkey']
+))->setHelp('Enter the dynamic DNS domain key secret which will be used to register client names in the DNS server.');
+
+$btnntp = new Form_Button(
+ 'btnntp',
+ 'Advanced'
+);
+
+$btnntp->removeClass('btn-primary')->addClass('btn-success btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'NTP servers',
+ $btnntp . '&nbsp;' . 'Show NTP Configuration'
+));
+
+$group = new Form_Group('NTP Servers');
+
+$group->add(new Form_Input(
+ 'ntp1',
+ 'NTP Server 1',
+ 'text',
+ $pconfig['ntp1'],
+ ['placeholder' => 'NTP 1']
+));
+
+$group->add(new Form_Input(
+ 'ntp2',
+ 'NTP Server 1',
+ 'text',
+ $pconfig['ntp2'],
+ ['placeholder' => 'NTP 2']
+));
+
+$group->addClass('ntpclass');
+
+$section->add($group);
+
+$btntftp = new Form_Button(
+ 'btntftp',
+ 'Advanced'
+);
+
+$btntftp->removeClass('btn-primary')->addClass('btn-success btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'TFTP servers',
+ $btntftp . '&nbsp;' . 'Show TFTP Configuration'
+));
+
+$section->addInput(new Form_Input(
+ 'tftp',
+ 'TFTP Server',
+ 'text',
+ $pconfig['tftp']
+))->setHelp('Leave blank to disable. Enter a full hostname or IP for the TFTP server.');
+
+$form->add($section);
+print($form);
?>
-<script type="text/javascript">
+<script>
//<![CDATA[
- function show_ddns_config() {
- document.getElementById("showddnsbox").innerHTML='';
- aodiv = document.getElementById('showddns');
- aodiv.style.display = "block";
+events.push(function(){
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
}
- function show_ntp_config() {
- document.getElementById("showntpbox").innerHTML='';
- aodiv = document.getElementById('showntp');
- aodiv.style.display = "block";
+ // Hides the <div> in which the specified icheckbox lives so that the input, its label and help text are hidden
+ // Checkboxes live inside <label></label> tags so we need another parent level
+ function hideCheckBox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
}
- function show_tftp_config() {
- document.getElementById("showtftpbox").innerHTML='';
- aodiv = document.getElementById('showtftp');
- aodiv.style.display = "block";
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
}
+
+ function hideDDNS(hide) {
+ hideCheckBox('ddnsupdate', hide);
+ hideInput('ddnsdomain', hide);
+ hideInput('ddnsdomainprimary', hide);
+ hideInput('ddnsdomainkeyname', hide);
+ hideInput('ddnsdomainkey', hide);
+ }
+
+ // Make the ‘Copy My MAC’ button a plain button, not a submit button
+ $("#btnmymac").prop('type','button');
+
+ // On click, copy the hidden 'mymac' text to the 'mac' input
+ $("#btnmymac").click(function() {
+ $('#mac').val('<?=$mymac?>');
+ });
+
+ // Make the ‘tftp’ button a plain button, not a submit button
+ $("#btntftp").prop('type','button');
+
+ // Show tftp controls
+ $("#btntftp").click(function() {
+ hideInput('tftp', false);
+ });
+
+ // Make the ‘ntp’ button a plain button, not a submit button
+ $("#btnntp").prop('type','button');
+
+ // Show ntp controls
+ $("#btnntp").click(function() {
+ hideClass('ntpclass', false);
+ });
+
+ // Make the ‘ddns’ button a plain button, not a submit button
+ $("#btndyndns").prop('type','button');
+
+ // Show ddns controls
+ $("#btndyndns").click(function() {
+ hideDDNS(false);
+ });
+
+ // On initial load
+ hideDDNS(true);
+ hideClass('ntpclass', true);
+ hideInput('tftp', true);
+});
//]]>
</script>
-</head>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="services_dhcp_edit.php" method="post" name="iform" id="iform">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="static mapping">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=sprintf(gettext("Static DHCP Mapping on %s"), $ifcfgdescr);?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("MAC address");?></td>
- <td width="78%" class="vtable">
- <input name="mac" type="text" class="formfld unknown" id="mac" size="30" value="<?=htmlspecialchars($pconfig['mac']);?>" />
- <?php
- $ip = getenv('REMOTE_ADDR');
- $mac = `/usr/sbin/arp -an | grep {$ip} | cut -d" " -f4`;
- $mac = str_replace("\n", "", $mac);
- ?>
- <a onclick="document.forms[0].mac.value='<?=$mac?>';" href="#"><?=gettext("Copy my MAC address");?></a>
- <br />
- <span class="vexpl">
- <?=gettext("Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Client identifier");?></td>
- <td width="78%" class="vtable">
- <input name="cid" type="text" class="formfld unknown" id="cid" size="30" value="<?=htmlspecialchars($pconfig['cid']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IP address");?></td>
- <td width="78%" class="vtable">
- <input name="ipaddr" type="text" class="formfld unknown" id="ipaddr" size="20" value="<?=htmlspecialchars($pconfig['ipaddr']);?>" />
- <br />
- <?=gettext("If an IPv4 address is entered, the address must be outside of the pool.");?>
- <br />
- <?=gettext("If no IPv4 address is given, one will be dynamically allocated from the pool.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Hostname");?></td>
- <td width="78%" class="vtable">
- <input name="hostname" type="text" class="formfld unknown" id="hostname" size="20" value="<?=htmlspecialchars($pconfig['hostname']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Name of the host, without domain part.");?>
- </span>
- </td>
- </tr>
-<?php
- if ($netboot_enabled) {
-?>
- <tr>
- <td width="22%" valign="top" class="vncell">Netboot Filename</td>
- <td width="78%" class="vtable">
- <input name="filename" type="text" class="formfld unknown" id="filename" size="20" value="<?=htmlspecialchars($pconfig['filename']);?>" />
- <br />
- <span class="vexpl">Name of the file that should be loaded when this host boots off of the network, overrides setting on main page.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell">Root Path</td>
- <td width="78%" class="vtable">
- <input name="rootpath" type="text" class="formfld unknown" id="rootpath" size="90" value="<?=htmlspecialchars($pconfig['rootpath']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Enter the"); ?> <b><?=gettext("root-path"); ?></b>-<?=gettext("string");?>, overrides setting on main page.
- </span>
- </td>
- </tr>
-<?php
- }
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed).");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("ARP Table Static Entry");?></td>
- <td width="78%" class="vtable">
- <input name="arp_table_static_entry" id="arp_table_static_entry" type="checkbox" value="yes" <?php if ($pconfig['arp_table_static_entry']) echo "checked=\"checked\""; ?> />
- <br />
- <span class="vexpl">
- <?=gettext("Create an ARP Table Static Entry for this MAC &amp; IP Address pair. ");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("WINS servers");?></td>
- <td width="78%" class="vtable">
- <input name="wins1" type="text" class="formfld unknown" id="wins1" size="20" value="<?=htmlspecialchars($pconfig['wins1']);?>" /><br />
- <input name="wins2" type="text" class="formfld unknown" id="wins2" size="20" value="<?=htmlspecialchars($pconfig['wins2']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("DNS servers");?></td>
- <td width="78%" class="vtable">
- <input name="dns1" type="text" class="formfld unknown" id="dns1" size="20" value="<?=htmlspecialchars($pconfig['dns1']);?>" /><br />
- <input name="dns2" type="text" class="formfld unknown" id="dns2" size="20" value="<?=htmlspecialchars($pconfig['dns2']);?>" /><br />
- <input name="dns3" type="text" class="formfld unknown" id="dns3" size="20" value="<?=htmlspecialchars($pconfig['dns3']);?>" /><br />
- <input name="dns4" type="text" class="formfld unknown" id="dns4" size="20" value="<?=htmlspecialchars($pconfig['dns4']);?>" /><br />
- <?=gettext("NOTE: leave blank to use the system default DNS servers - this interface's IP if DNS Forwarder or Resolver is enabled, otherwise the servers configured on the General page.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Gateway");?></td>
- <td width="78%" class="vtable">
- <input name="gateway" type="text" class="formfld host" id="gateway" size="20" value="<?=htmlspecialchars($pconfig['gateway']);?>" /><br />
- <?=gettext("The default is to use the IP on this interface of the firewall as the gateway. Specify an alternate gateway here if this is not the correct gateway for your network.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Domain name");?></td>
- <td width="78%" class="vtable">
- <input name="domain" type="text" class="formfld unknown" id="domain" size="20" value="<?=htmlspecialchars($pconfig['domain']);?>" /><br />
- <?=gettext("The default is to use the domain name of this system as the default domain name provided by DHCP. You may specify an alternate domain name here.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Domain search list");?></td>
- <td width="78%" class="vtable">
- <input name="domainsearchlist" type="text" class="formfld unknown" id="domainsearchlist" size="20" value="<?=htmlspecialchars($pconfig['domainsearchlist']);?>" /><br />
- <?=gettext("The DHCP server can optionally provide a domain search list. Use the semicolon character as separator ");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Default lease time");?></td>
- <td width="78%" class="vtable">
- <input name="deftime" type="text" class="formfld unknown" id="deftime" size="10" value="<?=htmlspecialchars($pconfig['deftime']);?>" />
- <?=gettext("seconds");?><br />
- <?=gettext("This is used for clients that do not ask for a specific expiration time."); ?><br />
- <?=gettext("The default is 7200 seconds.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Maximum lease time");?></td>
- <td width="78%" class="vtable">
- <input name="maxtime" type="text" class="formfld unknown" id="maxtime" size="10" value="<?=htmlspecialchars($pconfig['maxtime']);?>" />
- <?=gettext("seconds");?><br />
- <?=gettext("This is the maximum lease time for clients that ask for a specific expiration time."); ?><br />
- <?=gettext("The default is 86400 seconds.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Dynamic DNS");?></td>
- <td width="78%" class="vtable">
- <div id="showddnsbox">
- <input type="button" onclick="show_ddns_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Dynamic DNS");?>
- </div>
- <div id="showddns" style="display:none">
- <input style="vertical-align:middle" type="checkbox" value="yes" name="ddnsupdate" id="ddnsupdate" <?php if ($pconfig['ddnsupdate']) echo "checked=\"checked\""; ?> />&nbsp;
- <b><?=gettext("Enable registration of DHCP client names in DNS.");?></b><br />
- <p>
- <input name="ddnsdomain" type="text" class="formfld unknown" id="ddnsdomain" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomain']);?>" /><br />
- <?=gettext("Note: Leave blank to disable dynamic DNS registration.");?><br />
- <?=gettext("Enter the dynamic DNS domain which will be used to register client names in the DNS server.");?><br />
- <input name="ddnsdomainprimary" type="text" class="formfld unknown" id="ddnsdomainprimary" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainprimary']);?>" /><br />
- <?=gettext("Enter the primary domain name server IP address for the dynamic domain name.");?><br />
- <input name="ddnsdomainkeyname" type="text" class="formfld unknown" id="ddnsdomainkeyname" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainkeyname']);?>" /><br />
- <?=gettext("Enter the dynamic DNS domain key name which will be used to register client names in the DNS server.");?><br />
- <input name="ddnsdomainkey" type="text" class="formfld unknown" id="ddnsdomainkey" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainkey']);?>" /><br />
- <?=gettext("Enter the dynamic DNS domain key secret which will be used to register client names in the DNS server.");?>
- </p>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("NTP servers");?></td>
- <td width="78%" class="vtable">
- <div id="showntpbox">
- <input type="button" onclick="show_ntp_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show NTP configuration");?>
- </div>
- <div id="showntp" style="display:none">
- <input name="ntp1" type="text" class="formfld unknown" id="ntp1" size="20" value="<?=htmlspecialchars($pconfig['ntp1']);?>" /><br />
- <input name="ntp2" type="text" class="formfld unknown" id="ntp2" size="20" value="<?=htmlspecialchars($pconfig['ntp2']);?>" />
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("TFTP server");?></td>
- <td width="78%" class="vtable">
- <div id="showtftpbox">
- <input type="button" onclick="show_tftp_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show TFTP configuration");?>
- </div>
- <div id="showtftp" style="display:none">
- <input name="tftp" type="text" class="formfld unknown" id="tftp" size="50" value="<?=htmlspecialchars($pconfig['tftp']);?>" /><br />
- <?=gettext("Leave blank to disable. Enter a full hostname or IP for the TFTP server.");?>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_maps[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- <input name="if" type="hidden" value="<?=htmlspecialchars($if);?>" />
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_dhcp_relay.php b/src/usr/local/www/services_dhcp_relay.php
index ae69c3a..8559f4b 100644
--- a/src/usr/local/www/services_dhcp_relay.php
+++ b/src/usr/local/www/services_dhcp_relay.php
@@ -1,33 +1,59 @@
<?php
/*
services_dhcp_relay.php
-
- Copyright (C) 2003-2004 Justin Ellison <justin@techadvise.com>.
- Copyright (C) 2010 Ermal Luçi
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 22003-2004 Justin Ellison <justin@techadvise.com>
+ * Copyright (c) 22010 Ermal Luçi
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_MODULE: dhcprelay
*/
@@ -40,17 +66,29 @@
##|-PRIV
require("guiconfig.inc");
+require('classes/Form.class.php');
$pconfig['enable'] = isset($config['dhcrelay']['enable']);
+
if (empty($config['dhcrelay']['interface'])) {
$pconfig['interface'] = array();
} else {
$pconfig['interface'] = explode(",", $config['dhcrelay']['interface']);
}
-$pconfig['server'] = $config['dhcrelay']['server'];
+
$pconfig['agentoption'] = isset($config['dhcrelay']['agentoption']);
-$iflist = get_configured_interface_with_descr();
+$iflist = array_intersect_key(
+ get_configured_interface_with_descr(),
+ array_flip(
+ array_filter(
+ array_keys(get_configured_interface_with_descr()),
+ function($if) {
+ return is_ipaddr(get_interface_ip($if));
+ }
+ )
+ )
+);
/* set the enabled flag which will tell us if DHCP server is enabled
* on any interface. We will use this to disable dhcp-relay since
@@ -67,8 +105,8 @@ if (is_array($config['dhcpd'])) {
}
if ($_POST) {
-
unset($input_errors);
+
$pconfig = $_POST;
/* input validation */
@@ -78,21 +116,31 @@ if ($_POST) {
do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ $svrlist = '';
+
if ($_POST['server']) {
- $checksrv = explode(",", $_POST['server']);
- foreach ($checksrv as $srv) {
- if (!is_ipaddr($srv)) {
+ foreach($_POST['server'] as $checksrv => $srv) {
+ if (!is_ipaddr($srv[0]))
$input_errors[] = gettext("A valid Destination Server IP address must be specified.");
+
+ if(!empty($srv[0])) { // Filter out any empties
+ if(!empty($svrlist))
+ $svrlist .= ',';
+
+ $svrlist .= $srv[0];
}
}
}
}
+ // Now $svrlist is a comma separated list of servers ready to save to the config system
+ $pconfig['server'] = $svrlist;
+
if (!$input_errors) {
$config['dhcrelay']['enable'] = $_POST['enable'] ? true : false;
$config['dhcrelay']['interface'] = implode(",", $_POST['interface']);
$config['dhcrelay']['agentoption'] = $_POST['agentoption'] ? true : false;
- $config['dhcrelay']['server'] = $_POST['server'];
+ $config['dhcrelay']['server'] = $pconfig['server'];
write_config();
@@ -108,109 +156,74 @@ $pgtitle = array(gettext("Services"), gettext("DHCP Relay"));
$shortcut_section = "dhcp";
include("head.inc");
-?>
-
-<script type="text/javascript">
-//<![CDATA[
-function enable_change(enable_over) {
- if (document.iform.enable.checked || enable_over) {
- document.iform.server.disabled = 0;
- document.iform.interface.disabled = 0;
- document.iform.agentoption.disabled = 0;
- } else {
- document.iform.server.disabled = 1;
- document.iform.interface.disabled = 1;
- document.iform.agentoption.disabled = 1;
- }
+if ($dhcpd_enabled) {
+ echo '<div class="alert alert-danger">DHCP Server is currently enabled. Cannot enable the DHCP Relay service while the DHCP Server is enabled on any interface.</div>';
+ include("foot.inc");
+ exit;
}
-//]]>
-</script>
-</head>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="services_dhcp_relay.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcp relay">
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
-<?php
- if ($dhcpd_enabled) {
- echo "<td>DHCP Server is currently enabled. Cannot enable the DHCP Relay service while the DHCP Server is enabled on any interface.";
- echo "</td></tr></table></div></td></tr></table></form>";
- include("fend.inc");
- echo "</body></html>";
- exit;
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+$form = new Form;
+
+$section = new Form_Section('DHCP Relay configuration');
+
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'Enable',
+ 'Enable DHCP relay on interface',
+ $pconfig['enable']
+))->toggles('.form-group:not(:first-child)');
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface(s)',
+ $pconfig['interface'],
+ $iflist,
+ true
+))->setHelp('Interfaces without an IP address will not be shown.');
+
+$section->addInput(new Form_Checkbox(
+ 'agentoption',
+ '',
+ 'Append circuit ID and agent ID to requests',
+ 'yes',
+ $pconfig['agentoption']
+))->setHelp(
+ 'If this is checked, the DHCP relay will append the circuit ID (%s interface number) and the agent ID to the DHCP request.',
+ [$g['product_name']]
+);
+
+//Small function to prevent duplicate code
+function createDestinationServerInputGroup($value = null)
+{
+ $group = new Form_Group('Destination server');
+
+ $group->add(new Form_IpAddress(
+ 'server',
+ 'Destination server',
+ $value
+ ))->setWidth(4)->setHelp(
+ 'This is the IP address of the server to which DHCP requests are relayed.'
+ )->setIsRepeated();
+
+ $group->enableDuplication(null, true); // Buttons are in-line with the input
+ return $group;
+}
+
+if (!isset($pconfig['server']) || count($pconfig['server']) < 1)
+ $section->add(createDestinationServerInputGroup());
+else {
+ foreach (explode(',', $pconfig['server']) as $server) {
+ $section->add(createDestinationServerInputGroup($server));
}
-?>
-
- <td colspan="2" valign="top" class="listtopic"><?=gettext("DHCP Relay configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Enable</td>
- <td width="78%" class="vtable">
- <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
- <strong><?php printf(gettext("Enable DHCP relay on interface"));?></strong>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Interface(s)</td>
- <td width="78%" class="vtable">
- <select id="interface" name="interface[]" multiple="multiple" class="formselect" size="3">
- <?php
- foreach ($iflist as $ifent => $ifdesc) {
- if (!is_ipaddr(get_interface_ip($ifent))) {
- continue;
- }
- echo "<option value=\"{$ifent}\"";
- if (in_array($ifent, $pconfig['interface'])) {
- echo " selected=\"selected\"";
- }
- echo ">{$ifdesc}</option>\n";
- }
- ?>
- </select>
- <br />Interfaces without an IP address will not be shown.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vtable">&nbsp;</td>
- <td width="78%" class="vtable">
- <input name="agentoption" type="checkbox" value="yes" <?php if ($pconfig['agentoption']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Append circuit ID and agent ID to requests"); ?></strong><br />
- <?php printf(gettext("If this is checked, the DHCP relay will append the circuit ID (%s interface number) and the agent ID to the DHCP request."), $g['product_name']); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination server");?></td>
- <td width="78%" class="vtable">
- <input name="server" type="text" class="formfld unknown" id="server" size="20" value="<?=htmlspecialchars($pconfig['server']);?>" />
- <br />
- <?=gettext("This is the IP address of the server to which DHCP requests are relayed. You can enter multiple server IP addresses, separated by commas.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<script type="text/javascript">
-//<![CDATA[
-enable_change(false);
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+}
+
+$form->add($section);
+print $form;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_dhcpv6.php b/src/usr/local/www/services_dhcpv6.php
index 51a6ada..b8a4909 100644
--- a/src/usr/local/www/services_dhcpv6.php
+++ b/src/usr/local/www/services_dhcpv6.php
@@ -35,7 +35,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /bin/rm
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -53,8 +53,8 @@ if (!$g['services_dhcp_server_enable']) {
exit;
}
-/* Fix failover DHCP problem
- * http://article.gmane.org/gmane.comp.security.firewalls.pfsense.support/18749
+/* Fix failover DHCP problem
+ * http://article.gmane.org/gmane.comp.security.firewalls.pfsense.support/18749
*/
ini_set("memory_limit", "64M");
@@ -129,9 +129,9 @@ if (is_array($config['dhcpdv6'][$if])) {
$ifcfgip = get_interface_ipv6($if);
$ifcfgsn = get_interface_subnetv6($if);
-/* set the enabled flag which will tell us if DHCP relay is enabled
- * on any interface. We will use this to disable DHCP server since
- * the two are not compatible with each other.
+/* set the enabled flag which will tell us if DHCP relay is enabled
+ * on any interface. We will use this to disable DHCP server since
+ * the two are not compatible with each other.
*/
$dhcrelay_enabled = false;
@@ -147,7 +147,6 @@ if (is_array($dhcrelaycfg)) {
}
if ($_POST) {
-
unset($input_errors);
$old_dhcpdv6_enable = ($pconfig['enable'] == true);
@@ -417,579 +416,612 @@ if ($_GET['act'] == "del") {
}
}
+// Delete a row in the options table
+if($_GET['act'] == "delopt") {
+ $idx = $_GET['id'];
+
+ if($pconfig['numberoptions'] && is_array($pconfig['numberoptions']['item'][$idx])) {
+ unset($pconfig['numberoptions']['item'][$idx]);
+ }
+}
+
+// Add an option row
+if($_GET['act'] == "addopt") {
+ if(!is_array($pconfig['numberoptions']['item']))
+ $pconfig['numberoptions']['item'] = array();
+
+ array_push($pconfig['numberoptions']['item'], array('number' => null, 'value' => null));
+}
+
$closehead = false;
$pgtitle = array(gettext("Services"), gettext("DHCPv6 server"));
$shortcut_section = "dhcp6";
include("head.inc");
-?>
+if ($input_errors)
+ print_input_errors($input_errors);
-<script type="text/javascript" src="/javascript/row_helper.js">
-</script>
+if ($savemsg)
+ print_info_box($savemsg, 'success');
-<script type="text/javascript">
-//<![CDATA[
- rowname[0] = "number";
- rowtype[0] = "textbox";
- rowsize[0] = "10";
- rowname[1] = "value";
- rowtype[1] = "textbox";
- rowsize[1] = "55";
-//]]>
-</script>
+if ($dhcrelay_enabled) {
+ print_info_box(gettext("DHCP Relay is currently enabled. Cannot enable the DHCP Server service while the DHCP Relay is enabled on any interface."), 'danger');
+ include("foot.inc");
+ exit;
+}
-<script type="text/javascript">
-//<![CDATA[
- function enable_change(enable_over) {
- var endis;
- endis = !(document.iform.enable.checked || enable_over);
- document.iform.range_from.disabled = endis;
- document.iform.range_to.disabled = endis;
- document.iform.prefixrange_from.disabled = endis;
- document.iform.prefixrange_to.disabled = endis;
- document.iform.prefixrange_length.disabled = endis;
- document.iform.dns1.disabled = endis;
- document.iform.dns2.disabled = endis;
- document.iform.dns3.disabled = endis;
- document.iform.dns4.disabled = endis;
- document.iform.deftime.disabled = endis;
- document.iform.maxtime.disabled = endis;
- //document.iform.gateway.disabled = endis;
- document.iform.dhcpv6leaseinlocaltime.disabled = endis;
- document.iform.domain.disabled = endis;
- document.iform.domainsearchlist.disabled = endis;
- document.iform.ddnsdomain.disabled = endis;
- document.iform.ddnsdomainprimary.disabled = endis;
- document.iform.ddnsdomainkeyname.disabled = endis;
- document.iform.ddnsdomainkey.disabled = endis;
- document.iform.ddnsupdate.disabled = endis;
- document.iform.ntp1.disabled = endis;
- document.iform.ntp2.disabled = endis;
- //document.iform.tftp.disabled = endis;
- document.iform.ldap.disabled = endis;
- document.iform.netboot.disabled = endis;
- document.iform.bootfile_url.disabled = endis;
- }
+if (is_subsystem_dirty('staticmaps'))
+ print_info_box_np(gettext('The static mapping configuration has been changed') . '.<br />' . gettext('You must apply the changes in order for them to take effect.'));
- function show_shownumbervalue() {
- document.getElementById("shownumbervaluebox").innerHTML='';
- aodiv = document.getElementById('shownumbervalue');
- aodiv.style.display = "block";
- }
+/* active tabs */
+$tab_array = array();
+$tabscounter = 0;
+$i = 0;
+foreach ($iflist as $ifent => $ifname) {
+ $oc = $config['interfaces'][$ifent];
+ if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) ||
+ (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))))
+ continue;
- function show_ddns_config() {
- document.getElementById("showddnsbox").innerHTML='';
- aodiv = document.getElementById('showddns');
- aodiv.style.display = "block";
- }
- function show_ntp_config() {
- document.getElementById("showntpbox").innerHTML='';
- aodiv = document.getElementById('showntp');
- aodiv.style.display = "block";
- }
- /*
- function show_tftp_config() {
- document.getElementById("showtftpbox").innerHTML='';
- aodiv = document.getElementById('showtftp');
- aodiv.style.display = "block";
- }
- */
- function show_ldap_config() {
- document.getElementById("showldapbox").innerHTML='';
- aodiv = document.getElementById('showldap');
- aodiv.style.display = "block";
- }
+ if ($ifent == $if)
+ $active = true;
+ else
+ $active = false;
- function show_netboot_config() {
- document.getElementById("shownetbootbox").innerHTML='';
- aodiv = document.getElementById('shownetboot');
- aodiv.style.display = "block";
- }
-//]]>
-</script>
-</head>
+ $tab_array[] = array($ifname, $active, "services_dhcpv6.php?if={$ifent}");
+ $tabscounter++;
+}
+/* tack on PPPoE or PPtP servers here */
+/* pppoe server */
+if (is_array($config['pppoes']['pppoe'])) {
+ foreach($config['pppoes']['pppoe'] as $pppoe) {
+ if ($pppoe['mode'] == "server") {
+ $ifent = "poes". $pppoe['pppoeid'];
+ $ifname = strtoupper($ifent);
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="services_dhcpv6.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php
- if ($dhcrelay_enabled) {
- echo gettext("DHCP Relay is currently enabled. Cannot enable the DHCP Server service while the DHCP Relay is enabled on any interface.");
- include("fend.inc");
- echo "</body>";
- echo "</html>";
- exit;
- }
-?>
-<?php if (is_subsystem_dirty('staticmaps')): ?><p>
-<?php print_info_box_np(gettext("The static mapping configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcpv6 server">
- <tr>
- <td>
-<?php
- /* active tabs */
- $tab_array = array();
- $tabscounter = 0;
- $i = 0;
- foreach ($iflist as $ifent => $ifname) {
- $oc = $config['interfaces'][$ifent];
- if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) ||
- (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) {
- continue;
- }
- if ($ifent == $if) {
- $active = true;
- } else {
- $active = false;
- }
- $tab_array[] = array($ifname, $active, "services_dhcpv6.php?if={$ifent}");
- $tabscounter++;
- }
- /* tack on PPPoE or PPtP servers here */
- /* pppoe server */
- if (is_array($config['pppoes']['pppoe'])) {
- foreach ($config['pppoes']['pppoe'] as $pppoe) {
- if ($pppoe['mode'] == "server") {
- $ifent = "poes". $pppoe['pppoeid'];
- $ifname = strtoupper($ifent);
- if ($ifent == $if) {
- $active = true;
- } else {
- $active = false;
- }
- $tab_array[] = array($ifname, $active, "services_dhcpv6.php?if={$ifent}");
- $tabscounter++;
- }
+ if ($ifent == $if)
+ $active = true;
+ else
+ $active = false;
+
+ $tab_array[] = array($ifname, $active, "services_dhcpv6.php?if={$ifent}");
+ $tabscounter++;
}
}
- if ($tabscounter == 0) {
- echo "<b>" . gettext("The DHCPv6 Server can only be enabled on interfaces configured with a static IPv6 address. This system has none.") . "<br/><br/>";
- echo "</td></tr></table></form>";
- include("fend.inc");
- echo "</body>";
- echo "</html>";
- exit;
- }
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("DHCPv6 Server"), true, "services_dhcpv6.php?if={$if}");
- $tab_array[] = array(gettext("Router Advertisements"), false, "services_router_advertisements.php?if={$if}");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("DHCPv6 Server");?></td>
- <td width="78%" class="vtable">
- <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false);" />
- <strong><?php printf(gettext("Enable DHCPv6 server on %s interface"), htmlspecialchars($iflist[$if]));?></strong>
- </td>
- </tr>
-<?php
- /* the PPPoE Server could well have no IPv6 address and operate fine with just link-local, just hide these */
- if (is_ipaddrv6($ifcfgip)) {
-?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet");?></td>
- <td width="78%" class="vtable">
- <?=gen_subnetv6($ifcfgip, $ifcfgsn);?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet mask");?></td>
- <td width="78%" class="vtable">
- <?=$ifcfgsn;?> bits
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Available range");?></td>
- <td width="78%" class="vtable">
- <?php
- $range_from = gen_subnetv6($ifcfgip, $ifcfgsn);
- echo $range_from;
- ?>
- -
- <?php
- $range_to = gen_subnetv6_max($ifcfgip, $ifcfgsn);
- echo $range_to;
- ?>
- </td>
- </tr>
-<?php
- }
+}
- if ($is_olsr_enabled):
-?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet Mask");?></td>
- <td width="78%" class="vtable">
- <select name="netmask" class="formselect" id="netmask">
- <?php
- for ($i = 128; $i > 0; $i--) {
- if ($i <> 127) {
- echo "<option value=\"{$i}\" ";
- if ($i == $pconfig['netmask']) {
- echo "selected";
- }
- echo ">" . $i . "</option>";
- }
- }
- ?>
- </select>
- </td>
- </tr>
-<?php
- endif;
-?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Range");?></td>
- <td width="78%" class="vtable">
- <input name="range_from" type="text" class="formfld unknown" id="range_from" size="28" value="<?=htmlspecialchars($pconfig['range_from']);?>" />
- &nbsp;<?=gettext("to"); ?>&nbsp; <input name="range_to" type="text" class="formfld unknown" id="range_to" size="28" value="<?=htmlspecialchars($pconfig['range_to']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Prefix Delegation Range");?></td>
- <td width="78%" class="vtable">
- <input name="prefixrange_from" type="text" class="formfld unknown" id="prefixrange_from" size="28" value="<?=htmlspecialchars($pconfig['prefixrange_from']);?>" />
- &nbsp;<?=gettext("to"); ?>&nbsp; <input name="prefixrange_to" type="text" class="formfld unknown" id="prefixrange_to" size="28" value="<?=htmlspecialchars($pconfig['prefixrange_to']);?>" />
- &nbsp;<br /><?=gettext("Prefix Delegation Size"); ?>:&nbsp;
- <select name="prefixrange_length" class="formselect" id="prefixrange_length">
- <option value="48" <?php if ($pconfig['prefixrange_length'] == 48) echo "selected=\"selected\""; ?>>48</option>
- <option value="52" <?php if ($pconfig['prefixrange_length'] == 52) echo "selected=\"selected\""; ?>>52</option>
- <option value="56" <?php if ($pconfig['prefixrange_length'] == 56) echo "selected=\"selected\""; ?>>56</option>
- <option value="60" <?php if ($pconfig['prefixrange_length'] == 60) echo "selected=\"selected\""; ?>>60</option>
- <option value="62" <?php if ($pconfig['prefixrange_length'] == 62) echo "selected=\"selected\""; ?>>62</option>
- <option value="63" <?php if ($pconfig['prefixrange_length'] == 63) echo "selected=\"selected\""; ?>>63</option>
- <option value="64" <?php if ($pconfig['prefixrange_length'] == 64) echo "selected=\"selected\""; ?>>64</option>
- </select> <br />
- <?php echo gettext("You can define a Prefix range here for DHCP Prefix Delegation. This allows for
- assigning networks to subrouters. The start and end of the range must end on boundaries of the prefix delegation size."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("DNS servers");?></td>
- <td width="78%" class="vtable">
- <input name="dns1" type="text" class="formfld unknown" id="dns1" size="28" value="<?=htmlspecialchars($pconfig['dns1']);?>" /><br />
- <input name="dns2" type="text" class="formfld unknown" id="dns2" size="28" value="<?=htmlspecialchars($pconfig['dns2']);?>" /><br />
- <input name="dns3" type="text" class="formfld unknown" id="dns3" size="28" value="<?=htmlspecialchars($pconfig['dns3']);?>" /><br />
- <input name="dns4" type="text" class="formfld unknown" id="dns4" size="28" value="<?=htmlspecialchars($pconfig['dns4']);?>" /><br />
- <?=gettext("NOTE: leave blank to use the system default DNS servers - this interface's IP if DNS Forwarder or Resolver is enabled, otherwise the servers configured on the General page.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Domain name");?></td>
- <td width="78%" class="vtable">
- <input name="domain" type="text" class="formfld unknown" id="domain" size="28" value="<?=htmlspecialchars($pconfig['domain']);?>" /><br />
- <?=gettext("The default is to use the domain name of this system as the default domain name provided by DHCP. You may specify an alternate domain name here.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Domain search list");?></td>
- <td width="78%" class="vtable">
- <input name="domainsearchlist" type="text" class="formfld unknown" id="domainsearchlist" size="28" value="<?=htmlspecialchars($pconfig['domainsearchlist']);?>" /><br />
- <?=gettext("The DHCP server can optionally provide a domain search list. Use the semicolon character as separator");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Default lease time");?></td>
- <td width="78%" class="vtable">
- <input name="deftime" type="text" class="formfld unknown" id="deftime" size="10" value="<?=htmlspecialchars($pconfig['deftime']);?>" />
- <?=gettext("seconds");?><br />
- <?=gettext("This is used for clients that do not ask for a specific expiration time."); ?><br />
- <?=gettext("The default is 7200 seconds.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Maximum lease time");?></td>
- <td width="78%" class="vtable">
- <input name="maxtime" type="text" class="formfld unknown" id="maxtime" size="10" value="<?=htmlspecialchars($pconfig['maxtime']);?>" />
- <?=gettext("seconds");?><br />
- <?=gettext("This is the maximum lease time for clients that ask for a specific expiration time."); ?><br />
- <?=gettext("The default is 86400 seconds.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Time format change"); ?></td>
- <td width="78%" class="vtable">
- <table summary="time format change">
- <tr>
- <td>
- <input name="dhcpv6leaseinlocaltime" type="checkbox" id="dhcpv6leaseinlocaltime" value="yes" <?php if ($pconfig['dhcpv6leaseinlocaltime']) echo "checked=\"checked\""; ?> />
- </td>
- <td>
- <strong>
- <?=gettext("Change DHCPv6 display lease time from UTC to local time."); ?>
- </strong>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>
- <span class="red">
- <strong><?=gettext("Note:");?></strong>
- </span>
- <?=gettext("By default DHCPv6 leases are displayed in UTC time. By checking this box DHCPv6 lease time will be displayed in local time and set to time zone selected. This will be used for all DHCPv6 interfaces lease time."); ?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Dynamic DNS");?></td>
- <td width="78%" class="vtable">
- <div id="showddnsbox">
- <input type="button" onclick="show_ddns_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Dynamic DNS");?>
- </div>
- <div id="showddns" style="display:none">
- <input style="vertical-align:middle" type="checkbox" value="yes" name="ddnsupdate" id="ddnsupdate" <?php if ($pconfig['ddnsupdate']) echo " checked=\"checked\""; ?> />&nbsp;
- <b><?=gettext("Enable registration of DHCP client names in DNS.");?></b><br />
- <p>
- <input name="ddnsdomain" type="text" class="formfld unknown" id="ddnsdomain" size="28" value="<?=htmlspecialchars($pconfig['ddnsdomain']);?>" /><br />
- <?=gettext("Note: Leave blank to disable dynamic DNS registration.");?><br />
- <?=gettext("Enter the dynamic DNS domain which will be used to register client names in the DNS server.");?><br />
- <input name="ddnsdomainprimary" type="text" class="formfld unknown" id="ddnsdomainprimary" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainprimary']);?>" /><br />
- <?=gettext("Enter the primary domain name server IP address for the dynamic domain name.");?><br />
- <input name="ddnsdomainkeyname" type="text" class="formfld unknown" id="ddnsdomainkeyname" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainkeyname']);?>" /><br />
- <?=gettext("Enter the dynamic DNS domain key name which will be used to register client names in the DNS server.");?><br />
- <input name="ddnsdomainkey" type="text" class="formfld unknown" id="ddnsdomainkey" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainkey']);?>" /><br />
- <?=gettext("Enter the dynamic DNS domain key secret which will be used to register client names in the DNS server.");?>
- </p>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("NTP servers");?></td>
- <td width="78%" class="vtable">
- <div id="showntpbox">
- <input type="button" onclick="show_ntp_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show NTP configuration");?>
- </div>
- <div id="showntp" style="display:none">
- <input name="ntp1" type="text" class="formfld unknown" id="ntp1" size="28" value="<?=htmlspecialchars($pconfig['ntp1']);?>" /><br />
- <input name="ntp2" type="text" class="formfld unknown" id="ntp2" size="28" value="<?=htmlspecialchars($pconfig['ntp2']);?>" />
- </div>
- </td>
- </tr>
- <!-- ISC dhcpd does not support tftp for ipv6 yet. See redmine #2016
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("TFTP server");?></td>
- <td width="78%" class="vtable">
- <div id="showtftpbox">
- <input type="button" onclick="show_tftp_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show TFTP configuration");?>
- </div>
- <div id="showtftp" style="display:none">
- <input name="tftp" type="text" class="formfld unknown" id="tftp" size="50" value="<?=htmlspecialchars($pconfig['tftp']);?>" /><br />
- <?=gettext("Leave blank to disable. Enter a full hostname or IP for the TFTP server.");?>
- </div>
- </td>
- </tr>
- -->
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("LDAP URI");?></td>
- <td width="78%" class="vtable">
- <div id="showldapbox">
- <input type="button" onclick="show_ldap_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show LDAP configuration");?>
- </div>
- <div id="showldap" style="display:none">
- <input name="ldap" type="text" class="formfld unknown" id="ldap" size="80" value="<?=htmlspecialchars($pconfig['ldap']);?>" /><br />
- <?=gettext("Leave blank to disable. Enter a full URI for the LDAP server in the form ldap://ldap.example.com/dc=example,dc=com");?>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Enable network booting");?></td>
- <td width="78%" class="vtable">
- <div id="shownetbootbox">
- <input type="button" onclick="show_netboot_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Network booting");?>
- </div>
- <div id="shownetboot" style="display:none">
- <input style="vertical-align:middle" type="checkbox" value="yes" name="netboot" id="netboot" <?php if ($pconfig['netboot']) echo " checked=\"checked\""; ?> />&nbsp;
- <b><?=gettext("Enables network booting.");?></b>
- <br/>
- <?=gettext("Enter the Bootfile URL");?>
- <input name="bootfile_url" type="text" class="formfld unknown" id="bootfile_url" size="28" value="<?=htmlspecialchars($pconfig['bootfile_url']);?>" />
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Additional BOOTP/DHCP Options");?></td>
- <td width="78%" class="vtable">
- <div id="shownumbervaluebox">
- <input type="button" onclick="show_shownumbervalue()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Additional BOOTP/DHCP Options");?>
- </div>
- <div id="shownumbervalue" style="display:none">
- <table id="maintable" summary="bootp-dhcp options">
- <tbody>
- <tr>
- <td colspan="3">
- <div style="padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066; background-color: #ffffff; color: #000000; font-size: 8pt;" id="itemhelp">
- <?=gettext("Enter the DHCP option number and the value for each item you would like to include in the DHCP lease information. For a list of available options please visit this"); ?> <a href="http://www.iana.org/assignments/bootp-dhcp-parameters/" target="_blank"><?=gettext("URL"); ?></a>
- </div>
- </td>
- </tr>
- <tr>
- <td><div id="onecolumn"><?=gettext("Number");?></div></td>
- <td><div id="twocolumn"><?=gettext("Value");?></div></td>
- </tr>
-<?php
+if (empty($tabs_array)) {
+ print_info_box(gettext("The DHCPv6 Server can only be enabled on interfaces configured with a static IPv6 address. This system has none."), 'danger');
+ include("foot.inc");
+ exit;
+}
+
+$tab_array = array();
+$tab_array[] = array(gettext("DHCPv6 Server"), true, "services_dhcpv6.php?if={$if}");
+$tab_array[] = array(gettext("Router Advertisements"), false, "services_router_advertisements.php?if={$if}");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'Submit',
+ 'Save'
+));
+
+$section = new Form_Section('DHCPv6 Options');
+
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'DHCPv6 Server',
+ 'Enable DHCPv6 server on interface ' . $iflist[$if],
+ $pconfig['enable']
+))->toggles('.form-group:not(:first-child)');
+
+if(is_ipaddrv6($ifcfgip)) {
+
+ $section->addInput(new Form_StaticText(
+ 'Subnet',
+ gen_subnetv6($ifcfgip, $ifcfgsn)
+ ));
+
+ $section->addInput(new Form_StaticText(
+ 'Subnet Mask',
+ $ifcfgsn . ' bits'
+ ));
+
+ $section->addInput(new Form_StaticText(
+ 'Available Range',
+ $range_from = gen_subnetv6($ifcfgip, $ifcfgsn) . ' to ' . gen_subnetv6_max($ifcfgip, $ifcfgsn)
+ ));
+}
+
+if($is_olsr_enabled) {
+ $section->addInput(new Form_Select(
+ 'netmask',
+ 'Subnetmask',
+ $pconfig['netmask'],
+ array_combine(range(128, 1, -1), range(128, 1, -1))
+ ));
+}
+
+$f1 = new Form_Input(
+ 'range_from',
+ null,
+ 'text',
+ $pconfig['range_from']
+);
+
+$f1->setHelp('To');
+
+$f2 = new Form_Input(
+ 'range_to',
+ null,
+ 'text',
+ $pconfig['range_to']
+);
+
+$f2->setHelp('From');
+
+$group = new Form_Group('Range');
+
+$group->add($f1);
+$group->add($f2);
+
+$section->add($group);
+
+$f1 = new Form_Input(
+ 'prefix_from',
+ null,
+ 'text',
+ $pconfig['prefix_from']
+);
+
+$f1->setHelp('To');
+
+$f2 = new Form_Input(
+ 'prefix_to',
+ null,
+ 'text',
+ $pconfig['prefix_to']
+);
+
+$f2->setHelp('From');
+$group = new Form_Group('Prefix Delegation Range');
+
+$group->add($f1);
+$group->add($f2);
+
+$section->add($group);
+
+$section->addInput(new Form_Select(
+ 'prefixrange_length',
+ 'Prefix Delegation Size',
+ $pconfig['prefixrange_length'],
+ array(
+ '48' => '48',
+ '52' => '52',
+ '56' => '56',
+ '60' => '60',
+ '62' => '62',
+ '63' => '63',
+ '64' => '64'
+ )
+))->setHelp('You can define a Prefix range here for DHCP Prefix Delegation. This allows for assigning networks to subrouters. The start and end of the range must end on boundaries of the prefix delegation size.');
+
+$group = new Form_Group('DNS Servers');
+
+for($i=1;$i<=4; $i++) {
+ $group->add(new Form_input(
+ 'dns' . $i,
+ null,
+ 'text',
+ $pconfig['dns' . $i]
+ ))->setHelp('DNS ' . $i);
+}
+
+$group->setHelp('Leave blank to use the system default DNS servers,this interface\'s IP if DNS forwarder is enabled, or the servers configured on the "General" page.');
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'domain',
+ 'Domain Name',
+ 'text',
+ $pconfig['domain']
+))->setHelp('The default is to use the domain name of this system as the default domain name provided by DHCP. You may specify an alternate domain name here. ');
+
+$section->addInput(new Form_Input(
+ 'domainsearchlist',
+ 'Domain search list',
+ 'text',
+ $pconfig['domainsearchlist']
+))->setHelp('The DHCP server can optionally provide a domain search list. Use the semicolon character as separator');
+
+$section->addInput(new Form_Input(
+ 'deftime',
+ 'Default lease time',
+ 'text',
+ $pconfig['deftime']
+))->setHelp('Seconds . Used for clients that do not ask for a specific expiration time. ' . ' <br />' .
+ 'The default is 7200 seconds.');
+
+$section->addInput(new Form_Input(
+ 'maxtime',
+ 'Max lease time',
+ 'text',
+ $pconfig['maxtime']
+))->setHelp('Maximum lease time for clients that ask for a specific expiration time.' . ' <br />' .
+ 'The default is 86400 seconds.');
+
+$section->addInput(new Form_Checkbox(
+ 'dhcpv6leaseinlocaltime',
+ 'Time Format Change',
+ 'Change DHCPv6 display lease time from UTC to local time',
+ $pconfig['dhcpv6leaseinlocaltime']
+))->setHelp('By default DHCPv6 leases are displayed in UTC time. ' .
+ 'By checking this box DHCPv6 lease time will be displayed in local time and set to time zone selected. ' .
+ 'This will be used for all DHCPv6 interfaces lease time.');
+
+$btndyndns = new Form_Button(
+ 'btndyndns',
+ 'Advanced'
+);
+
+$btndyndns->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'Dynamic DNS',
+ $btndyndns . '&nbsp;' . 'Show dynamic DNS settings'
+));
+
+$section->addInput(new Form_Checkbox(
+ 'ddnsupdate',
+ 'DHCP Registration',
+ 'Enable registration of DHCP client names in DNS.',
+ $pconfig['ddnsupdate']
+));
+
+$section->addInput(new Form_Input(
+ 'ddnsdomain',
+ 'DDNS Domain',
+ 'text',
+ $pconfig['ddnsdomain']
+))->setHelp('Leave blank to disable dynamic DNS registration. Enter the dynamic DNS domain which will be used to register client names in the DNS server.');
+
+$section->addInput(new Form_IpAddress(
+ 'ddnsdomainprimary',
+ 'DDNS Server IP',
+ $pconfig['ddnsdomainprimary']
+))->setHelp('Enter the primary domain name server IP address for the dynamic domain name.');
+
+$section->addInput(new Form_Input(
+ 'ddnsdomainkeyname',
+ 'DDNS Domain Key name',
+ 'text',
+ $pconfig['ddnsdomainkeyname']
+))->setHelp('Enter the dynamic DNS domain key name which will be used to register client names in the DNS server.');
+
+$section->addInput(new Form_Input(
+ 'ddnsdomainkey',
+ 'DDNS Domain Key secret',
+ 'text',
+ $pconfig['ddnsdomainkey']
+))->setHelp('Enter the dynamic DNS domain key secret which will be used to register client names in the DNS server.');
+
+$btnntp = new Form_Button(
+ 'btnntp',
+ 'Advanced'
+);
+
+$btnntp->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'NTP servers',
+ $btnntp . '&nbsp;' . 'Show NTP Configuration'
+));
+
+$group = new Form_Group('NTP Servers');
+
+$group->add(new Form_Input(
+ 'ntp1',
+ 'NTP Server 1',
+ 'text',
+ $pconfig['ntp1'],
+ ['placeholder' => 'NTP 1']
+));
+
+$group->add(new Form_Input(
+ 'ntp2',
+ 'NTP Server 1',
+ 'text',
+ $pconfig['ntp2'],
+ ['placeholder' => 'NTP 2']
+));
+
+$group->addClass('ntpclass');
+
+$section->add($group);
+
+$btnldap = new Form_Button(
+ 'btnldap',
+ 'Advanced'
+);
+
+$btnldap->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'LDAP',
+ $btnldap . '&nbsp;' . 'Show LDAP Configuration'
+));
+
+$section->addInput(new Form_Input(
+ 'ldap',
+ 'LDAP URI',
+ 'text',
+ $pconfig['ldap']
+));
+
+$btnnetboot = new Form_Button(
+ 'btnnetboot',
+ 'Advanced'
+);
+
+$btnnetboot->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'Network booting',
+ $btnnetboot . '&nbsp;' . 'Show Netwok booting'
+));
+
+$section->addInput(new Form_Checkbox(
+ 'shownetboot',
+ 'Network booting',
+ 'Enable Network Booting',
+ $pconfig['shownetboot']
+));
+
+$section->addInput(new Form_Input(
+ 'bootfile_url',
+ 'Bootfile URL',
+ 'text',
+ $pconfig['bootfile_url']
+));
+
+$btnadnl = new Form_Button(
+ 'btnadnl',
+ 'Advanced'
+);
+
+$btnadnl->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'Additional BOOTP/DHCP Options',
+ $btnadnl . '&nbsp;' . 'Aditional BOOTP/DHCP Options'
+));
+
+$form->add($section);
+
+$title = 'Show Additional BOOTP/DHCP Options';
+
+if($pconfig['numberoptions']) {
$counter = 0;
- if ($pconfig['numberoptions']):
- foreach ($pconfig['numberoptions']['item'] as $item):
- $number = $item['number'];
- $value = $item['value'];
-?>
- <tr>
- <td>
- <input autocomplete="off" name="number<?php echo $counter; ?>" type="text" class="formfld" id="number<?php echo $counter; ?>" size="10" value="<?=htmlspecialchars($number);?>" />
- </td>
- <td>
- <input autocomplete="off" name="value<?php echo $counter; ?>" type="text" class="formfld" id="value<?php echo $counter; ?>" size="55" value="<?=htmlspecialchars($value);?>" />
- </td>
- <td>
- <input type="image" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" onclick="removeRow(this); return false;" value="<?=gettext("Delete");?>" />
- </td>
- </tr>
-<?php
- $counter++;
- endforeach;
- endif;
+ $last = count($pconfig['numberoptions']['item']) - 1;
+
+ foreach($pconfig['numberoptions']['item'] as $item) {
+ $group = new Form_Group(null);
+
+ $group->add(new Form_Input(
+ 'number' . $counter,
+ null,
+ 'text',
+ $item['number']
+ ))->setHelp($counter == $last ? 'Number':null);
+
+ $group->add(new Form_Input(
+ 'value' . $counter,
+ null,
+ 'text',
+ $item['value']
+ ))->setHelp($counter == $last ? 'Value':null);
+
+ $btn = new Form_Button(
+ 'btn' . $counter,
+ 'Delete',
+ 'services_dhcpv6.php?if=' . $if . '&act=delopt' . '&id=' . $counter
+ );
+
+ $btn->removeClass('btn-primary')->addClass('btn-danger btn-xs adnlopt');
+ $group->addClass('adnlopt');
+ $group->add($btn);
+ $section->add($group);
+ $counter++;
+ }
+}
+
+$btnaddopt = new Form_Button(
+ 'btnaddopt',
+ 'Add Option',
+ 'services_dhcpv6.php?if=' . $if . '&act=addopt'
+);
+
+$btnaddopt->removeClass('btn-primary')->addClass('btn-success btn-sm');
+
+$section->addInput($btnaddopt);
+
+$section->addInput(new Form_Input(
+ 'if',
+ null,
+ 'hidden',
+ $if
+));
+
+print($form);
+
+print_info_box(gettext('The DNS servers entered in ') . '<a href="system.php">' . gettext(' System: General setup') . '</a>' .
+ gettext(' (or the ') . '<a href="services_dnsmasq.php"/>' . gettext('DNS forwarder') . '</a>, ' . gettext('if enabled) ') .
+ gettext('will be assigned to clients by the DHCP server.') . '<br />' .
+ gettext('The DHCP lease table can be viewed on the ') . '<a href="status_dhcpv6_leases.php">' .
+ gettext('Status: DHCPv6 leases') . '</a>' . gettext(' page.'));
?>
- </tbody>
- </table>
- <a onclick="javascript:addRowTo('maintable', 'formfldalias'); return false;" href="#">
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
- </a>
- <script type="text/javascript">
- //<![CDATA[
- field_counter_js = 2;
- rows = 1;
- totalrows = <?php echo $counter; ?>;
- loaded = <?php echo $counter; ?>;
- //]]>
- </script>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="if" type="hidden" value="<?=$if;?>" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <p>
- <span class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Note:");?><br />
- </strong>
- </span>
- <?=gettext("The DNS servers entered in"); ?> <a href="system.php"><?=gettext("System: General setup"); ?></a>\
- <?=gettext("(or the"); ?> <a href="services_dnsmasq.php"><?=gettext("DNS forwarder"); ?></a>, <?=gettext("if enabled)"); ?>
- </span>
- <span class="vexpl">
- <?=gettext("will be assigned to clients by the DHCP server."); ?><br />
- <br />
- <?=gettext("The DHCP lease table can be viewed on the"); ?> <a href="status_dhcpv6_leases.php"><?=gettext("Status: DHCPv6 leases"); ?></a> <?=gettext("page."); ?><br />
- </span>
- </p>
- </td>
- </tr>
- </table>
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="static mappings">
- <tr>
- <td colspan="4" valign="top" class="listtopic"><?=gettext("DHCPv6 Static Mappings for this interface.");?></td>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td width="25%" class="listhdrr"><?=gettext("DUID");?></td>
- <td width="15%" class="listhdrr"><?=gettext("IPv6 address");?></td>
- <td width="20%" class="listhdrr"><?=gettext("Hostname");?></td>
- <td width="30%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td valign="middle" width="17"></td>
- <td valign="middle">
- <a href="services_dhcpv6_edit.php?if=<?=$if;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">DHCPv6 Static Mappings for this interface.</h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("DUID")?></th>
+ <th><?=gettext("IPv6 address")?></th>
+ <th><?=gettext("Hostname")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><!-- Buttons --></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- if (is_array($a_maps)):
- $i = 0;
- foreach ($a_maps as $mapent):
- if ($mapent['duid'] <> "" or $mapent['ipaddrv6'] <> ""):
+if(is_array($a_maps)):
+ $i = 0;
+ foreach ($a_maps as $mapent):
+ if($mapent['duid'] != "" or $mapent['ipaddrv6'] != ""):
?>
- <tr>
- <td class="listlr" ondblclick="document.location='services_dhcpv6_edit.php?if=<?=$if;?>&amp;id=<?=$i;?>';">
- <?=htmlspecialchars($mapent['duid']);?>
- </td>
- <td class="listr" ondblclick="document.location='services_dhcpv6_edit.php?if=<?=$if;?>&amp;id=<?=$i;?>';">
- <?=htmlspecialchars($mapent['ipaddrv6']);?>&nbsp;
- </td>
- <td class="listr" ondblclick="document.location='services_dhcpv6_edit.php?if=<?=$if;?>&amp;id=<?=$i;?>';">
- <?=htmlspecialchars($mapent['hostname']);?>&nbsp;
- </td>
- <td class="listbg" ondblclick="document.location='services_dhcpv6_edit.php?if=<?=$if;?>&amp;id=<?=$i;?>';">
- <?=htmlspecialchars($mapent['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
- <tr>
- <td valign="middle"><a href="services_dhcpv6_edit.php?if=<?=$if;?>&amp;id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a></td>
- <td valign="middle"><a href="services_dhcpv6.php?if=<?=$if;?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this mapping?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
+ <tr>
+ <td>
+ <?=htmlspecialchars($mapent['duid'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($mapent['ipaddrv6'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($mapent['hostname'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($mapent['descr'])?>
+ </td>
+ <td>
+ <a href="services_dhcpv6_edit.php?if=<?=$if?>&amp;id=<?=$i?>" class="btn btn-info btn-xs"/>Edit</a>
+ <a href="services_dhcpv6.php?if=<?=$if?>&amp;act=del&amp;id=<?=$i?>" class="btn btn-danger btn-xs"/>Delete</a>
+ </td>
+ </tr>
<?php
- endif;
- $i++;
- endforeach;
- endif;
+ endif;
+ $i++;
+ endforeach;
+endif;
?>
- <tr>
- <td class="list" colspan="4"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td valign="middle" width="17"></td>
- <td valign="middle"><a href="services_dhcpv6_edit.php?if=<?=$if;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<script type="text/javascript">
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<nav class="action-buttons">
+ <a href="services_dhcpv6_edit.php?if=<?=$if?>" class="btn btn-sm btn-success"/>Add</a>
+</nav>
+
+<script>
//<![CDATA[
-enable_change(false);
+events.push(function(){
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
+
+ // Hides the <div> in which the specified icheckbox lives so that the input, its label and help text are hidden
+ // Checkboxes live inside <label></label> tags so we need another parent level
+ function hideCheckBox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
+ }
+
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ function hideDDNS(hide) {
+ hideCheckBox('ddnsupdate', hide);
+ hideInput('ddnsdomain', hide);
+ hideInput('ddnsdomainprimary', hide);
+ hideInput('ddnsdomainkeyname', hide);
+ hideInput('ddnsdomainkey', hide);
+ }
+
+ // Make the ‘Copy My MAC’ button a plain button, not a submit button
+ $("#btnmymac").prop('type','button');
+
+ // On click, copy the hidden 'mymac' text to the 'mac' input
+ $("#btnmymac").click(function() {
+ $('#mac').val('<?=$mymac?>');
+ });
+
+ // Make the ‘tftp’ button a plain button, not a submit button
+ $("#btntftp").prop('type','button');
+
+ // Show tftp controls
+ $("#btntftp").click(function() {
+ hideInput('tftp', false);
+ });
+
+ // Make the ‘ntp’ button a plain button, not a submit button
+ $("#btnntp").prop('type','button');
+
+ // Show ntp controls
+ $("#btnntp").click(function() {
+ hideClass('ntpclass', false);
+ });
+
+ // Make the ‘ddns’ button a plain button, not a submit button
+ $("#btndyndns").prop('type','button');
+
+ // Show ddns controls
+ $("#btndyndns").click(function() {
+ hideDDNS(false);
+ });
+
+ // Make the ‘ldap’ button a plain button, not a submit button
+ $("#btnldap").prop('type','button');
+
+ // Show ldap controls
+ $("#btnldap").click(function() {
+ hideInput('ldap', false);
+ });
+
+ // Make the ‘netboot’ button a plain button, not a submit button
+ $("#btnnetboot").prop('type','button');
+
+ // Show netboot controls
+ $("#btnnetboot").click(function() {
+ hideInput('bootfile_url', false);
+ hideCheckBox('shownetboot', false);
+ });
+
+ // Make the ‘aditional options’ button a plain button, not a submit button
+ $("#btnadnl").prop('type','button');
+
+ // Show aditional controls
+ $("#btnadnl").click(function() {
+ hideClass('adnlopt', false);
+ hideInput('btnaddopt', false);
+ });
+
+ // On initial load
+ hideDDNS(true);
+ hideClass('ntpclass', true);
+ hideInput('tftp', true);
+ hideInput('ldap', true);
+ hideInput('bootfile_url', true);
+ hideCheckBox('shownetboot', true);
+ hideClass('adnlopt', true);
+ hideInput('btnaddopt', true);
+});
//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include('foot.inc'); \ No newline at end of file
diff --git a/src/usr/local/www/services_dhcpv6_edit.php b/src/usr/local/www/services_dhcpv6_edit.php
index 2034049..a6df8db 100644
--- a/src/usr/local/www/services_dhcpv6_edit.php
+++ b/src/usr/local/www/services_dhcpv6_edit.php
@@ -32,7 +32,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /usr/sbin/arp
- pfSense_MODULE: dhcpserver
+ pfSense_MODULE: dhcpserver
*/
##|+PRIV
@@ -54,13 +54,7 @@ function staticmaps_sort($ifgui) {
require_once('globals.inc');
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_dhcpv6.php');
-}
-
-if (!$g['services_dhcp_server_enable']) {
+if(!$g['services_dhcp_server_enable']) {
header("Location: /");
exit;
}
@@ -142,6 +136,7 @@ if ($_POST) {
if (($_POST['ipaddrv6'] && !is_ipaddrv6($_POST['ipaddrv6']))) {
$input_errors[] = gettext("A valid IPv6 address must be specified.");
}
+
if (empty($_POST['duid'])) {
$input_errors[] = gettext("A valid DUID must be specified.");
}
@@ -202,84 +197,80 @@ $shortcut_section = "dhcp6";
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="services_dhcpv6_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="static mapping">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Static DHCPv6 Mapping");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("DUID");?></td>
- <td width="78%" class="vtable">
- <input name="duid" type="text" class="formfld unknown" id="duid" size="40" value="<?=htmlspecialchars($pconfig['duid']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Enter a DUID in the following format: ");?><br />
-"DUID-LLT - ETH -- TIME --- ---- address ----" <br />
-"xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 address");?></td>
- <td width="78%" class="vtable">
- <input name="ipaddrv6" type="text" class="formfld unknown" id="ipaddrv6" size="28" value="<?=htmlspecialchars($pconfig['ipaddrv6']);?>" />
- <br />
- <?=gettext("If an IPv6 address is entered, the address must be outside of the pool.");?>
- <br />
- <?=gettext("If no IPv6 address is given, one will be dynamically allocated from the pool.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Hostname");?></td>
- <td width="78%" class="vtable">
- <input name="hostname" type="text" class="formfld unknown" id="hostname" size="28" value="<?=htmlspecialchars($pconfig['hostname']);?>" />
- <br /> <span class="vexpl"><?=gettext("Name of the host, without domain part.");?></span>
- </td>
- </tr>
-<?php
- if ($netboot_enabled) {
-?>
- <tr>
- <td width="22%" valign="top" class="vncell">Netboot filename</td>
- <td width="78%" class="vtable">
- <input name="filename" type="text" class="formfld unknown" id="filename" size="28" value="<?=htmlspecialchars($pconfig['filename']);?>" />
- <br /> <span class="vexpl">Name of the file that should be loaded when this host boots off of the network, overrides setting on main page.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell">Root Path</td>
- <td width="78%" class="vtable">
- <input name="rootpath" type="text" class="formfld unknown" id="rootpath" size="90" value="<?=htmlspecialchars($pconfig['rootpath']);?>" />
- <br /> <span class="vexpl"><?=gettext("Enter the"); ?> <b><?=gettext("root-path"); ?></b>-<?=gettext("string");?>, overrides setting on main page.</span>
- </td>
- </tr>
-<?php
- }
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br /> <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_maps[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- <input name="if" type="hidden" value="<?=htmlspecialchars($if);?>" />
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Static DHCPv6 Mapping');
+
+$section->addInput(new Form_Input(
+ 'duid',
+ 'DUID',
+ 'text',
+ $pconfig['duid'],
+ ['placeholder' => 'DUID-LLT - ETH -- TIME --- ---- address ---- xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx']
+))->setHelp(gettext('Enter a DUID in the following format: ') . '<br />' .
+ 'DUID-LLT - ETH -- TIME --- ---- address ---- ' .
+ 'xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx');
+
+$section->addInput(new Form_Input(
+ 'ipaddrv6',
+ 'Server 3',
+ 'text',
+ $pconfig['ipaddrv6']
+))->setHelp('If an IPv6 address is entered, the address must be outside of the pool.' . '<br />' .
+ 'If no IPv6 address is given, one will be dynamically allocated from the pool.');
+
+$section->addInput(new Form_Input(
+ 'hostname',
+ 'Hostname',
+ 'text',
+ $pconfig['hostname']
+))->setHelp('Name of the host, without domain part.');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+if($netboot_enabled) {
+ $section->addInput(new Form_Input(
+ 'filename',
+ 'Netboot filename',
+ 'text',
+ $pconfig['remoteserver3']
+ ))->setHelp('Name of the file that should be loaded when this host boots off of the network, overrides setting on main page.');
+
+ $section->addInput(new Form_Input(
+ 'rootpath',
+ 'Root path',
+ 'text',
+ $pconfig['remoteserver3']
+ ))->setHelp('Enter the root-path string. This overrides setting on main page.');
+}
+
+if (isset($id) && $a_maps[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$section->addInput(new Form_Input(
+ 'if',
+ null,
+ 'hidden',
+ $if
+));
+
+$form->add($section);
+print($form);
+
+include("foot.inc");
diff --git a/src/usr/local/www/services_dhcpv6_relay.php b/src/usr/local/www/services_dhcpv6_relay.php
index c6e5daf..2fdbcbc 100644
--- a/src/usr/local/www/services_dhcpv6_relay.php
+++ b/src/usr/local/www/services_dhcpv6_relay.php
@@ -41,6 +41,14 @@
##|-PRIV
require("guiconfig.inc");
+require('classes/Form.class.php');
+
+function filterDestinationServers(array $destinationServers)
+{
+ return array_unique(
+ array_filter($destinationServers)
+ );
+}
$pconfig['enable'] = isset($config['dhcrelay6']['enable']);
if (empty($config['dhcrelay6']['interface'])) {
@@ -48,10 +56,24 @@ if (empty($config['dhcrelay6']['interface'])) {
} else {
$pconfig['interface'] = explode(",", $config['dhcrelay6']['interface']);
}
-$pconfig['server'] = $config['dhcrelay6']['server'];
+
+$pconfig['server'] = filterDestinationServers(
+ explode(',', $config['dhcrelay6']['server'])
+);
+
$pconfig['agentoption'] = isset($config['dhcrelay6']['agentoption']);
-$iflist = get_configured_interface_with_descr();
+$iflist = array_intersect_key(
+ get_configured_interface_with_descr(),
+ array_flip(
+ array_filter(
+ array_keys(get_configured_interface_with_descr()),
+ function($if) {
+ return is_ipaddrv6(get_interface_ipv6($if));
+ }
+ )
+ )
+);
/* set the enabled flag which will tell us if DHCP server is enabled
* on any interface. We will use this to disable dhcp-relay since
@@ -70,6 +92,10 @@ if (is_array($config['dhcpdv6'])) {
if ($_POST) {
unset($input_errors);
+
+ if ($_POST['server'])
+ $_POST['server'] = filterDestinationServers($_POST['server']);
+
$pconfig = $_POST;
/* input validation */
@@ -80,11 +106,9 @@ if ($_POST) {
do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
if ($_POST['server']) {
- $checksrv = explode(",", $_POST['server']);
- foreach ($checksrv as $srv) {
- if (!is_ipaddrv6($srv)) {
- $input_errors[] = gettext("A valid Destination Server IPv6 address must be specified.");
- }
+ foreach ($_POST['server'] as $srv) {
+ if (!is_ipaddrv6($srv))
+ $input_errors[] = gettext("A valid Destination Server IPv6 address must be specified.");
}
}
}
@@ -108,109 +132,73 @@ $pgtitle = array(gettext("Services"), gettext("DHCPv6 Relay"));
$shortcut_section = "dhcp6";
include("head.inc");
-?>
-
-<script type="text/javascript">
-//<![CDATA[
-function enable_change(enable_over) {
- if (document.iform.enable.checked || enable_over) {
- document.iform.server.disabled = 0;
- document.iform.interface.disabled = 0;
- document.iform.agentoption.disabled = 0;
- } else {
- document.iform.server.disabled = 1;
- document.iform.interface.disabled = 1;
- document.iform.agentoption.disabled = 1;
- }
+if ($dhcpd_enabled)
+{
+ echo '<div class="alert alert-danger">DHCPv6 Server is currently enabled. Cannot enable the DHCPv6 Relay service while the DHCPv6 Server is enabled on any interface.</div>';
+ include("foot.inc");
+ exit;
}
-//]]>
-</script>
-</head>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="services_dhcpv6_relay.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcpv6 relay">
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
-<?php
- if ($dhcpd_enabled) {
- echo "<td>DHCPv6 Server is currently enabled. Cannot enable the DHCPv6 Relay service while the DHCPv6 Server is enabled on any interface.";
- echo "</td></tr></table></div></td></tr></table></form>";
- include("fend.inc");
- echo "</body></html>";
- exit;
- }
-?>
-
- <td colspan="2" valign="top" class="listtopic"><?=gettext("DHCPv6 Relay configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Enable</td>
- <td width="78%" class="vtable">
- <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
- <strong><?php printf(gettext("Enable DHCPv6 relay on interface"));?></strong>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Interface(s)</td>
- <td width="78%" class="vtable">
- <select id="interface" name="interface[]" multiple="multiple" class="formselect" size="3">
- <?php
- foreach ($iflist as $ifent => $ifdesc) {
- if (!is_ipaddrv6(get_interface_ipv6($ifent))) {
- continue;
- }
- echo "<option value=\"{$ifent}\"";
- if (in_array($ifent, $pconfig['interface'])) {
- echo " selected=\"selected\"";
- }
- echo ">{$ifdesc}</option>\n";
- }
- ?>
- </select>
- <br /><?=gettext("Interfaces without an IPv6 address will not be shown."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vtable">&nbsp;</td>
- <td width="78%" class="vtable">
- <input name="agentoption" type="checkbox" value="yes" <?php if ($pconfig['agentoption']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Append circuit ID and agent ID to requests"); ?></strong><br />
- <?php printf(gettext("If this is checked, the DHCPv6 relay will append the circuit ID (%s interface number) and the agent ID to the DHCPv6 request."), $g['product_name']); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Destination server");?></td>
- <td width="78%" class="vtable">
- <input name="server" type="text" class="formfld unknown" id="server" size="20" value="<?=htmlspecialchars($pconfig['server']);?>" />
- <br />
- <?=gettext("This is the IPv6 address of the server to which DHCPv6 requests are relayed. You can enter multiple server IPv6 addresses, separated by commas. ");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<script type="text/javascript">
-//<![CDATA[
-enable_change(false);
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg);
+
+$form = new Form;
+
+$section = new Form_Section('DHCPv6 Relay configuration');
+
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'Enable',
+ 'Enable DHCPv6 relay on interface',
+ $pconfig['enable']
+))->toggles('.form-group:not(:first-child)');
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface(s)',
+ $pconfig['interface'],
+ $iflist,
+ true
+))->setHelp('Interfaces without an IPv6 address will not be shown.');
+
+
+$section->addInput(new Form_Checkbox(
+ 'agentoption',
+ '',
+ 'Append circuit ID and agent ID to requests',
+ 'yes',
+ $pconfig['agentoption']
+))->setHelp(
+ 'If this is checked, the DHCPv6 relay will append the circuit ID (%s interface number) and the agent ID to the DHCPv6 request.',
+ [$g['product_name']]
+);
+
+function createDestinationServerInputGroup($value = null)
+{
+ $group = new Form_Group('Destination server');
+ $group->enableDuplication();
+
+ $group->add(new Form_IpAddress(
+ 'server',
+ 'Destination server',
+ $value
+ ))->setHelp(
+ 'This is the IPv6 address of the server to which DHCPv6 requests are relayed.'
+ )->setIsRepeated();
+
+ return $group;
+}
+
+if (!isset($pconfig['server']) || count($pconfig['server']) < 1)
+ $section->add(createDestinationServerInputGroup());
+else
+ foreach ($pconfig['server'] as $idx => $server)
+ $section->add(createDestinationServerInputGroup($server));
+
+$form->add($section);
+print $form;
+
+include("foot.inc");
diff --git a/src/usr/local/www/services_dnsmasq.php b/src/usr/local/www/services_dnsmasq.php
index 4abf4d7..ac6b44c 100644
--- a/src/usr/local/www/services_dnsmasq.php
+++ b/src/usr/local/www/services_dnsmasq.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: dnsforwarder
+ pfSense_MODULE: dnsforwarder
*/
##|+PRIV
@@ -75,7 +75,6 @@ $a_hosts = &$config['dnsmasq']['hosts'];
$a_domainOverrides = &$config['dnsmasq']['domainoverrides'];
if ($_POST) {
-
$pconfig = $_POST;
unset($input_errors);
@@ -163,420 +162,291 @@ if ($_GET['act'] == "del") {
}
}
+function build_if_list() {
+ $interface_addresses = get_possible_listen_ips(true);
+ $iflist = array('options' => array(), 'selected' => array());
+
+ $iflist['options'][""] = "All";
+ if (empty($pconfig['interface']) || empty($pconfig['interface'][0]))
+ array_push($iflist['selected'], "");
+
+ foreach ($interface_addresses as $laddr => $ldescr) {
+ $iflist['options'][$laddr] = htmlspecialchars($ldescr);
+
+ if ($pconfig['interface'] && in_array($laddr, $pconfig['interface']))
+ array_push($iflist['selected'], $laddr);
+ }
+
+ unset($interface_addresses);
+
+ return($iflist);
+}
+
$closehead = false;
$pgtitle = array(gettext("Services"), gettext("DNS forwarder"));
$shortcut_section = "forwarder";
include("head.inc");
-?>
+if ($input_errors)
+ print_input_errors($input_errors);
-<script type="text/javascript">
-//<![CDATA[
-function enable_change(enable_over) {
- var endis;
- endis = !(document.iform.enable.checked || enable_over);
- document.iform.regdhcp.disabled = endis;
- document.iform.regdhcpstatic.disabled = endis;
- document.iform.dhcpfirst.disabled = endis;
-}
-function show_advanced_dns() {
- document.getElementById("showadvbox").innerHTML='';
- aodiv = document.getElementById('showadv');
- aodiv.style.display = "block";
-}
-//]]>
-</script>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="services_dnsmasq.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('hosts')): ?><br/>
-<?php print_info_box_np(gettext("The DNS forwarder configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="dns forwarder">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("General DNS Forwarder Options");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Enable");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="enable" type="checkbox" id="enable" value="yes" <?php if ($pconfig['enable'] == "yes") echo "checked=\"checked\"";?> onclick="enable_change(false)" />
- <strong>
- <?=gettext("Enable DNS forwarder");?><br />
- </strong>
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("DHCP Registration");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="regdhcp" type="checkbox" id="regdhcp" value="yes" <?php if ($pconfig['regdhcp'] == "yes") echo "checked=\"checked\"";?> />
- <strong>
- <?=gettext("Register DHCP leases in DNS forwarder");?><br />
- </strong>
- <?php printf(gettext("If this option is set, then machines that specify".
- " their hostname when requesting a DHCP lease will be registered".
- " in the DNS forwarder, so that their name can be resolved.".
- " You should also set the domain in %sSystem:".
- " General setup%s to the proper value."), '<a href="system.php">', '</a>')?>
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Static DHCP");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="regdhcpstatic" type="checkbox" id="regdhcpstatic" value="yes" <?php if ($pconfig['regdhcpstatic'] == "yes") echo "checked=\"checked\"";?> />
- <strong>
- <?=gettext("Register DHCP static mappings in DNS forwarder");?><br />
- </strong>
- <?php printf(gettext("If this option is set, then DHCP static mappings will ".
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('hosts'))
+ print_info_box_np(gettext("The DNS forwarder configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('General DNS Forwarder Options');
+
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'Enable',
+ 'Enable DNS forwarder',
+ $pconfig['enable']
+))->toggles('.toggle-dhcp', 'disable');
+
+$section->addInput(new Form_Checkbox(
+ 'regdhcp',
+ 'DHCP Registration',
+ 'Register DHCP leases in DNS forwarder',
+ $pconfig['regdhcp']
+))->setHelp(sprintf("If this option is set, then machines that specify".
+ " their hostname when requesting a DHCP lease will be registered".
+ " in the DNS forwarder, so that their name can be resolved.".
+ " You should also set the domain in %sSystem:".
+ " General setup%s to the proper value.",'<a href="system.php">','</a>'))
+ ->addClass('toggle-dhcp');
+
+$section->addInput(new Form_Checkbox(
+ 'regdhcpstatic',
+ 'Static DHCP',
+ 'Register DHCP static mappings in DNS forwarder',
+ $pconfig['regdhcpstatic']
+))->setHelp(sprintf("If this option is set, then DHCP static mappings will ".
"be registered in the DNS forwarder, so that their name can be ".
"resolved. You should also set the domain in %s".
- "System: General setup%s to the proper value."), '<a href="system.php">', '</a>');?>
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Prefer DHCP");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="dhcpfirst" type="checkbox" id="dhcpfirst" value="yes" <?php if ($pconfig['dhcpfirst'] == "yes") echo "checked=\"checked\"";?> />
- <strong>
- <?=gettext("Resolve DHCP mappings first");?><br />
- </strong>
- <?php printf(gettext("If this option is set, then DHCP mappings will ".
+ "System: General setup%s to the proper value.",'<a href="system.php">','</a>'))
+ ->addClass('toggle-dhcp');
+
+$section->addInput(new Form_Checkbox(
+ 'dhcpfirst',
+ 'Prefer DHCP',
+ 'Resolve DHCP mappings first',
+ $pconfig['dhcpfirst']
+))->setHelp(sprintf("If this option is set, then DHCP mappings will ".
"be resolved before the manual list of names below. This only ".
- "affects the name given for a reverse lookup (PTR)."));?>
- </p>
- </td>
- </tr>
- <tr>
- <td rowspan="3" width="22%" valign="top" class="vncellreq"><?=gettext("DNS Query Forwarding");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="strict_order" type="checkbox" id="strict_order" value="yes" <?php if ($pconfig['strict_order'] == "yes") echo "checked=\"checked\"";?> />
- <strong>
- <?=gettext("Query DNS servers sequentially");?><br />
- </strong>
- <?php printf(gettext("If this option is set, %s DNS Forwarder (dnsmasq) will ".
+ "affects the name given for a reverse lookup (PTR)."))
+ ->addClass('toggle-dhcp');
+
+$group = new Form_Group('DNS Query Forwarding');
+
+$group->add(new Form_Checkbox(
+ 'strict_order',
+ 'DNS Query Forwarding',
+ 'Query DNS servers sequentially',
+ $pconfig['strict_order']
+))->setHelp(sprintf("If this option is set, %s DNS Forwarder (dnsmasq) will ".
"query the DNS servers sequentially in the order specified (<i>System - General Setup - DNS Servers</i>), ".
- "rather than all at once in parallel. "), $g['product_name']); ?>
- </p>
- </td>
- </tr>
- <tr>
- <td width="78%" class="vtable">
- <p>
- <input name="domain_needed" type="checkbox" id="domain_needed" value="yes" <?php if ($pconfig['domain_needed'] == "yes") echo "checked=\"checked\"";?> />
- <strong>
- <?=gettext("Require domain");?><br />
- </strong>
- <?php printf(gettext("If this option is set, %s DNS Forwarder (dnsmasq) will ".
- "not forward A or AAAA queries for plain names, without dots or domain parts, to upstream name servers. ".
- "If the name is not known from /etc/hosts or DHCP then a \"not found\" answer is returned. "), $g['product_name']); ?>
- </p>
- </td>
- </tr>
- <tr>
- <td width="78%" class="vtable">
- <p>
- <input name="no_private_reverse" type="checkbox" id="no_private_reverse" value="yes" <?php if ($pconfig['no_private_reverse'] == "yes") echo "checked=\"checked\"";?> />
- <strong>
- <?=gettext("Do not forward private reverse lookups");?><br />
- </strong>
- <?php printf(gettext("If this option is set, %s DNS Forwarder (dnsmasq) will ".
+ "rather than all at once in parallel. ", $g['product_name']));
+
+$group->add(new Form_Checkbox(
+ 'domain_needed',
+ null,
+ 'Require domain',
+ $pconfig['domain_needed']
+))->setHelp(sprintf("If this option is set, %s DNS Forwarder (dnsmasq) will ".
+ "not forward A or AAAA queries for plain names, without dots or domain parts, to upstream name servers. ".
+ "If the name is not known from /etc/hosts or DHCP then a \"not found\" answer is returned. ", $g['product_name']));
+
+$group->add(new Form_Checkbox(
+ 'no_private_reverse',
+ null,
+ 'Do not forward private reverse lookups',
+ $pconfig['no_private_reverse']
+))->setHelp(sprintf("If this option is set, %s DNS Forwarder (dnsmasq) will ".
"not forward reverse DNS lookups (PTR) for private addresses (RFC 1918) to upstream name servers. ".
"Any entries in the Domain Overrides section forwarding private \"n.n.n.in-addr.arpa\" names to a specific server are still forwarded. ".
- "If the IP to name is not known from /etc/hosts, DHCP or a specific domain override then a \"not found\" answer is immediately returned. "), $g['product_name']); ?>
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Listen Port");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="port" type="text" id="port" size="6" <?php if ($pconfig['port']) echo "value=\"" . htmlspecialchars($pconfig['port']) . "\"";?> />
- <br /><br />
- <?=gettext("The port used for responding to DNS queries. It should normally be left blank unless another service needs to bind to TCP/UDP port 53.");?>
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" rowspan="2" class="vncellreq"><?=gettext("Interfaces"); ?></td>
- <td width="78%" class="vtable">
- <?php
- $interface_addresses = get_possible_listen_ips(true);
- ?>
- <?=gettext("Interface IPs used by the DNS Forwarder for responding to queries from clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries to other interface IPs not selected below are discarded. The default behavior is to respond to queries on every available IPv4 and IPv6 address.");?>
- <br /><br />
- <select id="interface" name="interface[]" multiple="multiple" class="formselect" size="5">
- <option value="" <?php if (empty($pconfig['interface']) || empty($pconfig['interface'][0])) echo 'selected="selected"'; ?>>All</option>
- <?php
- foreach ($interface_addresses as $laddr => $ldescr):
- $selected = "";
- if (in_array($laddr, $pconfig['interface'])) {
- $selected = 'selected="selected"';
- }
- ?>
- <option value="<?=$laddr;?>" <?=$selected;?>>
- <?=htmlspecialchars($ldescr);?>
- </option>
- <?php
- endforeach;
- unset($interface_addresses);
- ?>
- </select>
- <br /><br />
- </td>
- </tr>
- <tr>
- <td width="78%" class="vtable">
- <p>
- <input name="strictbind" type="checkbox" id="strictbind" value="yes" <?php if ($pconfig['strictbind'] == "yes") echo "checked=\"checked\"";?> />
- <strong><?=gettext("Strict Interface Binding");?></strong>
- <br />
- <?= gettext("If this option is set, the DNS forwarder will only bind to the interfaces containing the IP addresses selected above, rather than binding to all interfaces and discarding queries to other addresses."); ?>
- <br /><br />
- <?= gettext("NOTE: This option does NOT work with IPv6. If set, dnsmasq will not bind to IPv6 addresses."); ?>
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Advanced");?></td>
- <td width="78%" class="vtable">
- <div id="showadvbox" <?php if ($pconfig['custom_options']) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_dns()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="showadv" <?php if (empty($pconfig['custom_options'])) echo "style='display:none'"; ?>>
- <strong><?=gettext("Advanced");?><br /></strong>
- <textarea rows="6" cols="78" name="custom_options" id="custom_options"><?=htmlspecialchars($pconfig['custom_options']);?></textarea><br />
- <?=gettext("Enter any additional options you would like to add to the dnsmasq configuration here, separated by a space or newline"); ?><br />
- </div>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <input name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
- </td>
- </tr>
-</table>
-
-<p>
- <span class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Note:");?><br />
- </strong>
- </span>
- <?php printf(gettext("If the DNS forwarder is enabled, the DHCP".
- " service (if enabled) will automatically serve the LAN IP".
- " address as a DNS server to DHCP clients so they will use".
- " the forwarder. The DNS forwarder will use the DNS servers".
- " entered in %sSystem: General setup%s".
- " or those obtained via DHCP or PPP on WAN if the &quot;Allow".
- " DNS server list to be overridden by DHCP/PPP on WAN&quot;".
- " is checked. If you don't use that option (or if you use".
- " a static IP address on WAN), you must manually specify at".
- " least one DNS server on the %sSystem:".
- "General setup%s page."), '<a href="system.php">', '</a>', '<a href="system.php">', '</a>');?><br />
- </span>
-</p>
-
-&nbsp;<br />
-<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont" summary="host overrides">
- <tr>
- <td colspan="5" valign="top" class="listtopic"><?=gettext("Host Overrides");?></td>
- </tr>
- <tr>
- <td>
- <br />
- <?=gettext("Entries in this section override individual results from the forwarders.");?>
- <?=gettext("Use these for changing DNS results or for adding custom DNS records.");?>
- </td>
- </tr>
-</table>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont sortable" summary="results">
- <thead>
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Host");?></td>
- <td width="25%" class="listhdrr"><?=gettext("Domain");?></td>
- <td width="20%" class="listhdrr"><?=gettext("IP");?></td>
- <td width="25%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ "If the IP to name is not known from /etc/hosts, DHCP or a specific domain override then a \"not found\" answer is immediately returned. ", $g['product_name']));
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'port',
+ 'Listen Port',
+ 'number',
+ $pconfig['port'],
+ ['placeholder' => '53']
+))->setHelp('The port used for responding to DNS queries. It should normally be left blank unless another service needs to bind to TCP/UDP port 53.');
+
+$iflist = build_if_list();
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interfaces',
+ $iflist['selected'],
+ $iflist['options'],
+ true
+))->setHelp('Interface IPs used by the DNS Forwarder for responding to queries from clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries to other interface IPs not selected below are discarded. ' .
+ 'The default behavior is to respond to queries on every available IPv4 and IPv6 address.');
+
+$section->addInput(new Form_Checkbox(
+ 'strictbind',
+ 'Strict binding',
+ 'Strict interface binding',
+ $pconfig['strictbind']
+))->setHelp('If this option is set, the DNS forwarder will only bind to the interfaces containing the IP addresses selected above, ' .
+ 'rather than binding to all interfaces and discarding queries to other addresses.' . '<br /><br />' .
+ 'This option does NOT work with IPv6. If set, dnsmasq will not bind to IPv6 addresses.');
+
+$section->addInput(new Form_TextArea(
+ 'custom_options',
+ 'Custom options',
+ $pconfig['custom_options']
+))->setHelp('Enter any additional options you would like to add to the dnsmasq configuration here, separated by a space or newline')
+ ->addClass('advanced');
+
+$form->add($section);
+print($form);
+
+print_info_box(sprintf("If the DNS forwarder is enabled, the DHCP".
+ " service (if enabled) will automatically serve the LAN IP".
+ " address as a DNS server to DHCP clients so they will use".
+ " the forwarder. The DNS forwarder will use the DNS servers".
+ " entered in %sSystem: General setup%s".
+ " or those obtained via DHCP or PPP on WAN if the &quot;Allow".
+ " DNS server list to be overridden by DHCP/PPP on WAN&quot;".
+ " is checked. If you don't use that option (or if you use".
+ " a static IP address on WAN), you must manually specify at".
+ " least one DNS server on the %sSystem:".
+ "General setup%s page.",'<a href="system.php">','</a>','<a href="system.php">','</a>'));
+?>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2><?=gettext("Host Overrides")?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td width="17"></td>
- <td valign="middle">
- <a href="services_dnsmasq_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
- </td>
+ <th><?=gettext("Host")?></th>
+ <th><?=gettext("Domain")?></th>
+ <th><?=gettext("IP")?></th>
+ <th><?=gettext("Description")?></th>
+ <th></th>
</tr>
- </table>
- </td>
- </tr>
- </thead>
- <tfoot>
- <tr>
- <td class="list" colspan="4"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ </thead>
+ <tbody>
+<?php
+foreach ($a_hosts as $i => $hostent):
+?>
<tr>
- <td width="17"></td>
- <td valign="middle">
- <a href="services_dnsmasq_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
+ <td>
+ <?=strtolower($hostent['host'])?>
+ </td>
+ <td>
+ <?=strtolower($hostent['domain'])?>
+ </td>
+ <td>
+ <?=$hostent['ip']?>
+ </td>
+ <td>
+ <?=htmlspecialchars($hostent['descr'])?>
+ </td>
+ <td>
+ <a href="services_dnsmasq_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext('Edit')?></a>
+ <a href="services_dnsmasq.php?type=host&amp;act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext('Delete')?></a>
</td>
</tr>
- </table>
- </td>
- </tr>
- </tfoot>
- <tbody>
+
<?php
- $i = 0;
- foreach ($a_hosts as $hostent):
+ if ($hostent['aliases']['item'] && is_array($hostent['aliases']['item'])):
+ foreach ($hostent['aliases']['item'] as $i => $alias):
?>
- <tr>
- <td class="listlr" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
- <?=strtolower($hostent['host']);?>&nbsp;
- </td>
- <td class="listr" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
- <?=strtolower($hostent['domain']);?>&nbsp;
- </td>
- <td class="listr" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
- <?=$hostent['ip'];?>&nbsp;
- </td>
- <td class="listbg" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($hostent['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
<tr>
- <td valign="middle"><a href="services_dnsmasq_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a></td>
<td>
- <a href="services_dnsmasq.php?type=host&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this host?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ <?=strtolower($alias['host'])?>
+ </td>
+ <td>
+ <?=strtolower($alias['domain'])?>
+ </td>
+ <td>
+ Alias for <?=$hostent['host'] ? $hostent['host'] . '.' . $hostent['domain'] : $hostent['domain']?>
+ </td>
+ <td>
+ <?=htmlspecialchars($alias['description'])?>
+ </td>
+ <td>
+ <a href="services_dnsmasq_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext('Edit')?></a>
</td>
</tr>
- </table>
- </td>
- </tr>
<?php
- if ($hostent['aliases']['item'] && is_array($hostent['aliases']['item'])):
- foreach ($hostent['aliases']['item'] as $alias):
+ endforeach;
+ endif;
+endforeach;
?>
- <tr>
- <td class="listlr" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
- <?=strtolower($alias['host']);?>&nbsp;
- </td>
- <td class="listr" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
- <?=strtolower($alias['domain']);?>&nbsp;
- </td>
- <td class="listr" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
- Alias for <?=$hostent['host'] ? $hostent['host'] . '.' . $hostent['domain'] : $hostent['domain'];?>&nbsp;
- </td>
- <td class="listbg" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($alias['description']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <a href="services_dnsmasq_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- </td>
- </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<nav class="action-buttons">
+ <a href="services_dnsmasq_edit.php" class="btn btn-sm btn-success"><?=gettext('Add')?></a>
+</nav>
+
<?php
- endforeach;
- endif;
- $i++;
- endforeach;
+print_info_box(gettext("Entries in this section override individual results from the forwarders.") .
+ gettext("Use these for changing DNS results or for adding custom DNS records."));
?>
- <tr style="display:none">
- <td></td>
- </tr>
- </tbody>
-</table>
-<br />
-<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont" summary="domain overrides">
- <tr>
- <td colspan="5" valign="top" class="listtopic"><?=gettext("Domain Overrides");?></td>
- </tr>
- <tr>
- <td>
- <p>
- <?=gettext("Entries in this area override an entire domain, and subdomains, by specifying an".
- " authoritative DNS server to be queried for that domain.");?>
- </p>
- </td>
- </tr>
-</table>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont sortable" summary="results">
- <thead>
- <tr>
- <td width="35%" class="listhdrr"><?=gettext("Domain");?></td>
- <td width="20%" class="listhdrr"><?=gettext("IP");?></td>
- <td width="35%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2><?=gettext("Domain Overrides")?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td width="17" height="17"></td>
- <td>
- <a href="services_dnsmasq_domainoverride_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
- </td>
+ <th><?=gettext("Domain")?></th>
+ <th><?=gettext("IP")?></th>
+ <th><?=gettext("Description")?></th>
+ <th></th>
</tr>
- </table>
- </td>
- </tr>
- </thead>
- <tfoot>
- <tr>
- <td class="list" colspan="3"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ </thead>
+
+ <tbody>
+<?php
+foreach ($a_domainOverrides as $i => $doment):
+?>
<tr>
- <td width="17" height="17"></td>
<td>
- <a href="services_dnsmasq_domainoverride_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
+ <?=strtolower($doment['domain'])?>
+ </td>
+ <td>
+ <?=$doment['ip']?>
+ </td>
+ <td>
+ <?=htmlspecialchars($doment['descr'])?>
+ </td>
+ <td>
+ <a href="services_dnsmasq_domainoverride_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext('Edit')?></a>
+ <a href="services_dnsmasq.php?act=del&amp;type=doverride&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext('Delete')?></a>
</td>
</tr>
- </table>
- </td>
- </tr>
- </tfoot>
- <tbody>
<?php
- $i = 0;
- foreach ($a_domainOverrides as $doment):
+endforeach;
?>
- <tr>
- <td class="listlr">
- <?=strtolower($doment['domain']);?>&nbsp;
- </td>
- <td class="listr">
- <?=$doment['ip'];?>&nbsp;
- </td>
- <td class="listbg">
- <?=htmlspecialchars($doment['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <a href="services_dnsmasq_domainoverride_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;<a href="services_dnsmasq.php?act=del&amp;type=doverride&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this domain override?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<nav class="action-buttons">
+ <a href="services_dnsmasq_domainoverride_edit.php" class="btn btn-sm btn-success"><?=gettext('Add')?></a>
+</nav>
+
<?php
- $i++;
- endforeach;
-?>
- <tr style="display:none">
- <td></td>
- </tr>
- </tbody>
-</table>
-</form>
-<script type="text/javascript">
-//<![CDATA[
-enable_change(false);
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+print_info_box(gettext("Entries in this area override an entire domain, and subdomains, by specifying an".
+ " authoritative DNS server to be queried for that domain."));
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_dnsmasq_domainoverride_edit.php b/src/usr/local/www/services_dnsmasq_domainoverride_edit.php
index ca66b49..3bc37fa 100644
--- a/src/usr/local/www/services_dnsmasq_domainoverride_edit.php
+++ b/src/usr/local/www/services_dnsmasq_domainoverride_edit.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: dnsforwarder
+ pfSense_MODULE: dnsforwarder
*/
##|+PRIV
@@ -41,15 +41,10 @@
require("guiconfig.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_dnsmasq.php');
-}
-
if (!is_array($config['dnsmasq']['domainoverrides'])) {
- $config['dnsmasq']['domainoverrides'] = array();
+ $config['dnsmasq']['domainoverrides'] = array();
}
+
$a_domainOverrides = &$config['dnsmasq']['domainoverrides'];
if (is_numericint($_GET['id'])) {
@@ -72,43 +67,48 @@ if (isset($id) && $a_domainOverrides[$id]) {
}
if ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
- unset($input_errors);
- $pconfig = $_POST;
+ /* input validation */
+ $reqdfields = explode(" ", "domain ip");
+ $reqdfieldsn = array(gettext("Domain"),gettext("IP address"));
- /* input validation */
- $reqdfields = explode(" ", "domain ip");
- $reqdfieldsn = array(gettext("Domain"), gettext("IP address"));
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
- do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ function String_Begins_With($needle, $haystack) {
+ return (substr($haystack, 0, strlen($needle))==$needle);
+ }
- function String_Begins_With($needle, $haystack) {
- return (substr($haystack, 0, strlen($needle)) == $needle);
- }
+ if (String_Begins_With(_msdcs, $_POST['domain'])) {
+ $subdomainstr = substr($_POST['domain'], 7);
- if (String_Begins_With(_msdcs, $_POST['domain'])) {
- $subdomainstr = substr($_POST['domain'], 7);
- if ($subdomainstr && !is_domain($subdomainstr)) {
- $input_errors[] = gettext("A valid domain must be specified after _msdcs.");
- }
- } elseif ($_POST['domain'] && !is_domain($_POST['domain'])) {
- $input_errors[] = gettext("A valid domain must be specified.");
- }
- if ($_POST['ip'] && !is_ipaddr($_POST['ip']) && ($_POST['ip'] != '#') && ($_POST['ip'] != '!')) {
- $input_errors[] = gettext("A valid IP address must be specified, or # for an exclusion or ! to not forward at all.");
- }
- if ($_POST['dnssrcip'] && !in_array($_POST['dnssrcip'], get_configured_ip_addresses())) {
- $input_errors[] = gettext("An interface IP address must be specified for the DNS query source.");
- }
- if (!$input_errors) {
- $doment = array();
- $doment['domain'] = $_POST['domain'];
- if (empty($_POST['dnssrcip'])) {
- $doment['ip'] = $_POST['ip'];
- } else {
- $doment['ip'] = $_POST['ip'] . "@" . $_POST['dnssrcip'];
- }
- $doment['descr'] = $_POST['descr'];
+ if ($subdomainstr && !is_domain($subdomainstr)) {
+ $input_errors[] = gettext("A valid domain must be specified after _msdcs.");
+ }
+ }
+ elseif ($_POST['domain'] && !is_domain($_POST['domain'])) {
+ $input_errors[] = gettext("A valid domain must be specified.");
+ }
+
+ if ($_POST['ip'] && !is_ipaddr($_POST['ip']) && ($_POST['ip'] != '#') && ($_POST['ip'] != '!')) {
+ $input_errors[] = gettext("A valid IP address must be specified, or # for an exclusion or ! to not forward at all.");
+ }
+
+ if ($_POST['dnssrcip'] && !in_array($_POST['dnssrcip'], get_configured_ip_addresses())) {
+ $input_errors[] = gettext("An interface IP address must be specified for the DNS query source.");
+ }
+
+ if (!$input_errors) {
+ $doment = array();
+ $doment['domain'] = $_POST['domain'];
+
+ if (empty($_POST['dnssrcip']))
+ $doment['ip'] = $_POST['ip'];
+ else
+ $doment['ip'] = $_POST['ip'] . "@" . $_POST['dnssrcip'];
+
+ $doment['descr'] = $_POST['descr'];
if (isset($id) && $a_domainOverrides[$id]) {
$a_domainOverrides[$id] = $doment;
@@ -129,69 +129,55 @@ $pgtitle = array(gettext("Services"), gettext("DNS forwarder"), gettext("Edit Do
$shortcut_section = "forwarder";
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="services_dnsmasq_domainoverride_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="domain override">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Domain");?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="domain" type="text" class="formfld unknown" id="domain" size="40" value="<?=htmlspecialchars($pconfig['domain']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Domain to override (NOTE: this does not have to be a valid TLD!)"); ?><br />
- <?=gettext("e.g."); ?> <em><?=gettext("test"); ?></em> <?=gettext("or"); ?> <em>mycompany.localdomain</em> <?=gettext("or"); ?> <em>1.168.192.in-addr.arpa</em>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("IP address");?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="ip" type="text" class="formfld unknown" id="ip" size="40" value="<?=htmlspecialchars($pconfig['ip']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("IP address of the authoritative DNS server for this domain"); ?><br />
- <?=gettext("e.g."); ?> <em>192.168.100.100</em><br /><?=gettext("Or enter # for an exclusion to pass through this host/subdomain to standard nameservers instead of a previous override."); ?><br /><?=gettext("Or enter ! for lookups for this host/subdomain to NOT be forwarded anywhere."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Source IP");?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="dnssrcip" type="text" class="formfld unknown" id="dnssrcip" size="40" value="<?=htmlspecialchars($pconfig['dnssrcip']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Source IP address for queries to the DNS server for the override domain."); ?><br />
- <?=gettext("Leave blank unless your DNS server is accessed through a VPN tunnel."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed).");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_domainOverrides[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Domain override options');
+
+$section->addInput(new Form_Input(
+ 'domain',
+ 'Domain',
+ 'text',
+ $pconfig['domain']
+))->setHelp('Domain to override (NOTE: this does not have to be a valid TLD!)' . '<br />' .
+ 'e.g.: test or mycompany.localdomain or 1.168.192.in-addr.arpa');
+
+$section->addInput(new Form_IpAddress(
+ 'ip',
+ 'IP Address',
+ $pconfig['ip']
+))->setHelp('IP address of the authoritative DNS server for this domain' . '<br />' .
+ 'e.g.: 192.168.100.100' . '<br />' .
+ 'Or enter # for an exclusion to pass through this host/subdomain to standard nameservers instead of a previous override.' . '<br />' .
+ 'Or enter ! for lookups for this host/subdomain to NOT be forwarded anywhere.');
+
+$section->addInput(new Form_IpAddress(
+ 'dnssrcip',
+ 'Source IP',
+ $pconfig['dnssrcip']
+))->setHelp('Source IP address for queries to the DNS server for the override domain. Leave blank unless your DNS server is accessed through a VPN tunnel.');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+if (isset($id) && $a_domainOverrides[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $pconfig['id']
+ ))->setHelp('You may enter a description here for your reference (not parsed).');
+}
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_dnsmasq_edit.php b/src/usr/local/www/services_dnsmasq_edit.php
index 4b4c1c4..f9513d9 100644
--- a/src/usr/local/www/services_dnsmasq_edit.php
+++ b/src/usr/local/www/services_dnsmasq_edit.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: dnsforwarder
+ pfSense_MODULE: dnsforwarder
*/
##|+PRIV
@@ -56,15 +56,8 @@ function hosts_sort() {
require("guiconfig.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_dnsmasq.php');
-}
-
-if (!is_array($config['dnsmasq']['hosts'])) {
+if (!is_array($config['dnsmasq']['hosts']))
$config['dnsmasq']['hosts'] = array();
-}
$a_hosts = &$config['dnsmasq']['hosts'];
@@ -84,7 +77,6 @@ if (isset($id) && $a_hosts[$id]) {
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -149,6 +141,7 @@ if ($_POST) {
}
}
}
+
if (($alias['domain'] && !is_domain($alias['domain']))) {
$input_errors[] = gettext("A valid domain must be specified in alias list.");
}
@@ -193,153 +186,131 @@ if ($_POST) {
}
}
-$pgtitle = array(gettext("Services"), gettext("DNS forwarder"), gettext("Edit host"));
+// Delete a row in the options table
+if($_GET['act'] == "delopt") {
+ $idx = $_GET['id'];
+
+ if($pconfig['aliases'] && is_array($pconfig['aliases']['item'][$idx])) {
+ unset($pconfig['aliases']['item'][$idx]);
+ }
+}
+
+// Add an option row
+if($_GET['act'] == "addopt") {
+ if(!is_array($pconfig['aliases']['item']))
+ $pconfig['aliases']['item'] = array();
+
+ array_push($pconfig['aliases']['item'], array('host' => null, 'domain' => null, 'description' => null));
+}
+
+$pgtitle = array(gettext("Services"),gettext("DNS forwarder"),gettext("Edit host"));
$shortcut_section = "forwarder";
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-
-<script type="text/javascript" src="/javascript/row_helper.js">
-</script>
-
-<script type="text/javascript">
-//<![CDATA[
- rowname[0] = "aliashost";
- rowtype[0] = "textbox";
- rowsize[0] = "20";
- rowname[1] = "aliasdomain";
- rowtype[1] = "textbox";
- rowsize[1] = "20";
- rowname[2] = "aliasdescription";
- rowtype[2] = "textbox";
- rowsize[2] = "20";
-//]]>
-</script>
-
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="services_dnsmasq_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="dns edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit DNS Forwarder entry");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Host");?></td>
- <td width="78%" class="vtable">
- <input name="host" type="text" class="formfld unknown" id="host" size="40" value="<?=htmlspecialchars($pconfig['host']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Name of the host, without domain part"); ?><br />
- <?=gettext("e.g."); ?> <em><?=gettext("myhost"); ?></em>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Domain");?></td>
- <td width="78%" class="vtable">
- <input name="domain" type="text" class="formfld unknown" id="domain" size="40" value="<?=htmlspecialchars($pconfig['domain']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Domain of the host"); ?><br />
- <?=gettext("e.g."); ?> <em><?=gettext("example.com"); ?></em>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("IP address");?></td>
- <td width="78%" class="vtable">
- <input name="ip" type="text" class="formfld unknown" id="ip" size="40" value="<?=htmlspecialchars($pconfig['ip']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("IP address of the host"); ?><br />
- <?=gettext("e.g."); ?> <em>192.168.100.100</em> <?=gettext("or"); ?> <em>fd00:abcd::1</em>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed).");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><div id="addressnetworkport"><?=gettext("Aliases"); ?></div></td>
- <td width="78%" class="vtable">
- <table id="maintable" summary="aliases">
- <tbody>
- <tr>
- <td colspan="4">
- <div style="padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066; background-color: #ffffff; color: #000000; font-size: 8pt;" id="itemhelp">
- <?=gettext("Enter additional names for this host."); ?>
- </div>
- </td>
- </tr>
- <tr>
- <td><div id="onecolumn"><?=gettext("Host");?></div></td>
- <td><div id="twocolumn"><?=gettext("Domain");?></div></td>
- <td><div id="threecolumn"><?=gettext("Description");?></div></td>
- </tr>
-<?php
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Domain override options');
+
+$section->addInput(new Form_Input(
+ 'host',
+ 'Host',
+ 'text',
+ $pconfig['domain']
+))->setHelp('Name of the host, without the domain part' . '<br />' .
+ 'e.g.: "myhost"');
+
+$section->addInput(new Form_Input(
+ 'domain',
+ 'Domain',
+ 'text',
+ $pconfig['domain']
+))->setHelp('Domain of the host' . '<br />' .
+ 'e.g.: "example.com"');
+
+$section->addInput(new Form_IpAddress(
+ 'ip',
+ 'IP Address',
+ $pconfig['ip']
+))->setHelp('IP address of the host' . '<br />' .
+ 'e.g.: 192.168.100.100 or fd00:abcd::1');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+if (isset($id) && $a_hosts[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $pconfig['id']
+ ));
+}
+
+$form->add($section);
+
+$section = new Form_Section('Additional names for this host');
+
+if( $pconfig['aliases']['item']) {
$counter = 0;
- if ($pconfig['aliases']['item']):
- foreach ($pconfig['aliases']['item'] as $item):
- $host = $item['host'];
- $domain = $item['domain'];
- $description = $item['description'];
-?>
- <tr>
- <td>
- <input autocomplete="off" name="aliashost<?php echo $counter; ?>" type="text" class="formfld unknown" id="aliashost<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($host);?>" />
- </td>
- <td>
- <input autocomplete="off" name="aliasdomain<?php echo $counter; ?>" type="text" class="formfld unknown" id="aliasdomain<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($domain);?>" />
- </td>
- <td>
- <input name="aliasdescription<?php echo $counter; ?>" type="text" class="formfld unknown" id="aliasdescription<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($description);?>" />
- </td>
- <td>
- <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="" title="<?=gettext("remove this entry"); ?>" /></a>
- </td>
- </tr>
-<?php
- $counter++;
- endforeach;
- endif;
-?>
- </tbody>
- </table>
- <a onclick="javascript:addRowTo('maintable', 'formfldalias'); return false;" href="#">
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
- </a>
- <script type="text/javascript">
- //<![CDATA[
- field_counter_js = 3;
- rows = 1;
- totalrows = <?php echo $counter; ?>;
- loaded = <?php echo $counter; ?>;
- //]]>
- </script>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_hosts[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ $last = count($pconfig['aliases']['item']) - 1;
+
+ foreach($pconfig['aliases']['item'] as $item) {
+ $group = new Form_Group(null);
+
+ $group->add(new Form_Input(
+ 'aliashost' . $counter,
+ null,
+ 'text',
+ $item['host']
+ ))->setHelp($counter == $last ? 'Host name':null);
+
+ $group->add(new Form_Input(
+ 'aliasdomain' . $counter,
+ null,
+ 'text',
+ $item['domain']
+ ))->setHelp($counter == $last ? 'Value':null);
+
+ $group->add(new Form_Input(
+ 'aliasdescription' . $counter,
+ null,
+ 'text',
+ $item['description']
+ ))->setHelp($counter == $last ? 'Description':null);
+
+ $btn = new Form_Button(
+ 'btn' . $counter,
+ 'Delete',
+ 'services_dnsmasq_edit.php?act=delopt' . '&id=' . $counter
+ );
+
+ $btn->removeClass('btn-primary')->addClass('btn-danger btn-sm');
+ $group->add($btn);
+ $section->add($group);
+ $counter++;
+ }
+}
+
+$btnaddopt = new Form_Button(
+ 'btnaddopt',
+ 'Add Option',
+ 'services_dnsmasq_edit.php?act=addopt'
+);
+
+$btnaddopt->removeClass('btn-primary')->addClass('btn-success btn-sm');
+
+$section->addInput($btnaddopt);
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_dyndns.php b/src/usr/local/www/services_dyndns.php
index 5051f00..c605241 100644
--- a/src/usr/local/www/services_dyndns.php
+++ b/src/usr/local/www/services_dyndns.php
@@ -30,7 +30,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /usr/bin/host
- pfSense_MODULE: dyndns
+ pfSense_MODULE: dyndns
*/
##|+PRIV
@@ -49,7 +49,6 @@ if (!is_array($config['dyndnses']['dyndns'])) {
$a_dyndns = &$config['dyndnses']['dyndns'];
if ($_GET['act'] == "del") {
-
$conf = $a_dyndns[$_GET['id']];
@unlink("{$g['conf_path']}/dyndns_{$conf['interface']}{$conf['type']}" . escapeshellarg($conf['host']) . "{$conf['id']}.cache");
unset($a_dyndns[$_GET['id']]);
@@ -64,166 +63,131 @@ if ($_GET['act'] == "del") {
$pgtitle = array(gettext("Services"), gettext("Dynamic DNS clients"));
include("head.inc");
-?>
+if ($input_errors)
+ print_input_errors($input_errors);
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="services_dyndns.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="dynamic dns">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("DynDns"), true, "services_dyndns.php");
- $tab_array[] = array(gettext("RFC 2136"), false, "services_rfc2136.php");
- display_top_tabs($tab_array);
+$tab_array = array();
+$tab_array[] = array(gettext("DynDns"), true, "services_dyndns.php");
+$tab_array[] = array(gettext("RFC 2136"), false, "services_rfc2136.php");
+display_top_tabs($tab_array);
?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+<form action="services_dyndns.php" method="post" name="iform" id="iform">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td width="5%" class="listhdrr"><?=gettext("Interface");?></td>
- <td width="15%" class="listhdrr"><?=gettext("Service");?></td>
- <td width="20%" class="listhdrr"><?=gettext("Hostname");?></td>
- <td width="20%" class="listhdrr"><?=gettext("Cached IP");?></td>
- <td width="50%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list"></td>
+ <th><?=gettext("Interface")?></th>
+ <th><?=gettext("Service")?></th>
+ <th><?=gettext("Hostname")?></th>
+ <th><?=gettext("Cached IP")?></th>
+ <th><?=gettext("Description")?></th>
+ <th></th>
</tr>
+ </thead>
+ <tbody>
<?php
- $i = 0;
- foreach ($a_dyndns as $dyndns):
+$i = 0;
+foreach ($a_dyndns as $dyndns):
?>
- <tr ondblclick="document.location='services_dyndns_edit.php?id=<?=$i;?>'">
- <td class="listlr">
+ <tr<?=!isset($dyndns['enable'])?' class="disabled""':''?>>
+ <td>
<?php
- $iflist = get_configured_interface_with_descr();
- foreach ($iflist as $if => $ifdesc) {
- if ($dyndns['interface'] == $if) {
- if (!isset($dyndns['enable'])) {
- echo "<span class=\"gray\">{$ifdesc}</span>";
- } else {
- echo "{$ifdesc}";
- }
- break;
- }
+ $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $if => $ifdesc) {
+ if ($dyndns['interface'] == $if) {
+ print($ifdesc);
+
+ break;
}
- $groupslist = return_gateway_groups_array();
- foreach ($groupslist as $if => $group) {
- if ($dyndns['interface'] == $if) {
- if (!isset($dyndns['enable'])) {
- echo "<span class=\"gray\">{$if}</span>";
- } else {
- echo "{$if}";
- }
- break;
- }
+ }
+
+ $groupslist = return_gateway_groups_array();
+ foreach ($groupslist as $if => $group) {
+ if ($dyndns['interface'] == $if) {
+ print($if);
+ break;
}
+ }
?>
</td>
- <td class="listr">
+ <td>
<?php
- $types = explode(",", DYNDNS_PROVIDER_DESCRIPTIONS);
- $vals = explode(" ", DYNDNS_PROVIDER_VALUES);
- for ($j = 0; $j < count($vals); $j++) {
- if ($vals[$j] == $dyndns['type']) {
- if (!isset($dyndns['enable'])) {
- echo "<span class=\"gray\">" . htmlspecialchars($types[$j]) . "</span>";
- } else {
- echo htmlspecialchars($types[$j]);
- }
- break;
- }
+ $types = explode(",", DYNDNS_PROVIDER_DESCRIPTIONS);
+ $vals = explode(" ", DYNDNS_PROVIDER_VALUES);
+
+ for ($j = 0; $j < count($vals); $j++) {
+ if ($vals[$j] == $dyndns['type']) {
+ print(htmlspecialchars($types[$j]));
+
+ break;
}
+ }
?>
</td>
- <td class="listr">
+ <td>
<?php
- if (!isset($dyndns['enable'])) {
- echo "<span class=\"gray\">" . htmlspecialchars($dyndns['host']) . "</span>";
- } else {
- echo htmlspecialchars($dyndns['host']);
- }
+ print(htmlspecialchars($dyndns['host']));
?>
</td>
- <td class="listr">
+ <td>
<?php
- $filename = "{$g['conf_path']}/dyndns_{$dyndns['interface']}{$dyndns['type']}" . escapeshellarg($dyndns['host']) . "{$dyndns['id']}.cache";
- $filename_v6 = "{$g['conf_path']}/dyndns_{$dyndns['interface']}{$dyndns['type']}" . escapeshellarg($dyndns['host']) . "{$dyndns['id']}_v6.cache";
- if (file_exists($filename)) {
- $ipaddr = dyndnsCheckIP($dyndns['interface']);
- $cached_ip_s = explode(":", file_get_contents($filename));
- $cached_ip = $cached_ip_s[0];
- if ($ipaddr <> $cached_ip) {
- echo "<font color='red'>";
- } else {
- echo "<font color='green'>";
- }
- echo htmlspecialchars($cached_ip);
- echo "</font>";
- } else if (file_exists($filename_v6)) {
- $ipv6addr = get_interface_ipv6($dyndns['interface']);
- $cached_ipv6_s = explode("|", file_get_contents($filename_v6));
- $cached_ipv6 = $cached_ipv6_s[0];
- if ($ipv6addr <> $cached_ipv6) {
- echo "<font color='red'>";
- } else {
- echo "<font color='green'>";
- }
- echo htmlspecialchars($cached_ipv6);
- echo "</font>";
- } else {
- echo "N/A";
- }
+ $filename = "{$g['conf_path']}/dyndns_{$dyndns['interface']}{$dyndns['type']}" . escapeshellarg($dyndns['host']) . "{$dyndns['id']}.cache";
+ $filename_v6 = "{$g['conf_path']}/dyndns_{$dyndns['interface']}{$dyndns['type']}" . escapeshellarg($dyndns['host']) . "{$dyndns['id']}_v6.cache";
+ if (file_exists($filename)) {
+ $ipaddr = dyndnsCheckIP($dyndns['interface']);
+ $cached_ip_s = explode(":", file_get_contents($filename));
+ $cached_ip = $cached_ip_s[0];
+
+ if ($ipaddr != $cached_ip)
+ print('<font color="red">');
+ else
+ print('<font color="green">');
+
+ print(htmlspecialchars($cached_ip));
+ print('</font>');
+ } else if (file_exists($filename_v6)) {
+ $ipv6addr = get_interface_ipv6($dyndns['interface']);
+ $cached_ipv6_s = explode("|", file_get_contents($filename_v6));
+ $cached_ipv6 = $cached_ipv6_s[0];
+
+ if ($ipv6addr != $cached_ipv6)
+ print('<font color="red">');
+ else
+ print('<font color="green">');
+
+ print(htmlspecialchars($cached_ipv6));
+ print('</font>');
+ } else {
+ print('N/A');
+ }
?>
</td>
- <td class="listbg">
+ <td>
<?php
- if (!isset($dyndns['enable'])) {
- echo "<span class=\"gray\">".htmlspecialchars($dyndns['descr'])."</span>";
- } else {
- echo htmlspecialchars($dyndns['descr']);
- }
+ print(htmlspecialchars($dyndns['descr']));
?>
</td>
- <td valign="middle" class="list nowrap">
- <a href="services_dyndns_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;<a href="services_dyndns.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this entry?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ <td>
+ <a href="services_dyndns_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext('Edit')?></a>
+ <a href="services_dyndns.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext("Delete")?></a>
</td>
</tr>
<?php
- $i++;
+ $i++;
endforeach;
?>
- <tr>
- <td class="list" colspan="5"></td>
- <td class="list">
- <a href="services_dyndns_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
- <tr>
- <td colspan="5" class="list">
- <p class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Note:");?><br />
- </strong>
- </span>
- <?=gettext("IP addresses appearing in green are up to date with Dynamic DNS provider.");?><br />
- <?=gettext("You can force an update for an IP address on the edit page for that service.");?>
- </p>
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
+ </tbody>
+ </table>
+ </div>
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<nav class="action-buttons">
+ <a href="services_dyndns_edit.php" class="btn btn-sm btn-success"><?=gettext('Add')?></a>
+</nav>
+
+<?php
+
+print_info_box(gettext("IP addresses appearing in green are up to date with Dynamic DNS provider. " .
+ "You can force an update for an IP address on the edit page for that service."));
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_dyndns_edit.php b/src/usr/local/www/services_dyndns_edit.php
index a619ce9..750cd9b 100644
--- a/src/usr/local/www/services_dyndns_edit.php
+++ b/src/usr/local/www/services_dyndns_edit.php
@@ -30,7 +30,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /bin/rm
- pfSense_MODULE: dyndns
+ pfSense_MODULE: dyndns
*/
##|+PRIV
@@ -89,7 +89,6 @@ if (isset($id) && isset($a_dyndns[$id])) {
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -102,6 +101,7 @@ if ($_POST) {
$reqdfieldsn = array();
$reqdfields = array("type");
$reqdfieldsn = array(gettext("Service type"));
+
if ($pconfig['type'] != "custom" && $pconfig['type'] != "custom-v6") {
$reqdfields[] = "host";
$reqdfieldsn[] = gettext("Hostname");
@@ -192,294 +192,279 @@ if ($_POST) {
}
}
-$pgtitle = array(gettext("Services"), gettext("Dynamic DNS client"));
+function build_type_list() {
+ $types = explode(",", DYNDNS_PROVIDER_DESCRIPTIONS);
+ $vals = explode(" ", DYNDNS_PROVIDER_VALUES);
+ $typelist = array();
+
+ for ($j = 0; $j < count($vals); $j++)
+ $typelist[$vals[$j]] = htmlspecialchars($types[$j]);
+
+ return($typelist);
+}
+
+function build_if_list() {
+ $list = array();
+
+ $iflist = get_configured_interface_with_descr();
+
+ foreach ($iflist as $if => $ifdesc)
+ $list[$if] = $ifdesc;
+
+ unset($iflist);
+
+ $grouplist = return_gateway_groups_array();
+
+ foreach ($grouplist as $name => $group)
+ $list[$name] = 'GW Group ' . $name;
+
+ unset($grouplist);
+
+ return($list);
+}
+
+$pgtitle = array(gettext("Services"),gettext("Dynamic DNS client"));
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+require('classes/Form.class.php');
+
+$form = new Form;
+
+$section = new Form_Section('Dynamic DNS Client');
+
+// Confusingly the 'enable' checkbox is labelled 'Disable', but thats the way it works!
+// No action (hide or disable) is taken on selecting this.
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'Disable',
+ 'Disable this client',
+ $pconfig['enable']
+));
+
+$section->addInput(new Form_Select(
+ 'type',
+ 'Service Type',
+ $pconfig['type'],
+ build_type_list()
+));
+
+$interfacelist = build_if_list();
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface to monitor',
+ $pconfig['interface'],
+ $interfacelist
+));
+
+$section->addInput(new Form_Select(
+ 'requestif',
+ 'Interface to send update from',
+ $pconfig['request'],
+ $interfacelist
+))->setHelp('This is almost always the same as the Interface to Monitor. ');
+
+$section->addInput(new Form_Input(
+ 'host',
+ 'Hostname',
+ 'text',
+ $pconfig['host']
+))->setHelp('Enter the complete host/domain name. example: myhost.dyndns.org'.
+ 'he.net tunnelbroker: Enter your tunnel ID'.
+ 'GleSYS: Enter your record ID'.
+ 'DNSimple: Enter only the domain name.');
+
+$section->addInput(new Form_Input(
+ 'mx',
+ 'MX',
+ 'text',
+ $pconfig['mx']
+))->setHelp('Note: With DynDNS service you can only use a hostname, not an IP address.'.
+ 'Set this option only if you need a special MX record. Not all services support this.');
+
+$section->addInput(new Form_Checkbox(
+ 'wildcard',
+ 'Wildcards',
+ 'Enable Wildcard',
+ $pconfig['wildcard']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'verboselog',
+ 'Verbose logging',
+ 'Enable verbose logging',
+ $pconfig['verboselog']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'curl_ipresolve_v4',
+ 'CURL options',
+ 'Force IPv4 resolving',
+ $pconfig['curl_ipresolve_v4']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'curl_ssl_verifypeer',
+ null,
+ 'Verify SSL peer',
+ $pconfig['curl_ssl_verifypeer']
+));
+
+$section->addInput(new Form_Input(
+ 'username',
+ 'Username',
+ 'text',
+ $pconfig['username']
+))->setHelp('Username is required for all types except Namecheap, FreeDNS and Custom Entries.' . '<br />' .
+ 'Route 53: Enter your Access Key ID.' . '<br />' .
+ 'GleSYS: Enter your API user.' . '<br />' .
+ 'For Custom Entries, Username and Password represent HTTP Authentication username and passwords.');
+
+$section->addInput(new Form_Input(
+ 'passwordfld',
+ 'Password',
+ 'password',
+ $pconfig['passwordfld']
+))->setHelp('FreeDNS (freedns.afraid.org): Enter your \"Authentication Token\" provided by FreeDNS.' . '<br />' .
+ 'Route 53: Enter your Secret Access Key.' . '<br />' .
+ 'GleSYS: Enter your API key.' . '<br />' .
+ 'DNSimple: Enter your API token.');
+
+$section->addInput(new Form_Input(
+ 'zoneid',
+ 'Zone ID',
+ 'text',
+ $pconfig['zoneid']
+))->setHelp('Enter Zone ID that you received when you created your domain in Route 53.' . '<br />' .
+ 'DNSimple: Enter the Record ID of record to update.');
+
+$section->addInput(new Form_Input(
+ 'updateurl',
+ 'Update URL',
+ 'text',
+ $pconfig['updateurl']
+))->setHelp('This is the only field required by for Custom Dynamic DNS, and is only used by Custom Entries.');
+
+$section->addInput(new Form_Textarea(
+ 'resultmatch',
+ 'Result Match',
+ $pconfig['resultmatch']
+))->sethelp('This field should be identical to what your DDNS Provider will return if the update succeeds, leave it blank to disable checking of returned results.' . '<br />' .
+ 'If you need the new IP to be included in the request, put %IP% in its place.' . '<br />' .
+ 'If you need to include multiple possible values, separate them with a |. If your provider includes a |, escape it with \\|)' . '<br />' .
+ 'Tabs (\\t), newlines (\\n) and carriage returns (\\r) at the beginning or end of the returned results are removed before comparison.');
+
+$section->addInput(new Form_Input(
+ 'ttl',
+ 'TTL',
+ 'text',
+ $pconfig['ttl']
+))->setHelp('Choose TTL for your dns record.');
+
+$section->addInput(new Form_Input(
+ 'description',
+ 'Description',
+ 'text',
+ $pconfig['description']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+if (isset($id) && $a_dyndns[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+
+print($form);
+
+// Certain input elements are hidden/shown based on the service type in the following script
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<script type="text/javascript">
+<script>
//<![CDATA[
-function _onTypeChange(type) {
- switch (type) {
- case "custom":
- case "custom-v6":
- document.getElementById("_resulttr").style.display = '';
- document.getElementById("_urltr").style.display = '';
- document.getElementById("_requestiftr").style.display = '';
- document.getElementById("_curloptions").style.display = '';
- document.getElementById("_hostnametr").style.display = 'none';
- document.getElementById("_mxtr").style.display = 'none';
- document.getElementById("_wildcardtr").style.display = 'none';
- document.getElementById("r53_zoneid").style.display='none';
- document.getElementById("r53_ttl").style.display='none';
- break;
- case "dnsimple":
- case "route53":
- document.getElementById("_resulttr").style.display = 'none';
- document.getElementById("_urltr").style.display = 'none';
- document.getElementById("_requestiftr").style.display = 'none';
- document.getElementById("_curloptions").style.display = 'none';
- document.getElementById("_hostnametr").style.display = '';
- document.getElementById("_mxtr").style.display = '';
- document.getElementById("_wildcardtr").style.display = '';
- document.getElementById("r53_zoneid").style.display='';
- document.getElementById("r53_ttl").style.display='';
- break;
- default:
- document.getElementById("_resulttr").style.display = 'none';
- document.getElementById("_urltr").style.display = 'none';
- document.getElementById("_requestiftr").style.display = 'none';
- document.getElementById("_curloptions").style.display = 'none';
- document.getElementById("_hostnametr").style.display = '';
- document.getElementById("_mxtr").style.display = '';
- document.getElementById("_wildcardtr").style.display = '';
- document.getElementById("r53_zoneid").style.display='none';
- document.getElementById("r53_ttl").style.display='none';
+events.push(function(){
+ var visible = false;
+
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
}
-}
-//]]>
-</script>
-<form action="services_dyndns_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="dynamic dns edit">
- <tr>
- <td colspan="2" valign="top" class="optsect_t">
- <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="title">
- <tr>
- <td class="optsect_s"><strong><?=gettext("Dynamic DNS client");?></strong></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Disable");?></td>
- <td width="78%" class="vtable">
- <input name="enable" type="checkbox" id="enable" value="<?=gettext("yes");?>" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Service type");?></td>
- <td width="78%" class="vtable">
- <select name="type" class="formselect" id="type" onchange="_onTypeChange(this.options[this.selectedIndex].value);">
- <?php
- $types = explode(",", DYNDNS_PROVIDER_DESCRIPTIONS);
- $vals = explode(" ", DYNDNS_PROVIDER_VALUES);
- $j = 0;
- for ($j = 0; $j < count($vals); $j++):
- ?>
- <option value="<?=$vals[$j];?>" <?php if ($vals[$j] == $pconfig['type']) echo "selected=\"selected\"";?>>
- <?=htmlspecialchars($types[$j]);?>
- </option>
- <?php
- endfor;
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface to monitor");?></td>
- <td width="78%" class="vtable">
- <select name="interface" class="formselect" id="interface">
- <?php
- $iflist = get_configured_interface_with_descr();
- foreach ($iflist as $if => $ifdesc) {
- echo "<option value=\"{$if}\"";
- if ($pconfig['interface'] == $if) {
- echo "selected=\"selected\"";
- }
- echo ">{$ifdesc}</option>\n";
- }
- unset($iflist);
- $grouplist = return_gateway_groups_array();
- foreach ($grouplist as $name => $group) {
- echo "<option value=\"{$name}\"";
- if ($pconfig['interface'] == $name) {
- echo "selected=\"selected\"";
- }
- echo ">GW Group {$name}</option>\n";
- }
- unset($grouplist);
- ?>
- </select>
- </td>
- </tr>
- <tr id="_requestiftr">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface to send update from");?></td>
- <td width="78%" class="vtable">
- <select name="requestif" class="formselect" id="requestif">
- <?php
- $iflist = get_configured_interface_with_descr();
- foreach ($iflist as $if => $ifdesc) {
- echo "<option value=\"{$if}\"";
- if ($pconfig['requestif'] == $if) {
- echo "selected=\"selected\"";
- }
- echo ">{$ifdesc}</option>\n";
- }
- unset($iflist);
- $grouplist = return_gateway_groups_array();
- foreach ($grouplist as $name => $group) {
- echo "<option value=\"{$name}\"";
- if ($pconfig['requestif'] == $name) {
- echo "selected=\"selected\"";
- }
- echo ">GW Group {$name}</option>\n";
- }
- unset($grouplist);
- ?>
- </select>
- <br /><?=gettext("Note: This is almost always the same as the Interface to Monitor.");?>
- </td>
- </tr>
- <tr id="_hostnametr">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname");?></td>
- <td width="78%" class="vtable">
- <input name="host" type="text" class="formfld unknown" id="host" size="30" value="<?=htmlspecialchars($pconfig['host']);?>" />
- <br />
- <span class="vexpl">
- <span class="red">
- <strong><?=gettext("Note:");?><br /></strong>
- </span>
- <?=gettext("Enter the complete host/domain name. example: myhost.dyndns.org");?><br />
- <?=gettext("he.net tunnelbroker: Enter your tunnel ID");?><br />
- <?=gettext("GleSYS: Enter your record ID");?><br />
- <?=gettext("DNSimple: Enter only the domain name");?><br />
- <?=gettext("DNS Made Easy: Enter your record ID separated by commas if more than one at a time");?>
- </span>
- </td>
- </tr>
- <tr id="_mxtr">
- <td width="22%" valign="top" class="vncell"><?=gettext("MX"); ?></td>
- <td width="78%" class="vtable">
- <input name="mx" type="text" class="formfld unknown" id="mx" size="30" value="<?=htmlspecialchars($pconfig['mx']);?>" />
- <br />
- <?=gettext("Note: With DynDNS service you can only use a hostname, not an IP address.");?>
- <br />
- <?=gettext("Set this option only if you need a special MX record. Not all services support this.");?>
- </td>
- </tr>
- <tr id="_wildcardtr">
- <td width="22%" valign="top" class="vncell"><?=gettext("Wildcards"); ?></td>
- <td width="78%" class="vtable">
- <input name="wildcard" type="checkbox" id="wildcard" value="yes" <?php if ($pconfig['wildcard']) echo "checked=\"checked\""; ?> />
- <?=gettext("Enable ");?><?=gettext("Wildcard"); ?>
- </td>
- </tr>
- <tr id="_verboselogtr">
- <td width="22%" valign="top" class="vncell"><?=gettext("Verbose logging"); ?></td>
- <td width="78%" class="vtable">
- <input name="verboselog" type="checkbox" id="verboselog" value="yes" <?php if ($pconfig['verboselog']) echo "checked=\"checked\""; ?> />
- <?=gettext("Enable ");?><?=gettext("verbose logging"); ?>
- </td>
- </tr>
- <tr id="_curloptions">
- <td width="22%" valign="top" class="vncell"><?=gettext("CURL options"); ?></td>
- <td width="78%" class="vtable">
- <input name="curl_ipresolve_v4" type="checkbox" id="curl_ipresolve_v4" value="yes" <?php if ($pconfig['curl_ipresolve_v4']) echo "checked=\"checked\""; ?> />
- <?=gettext("Force IPv4 resolving"); ?><br />
- <input name="curl_ssl_verifypeer" type="checkbox" id="curl_ssl_verifypeer" value="yes" <?php if ($pconfig['curl_ssl_verifypeer']) echo "checked=\"checked\""; ?> />
- <?=gettext("Verify SSL peer"); ?>
- </td>
- </tr>
- <tr id="_usernametr">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Username");?></td>
- <td width="78%" class="vtable">
- <input name="username" type="text" class="formfld user" id="username" size="20" value="<?=htmlspecialchars($pconfig['username']);?>" />
- <br /><?=gettext("Username is required for all types except Namecheap, FreeDNS and Custom Entries.");?>
- <br /><?=gettext("Route 53: Enter your Access Key ID.");?>
- <br /><?=gettext("GleSYS: Enter your API user.");?>
- <br /><?=gettext("For Custom Entries, Username and Password represent HTTP Authentication username and passwords.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Password");?></td>
- <td width="78%" class="vtable">
- <input name="passwordfld" type="password" class="formfld pwd" id="passwordfld" size="20" value="<?=htmlspecialchars($pconfig['password']);?>" />
- <br />
- <?=gettext("FreeDNS (freedns.afraid.org): Enter your \"Authentication Token\" provided by FreeDNS.");?>
- <br /><?=gettext("Route 53: Enter your Secret Access Key.");?>
- <br /><?=gettext("GleSYS: Enter your API key.");?>
- <br /><?=gettext("DNSimple: Enter your API token.");?>
- </td>
- </tr>
- <tr id="r53_zoneid" style="display:none">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Zone ID");?></td>
- <td width="78%" class="vtable">
- <input name="zoneid" type="text" class="formfld user" id="zoneid" size="20" value="<?=htmlspecialchars($pconfig['zoneid']);?>" />
- <br /><?=gettext("Enter Zone ID that you received when you created your domain in Route 53.");?>
- <br /><?=gettext("DNSimple: Enter the Record ID of record to update.");?>
- </td>
- </tr>
- <tr id="_urltr">
- <td width="22%" valign="top" class="vncell"><?=gettext("Update URL");?></td>
- <td width="78%" class="vtable">
- <input name="updateurl" type="text" class="formfld unknown" id="updateurl" size="60" value="<?=htmlspecialchars($pconfig['updateurl']);?>" />
- <br /><?=gettext("This is the only field required by for Custom Dynamic DNS, and is only used by Custom Entries.");?>
- <br /><?=gettext("If you need the new IP to be included in the request, put %IP% in its place.");?>
- </td>
- </tr>
- <tr id="_resulttr">
- <td width="22%" valign="top" class="vncell"><?=gettext("Result Match");?></td>
- <td width="78%" class="vtable">
- <textarea name="resultmatch" class="formpre" id="resultmatch" cols="65" rows="7"><?=htmlspecialchars($pconfig['resultmatch']);?></textarea>
- <br /><?=gettext("This field is only used by Custom Dynamic DNS Entries.");?>
- <br /><?=gettext("This field should be identical to what your DDNS Provider will return if the update succeeds, leave it blank to disable checking of returned results.");?>
- <br /><?=gettext("If you need the new IP to be included in the request, put %IP% in its place.");?>
- <br /><?=gettext("If you need to include multiple possible values, separate them with a |. If your provider includes a |, escape it with \\|");?>
- <br /><?=gettext("Tabs (\\t), newlines (\\n) and carriage returns (\\r) at the beginning or end of the returned results are removed before comparison.");?>
- </td>
- </tr>
- <tr id="r53_ttl" style="display:none">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("TTL");?></td>
- <td width="78%" class="vtable">
- <input name="ttl" type="text" class="formfld user" id="ttl" size="20" value="<?=htmlspecialchars($pconfig['ttl']);?>" />
- <br /><?=gettext("Choose TTL for your dns record.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="60" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
- <a href="services_dyndns.php"><input name="cancel" type="button" class="formbtn" value="<?=gettext("Cancel");?>" /></a>
- <?php if (isset($id) && $a_dyndns[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <input name="force" type="submit" class="formbtn" value="<?=gettext("Save & Force Update");?>" onclick="enable_change(true)" />
- <?php endif; ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <span class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Note:");?><br />
- </strong>
- </span>
- <?php printf(gettext("You must configure a DNS server in %sSystem:
- General setup%s or allow the DNS server list to be overridden
- by DHCP/PPP on WAN for dynamic DNS updates to work."), '<a href="system.php">', '</a>');?>
- </span>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-
-<script type="text/javascript">
-//<![CDATA[
-_onTypeChange("<?php echo $pconfig['type']; ?>");
+
+ // Hides the <div> in which the specified checkbox lives so that the checkbox, its label and help text are hidden
+ function hideCheckbox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
+ }
+
+ function setVisible(service) {
+ switch(service) {
+ case "custom" :
+ case "custom-v6" :
+ hideInput('resultmatch', false);
+ hideInput('updateurl', false);
+ hideInput('requestif', false);
+ hideCheckbox('curl_ipresolve_v4', false);
+ hideCheckbox('curl_ssl_verifypeer', false);
+ hideInput('host', true);
+ hideInput('mx', true);
+ hideCheckbox('wildcard', true);
+ hideInput('zoneid', true);
+ hideInput('ttl', true);
+ break;
+
+ case "dnsimple":
+ case "route53":
+ hideInput('resultmatch', true);
+ hideInput('updateurl', true);
+ hideInput('requestif', true);
+ hideCheckbox('curl_ipresolve_v4', true);
+ hideCheckbox('curl_ssl_verifypeer', false);
+ hideInput('host', false);
+ hideInput('mx', false);
+ hideCheckbox('wildcard', false);
+ hideInput('zoneid', false);
+ hideInput('ttl', false);
+ break;
+
+ default:
+ hideInput('resultmatch', true);
+ hideInput('updateurl', true);
+ hideInput('requestif', true);
+ hideCheckbox('curl_ipresolve_v4', true);
+ hideCheckbox('curl_ssl_verifypeer', true);
+ hideInput('host', false);
+ hideInput('mx', false);
+ hideCheckbox('wildcard', false);
+ hideInput('zoneid', true);
+ hideInput('ttl', true);
+ }
+ }
+
+ // When the 'Service type" selector is changed, we show/hide certain elements
+ $('#type').on('change', function() {
+ setVisible( this.value );
+ });
+
+ // On initial page load
+ setVisible($('#type').val());
+
+});
//]]>
</script>
-</body>
-</html>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_igmpproxy.php b/src/usr/local/www/services_igmpproxy.php
index 8749b2d..2953337 100644
--- a/src/usr/local/www/services_igmpproxy.php
+++ b/src/usr/local/www/services_igmpproxy.php
@@ -54,7 +54,6 @@ if (!is_array($config['igmpproxy']['igmpentry'])) {
$a_igmpproxy = &$config['igmpproxy']['igmpentry'];
if ($_POST) {
-
$pconfig = $_POST;
$retval = 0;
@@ -83,107 +82,75 @@ if ($_GET['act'] == "del") {
$pgtitle = array(gettext("Services"), gettext("IGMP Proxy"));
include("head.inc");
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('igmpproxy'))
+ print_info_box_np(gettext('The IGMP entry list has been changed.' . '<br />' . 'You must apply the changes in order for them to take effect.'));
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
<form action="services_igmpproxy.php" method="post">
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('igmpproxy')): ?><br/>
-<?php print_info_box_np(gettext("The IGMP entry list has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?>
-<?php endif; ?>
-
-<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="igmp proxy">
- <tr>
- <td width="15%" class="listhdrr"><?=gettext("Name");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Type");?></td>
- <td width="25%" class="listhdrr"><?=gettext("Values");?></td>
- <td width="25%" class="listhdr"><?=gettext("Description");?></td>
- <td width="5%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td valign="middle" width="17">&nbsp;</td>
- <td valign="middle">
- <a href="services_igmpproxy_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new igmpentry");?>" alt="add" /></a>
- </td>
+ <th><?=gettext("Name")?></th>
+ <th><?=gettext("Type")?></th>
+ <th><?=gettext("Values")?></th>
+ <th><?=gettext("Description")?></th>
+ <th</th>
</tr>
- </table>
- </td>
- </tr>
+ </thead>
+ <tbody>
<?php
- $i = 0;
- foreach ($a_igmpproxy as $igmpentry):
+$i = 0;
+foreach ($a_igmpproxy as $igmpentry):
?>
- <tr>
- <td class="listlr" ondblclick="document.location='services_igmpproxy_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($igmpentry['ifname']));?>
- </td>
- <td class="listlr" ondblclick="document.location='services_igmpproxy_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($igmpentry['type']);?>
- </td>
- <td class="listr" ondblclick="document.location='services_igmpproxy_edit.php?id=<?=$i;?>';">
+ <tr>
+ <td>
+ <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($igmpentry['ifname']))?>
+ </td>
+ <td>
+ <?=htmlspecialchars($igmpentry['type'])?>
+ </td>
+ <td>
<?php
- $addresses = implode(", ", array_slice(explode(" ", $igmpentry['address']), 0, 10));
- echo $addresses;
- if (count($addresses) < 10) {
- echo " ";
- } else {
- echo "...";
- }
+ $addresses = implode(", ", array_slice(explode(" ", $igmpentry['address']), 0, 10));
+ print($addresses);
+
+ if(count($addresses) < 10) {
+ print(' ');
+ } else {
+ print('...');
+ }
?>
- </td>
- <td class="listbg" ondblclick="document.location='services_igmpproxy_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($igmpentry['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
- <tr>
- <td valign="middle"><a href="services_igmpproxy_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit igmpentry"); ?>" alt="edit" /></a></td>
+ </td>
+ <td>
+ <?=htmlspecialchars($igmpentry['descr'])?>&nbsp;
+ </td>
<td>
- <a href="services_igmpproxy.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this igmp entry? All elements that still use it will become invalid (e.g. filter rules)!");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete igmpentry");?>" alt="delete" /></a>
+ <a href="services_igmpproxy_edit.php?id=<?=$i?>" class="btn btn-info btn-xs"><?=gettext('Edit')?></a>
+ <a href="services_igmpproxy.php?act=del&amp;id=<?=$i?>" class="btn btn-danger btn-xs"><?=gettext('Delete')?></a>
</td>
</tr>
- </table>
- </td>
- </tr>
<?php
- $i++;
- endforeach;
+ $i++;
+endforeach;
?>
- <tr>
- <td class="list" colspan="4"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1">
- <tr>
- <td valign="middle" width="17">&nbsp;</td>
- <td valign="middle"><a href="services_igmpproxy_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new igmpentry");?>" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td colspan="2" width="78%">
- <br />
- <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <br />
- </td>
- </tr>
- <tr>
- <td class="tabcont" colspan="4">
- <p>
- <span class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Note:");?><br />
- </strong>
- </span>
- <?=gettext("Please add the interface for upstream, the allowed subnets, and the downstream interfaces you would like the proxy to allow. Only one 'upstream' interface can be configured.");?>
- </span>
- </p>
- </td>
- </tr>
-</table>
+ </tbody>
+ </table>
+ </div>
+
+ <nav class="action-buttons">
+ <input id="submit" name="submit" type="submit" class="btn btn-primary" value="<?=gettext("Save")?>" />
+ <a href="services_igmpproxy_edit.php" class="btn btn-success"><?=gettext('Add')?></a>
+ </nav>
+
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php
+
+print_info_box(gettext('Please add the interface for upstream, the allowed subnets, and the downstream interfaces you would like the proxy to allow. ' .
+ 'Only one "upstream" interface can be configured.'));
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_igmpproxy_edit.php b/src/usr/local/www/services_igmpproxy_edit.php
index 2d299c0..cbe8307 100644
--- a/src/usr/local/www/services_igmpproxy_edit.php
+++ b/src/usr/local/www/services_igmpproxy_edit.php
@@ -33,7 +33,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: igmpproxy
+ pfSense_MODULE: igmpproxy
*/
##|+PRIV
@@ -67,11 +67,30 @@ if (isset($id) && $a_igmpproxy[$id]) {
$pconfig['type'] = $a_igmpproxy[$id]['type'];
$pconfig['address'] = $a_igmpproxy[$id]['address'];
$pconfig['descr'] = html_entity_decode($a_igmpproxy[$id]['descr']);
+}
+
+// Add a row to the network table
+if($_GET['act'] && $_GET['act'] == 'addrow')
+ $pconfig['address'] .= '/32';
+
+// Remove a row from the network table
+if($_GET['act'] && $_GET['act'] == 'delrow') {
+ $row = $_GET['row'];
+
+ $addresses = explode(" ", $pconfig['address']);
+
+ $pconfig['address'] = "";
+
+ $idx = 0;
+ foreach($addresses as $address) {
+ if($idx != $row)
+ $pconfig['address'] .= ($idx > 0 ? ' ':null) . $address;
+ $idx++;
+ }
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -85,6 +104,7 @@ if ($_POST) {
}
}
}
+
$igmpentry = array();
$igmpentry['ifname'] = $_POST['ifname'];
$igmpentry['threshold'] = $_POST['threshold'];
@@ -128,185 +148,144 @@ if ($_POST) {
include("head.inc");
-?>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+// These two inputs appear inthe original file. Don't know what they are for
+// but they are here just in case.
+
+$h1 = new Form_Input(
+ 'address_type',
+ null,
+ 'textbox',
+ 'hidden'
+ );
+
+$h2 = new Form_Input(
+ 'address_subnet_type',
+ null,
+ 'select',
+ 'hidden'
+ );
+
+$form = new Form;
+
+$section = new Form_Section('IGMP Proxy Edit');
+
+$optionlist = array();
+$iflist = get_configured_interface_with_descr();
+
+foreach ($iflist as $ifnam => $ifdescr)
+ $optionlist[$ifnam] = $ifdescr;
+
+$section->addInput(new Form_Select(
+ 'ifname',
+ 'Interface',
+ $pconfig['ifname'],
+ $optionlist
+));
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$section->addInput(new Form_Select(
+ 'type',
+ 'Type',
+ $pconfig['type'],
+ ['upstream' => gettext('Upstream Interface'), 'downstream' => gettext('Downstream Interface')]
+))->setHelp('The upstream network interface is the outgoing interface which is responsible for communicating to available multicast data sources .' .
+ 'There can only be one upstream interface.' . '<br />' .
+ 'Downstream network interfaces are the distribution interfaces to the destination networks, where multicast clients can join groups and '.
+ 'receive multicast data. One or more downstream interfaces must be configured.');
+
+$section->addInput(new Form_Input(
+ 'threshold',
+ 'Threshold',
+ 'text',
+ $pconfig['threshold']
+))->setHelp('Defines the TTL threshold for the network interface. Packets with a lower TTL than the threshold value will be ignored. ' .
+ 'This setting is optional, and by default the threshold is 1.');
+
+if (isset($id) && $a_igmpproxy[$id]){
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php
- include("fbegin.inc");
-?>
-
-<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js">
-</script>
-<script type="text/javascript" src="/javascript/row_helper.js">
-</script>
-
-<input type="hidden" name="address_type" value="textbox" class="formfld unknown" />
-<input type="hidden" name="address_subnet_type" value="select" />
-
-<script type="text/javascript">
-//<![CDATA[
- rowname[0] = "address";
- rowtype[0] = "textbox,ipv4v6";
- rowsize[0] = "30";
-
- rowname[1] = "address_subnet";
- rowtype[1] = "select,ipv4v6";
- rowsize[1] = "1";
-
- rowname[2] = "detail";
- rowtype[2] = "textbox";
- rowsize[2] = "50";
-//]]>
-</script>
-
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<div id="inputerrors"></div>
-
-<form action="services_igmpproxy_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="igmp proxy edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("IGMP Proxy Edit");?></td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Interface");?></td>
- <td class="vtable">
- <select name="ifname" id="ifname" >
-<?php
- $iflist = get_configured_interface_with_descr();
- foreach ($iflist as $ifnam => $ifdescr) {
- echo "<option value=\"{$ifnam}\"";
- if ($ifnam == $pconfig['ifname']) {
- echo " selected=\"selected\"";
+$counter = 0;
+$address = $pconfig['address'];
+
+if ($address != "") {
+ $item = explode(" ", $address);
+ $rows = count($item) -1;
+ foreach($item as $ww) {
+ $address = $item[$counter];
+ $address_subnet = "";
+ $item2 = explode("/", $address);
+ foreach($item2 as $current) {
+ if($item2[1] != "") {
+ $address = $item2[0];
+ $address_subnet = $item2[1];
+ }
}
- echo ">{$ifdescr}</option>";
- }
-?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed).");?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Type");?></td>
- <td class="vtable">
- <select name="type" class="formselect" id="type" >
- <option value="upstream" <?php if ($pconfig['type'] == "upstream") echo "selected=\"selected\""; ?>><?=gettext("Upstream Interface");?></option>
- <option value="downstream" <?php if ($pconfig['type'] == "downstream") echo "selected=\"selected\""; ?>><?=gettext("Downstream Interface");?></option>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("The <b>upstream</b> network interface is the outgoing interface which is" .
- " responsible for communicating to available multicast data sources." .
- " There can only be one upstream interface.");?>
- </span>
- <br />
- <span class="vexpl">
- <b><?=gettext("Downstream"); ?></b>
- <?=gettext("network interfaces are the distribution interfaces to the" .
- " destination networks, where multicast clients can join groups and" .
- " receive multicast data. One or more downstream interfaces must be configured.");?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Threshold");?></td>
- <td class="vtable">
- <input name="threshold" class="formfld unknown" id="threshold" value="<?php echo htmlspecialchars($pconfig['threshold']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Defines the TTL threshold for the network interface. Packets" .
- " with a lower TTL than the threshold value will be ignored. This" .
- " setting is optional, and by default the threshold is 1.");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><div id="addressnetworkport"><?=gettext("Network (s)");?></div></td>
- <td width="78%" class="vtable">
- <table id="maintable">
- <tbody>
- <tr>
- <td><div id="onecolumn"><?=gettext("Network");?></div></td>
- <td><div id="twocolumn"><?=gettext("CIDR");?></div></td>
- </tr>
+ $item4 = $item3[$counter];
+ $tracker = $counter;
+
+ $group = new Form_group($tracker == 0? 'Network':null);
+
+ $group->add(new Form_Input(
+ 'address' . $tracker,
+ null,
+ 'text',
+ $address,
+ ['placeholder' => 'Address']
+ ))->sethelp($tracker == $rows ? 'Network':null);
+
+ $group->add(new Form_Select(
+ 'ifname',
+ 'Interface',
+ $address_subnet,
+ array_combine(range(32, 1, -1), range(32, 1, -1))
+ ))->sethelp($tracker == $rows ? 'CIDR':null);;
+
+ $btndel = new Form_Button (
+ 'removerow',
+ 'Remove',
+ 'services_igmpproxy_edit.php?act=delrow&row=' . $tracker
+ );
+
+ $btndel->removeClass('btn-primary')->addClass('btn-danger btn-sm');
+ $group->add($btndel);
-<?php
- $counter = 0;
- $address = $pconfig['address'];
- if ($address <> "") {
- $item = explode(" ", $address);
- foreach ($item as $ww) {
- $address = $item[$counter];
- $address_subnet = "";
- $item2 = explode("/", $address);
- foreach ($item2 as $current) {
- if ($item2[1] <> "") {
- $address = $item2[0];
- $address_subnet = $item2[1];
- }
- }
- $item4 = $item3[$counter];
- $tracker = $counter;
-?>
- <tr>
- <td>
- <input name="address<?php echo $tracker; ?>" type="text" class="formfld unknown" id="address<?php echo $tracker; ?>" size="30" value="<?=htmlspecialchars($address);?>" />
- </td>
- <td>
- <select name="address_subnet<?php echo $tracker; ?>" class="formselect" id="address_subnet<?php echo $tracker; ?>">
- <option></option>
- <?php for ($i = 32; $i >= 1; $i--): ?>
- <option value="<?=$i;?>" <?php if ($i == $address_subnet) echo "selected=\"selected\""; ?>><?=$i;?></option>
- <?php endfor; ?>
- </select>
- </td>
- <td>
- <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="delete" /></a>
- </td>
- </tr>
-<?php
$counter++;
+ $section->add($group);
+ } // end foreach
+} // end if
+
+$btnadd = new Form_Button (
+ 'addrow',
+ 'Add Network',
+ 'services_igmpproxy_edit.php?act=addrow'
+ );
+
+$btnadd->removeClass('btn-primary')->addClass('btn-success btn-sm');
+
+$section->addInput(new Form_StaticText(
+ null,
+ $btnadd . ' (Save after each Add or Delete)'
+));
+
+$form->add($section);
+
+print($form);
- } // end foreach
- } // end if
-?>
- </tbody>
- </table>
- <a onclick="javascript:addRowTo('maintable'); return false;" href="#">
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="add" title="<?=gettext("add another entry");?>" />
- </a>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <a href="services_igmpproxy.php"><input id="cancelbutton" name="cancelbutton" type="button" class="formbtn" value="<?=gettext("Cancel");?>" /></a>
- <?php if (isset($id) && $a_igmpproxy[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-
-<script type="text/javascript">
-//<![CDATA[
- field_counter_js = 2;
- rows = 1;
- totalrows = <?php echo $counter; ?>;
- loaded = <?php echo $counter; ?>;
-//]]>
-</script>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_ntpd.php b/src/usr/local/www/services_ntpd.php
index 1f4dd86..412678b 100644
--- a/src/usr/local/www/services_ntpd.php
+++ b/src/usr/local/www/services_ntpd.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: ntpd
+ pfSense_MODULE: ntpd
*/
##|+PRIV
@@ -39,6 +39,7 @@
##|*MATCH=services_ntpd.php*
##|-PRIV
+define(NUMTIMESERVERS, 10); // The maximum number of configurable time servers
require("guiconfig.inc");
require_once('rrd.inc');
require_once("shaper.inc");
@@ -49,7 +50,7 @@ if (!is_array($config['ntpd'])) {
if (empty($config['ntpd']['interface'])) {
if (is_array($config['installedpackages']['openntpd']) && is_array($config['installedpackages']['openntpd']['config']) &&
- is_array($config['installedpackages']['openntpd']['config'][0]) && !empty($config['installedpackages']['openntpd']['config'][0]['interface'])) {
+ is_array($config['installedpackages']['openntpd']['config'][0]) && !empty($config['installedpackages']['openntpd']['config'][0]['interface'])) {
$pconfig['interface'] = explode(",", $config['installedpackages']['openntpd']['config'][0]['interface']);
unset($config['installedpackages']['openntpd']);
write_config("Upgraded settings from openttpd");
@@ -60,8 +61,12 @@ if (empty($config['ntpd']['interface'])) {
$pconfig['interface'] = explode(",", $config['ntpd']['interface']);
}
-if ($_POST) {
+if($_GET['addrow'])
+ $maxrows = $_GET['addrow'] + 1;
+else
+ $maxrows = 3;
+if ($_POST) {
unset($input_errors);
$pconfig = $_POST;
@@ -81,6 +86,7 @@ if ($_POST) {
unset($config['ntpd']['prefer']);
unset($config['ntpd']['noselect']);
$timeservers = '';
+
for ($i = 0; $i < 10; $i++) {
$tserver = trim($_POST["server{$i}"]);
if (!empty($tserver)) {
@@ -199,6 +205,39 @@ if ($_POST) {
$savemsg = get_std_save_message($retval);
}
}
+
+function build_interface_list() {
+ global $pconfig;
+
+ $iflist = array('options' => array(), 'selected' => array());
+
+ $interfaces = get_configured_interface_with_descr();
+ $carplist = get_configured_carp_interface_list();
+
+ foreach ($carplist as $cif => $carpip)
+ $interfaces[$cif] = $carpip . " (" . get_vip_descr($carpip) .")";
+
+ $aliaslist = get_configured_ip_aliases_list();
+
+ foreach ($aliaslist as $aliasip => $aliasif)
+ $interfaces[$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
+
+ $size = (count($interfaces) < 10) ? count($interfaces) : 10;
+
+ foreach ($interfaces as $iface => $ifacename) {
+ if (!is_ipaddr(get_interface_ip($iface)) && !is_ipaddr($iface))
+ continue;
+
+ $iflist['options']['$iface'] = $ifacename;
+
+ if (in_array($iface, $pconfig['interface']))
+ array_push($iflist['slected'], $iface);
+
+ }
+
+ return($iflist);
+}
+
$closehead = false;
$pconfig = &$config['ntpd'];
if (empty($pconfig['interface'])) {
@@ -210,253 +249,305 @@ $pgtitle = array(gettext("Services"), gettext("NTP"));
$shortcut_section = "ntp";
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+$tab_array = array();
+$tab_array[] = array(gettext("NTP"), true, "services_ntpd.php");
+$tab_array[] = array(gettext("Serial GPS"), false, "services_ntpd_gps.php");
+$tab_array[] = array(gettext("PPS"), false, "services_ntpd_pps.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form;
+
+$section = new Form_Section('NTP server configuration');
+
+$iflist = build_interface_list();
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ $iflist['selected'],
+ $iflist['options'],
+ true
+))->setHelp('Interfaces without an IP address will not be shown.' . '<br />' .
+ 'Selecting no interfaces will listen on all interfaces with a wildcard.' . '<br />' .
+ 'Selecting all interfaces will explicitly listen on only the interfaces/IPs specified.');
+
+// NUMTIMESERVERS time servers are always available, but we only display a smaller number of these ($maxrows)
+// Clicking the 'Add Row' button increments $maxrows so you can see more of time servers
+$timeservers = explode( ' ', $config['system']['timeservers']);
+for ($i = $j = 0; $i < NUMTIMESERVERS; $i++){
+
+ if($i >= $maxrows)
+ continue;
+
+ $group = new Form_Group($i == 0 ? 'Time servers':'');
+
+ $group->add(new Form_Input(
+ 'server' . $i,
+ null,
+ 'text',
+ $timeservers[$i]
+ ));
+
+ $group->add(new Form_Checkbox(
+ 'servprefer' . $i,
+ null,
+ 'Prefer',
+ isset($config['ntpd']['prefer']) && isset($timeservers[$i]) && substr_count($config['ntpd']['prefer'], $timeservers[$i])
+ ));
+
+ $group->add(new Form_Checkbox(
+ 'servselect' . $i,
+ null,
+ 'NoSelect',
+ isset($config['ntpd']['noselect']) && isset($timeservers[$i]) && substr_count($config['ntpd']['noselect'], $timeservers[$i])
+ ));
+
+ $section->add($group);
+}
+
+// Show the 'Add Rows' button only if we are currently displaying less than the maximum
+// number of configured servers
+if($maxrows < NUMTIMESERVERS) {
+ $btnaddrow = new Form_Button(
+ 'btnaddrow',
+ 'Add Server',
+ 'services_ntpd.php?addrow=' . $maxrows
+ );
+
+ $btnaddrow->removeClass('btn-primary')->addClass('btn-success btn-sm');
+} else
+ $btnaddrow = false;
+
+$section->addInput(new Form_StaticText(
+ null,
+ $btnaddrow
+))->setHelp('For best results three to five servers should be configured here.' . '<br />' .
+ 'The prefer option indicates that NTP should favor the use of this server more than all others.' . '<br />' .
+ 'The noselect option indicates that NTP should not use this server for time, but stats for this server will be collected and displayed.');
+
+$section->addInput(new Form_Input(
+ 'ntporphan',
+ 'Orphan mode',
+ 'text',
+ $pconfig['ntporphan']
+))->setHelp('Orphan mode allows the system clock to be used when no other clocks are available. ' .
+ 'The number here specifies the stratum reported during orphan mode and should normally be set to a number high enough ' .
+ 'to insure that any other servers available to clients are preferred over this server. (default: 12).');
+
+$section->addInput(new Form_Checkbox(
+ 'statsgraph',
+ 'NTP Graphs',
+ 'Enable RRD graphs of NTP statistics (default: disabled).',
+ $pconfig['statsgraph']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'logpeer',
+ 'Syslog logging',
+ 'Enable logging of peer messages (default: disabled).',
+ $pconfig['logpeer']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'logsys',
+ null,
+ 'Enable logging of system messages (default: disabled).',
+ $pconfig['logsys']
+))->setHelp('These options enable additional messages from NTP to be written to the System Log ' .
+ '<a href="diag_logs_ntpd.php">' . 'Status > System Logs > NTP' . '</a>');
+
+// Statistics logging section
+$btnadvstats = new Form_Button(
+ 'btnadvstats',
+ 'Advanced'
+);
+
+$btnadvstats->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'Statistics logging',
+ $btnadvstats
+))->setHelp('Warning: These options will create persistant daily log files in /var/log/ntp.');
+
+$section->addInput(new Form_Checkbox(
+ 'clockstats',
+ null,
+ 'Enable logging of reference clock statistics (default: disabled).',
+ $pconfig['clockstats']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'loopstats',
+ null,
+ 'Enable logging of clock discipline statistics (default: disabled).',
+ $pconfig['loopstats']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'peerstats',
+ null,
+ 'Enable logging of NTP peer statistics (default: disabled).',
+ $pconfig['peerstats']
+));
+
+// Access restrictions section
+$btnadvrestr = new Form_Button(
+ 'btnadvrestr',
+ 'Advanced'
+);
+
+$btnadvrestr->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'Access Restrictions',
+ $btnadvrestr
+))->setHelp('These options control access to NTP from the WAN.');
+
+$section->addInput(new Form_Checkbox(
+ 'kod',
+ null,
+ 'Enable Kiss-o\'-death packets (default: enabled).',
+ $pconfig['kod']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'nomodify',
+ null,
+ 'Deny state modifications (i.e. run time configuration) by ntpq and ntpdc (default: enabled).',
+ $pconfig['nomodify']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'noquery',
+ null,
+ 'Disable ntpq and ntpdc queries (default: disabled).',
+ $pconfig['noquery']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'noserve',
+ null,
+ 'Disable all except ntpq and ntpdc queries (default: disabled).',
+ $pconfig['noserve']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'nopeer',
+ null,
+ 'Deny packets that attempt a peer association (default: enabled).',
+ $pconfig['nopeer']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'notrap',
+ null,
+ 'Deny mode 6 control message trap service (default: enabled).',
+ $pconfig['notrap']
+))->addClass('advrestrictions');
+
+// Leap seconds section
+$btnleap = new Form_Button(
+ 'btnleap',
+ 'Advanced'
+);
+
+$btnleap->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'Leap seconds',
+ $btnleap
+))->setHelp('A leap second file allows NTP to advertize an upcoming leap second addition or subtraction. ' .
+ 'Normally this is only useful if this server is a stratum 1 time server. ');
+
+$section->addInput(new Form_Textarea(
+ 'leaptext',
+ null,
+ base64_decode(chunk_split($pconfig['leapsec']))
+))->setHelp('Enter Leap second configuration as text OR select a file to upload');
+
+$section->addInput(new Form_Input(
+ 'leapfile',
+ null,
+ 'file'
+))->addClass('btn-default');
+
+$form->add($section);
+print($form);
+
?>
-<script type="text/javascript">
+<script>
//<![CDATA[
- //Generic show an advanced option function
- function show_advanced(showboxID, configvalueID) {
- document.getElementById(showboxID).innerHTML='';
- aodiv = document.getElementById(configvalueID);
- aodiv.style.display = "block";
+events.push(function(){
+
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
}
- //Insure only one of two mutually exclusive options are checked
- function CheckOffOther(clicked, checkOff) {
- if (document.getElementById(clicked).checked) {
- document.getElementById(checkOff).checked=false;
- }
+ // Hides the <div> in which the specified checkbox lives so that the checkbox, its label and help text are hidden
+ function hideCheckbox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
}
- //Show another time server line, limited to 10 servers
- function NewTimeServer(add) {
- //If the last line has a value
- var CheckServer = 'server' + (add - 1);
- var LastId = document.getElementById(CheckServer);
- if (document.getElementById(CheckServer).value != '') {
- if (add < 10) {
- var TimeServerID = 'timeserver' + add;
- document.getElementById(TimeServerID).style.display = 'block';
- //then revise the add another server line
- if (add < 9) {
- var next = add + 1;
- var newdiv = '<img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?php echo gettext("Add another Time server");?>" onclick="NewTimeServer(' + next + ')" alt="add" />\n';
- document.getElementById('addserver').innerHTML=newdiv;
- } else {
- document.getElementById('addserver').style.display = 'none';
- }
- }
- }
- }
+ // Make the ‘clear’ button a plain button, not a submit button
+ $('#btnadvstats').prop('type','button');
+
+ // On click, show the controls in the stats section
+ $("#btnadvstats").click(function() {
+ hideCheckbox('clockstats', false);
+ hideCheckbox('loopstats', false);
+ hideCheckbox('peerstats', false);
+ });
+
+ // Make the ‘clear’ button a plain button, not a submit button
+ $('#btnadvrestr').prop('type','button');
+
+ // On click, show the controls in the restrictions section
+ $("#btnadvrestr").click(function() {
+ hideCheckbox('nomodify', false);
+ hideCheckbox('noquery', false);
+ hideCheckbox('noserve', false);
+ hideCheckbox('nopeer', false);
+ hideCheckbox('notrap', false);
+ });
+
+ // Make the ‘btnleap’ button a plain button, not a submit button
+ $('#btnleap').prop('type','button');
+
+ // On click, show the controls in the leap seconds section
+ $("#btnleap").click(function() {
+ hideInput('leaptext', false);
+ hideInput('leapfile', false);
+ });
+
+ // Set intial states
+ hideCheckbox('clockstats', true);
+ hideCheckbox('loopstats', true);
+ hideCheckbox('peerstats', true);
+ hideCheckbox('kod', true);
+ hideCheckbox('nomodify', true);
+ hideCheckbox('noquery', true);
+ hideCheckbox('noserve', true);
+ hideCheckbox('nopeer', true);
+ hideCheckbox('notrap', true);
+ hideInput('leaptext', true);
+ hideInput('leapfile', true);
+});
//]]>
</script>
-</head>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="services_ntpd.php" method="post" name="iform" id="iform" enctype="multipart/form-data" accept-charset="utf-8">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="ntpd">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("NTP"), true, "services_ntpd.php");
- $tab_array[] = array(gettext("Serial GPS"), false, "services_ntpd_gps.php");
- $tab_array[] = array(gettext("PPS"), false, "services_ntpd_pps.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("NTP Server Configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Interface(s)</td>
- <td width="78%" class="vtable">
-<?php
- $interfaces = get_configured_interface_with_descr();
- $carplist = get_configured_carp_interface_list();
- foreach ($carplist as $cif => $carpip) {
- $interfaces[$cif] = $carpip." (".get_vip_descr($carpip).")";
- }
- $aliaslist = get_configured_ip_aliases_list();
- foreach ($aliaslist as $aliasip => $aliasif) {
- $interfaces[$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
- }
- $size = (count($interfaces) < 10) ? count($interfaces) : 10;
-?>
- <select id="interface" name="interface[]" multiple="multiple" class="formselect" size="<?php echo $size; ?>">
-<?php
- foreach ($interfaces as $iface => $ifacename) {
- if (!is_ipaddr(get_interface_ip($iface)) && !is_ipaddr($iface)) {
- continue;
- }
- echo "<option value='{$iface}'";
- if (is_array($pconfig['interface'])) {
- if (in_array($iface, $pconfig['interface'])) {
- echo " selected=\"selected\"";
- }
- }
- echo ">" . htmlspecialchars($ifacename) . "</option>\n";
- }
-?>
- </select>
- <br />
- <br /><?php echo gettext("Interfaces without an IP address will not be shown."); ?>
- <br />
- <br /><?php echo gettext("Selecting no interfaces will listen on all interfaces with a wildcard."); ?>
- <br /><?php echo gettext("Selecting all interfaces will explicitly listen on only the interfaces/IPs specified."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Time servers</td>
- <td width="78%" class="vtable">
- <?php
- $timeservers = explode(' ', $config['system']['timeservers']);
- for ($i = $j = 0; $i < 10; $i++) {
- echo "<div id=\"timeserver{$i}\"";
- if ((isset($timeservers[$i])) || ($i < 3)) {
- $j++;
- } else {
- echo " style=\"display:none\"";
- }
- echo ">\n";
-
- echo "<input name=\"server{$i}\" class=\"formfld unknown\" id=\"server{$i}\" size=\"30\" value=\"" . htmlspecialchars($timeservers[$i]) . "\" type=\"text\" />&emsp;";
- echo "\n<input name=\"servprefer{$i}\" class=\"formcheckbox\" id=\"servprefer{$i}\" onclick=\"CheckOffOther('servprefer{$i}', 'servselect{$i}')\" type=\"checkbox\"";
- if (isset($config['ntpd']['prefer']) && isset($timeservers[$i]) && substr_count($config['ntpd']['prefer'], $timeservers[$i])) {
- echo " checked=\"checked\"";
- }
- echo " />&nbsp;prefer&emsp;";
- echo "\n<input name=\"servselect{$i}\" class=\"formcheckbox\" id=\"servselect{$i}\" onclick=\"CheckOffOther('servselect{$i}', 'servprefer{$i}')\" type=\"checkbox\"";
- if (isset($config['ntpd']['noselect']) && isset($timeservers[$i]) && substr_count($config['ntpd']['noselect'], $timeservers[$i])) {
- echo " checked=\"checked\"";
- }
- echo " />&nbsp;noselect\n<br />\n</div>\n";
- }
- ?>
- <div id="addserver">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?php echo gettext("Add another Time server");?>" onclick="NewTimeServer(<?php echo $j;?>)" alt="add" />
- </div>
- <br />
- <?php echo gettext('For best results three to five servers should be configured here.'); ?>
- <br />
- <?php echo gettext('The <i>prefer</i> option indicates that NTP should favor the use of this server more than all others.'); ?>
- <br />
- <?php echo gettext('The <i>noselect</i> option indicates that NTP should not use this server for time, but stats for this server will be collected and displayed.'); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Orphan mode</td>
- <td width="78%" class="vtable">
- <input name="ntporphan" type="text" class="formfld unknown" id="ntporphan" min="1" max="16" size="20" value="<?=htmlspecialchars($pconfig['orphan']);?>" /><?php echo gettext("(0-15)");?><br />
- <?php echo gettext("Orphan mode allows the system clock to be used when no other clocks are available. The number here specifies the stratum reported during orphan mode and should normally be set to a number high enough to insure that any other servers available to clients are preferred over this server. (default: 12)."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">NTP graphs</td>
- <td width="78%" class="vtable">
- <input name="statsgraph" type="checkbox" class="formcheckbox" id="statsgraph" <?php if ($pconfig['statsgraph']) echo " checked=\"checked\""; ?> />
- <?php echo gettext("Enable RRD graphs of NTP statistics (default: disabled)."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Syslog logging</td>
- <td width="78%" class="vtable">
- <?php echo gettext("These options enable additional messages from NTP to be written to the System Log");?> (<a href="diag_logs_ntpd.php"><?php echo gettext("Status > System Logs > NTP"); ?></a>).
- <br /><br />
- <input name="logpeer" type="checkbox" class="formcheckbox" id="logpeer"<?php if ($pconfig['logpeer']) echo " checked=\"checked\""; ?> />
- <?php echo gettext("Enable logging of peer messages (default: disabled)."); ?>
- <br />
- <input name="logsys" type="checkbox" class="formcheckbox" id="logsys"<?php if ($pconfig['logsys']) echo " checked=\"checked\""; ?> />
- <?php echo gettext("Enable logging of system messages (default: disabled)."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Statistics logging</td>
- <td width="78%" class="vtable">
- <div id="showstatisticsbox">
- <input type="button" onclick="show_advanced('showstatisticsbox', 'showstatistics')" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show statistics logging options");?>
- </div>
- <div id="showstatistics" style="display:none">
- <strong><?php echo gettext("Warning: ")?></strong><?php echo gettext("these options will create persistent daily log files in /var/log/ntp."); ?>
- <br /><br />
- <input name="clockstats" type="checkbox" class="formcheckbox" id="clockstats"<?php if ($pconfig['clockstats']) echo " checked=\"checked\""; ?> />
- <?php echo gettext("Enable logging of reference clock statistics (default: disabled)."); ?>
- <br />
- <input name="loopstats" type="checkbox" class="formcheckbox" id="loopstats"<?php if ($pconfig['loopstats']) echo " checked=\"checked\""; ?> />
- <?php echo gettext("Enable logging of clock discipline statistics (default: disabled)."); ?>
- <br />
- <input name="peerstats" type="checkbox" class="formcheckbox" id="peerstats"<?php if ($pconfig['peerstats']) echo " checked=\"checked\""; ?> />
- <?php echo gettext("Enable logging of NTP peer statistics (default: disabled)."); ?>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Access restrictions</td>
- <td width="78%" class="vtable">
- <div id="showrestrictbox">
- <input type="button" onclick="show_advanced('showrestrictbox', 'showrestrict')" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show access restriction options");?>
- </div>
- <div id="showrestrict" style="display:none">
- <?php echo gettext("these options control access to NTP from the WAN."); ?>
- <br /><br />
- <input name="kod" type="checkbox" class="formcheckbox" id="kod"<?php if (!$pconfig['kod']) echo " checked=\"checked\""; ?> />
- <?php echo gettext("Enable Kiss-o'-death packets (default: enabled)."); ?>
- <br />
- <input name="nomodify" type="checkbox" class="formcheckbox" id="nomodify"<?php if (!$pconfig['nomodify']) echo " checked=\"checked\""; ?> />
- <?php echo gettext("Deny state modifications (i.e. run time configuration) by ntpq and ntpdc (default: enabled)."); ?>
- <br />
- <input name="noquery" type="checkbox" class="formcheckbox" id="noquery"<?php if ($pconfig['noquery']) echo " checked=\"checked\""; ?> />
- <?php echo gettext("Disable ntpq and ntpdc queries (default: disabled)."); ?>
- <br />
- <input name="noserve" type="checkbox" class="formcheckbox" id="noserve"<?php if ($pconfig['noserve']) echo " checked=\"checked\""; ?> />
- <?php echo gettext("Disable all except ntpq and ntpdc queries (default: disabled)."); ?>
- <br />
- <input name="nopeer" type="checkbox" class="formcheckbox" id="nopeer"<?php if (!$pconfig['nopeer']) echo " checked=\"checked\""; ?> />
- <?php echo gettext("Deny packets that attempt a peer association (default: enabled)."); ?>
- <br />
- <input name="notrap" type="checkbox" class="formcheckbox" id="notrap"<?php if (!$pconfig['notrap']) echo " checked=\"checked\""; ?> />
- <?php echo gettext("Deny mode 6 control message trap service (default: enabled)."); ?>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Leap seconds</td>
- <td width="78%" class="vtable">
- <div id="showleapsecbox">
- <input type="button" onclick="show_advanced('showleapsecbox', 'showleapsec')" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Leap second configuration");?>
- </div>
- <div id="showleapsec" style="display:none">
- <?php echo gettext("A leap second file allows NTP to advertise an upcoming leap second addition or subtraction.");?>
- <?php echo gettext("Normally this is only useful if this server is a stratum 1 time server.");?>
- <br /><br />
- <?php echo gettext("Enter Leap second configuration as text:");?><br />
- <textarea name="leaptxt" class="formpre" id="leaptxt" cols="65" rows="7"><?php $text = base64_decode(chunk_split($pconfig['leapsec'])); echo $text;?></textarea><br />
- <strong><?php echo gettext("Or");?></strong>, <?php echo gettext("select a file to upload:");?>
- <input type="file" name="leapfile" class="formfld file" id="leapfile" />
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_ntpd_gps.php b/src/usr/local/www/services_ntpd_gps.php
index c8098c1..9bf100d 100644
--- a/src/usr/local/www/services_ntpd_gps.php
+++ b/src/usr/local/www/services_ntpd_gps.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: ntpd_gps
+ pfSense_MODULE: ntpd_gps
*/
##|+PRIV
@@ -66,7 +66,6 @@ function set_default_gps() {
}
if ($_POST) {
-
unset($input_errors);
if (!empty($_POST['gpsport']) && file_exists('/dev/'.$_POST['gpsport'])) {
@@ -176,444 +175,371 @@ if ($_POST) {
set_default_gps();
}
}
+
+function build_nmea_list() {
+ global $pconfig;
+
+ $nmealist = array('options' => array(), 'selected' => array());
+
+ $nmealist['options'][0] = 'All';
+ $nmealist['options'][1] = 'RMC';
+ $nmealist['options'][2] = 'GGA';
+ $nmealist['options'][4] = 'GLL';
+ $nmealist['options'][8] = 'ZDA or ZDG';
+
+ if(!$pconfig['nmea'])
+ array_push($nmealist['selected'], 0);
+
+ foreach($nmealist['options'] as $val => $opt) {
+ if($pconfig['nmea'] & $val)
+ array_push($nmealist['selected'], $val);
+ }
+
+ return($nmealist);
+}
+
$closehead = false;
$pconfig = &$config['ntpd']['gps'];
$pgtitle = array(gettext("Services"), gettext("NTP GPS"));
$shortcut_section = "ntp";
include("head.inc");
+
+$tab_array = array();
+$tab_array[] = array(gettext("NTP"), false, "services_ntpd.php");
+$tab_array[] = array(gettext("Serial GPS"), true, "services_ntpd_gps.php");
+$tab_array[] = array(gettext("PPS"), false, "services_ntpd_pps.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form;
+
+$section = new Form_Section('NTP Serial GPS Configuration');
+
+$section->addInput(new Form_StaticText(
+ 'Notes',
+ 'A GPS connected via a serial port may be used as a reference clock for NTP. If the GPS also supports PPS and is properly configured, ' .
+ 'and connected, that GPS may also be used as a Pulse Per Second clock reference. NOTE: A USB GPS may work, but is not recommended due to USB bus timing issues.' . '<br />' .
+ 'For the best results, NTP should have at least three sources of time. So it is best to configure at least 2 servers under ' .
+ '<a href="services_ntpd.php">Services > NTP</a>' .
+ ' to minimize clock drift if the GPS data is not valid over time. Otherwise ntpd may only use values from the unsynchronized local clock when providing time to clients.'
+));
+
+$gpstypes = array('Custom', 'Default', 'Generic', 'Garmin', 'MediaTek', 'SiRF', 'U-Blox', 'SureGPS');
+
+$section->addInput(new Form_Select(
+ 'gpstype',
+ 'GPS',
+ $pconfig['type'],
+ array_combine($gpstypes, $gpstypes)
+))->setHelp('This option allows you to select a predefined configuration.' .
+ 'Default is the configuration of pfSense 2.1 and earlier (not recommended). Select Generic if your GPS is not listed.' . '<br /><br />' .
+ 'The perdefined configurations assume your GPS has already been set to NMEA mode.');
+
+$serialports = glob("/dev/cua?[0-9]{,.[0-9]}", GLOB_BRACE);
+
+if (!empty($serialports)) {
+ $splist = array();
+
+ foreach ($serialports as $port) {
+ $shortport = substr($port,5);
+ $splist[$shortport] = $shortport;
+ }
+
+ $section->addInput(new Form_Select(
+ 'gpsport',
+ 'Serial port',
+ $pconfig['port'],
+ $splist
+ ))->setHelp('All serial ports are listed, be sure to pick the port with the GPS attached. ');
+
+ $section->addInput(new Form_Select(
+ 'gpsspeed',
+ null,
+ $pconfig['speed'],
+ [0 => '4800', 15 => '9600', 32 => '19200', 48 => '38400', 64 => '57600', 80 => '115200']
+
+ ))->setHelp('A higher baud rate is generally only helpful if the GPS is sending too many sentences. ' .
+ 'It is recommended to configure the GPS to send only one sentence at a baud rate of 4800 or 9600.');
+}
+
+$nmealist = build_nmea_list();
+$section->addInput(new Form_Select(
+ 'gpsnmea',
+ 'NMEA Sentences',
+ $nmealist['selected'],
+ $nmealist['options'],
+ true
+))->setHelp('By default NTP will listen for all supported NMEA sentences. One or more sentences to listen for may be specified.');
+
+$section->addInput(new Form_Input(
+ 'gpsfudge1',
+ 'Fudge time 1',
+ 'text',
+ $pconfig['fudge1']
+))->setHelp('Fudge time 1 is used to specify the GPS PPS signal offset (default: 0.0).');
+
+$section->addInput(new Form_Input(
+ 'gpsfudge2',
+ 'Fudge time 2',
+ 'text',
+ $pconfig['fudge2']
+))->setHelp('Fudge time 2 is used to specify the GPS time offset (default: 0.0).');
+
+$section->addInput(new Form_Input(
+ 'gpsstratum',
+ 'Stratum (0-16)',
+ 'text',
+ $pconfig['stratum']
+))->setHelp('This may be used to change the GPS Clock stratum (default: 0). This may be useful if, for some reason, you want ntpd to prefer a different clock');
+
+$section->addInput(new Form_Checkbox(
+ 'gpsprefer',
+ 'Flags',
+ 'NTP should prefer this clock (default: enabled).',
+ !$pconfig['prefer']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'gpsselect',
+ null,
+ 'NTP should not use this clock, it will be displayed for reference only(default: disabled).',
+ $pconfig['noselect']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'gpsflag1',
+ null,
+ 'Enable PPS signal processing (default: enabled).',
+ $pconfig['flag1']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'gpsflag2',
+ null,
+ 'Enable falling edge PPS signal processing (default: rising edge).',
+ $pconfig['flag2']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'gpsflag3',
+ null,
+ 'Enable kernel PPS clock discipline (default: enabled).',
+ $pconfig['flag3']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'gpsflag4',
+ null,
+ 'Obscure location in timestamp (default: unobscured).',
+ $pconfig['flag4']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'gpssubsec',
+ null,
+ 'Log the sub-second fraction of the received time stamp (default: Not logged).',
+ $pconfig['subsec']
+))->setHelp('Enabling this will rapidly fill the log, but is useful for tuning Fudge time 2.');
+
+$section->addInput(new Form_Input(
+ 'gpsrefid',
+ 'Clock ID',
+ 'text',
+ $pconfig['refid'],
+ ['placeholder' => '1 to 4 characters']
+))->setHelp('This may be used to change the GPS Clock ID (default: GPS).');
+
+// Statistics logging section
+$btnadvgps = new Form_Button(
+ 'btnadvgps',
+ 'Advanced'
+);
+
+$btnadvgps->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'GPS Initialization',
+ $btnadvgps . '&nbsp' . 'Show GPS Initialization commands'
+));
+
+$section->addInput(new Form_Textarea(
+ 'gpsinitcmd',
+ null,
+ $pconfig['initcmd']
+))->setHelp('Commands entered here will be sent to the GPS during initialization. Please read and understand your GPS documentation before making any changes here');
+
+$group = new Form_Group('NMEA Checksum Calculator');
+
+$group->add(new Form_Input(
+ 'nmeastring',
+ null
+));
+
+$btncalc = new Form_Button(
+ 'btncalc',
+ 'Calculate'
+);
+
+$btncalc->removeClass('btn-primary')->addClass('btn-success btn-sm');
+
+$group->add($btncalc);
+
+$group->add(new Form_Input(
+ 'result',
+ null,
+ 'text',
+ null,
+ ['placeholder' => 'Result']
+));
+
+$group->setHelp('Enter the text between &quot;$&quot; and &quot;*&quot; of a NMEA command string:');
+$group->addClass('calculator');
+
+$section->add($group);
+
+$form->add($section);
+print($form);
+
?>
-<script type="text/javascript">
+<script>
//<![CDATA[
- function show_advanced(showboxID, configvalueID) {
- document.getElementById(showboxID).innerHTML='';
- aodiv = document.getElementById(configvalueID);
- aodiv.style.display = "block";
- }
+events.push(function(){
- function ToggleOther(clicked, checkOff) {
- if (document.getElementById(clicked).checked) {
- document.getElementById(checkOff).checked=false;
+ function NMEAChecksum(cmd) {
+ // Compute the checksum by XORing all the character values in the string.
+ var checksum = 0;
+
+ for(var i = 0; i < cmd.length; i++) {
+ checksum = checksum ^ cmd.charCodeAt(i);
+ }
+ // Convert it to hexadecimal (base-16, upper case, most significant byte first).
+ var hexsum = Number(checksum).toString(16).toUpperCase();
+
+ if (hexsum.length < 2) {
+ hexsum = ("00" + hexsum).slice(-2);
}
+
+ return(hexsum);
}
-/*
-init commands are Base64 encoded
-Default = #Sponsored, probably a Ublox
- $PUBX,40,GSV,0,0,0,0*59
- $PUBX,40,GLL,0,0,0,0*5C
- $PUBX,40,ZDA,0,0,0,0*44
- $PUBX,40,VTG,0,0,0,0*5E
- $PUBX,40,GSV,0,0,0,0*59
- $PUBX,40,GSA,0,0,0,0*4E
- $PUBX,40,GGA,0,0,0,0
- $PUBX,40,TXT,0,0,0,0
- $PUBX,40,RMC,0,0,0,0*46
- $PUBX,41,1,0007,0003,4800,0
- $PUBX,40,ZDA,1,1,1,1
-
-Generic = #do nothing
-
-Garmin = #most Garmin
- $PGRMC,,,,,,,,,,3,,2,4*52 #enable PPS @ 100ms
- $PGRMC1,,1,,,,,,W,,,,,,,*30 #enable WAAS
- $PGRMO,,3*74 #turn off all sentences
- $PGRMO,GPRMC,1*3D #enable RMC
- $PGRMO,GPGGA,1*20 #enable GGA
- $PGRMO,GPGLL,1*26 #enable GLL
-
-MediaTek = #Adafruit, Fastrax, some Garmin and others
- $PMTK225,0*2B #normal power mode
- $PMTK314,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0*28 #enable GLL, RMC, GGA and ZDA
- $PMTK301,2*2E #enable WAAS
- $PMTK320,0*2F #power save off
- $PMTK330,0*2E #set WGS84 datum
- $PMTK386,0*23 #disable static navigation (MT333X)
- $PMTK397,0*23 #disable static navigation (MT332X)
- $PMTK251,4800*14 #4800 baud rate
-
-SiRF = #used by many devices
- $PSRF103,00,00,01,01*25 #turn on GGA
- $PSRF103,01,00,01,01*24 #turn on GLL
- $PSRF103,02,00,00,01*24 #turn off GSA
- $PSRF103,03,00,00,01*24 #turn off GSV
- $PSRF103,04,00,01,01*24 #turn on RMC
- $PSRF103,05,00,00,01*24 #turn off VTG
- $PSRF100,1,4800,8,1,0*0E #set port to 4800,N,8,1
-
-U-Blox = #U-Blox 5, 6 and probably 7
- $PUBX,40,GGA,1,1,1,1,0,0*5A #turn on GGA all ports
- $PUBX,40,GLL,1,1,1,1,0,0*5C #turn on GLL all ports
- $PUBX,40,GSA,0,0,0,0,0,0*4E #turn off GSA all ports
- $PUBX,40,GSV,0,0,0,0,0,0*59 #turn off GSV all ports
- $PUBX,40,RMC,1,1,1,1,0,0*47 #turn on RMC all ports
- $PUBX,40,VTG,0,0,0,0,0,0*5E #turn off VTG all ports
- $PUBX,40,GRS,0,0,0,0,0,0*5D #turn off GRS all ports
- $PUBX,40,GST,0,0,0,0,0,0*5B #turn off GST all ports
- $PUBX,40,ZDA,1,1,1,1,0,0*44 #turn on ZDA all ports
- $PUBX,40,GBS,0,0,0,0,0,0*4D #turn off GBS all ports
- $PUBX,40,DTM,0,0,0,0,0,0*46 #turn off DTM all ports
- $PUBX,40,GPQ,0,0,0,0,0,0*5D #turn off GPQ all ports
- $PUBX,40,TXT,0,0,0,0,0,0*43 #turn off TXT all ports
- $PUBX,40,THS,0,0,0,0,0,0*54 #turn off THS all ports (U-Blox 6)
- $PUBX,41,1,0007,0003,4800,0*13 # set port 1 to 4800 baud
-
-SureGPS = #Sure Electronics SKG16B
- $PMTK225,0*2B
- $PMTK314,1,1,0,1,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0*2D
- $PMTK301,2*2E
- $PMTK397,0*23
- $PMTK102*31
- $PMTK313,1*2E
- $PMTK513,1*28
- $PMTK319,0*25
- $PMTK527,0.00*00
- $PMTK251,9600*17 #really needs to work at 9600 baud
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
-*/
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
- function set_gps_default(form) {
- //This handles a new config and also a reset to a defined default config
- var gpsdef = new Object();
- //get the text description of the selected type
- var e = document.getElementById("gpstype");
- var type = e.options[e.selectedIndex].text;
+ function set_gps_default(type) {
+ $('#gpsnmea').val(0);
+ $('#gpsspeed').val(0);
+ $('#gpsfudge1').val(0);
//stuff the JS object as needed for each type
switch (type) {
case "Default":
- gpsdef['nmea'] = 0;
- gpsdef['speed'] = 0;
- gpsdef['fudge1'] = "0.155";
- gpsdef['fudge2'] = "";
- gpsdef['inittxt'] = "JFBVQlgsNDAsR1NWLDAsMCwwLDAqNTkNCiRQVUJYLDQwLEdMTCwwLDAsMCwwKjVDDQokUFVCWCw0MCxaREEsMCwwLDAsMCo0NA0KJFBVQlgsNDAsVlRHLDAsMCwwLDAqNUUNCiRQVUJYLDQwLEdTViwwLDAsMCwwKjU5DQokUFVCWCw0MCxHU0EsMCwwLDAsMCo0RQ0KJFBVQlgsNDAsR0dBLDAsMCwwLDANCiRQVUJYLDQwLFRYVCwwLDAsMCwwDQokUFVCWCw0MCxSTUMsMCwwLDAsMCo0Ng0KJFBVQlgsNDEsMSwwMDA3LDAwMDMsNDgwMCwwDQokUFVCWCw0MCxaREEsMSwxLDEsMQ0K";
+ $('#gpsfudge1').val("0.155");
+ $('#gpsfudge2').val("");
+ $('#gpsinitcmd').val("JFBVQlgsNDAsR1NWLDAsMCwwLDAqNTkNCiRQVUJYLDQwLEdMTCwwLDAsMCwwKjVDDQokUFVCWCw0MCxaREEsMCwwLDAsMCo0NA0KJFBVQlgsNDAsVlRHLDAsMCwwLDAqNUUNCiRQVUJYLDQwLEdTViwwLDAsMCwwKjU5DQokUFVCWCw0MCxHU0EsMCwwLDAsMCo0RQ0KJFBVQlgsNDAsR0dBLDAsMCwwLDANCiRQVUJYLDQwLFRYVCwwLDAsMCwwDQokUFVCWCw0MCxSTUMsMCwwLDAsMCo0Ng0KJFBVQlgsNDEsMSwwMDA3LDAwMDMsNDgwMCwwDQokUFVCWCw0MCxaREEsMSwxLDEsMQ0K");
break;
case "Garmin":
- gpsdef['nmea'] = 0;
- gpsdef['speed'] = 0;
- gpsdef['fudge1'] = "";
- gpsdef['fudge2'] = "0.600";
- gpsdef['inittxt'] = "JFBHUk1DLCwsLCwsLCwsLDMsLDIsOCo1RQ0KJFBHUk1DMSwsMSwsLCwsLFcsLCwsLCwsKjMwDQokUEdSTU8sLDMqNzQNCiRQR1JNTyxHUFJNQywxKjNEDQokUEdSTU8sR1BHR0EsMSoyMA0KJFBHUk1PLEdQR0xMLDEqMjYNCg==";
+ $('#gpsfudge2').val("0.600");
+ $('#gpsinitcmd').val("JFBHUk1DLCwsLCwsLCwsLDMsLDIsOCo1RQ0KJFBHUk1DMSwsMSwsLCwsLFcsLCwsLCwsKjMwDQokUEdSTU8sLDMqNzQNCiRQR1JNTyxHUFJNQywxKjNEDQokUEdSTU8sR1BHR0EsMSoyMA0KJFBHUk1PLEdQR0xMLDEqMjYNCg==");
break;
case "Generic":
- gpsdef['nmea'] = 0;
- gpsdef['speed'] = 0;
- gpsdef['fudge1'] = "";
- gpsdef['fudge2'] = "0.400";
- gpsdef['inittxt'] = "";
+ $('#gpsfudge2').val("0.400");
+ $('#gpsinitcmd').val("");
break;
case "MediaTek":
- gpsdef['nmea'] = 0;
- gpsdef['speed'] = 0;
- gpsdef['fudge1'] = "";
- gpsdef['fudge2'] = "0.400";
- gpsdef['inittxt'] = "JFBNVEsyMjUsMCoyQg0KJFBNVEszMTQsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCoyOA0KJFBNVEszMDEsMioyRQ0KJFBNVEszMjAsMCoyRg0KJFBNVEszMzAsMCoyRQ0KJFBNVEszODYsMCoyMw0KJFBNVEszOTcsMCoyMw0KJFBNVEsyNTEsNDgwMCoxNA0K";
+ $('#gpsfudge2').val("0.400");
+ $('#gpsinitcmd').val("JFBNVEsyMjUsMCoyQg0KJFBNVEszMTQsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCoyOA0KJFBNVEszMDEsMioyRQ0KJFBNVEszMjAsMCoyRg0KJFBNVEszMzAsMCoyRQ0KJFBNVEszODYsMCoyMw0KJFBNVEszOTcsMCoyMw0KJFBNVEsyNTEsNDgwMCoxNA0K");
break;
case "SiRF":
- gpsdef['nmea'] = 0;
- gpsdef['speed'] = 0;
- gpsdef['fudge1'] = "";
- gpsdef['fudge2'] = "0.704"; //valid for 4800, 0.688 @ 9600, 0.640 @ USB
- gpsdef['inittxt'] = "JFBTUkYxMDMsMDAsMDAsMDEsMDEqMjUNCiRQU1JGMTAzLDAxLDAwLDAxLDAxKjI0DQokUFNSRjEwMywwMiwwMCwwMCwwMSoyNA0KJFBTUkYxMDMsMDMsMDAsMDAsMDEqMjQNCiRQU1JGMTAzLDA0LDAwLDAxLDAxKjI0DQokUFNSRjEwMywwNSwwMCwwMCwwMSoyNA0KJFBTUkYxMDAsMSw0ODAwLDgsMSwwKjBFDQo=";
+ $('#gpsfudge2').val("0.704"); //valid for 4800, 0.688 @ 9600, 0.640 @ USB
+ $('#gpsinitcmd').val("JFBTUkYxMDMsMDAsMDAsMDEsMDEqMjUNCiRQU1JGMTAzLDAxLDAwLDAxLDAxKjI0DQokUFNSRjEwMywwMiwwMCwwMCwwMSoyNA0KJFBTUkYxMDMsMDMsMDAsMDAsMDEqMjQNCiRQU1JGMTAzLDA0LDAwLDAxLDAxKjI0DQokUFNSRjEwMywwNSwwMCwwMCwwMSoyNA0KJFBTUkYxMDAsMSw0ODAwLDgsMSwwKjBFDQo=");
break;
case "U-Blox":
- gpsdef['nmea'] = 0;
- gpsdef['speed'] = 0;
- gpsdef['fudge1'] = "";
- gpsdef['fudge2'] = "0.400";
- gpsdef['inittxt'] = "JFBVQlgsNDAsR0dBLDEsMSwxLDEsMCwwKjVBDQokUFVCWCw0MCxHTEwsMSwxLDEsMSwwLDAqNUMNCiRQVUJYLDQwLEdTQSwwLDAsMCwwLDAsMCo0RQ0KJFBVQlgsNDAsR1NWLDAsMCwwLDAsMCwwKjU5DQokUFVCWCw0MCxSTUMsMSwxLDEsMSwwLDAqNDcNCiRQVUJYLDQwLFZURywwLDAsMCwwLDAsMCo1RQ0KJFBVQlgsNDAsR1JTLDAsMCwwLDAsMCwwKjVEDQokUFVCWCw0MCxHU1QsMCwwLDAsMCwwLDAqNUINCiRQVUJYLDQwLFpEQSwxLDEsMSwxLDAsMCo0NA0KJFBVQlgsNDAsR0JTLDAsMCwwLDAsMCwwKjREDQokUFVCWCw0MCxEVE0sMCwwLDAsMCwwLDAqNDYNCiRQVUJYLDQwLEdQUSwwLDAsMCwwLDAsMCo1RA0KJFBVQlgsNDAsVFhULDAsMCwwLDAsMCwwKjQzDQokUFVCWCw0MCxUSFMsMCwwLDAsMCwwLDAqNTQNCiRQVUJYLDQxLDEsMDAwNywwMDAzLDQ4MDAsMCoxMw0K";
+ $('#gpsfudge2').val("0.400");
+ $('#gpsinitcmd').val("JFBVQlgsNDAsR0dBLDEsMSwxLDEsMCwwKjVBDQokUFVCWCw0MCxHTEwsMSwxLDEsMSwwLDAqNUMNCiRQVUJYLDQwLEdTQSwwLDAsMCwwLDAsMCo0RQ0KJFBVQlgsNDAsR1NWLDAsMCwwLDAsMCwwKjU5DQokUFVCWCw0MCxSTUMsMSwxLDEsMSwwLDAqNDcNCiRQVUJYLDQwLFZURywwLDAsMCwwLDAsMCo1RQ0KJFBVQlgsNDAsR1JTLDAsMCwwLDAsMCwwKjVEDQokUFVCWCw0MCxHU1QsMCwwLDAsMCwwLDAqNUINCiRQVUJYLDQwLFpEQSwxLDEsMSwxLDAsMCo0NA0KJFBVQlgsNDAsR0JTLDAsMCwwLDAsMCwwKjREDQokUFVCWCw0MCxEVE0sMCwwLDAsMCwwLDAqNDYNCiRQVUJYLDQwLEdQUSwwLDAsMCwwLDAsMCo1RA0KJFBVQlgsNDAsVFhULDAsMCwwLDAsMCwwKjQzDQokUFVCWCw0MCxUSFMsMCwwLDAsMCwwLDAqNTQNCiRQVUJYLDQxLDEsMDAwNywwMDAzLDQ4MDAsMCoxMw0K");
break;
case "SureGPS":
- gpsdef['nmea'] = 1;
- gpsdef['speed'] = 16;
- gpsdef['fudge1'] = "";
- gpsdef['fudge2'] = "0.407";
- gpsdef['inittxt'] = "JFBNVEsyMjUsMCoyQg0KJFBNVEszMTQsMSwxLDAsMSwwLDUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCoyRA0KJFBNVEszMDEsMioyRQ0KJFBNVEszOTcsMCoyMw0KJFBNVEsxMDIqMzENCiRQTVRLMzEzLDEqMkUNCiRQTVRLNTEzLDEqMjgNCiRQTVRLMzE5LDAqMjUNCiRQTVRLNTI3LDAuMDAqMDANCiRQTVRLMjUxLDk2MDAqMTcNCg==";
+ $('#gpsnmea').val(1);
+ $('#gpsspeed').val(16);
+ $('#gpsfudge2').val("0.407");
+ $('#gpsinitcmd').val("JFBNVEsyMjUsMCoyQg0KJFBNVEszMTQsMSwxLDAsMSwwLDUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCoyRA0KJFBNVEszMDEsMioyRQ0KJFBNVEszOTcsMCoyMw0KJFBNVEsxMDIqMzENCiRQTVRLMzEzLDEqMkUNCiRQTVRLNTEzLDEqMjgNCiRQTVRLMzE5LDAqMjUNCiRQTVRLNTI3LDAuMDAqMDANCiRQTVRLMjUxLDk2MDAqMTcNCg==");
break;
default:
return;
}
- //then update the html and set the common stuff
- document.getElementById("gpsnmea").selectedIndex = gpsdef['nmea'];
- document.getElementById("gpsspeed").selectedIndex = gpsdef['speed'];
- form.gpsfudge1.value = gpsdef['fudge1'];
- form.gpsfudge2.value = gpsdef['fudge2'];
- form.gpsstratum.value = "";
- form.gpsrefid.value = "";
- form.gpsspeed.value = gpsdef['speed'];
- document.getElementById("gpsflag1").checked=true
- document.getElementById("gpsflag2").checked=false
- document.getElementById("gpsflag3").checked=true
- document.getElementById("gpsflag4").checked=false
- document.getElementById("gpssubsec").checked=false
- form.gpsinitcmd.value = atob(gpsdef['inittxt']);
+ $('#gpsstratum').val("");
+ $('#gpsrefid').val("");
+ $('#gpsflag1').prop('checked', true);
+ $('#gpsflag2').prop('checked', false);
+ $('#gpsflag3').prop('checked', true);
+ $('#gpsflag4').prop('checked', false);
+ $('#gpssubsec').prop('checked', false);
}
- //function to compute a NMEA checksum derived from the public domain function at http://www.hhhh.org/wiml/proj/nmeaxor.html
- function NMEAChecksum(cmd) {
- // Compute the checksum by XORing all the character values in the string.
- var checksum = 0;
- for (var i = 0; i < cmd.length; i++) {
- checksum = checksum ^ cmd.charCodeAt(i);
+ // Make the ‘Advanced’ button a plain button, not a submit button
+ $('#btnadvgps').prop('type','button');
+
+ // On click, show the controls in the GPS Initialization section
+ $("#btnadvgps").click(function() {
+ hideInput('gpsinitcmd', false);
+ hideClass('calculator', false);
+ });
+
+ // Make the ‘Calculate’ button a plain button, not a submit button
+ $('#btncalc').prop('type','button');
+ $('#result').prop("disabled", true);
+
+ // Onclick read the string from the nmeastring box, calculate the checksum
+ // and display the results in the result box
+ $("#btncalc").click(function() {
+ $('#result').val(NMEAChecksum($('#nmeastring').val()));
+ });
+
+ // When the 'GPS' selector is changed, we set tth gps defaults
+ $('#gpstype').on('change', function() {
+ set_gps_default($(this).val());
+ });
+
+ hideInput('gpsinitcmd', true);
+ hideClass('calculator', true);
+
+ set_gps_default('<?=$pconfig['type']?>');
+
+ // Checkboxes gpsprefer and gpsselect are mutually exclusive
+ $('#gpsprefer').click(function() {
+ if ($(this).is(':checked')) {
+ $('#gpsselect').prop('checked', false);
}
- // Convert it to hexadecimal (base-16, upper case, most significant byte first).
- var hexsum = Number(checksum).toString(16).toUpperCase();
- if (hexsum.length < 2) {
- hexsum = ("00" + hexsum).slice(-2);
+ });
+
+ $('#gpsselect').click(function() {
+ if ($(this).is(':checked')) {
+ $('#gpsprefer').prop('checked', false);
}
- // Display the result
- document.getElementById("nmeachecksum").innerHTML = hexsum;
- }
+ });
+});
//]]>
</script>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="services_ntpd_gps.php" method="post" name="iform" id="iform" accept-charset="utf-8">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="ntpd gps">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("NTP"), false, "services_ntpd.php");
- $tab_array[] = array(gettext("Serial GPS"), true, "services_ntpd_gps.php");
- $tab_array[] = array(gettext("PPS"), false, "services_ntpd_pps.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("NTP Serial GPS Configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">
- </td>
- <td width="78%" class="vtable">A GPS connected via a serial port may be used as a reference clock for NTP. If the GPS also supports PPS and is properly configured, and connected, that GPS may also be used as a Pulse Per Second clock reference. NOTE: a USB GPS may work, but is not recommended due to USB bus timing issues.
- <br />
- <br /><?php echo gettext("For the best results, NTP should have at least three sources of time. So it is best to configure at least 2 servers under"); ?> <a href="services_ntpd.php"><?php echo gettext("Services > NTP"); ?></a> <?php echo gettext("to minimize clock drift if the GPS data is not valid over time. Otherwise ntpd may only use values from the unsynchronized local clock when providing time to clients."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("GPS"); ?></td>
- <td width="78%" valign="top" class="vtable">
- <!-- Start with the original "Default", list a "Generic" and then specific configs alphabetically -->
- <select id="gpstype" name="gpstype" class="formselect" onchange="set_gps_default(this.form)">
- <option value="Custom"<?php if ($pconfig['type'] == 'Custom') echo " selected=\"selected\""; ?>>Custom</option>
- <option value="Default"<?php if ($pconfig['type'] == 'Default') echo " selected=\"selected\""; ?>>Default</option>
- <option value="Generic" title="Generic"<?php if ($pconfig['type'] == 'Generic') echo " selected=\"selected\"";?>>Generic</option>
- <option value="Garmin" title="$PGRM... Most Garmin"<?php if ($pconfig['type'] == 'Garmin') echo " selected=\"selected\"";?>>Garmin</option>
- <option value="MediaTek" title="$PMTK... Adafruit, Fastrax, some Garmin and others"<?php if ($pconfig['type'] == 'MediaTek') echo " selected=\"selected\"";?>>MediaTek</option>
- <option value="SiRF" title="$PSRF... Used by many devices"<?php if ($pconfig['type'] == 'sirf') echo " selected=\"selected\"";?>>SiRF</option>
- <option value="U-Blox" title="$PUBX... U-Blox 5, 6 and probably 7"<?php if ($pconfig['type'] == 'U-Blox') echo " selected=\"selected\"";?>>U-Blox</option>
- <option value="SureGPS" title="$PMTK... Sure Electronics SKG16B"<?php if ($pconfig['type'] == 'SureGPS') echo " selected=\"selected\"";?>>SureGPS</option>
- </select>
- <?php echo gettext("This option allows you to select a predefined configuration.");?>
- <br />
- <br />
- <strong><?php echo gettext("Note: ");?></strong><?php echo gettext("Default is the configuration of pfSense 2.1 and earlier"); ?>
- <?php echo gettext(" (not recommended). Select Generic if your GPS is not listed.)"); ?><br />
- <strong><?php echo gettext("Note: ");?></strong><?php echo gettext("The perdefined configurations assume your GPS has already been set to NMEA mode."); ?>
- </td>
- </tr>
-<?php
- /* Probing would be nice, but much more complex. Would need to listen to each port for 1s+ and watch for strings. */
- $serialports = glob("/dev/cua?[0-9]{,.[0-9]}", GLOB_BRACE);
- if (!empty($serialports)):
-?>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Serial port</td>
- <td width="78%" class="vtable">
- <select name="gpsport" class="formselect">
- <option value="">none</option>
-<?php
- foreach ($serialports as $port):
- $shortport = substr($port, 5);
- $selected = ($shortport == $pconfig['port']) ? " selected=\"selected\"" : "";
-?>
- <option value="<?php echo $shortport;?>"<?php echo $selected;?>><?php echo $shortport;?></option>
-<?php
- endforeach;
-?>
- </select>&nbsp;
- <?php echo gettext("All serial ports are listed, be sure to pick the port with the GPS attached."); ?>
- <br /><br />
- <select id="gpsspeed" name="gpsspeed" class="formselect">
- <option value="0"<?php if (!$pconfig['speed']) echo " selected=\"selected\""; ?>>4800</option>
- <option value="16"<?php if ($pconfig['speed'] === '16') echo " selected=\"selected\"";?>>9600</option>
- <option value="32"<?php if ($pconfig['speed'] === '32') echo " selected=\"selected\"";?>>19200</option>
- <option value="48"<?php if ($pconfig['speed'] === '48') echo " selected=\"selected\"";?>>38400</option>
- <option value="64"<?php if ($pconfig['speed'] === '64') echo " selected=\"selected\"";?>>57600</option>
- <option value="80"<?php if ($pconfig['speed'] === '80') echo " selected=\"selected\"";?>>115200</option>
- </select>&nbsp;<?php echo gettext("Serial port baud rate."); ?>
- <br />
- <br />
- <?php echo gettext("Note: A higher baud rate is generally only helpful if the GPS is sending too many sentences. It is recommended to configure the GPS to send only one sentence at a baud rate of 4800 or 9600."); ?>
- </td>
- </tr>
-<?php
- endif;
-?>
- <tr>
- <!-- 1 = RMC, 2 = GGA, 4 = GLL, 8 = ZDA or ZDG -->
- <td width="22%" valign="top" class="vncellreq">NMEA sentences</td>
- <td width="78%" class="vtable">
- <select id="gpsnmea" name="gpsnmea[]" multiple="multiple" class="formselect" size="5">
- <option value="0"<?php if (!$pconfig['nmea']) echo " selected=\"selected\""; ?>>All</option>
- <option value="1"<?php if ($pconfig['nmea'] & 1) echo " selected=\"selected\"";?>>RMC</option>
- <option value="2"<?php if ($pconfig['nmea'] & 2) echo " selected=\"selected\"";?>>GGA</option>
- <option value="4"<?php if ($pconfig['nmea'] & 4) echo " selected=\"selected\"";?>>GLL</option>
- <option value="8"<?php if ($pconfig['nmea'] & 8) echo " selected=\"selected\"";?>>ZDA or ZDG</option>
- </select><br />
- <?php echo gettext("By default NTP will listen for all supported NMEA sentences. Here one or more sentences to listen for may be specified."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Fudge time 1</td>
- <td width="78%" class="vtable">
- <input name="gpsfudge1" type="text" class="formfld unknown" id="gpsfudge1" min="-1" max="1" size="20" value="<?=htmlspecialchars($pconfig['fudge1']);?>" />(<?php echo gettext("seconds");?>)<br />
- <?php echo gettext("Fudge time 1 is used to specify the GPS PPS signal offset");?> (<?php echo gettext("default");?>: 0.0).
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Fudge time 2</td>
- <td width="78%" class="vtable">
- <input name="gpsfudge2" type="text" class="formfld unknown" id="gpsfudge2" min="-1" max="1" size="20" value="<?=htmlspecialchars($pconfig['fudge2']);?>" />(<?php echo gettext("seconds");?>)<br />
- <?php echo gettext("Fudge time 2 is used to specify the GPS time offset");?> (<?php echo gettext("default");?>: 0.0).
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Stratum</td>
- <td width="78%" class="vtable">
- <input name="gpsstratum" type="text" class="formfld unknown" id="gpsstratum" max="16" size="20" value="<?=htmlspecialchars($pconfig['stratum']);?>" /><?php echo gettext("(0-16)");?><br />
- <?php echo gettext("This may be used to change the GPS Clock stratum");?> (<?php echo gettext("default");?>: 0). <?php echo gettext("This may be useful if, for some reason, you want ntpd to prefer a different clock"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Flags</td>
- <td width="78%" class="vtable">
- <table>
- <tr>
- <td>
- <?php echo gettext("Normally there should be no need to change these options from the defaults."); ?><br />
- </td>
- </tr>
- </table>
- <table>
- <tr>
- <td>
- <input name="gpsprefer" type="checkbox" class="formcheckbox" id="gpsprefer" onclick="ToggleOther('gpsprefer', 'gpsselect')"<?php if (!$pconfig['prefer']) echo " checked=\"checked\""; ?> />
- </td>
- <td>
- <span class="vexpl"><?php echo gettext("NTP should prefer this clock (default: enabled)."); ?></span>
- </td>
- </tr>
- <tr>
- <td>
- <input name="gpsselect" type="checkbox" class="formcheckbox" id="gpsselect" onclick="ToggleOther('gpsselect', 'gpsprefer')"<?php if ($pconfig['noselect']) echo " checked=\"checked\""; ?> />
- </td>
- <td>
- <span class="vexpl"><?php echo gettext("NTP should not use this clock, it will be displayed for reference only(default: disabled)."); ?></span>
- </td>
- </tr>
- <tr>
- <td>
- <input name="gpsflag1" type="checkbox" class="formcheckbox" id="gpsflag1"<?php if ($pconfig['flag1']) echo " checked=\"checked\""; ?> />
- </td>
- <td>
- <span class="vexpl"><?php echo gettext("Enable PPS signal processing (default: enabled)."); ?></span>
- </td>
- </tr>
- <tr>
- <td>
- <input name="gpsflag2" type="checkbox" class="formcheckbox" id="gpsflag2"<?php if ($pconfig['flag2']) echo " checked=\"checked\""; ?> />
- </td>
- <td>
- <span class="vexpl"><?php echo gettext("Enable falling edge PPS signal processing (default: rising edge)."); ?></span>
- </td>
- </tr>
- <tr>
- <td>
- <input name="gpsflag3" type="checkbox" class="formcheckbox" id="gpsflag3"<?php if ($pconfig['flag3']) echo " checked=\"checked\""; ?> />
- </td>
- <td>
- <span class="vexpl"><?php echo gettext("Enable kernel PPS clock discipline (default: enabled)."); ?></span>
- </td>
- </tr>
- <tr>
- <td>
- <input name="gpsflag4" type="checkbox" class="formcheckbox" id="gpsflag4"<?php if ($pconfig['flag4']) echo " checked=\"checked\""; ?> />
- </td>
- <td>
- <span class="vexpl"><?php echo gettext("Obscure location in timestamp (default: unobscured)."); ?></span>
- </td>
- </tr>
- <tr>
- <td>
- <input name="gpssubsec" type="checkbox" class="formcheckbox" id="gpssubsec"<?php if ($pconfig['subsec']) echo " checked=\"checked\""; ?> />
- </td>
- <td>
- <span class="vexpl"><?php echo gettext("Log the sub-second fraction of the received time stamp (default: Not logged).<br />Note: enabling this will rapidly fill the log, but is useful for tuning Fudge time 2."); ?></span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Clock ID</td>
- <td width="78%" class="vtable">
- <input name="gpsrefid" type="text" class="formfld unknown" id="gpsrefid" maxlength= "4" size="20" value="<?=htmlspecialchars($pconfig['refid']);?>" /><?php echo gettext("(1 to 4 charactors)");?><br />
- <?php echo gettext("This may be used to change the GPS Clock ID");?> (<?php echo gettext("default");?>: GPS).
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">GPS Initialization</td>
- <td width="78%" class="vtable">
- <div id="showgpsinitbox">
- <input type="button" onclick="show_advanced('showgpsinitbox', 'showgpsinit')" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show GPS Initialization commands");?>
- </div>
- <div id="showgpsinit" style="display:none">
- <p>
- <textarea name="gpsinitcmd" class="formpre" id="gpsinitcmd" cols="65" rows="7"><?=htmlspecialchars(base64_decode($pconfig['initcmd'])); /*resultmatch*/?></textarea><br />
- <?php echo gettext("Note: Commands entered here will be sent to the GPS during initialization. Please read and understand your GPS documentation before making any changes here.");?><br /><br />
- <strong><?php echo gettext("NMEA checksum calculator");?>:</strong>
- <br />
- <?php echo gettext("Enter the text between &quot;$&quot; and &quot;*&quot; of a NMEA command string:");?><br /> $<input name="nmeastring" type="text" class="formfld unknown" id="nmeastring" size="30" value="" />*<span id="nmeachecksum"><?php echo gettext("checksum");?></span>&nbsp;&nbsp;
- <input type="button" onclick="NMEAChecksum(nmeastring.value)" value="<?=gettext("Calculate NMEA checksum");?>" /><br />
- </p>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-<script type="text/javascript">
-//<![CDATA[
-set_gps_default(this.form);
-//]]>
-</script>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_ntpd_pps.php b/src/usr/local/www/services_ntpd_pps.php
index e4abce0..c8d817b 100644
--- a/src/usr/local/www/services_ntpd_pps.php
+++ b/src/usr/local/www/services_ntpd_pps.php
@@ -49,7 +49,6 @@ if (!is_array($config['ntpd']['pps'])) {
}
if ($_POST) {
-
unset($input_errors);
if (!$input_errors) {
@@ -109,143 +108,102 @@ if ($_POST) {
$savemsg = get_std_save_message($retval);
}
}
+
$pconfig = &$config['ntpd']['pps'];
$pgtitle = array(gettext("Services"), gettext("NTP PPS"));
$shortcut_section = "ntp";
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="services_ntpd_pps.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+$tab_array = array();
+$tab_array[] = array(gettext("NTP"), false, "services_ntpd.php");
+$tab_array[] = array(gettext("Serial GPS"), false, "services_ntpd_gps.php");
+$tab_array[] = array(gettext("PPS"), true, "services_ntpd_pps.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form;
+
+$section = new Form_Section('NTP Serial PPS Configuration');
+
+$section->addInput(new Form_StaticText(
+ 'Notes',
+ 'Devices with a Pulse Per Second output such as radios that receive a time signal from DCF77 (DE), JJY (JP), MSF (GB) or WWVB (US) may be used as a PPS reference for NTP.' .
+ 'A serial GPS may also be used, but the serial GPS driver would usually be the better option. ' .
+ 'A PPS signal only provides a reference to the change of a second, so at least one other source to number the seconds is required.' . '<br /><br />' .
+ 'At least 3 additional time sources should be configured under ' .
+ '<a href="services_ntpd.php">' . 'Services > NTP' . '</a>' . ' to reliably supply the time of each PPS pulse.'
+));
+
+$serialports = glob("/dev/cua?[0-9]{,.[0-9]}", GLOB_BRACE);
+
+if (!empty($serialports)) {
+ $splist = array();
+
+ foreach ($serialports as $port) {
+ $shortport = substr($port,5);
+ $splist[$shortport] = $shortport;
+ }
+
+ $section->addInput(new Form_Select(
+ 'ppsport',
+ 'Serial port',
+ $pconfig['port'],
+ $splist
+ ))->setHelp('All serial ports are listed, be sure to pick the port with the PPS source attached. ');
+}
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="ntpd pps">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("NTP"), false, "services_ntpd.php");
- $tab_array[] = array(gettext("Serial GPS"), false, "services_ntpd_gps.php");
- $tab_array[] = array(gettext("PPS"), true, "services_ntpd_pps.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("NTP PPS Configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">
- </td>
- <td width="78%" class="vtable"><?php echo gettext("Devices with a Pulse Per Second output such as radios that receive a time signal from DCF77 (DE), JJY (JP), MSF (GB) or WWVB (US) may be used as a PPS reference for NTP.");?>
- <?php echo gettext("A serial GPS may also be used, but the serial GPS driver would usually be the better option.");?>
- <?php echo gettext("A PPS signal only provides a reference to the change of a second, so at least one other source to number the seconds is required.");?>
- <br />
- <br /><strong><?php echo gettext("Note");?>:</strong> <?php echo gettext("At least 3 additional time sources should be configured under"); ?> <a href="services_ntpd.php"><?php echo gettext("Services > NTP"); ?></a> <?php echo gettext("to reliably supply the time of each PPS pulse."); ?>
- </td>
- </tr>
-<?php
- $serialports = glob("/dev/cua?[0-9]{,.[0-9]}", GLOB_BRACE);
- if (!empty($serialports)):
-?>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Serial port</td>
- <td width="78%" class="vtable">
- <select name="ppsport" class="formselect">
- <option value="">none</option>
- <?php
- foreach ($serialports as $port):
- $shortport = substr($port, 5);
- $selected = ($shortport == $pconfig['port']) ? " selected=\"selected\"" : "";?>
- <option value="<?php echo $shortport;?>"<?php echo $selected;?>><?php echo $shortport;?></option>
- <?php
- endforeach;
- ?>
- </select>&nbsp;
- <?php echo gettext("All serial ports are listed, be sure to pick the port with the PPS source attached."); ?>
- </td>
- </tr>
-<?php
- endif;
-?>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Fudge time</td>
- <td width="78%" class="vtable">
- <input name="ppsfudge1" type="text" class="formfld unknown" id="ppsfudge1" min="-1" max="1" size="20" value="<?=htmlspecialchars($pconfig['fudge1']);?>" />(<?php echo gettext("seconds");?>)<br />
- <?php echo gettext("Fudge time is used to specify the PPS signal offset from the actual second such as the transmission delay between the transmitter and the receiver.");?> (<?php echo gettext("default");?>: 0.0).
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Stratum</td>
- <td width="78%" class="vtable">
- <input name="ppsstratum" type="text" class="formfld unknown" id="ppsstratum" max="16" size="20" value="<?=htmlspecialchars($pconfig['stratum']);?>" /><?php echo gettext("(0-16)");?><br />
- <?php echo gettext("This may be used to change the PPS Clock stratum");?> (<?php echo gettext("default");?>: 0). <?php echo gettext("This may be useful if, for some reason, you want ntpd to prefer a different clock and just monitor this source."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Flags</td>
- <td width="78%" class="vtable">
- <table summary="flags">
- <tr>
- <td>
- <?php echo gettext("Normally there should be no need to change these options from the defaults."); ?><br />
- </td>
- </tr>
- </table>
- <table>
- <tr>
- <td>
- <input name="ppsflag2" type="checkbox" class="formcheckbox" id="ppsflag2"<?php if ($pconfig['flag2']) echo " checked=\"checked\""; ?> />
- </td>
- <td>
- <span class="vexpl"><?php echo gettext("Enable falling edge PPS signal processing (default: rising edge)."); ?></span>
- </td>
- </tr>
- <tr>
- <td>
- <input name="ppsflag3" type="checkbox" class="formcheckbox" id="ppsflag3"<?php if ($pconfig['flag3']) echo " checked=\"checked\""; ?> />
- </td>
- <td>
- <span class="vexpl"><?php echo gettext("Enable kernel PPS clock discipline (default: disabled)."); ?></span>
- </td>
- </tr>
- <tr>
- <td>
- <input name="ppsflag4" type="checkbox" class="formcheckbox" id="ppsflag4"<?php if ($pconfig['flag4']) echo " checked=\"checked\""; ?> />
- </td>
- <td>
- <span class="vexpl"><?php echo gettext("Record a timestamp once for each second, useful for constructing Allan deviation plots (default: disabled)."); ?></span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq">Clock ID</td>
- <td width="78%" class="vtable">
- <input name="ppsrefid" type="text" class="formfld unknown" id="ppsrefid" maxlength= "4" size="20" value="<?php htmlspecialchars($pconfig['refid']);?>" /><?php echo gettext("(1 to 4 charactors)");?><br />
- <?php echo gettext("This may be used to change the PPS Clock ID");?> (<?php echo gettext("default");?>: PPS).
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+$section->addInput(new Form_Input(
+ 'ppsfudge1',
+ 'Fudge time',
+ 'text',
+ $pconfig['fudge1']
+))->setHelp('Fudge time is used to specify the PPS signal offset from the actual second such as the transmission delay between the transmitter and the receiver. (default: 0.0).');
+
+$section->addInput(new Form_Input(
+ 'ppsstratum',
+ 'Stratum',
+ 'text',
+ $pconfig['stratum']
+))->setHelp('This may be used to change the PPS Clock stratum (default: 0). This may be useful if, for some reason, you want ntpd to prefer a different clock and just monitor this source.');
+
+$section->addInput(new Form_Checkbox(
+ 'ppsflag2',
+ 'Flags',
+ 'Enable falling edge PPS signal processing (default: rising edge).',
+ $pconfig['flag2']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'ppsflag3',
+ null,
+ 'Enable kernel PPS clock discipline (default: disabled).',
+ $pconfig['flag3']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'ppsflag4',
+ null,
+ 'Record a timestamp once for each second, useful for constructing Allan deviation plots (default: disabled).',
+ $pconfig['flag4']
+));
+
+$section->addInput(new Form_Input(
+ 'ppsrefid',
+ 'Clock ID',
+ 'text',
+ $pconfig['refid'],
+ ['placeholder' => '1 to 4 characters']
+))->setHelp('This may be used to change the PPS Clock ID (default: PPS).');
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_rfc2136.php b/src/usr/local/www/services_rfc2136.php
index 87d4770..a73880a 100644
--- a/src/usr/local/www/services_rfc2136.php
+++ b/src/usr/local/www/services_rfc2136.php
@@ -58,149 +58,121 @@ if ($_GET['act'] == "del") {
$pgtitle = array(gettext("Services"), gettext("RFC 2136 clients"));
include("head.inc");
+
+$tab_array = array();
+$tab_array[] = array(gettext("DynDns"), false, "services_dyndns.php");
+$tab_array[] = array(gettext("RFC 2136"), true, "services_rfc2136.php");
+display_top_tabs($tab_array);
+
+if ($input_errors)
+ print_input_errors($input_errors);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
<form action="services_rfc2136.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="rfc2136">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("DynDns"), false, "services_dyndns.php");
- $tab_array[] = array(gettext("RFC 2136"), true, "services_rfc2136.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td width="5%" class="listhdrr"><?=gettext("If");?></td>
- <td width="15%" class="listhdrr"><?=gettext("Server");?></td>
- <td width="20%" class="listhdrr"><?=gettext("Hostname");?></td>
- <td width="25%" class="listhdrr"><?=gettext("Cached IP");?></td>
- <td width="25%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list"></td>
- </tr>
-<?php
- $i = 0;
- foreach ($a_rfc2136 as $rfc2136):
-?>
- <tr ondblclick="document.location='services_rfc2136_edit.php?id=<?=$i;?>'">
- <td class="listlr">
-<?php
- $iflist = get_configured_interface_with_descr();
- foreach ($iflist as $if => $ifdesc) {
- if ($rfc2136['interface'] == $if) {
- if (!isset($rfc2136['enable'])) {
- echo "<span class=\"gray\">{$ifdesc}</span>";
- } else {
- echo "{$ifdesc}";
- }
- break;
- }
- }
-?>
- </td>
- <td class="listr">
+ <th><?=gettext("If")?></th>
+ <th><?=gettext("Server")?></th>
+ <th><?=gettext("Hostname")?></th>
+ <th><?=gettext("Cached IP")?></th>
+ <th><?=gettext("Description")?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- if (!isset($rfc2136['enable'])) {
- echo "<span class=\"gray\">" . htmlspecialchars($rfc2136['server']) . "</span>";
- } else {
- echo htmlspecialchars($rfc2136['server']);
- }
-?>
- </td>
- <td class="listr">
-<?php
- if (!isset($rfc2136['enable'])) {
- echo "<span class=\"gray\">" . htmlspecialchars($rfc2136['host']) . "</span>";
- } else {
- echo htmlspecialchars($rfc2136['host']);
- }
+
+
+$iflist = get_configured_interface_with_descr();
+
+$i = 0;
+foreach ($a_rfc2136 as $rfc2136):
?>
- </td>
- <td class="listr">
+ <tr <?=(isset($rfc2136['enable']) ? '' : 'class="disabled"')?>">
+ <td>
<?php
- $filename = "{$g['conf_path']}/dyndns_{$rfc2136['interface']}_rfc2136_" . escapeshellarg($rfc2136['host']) . "_{$rfc2136['server']}.cache";
- if (file_exists($filename)) {
- echo "IPv4: ";
- if (isset($rfc2136['usepublicip'])) {
- $ipaddr = dyndnsCheckIP($rfc2136['interface']);
- } else {
- $ipaddr = get_interface_ip($rfc2136['interface']);
- }
- $cached_ip_s = explode("|", file_get_contents($filename));
- $cached_ip = $cached_ip_s[0];
- if ($ipaddr <> $cached_ip) {
- echo "<font color='red'>";
- } else {
- echo "<font color='green'>";
- }
- echo htmlspecialchars($cached_ip);
- echo "</font>";
- } else {
- echo "IPv4: N/A";
- }
- echo "<br />";
- if (file_exists("{$filename}.ipv6")) {
- echo "IPv6: ";
- $ipaddr = get_interface_ipv6($rfc2136['interface']);
- $cached_ip_s = explode("|", file_get_contents("{$filename}.ipv6"));
- $cached_ip = $cached_ip_s[0];
- if ($ipaddr <> $cached_ip) {
- echo "<font color='red'>";
- } else {
- echo "<font color='green'>";
- }
- echo htmlspecialchars($cached_ip);
- echo "</font>";
- } else {
- echo "IPv6: N/A";
- }
+ foreach ($iflist as $if => $ifdesc) {
+ if ($rfc2136['interface'] == $if) {
+ print($ifdesc);
+ break;
+ }
+ }
?>
- </td>
- <td class="listbg">
+ </td>
+ <td>
+ <?=htmlspecialchars($rfc2136['server'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($rfc2136['host'])?>
+ </td>
+ <td>
<?php
- if (!isset($rfc2136['enable'])) {
- echo "<span class=\"gray\">" . htmlspecialchars($rfc2136['descr']) . "</span>";
- } else {
- echo htmlspecialchars($rfc2136['descr']);
- }
+ $filename = "{$g['conf_path']}/dyndns_{$rfc2136['interface']}_rfc2136_" . escapeshellarg($rfc2136['host']) . "_{$rfc2136['server']}.cache";
+
+ if (file_exists($filename)) {
+ print('IPv4: ');
+ if (isset($rfc2136['usepublicip']))
+ $ipaddr = dyndnsCheckIP($rfc2136['interface']);
+ else
+ $ipaddr = get_interface_ip($rfc2136['interface']);
+
+ $cached_ip_s = explode("|", file_get_contents($filename));
+ $cached_ip = $cached_ip_s[0];
+
+ if ($ipaddr != $cached_ip)
+ print('<font color="red">');
+ else
+ print('<font color="green">');
+
+ print(tmlspecialchars($cached_ip));
+ print('</font>');
+ } else {
+ print('IPv4: N/A');
+ }
+
+ print('<br />');
+
+ if (file_exists("{$filename}.ipv6")) {
+ print('IPv6: ');
+ $ipaddr = get_interface_ipv6($rfc2136['interface']);
+ $cached_ip_s = explode("|", file_get_contents("{$filename}.ipv6"));
+ $cached_ip = $cached_ip_s[0];
+
+ if ($ipaddr != $cached_ip)
+ print('<font color="red">');
+ else
+ print('<font color="green">');
+
+ print(htmlspecialchars($cached_ip));
+ print('</font>');
+ } else {
+ print('IPv6: N/A');
+ }
+
?>
+ </td>
+ <td>
+ <?=htmlspecialchars($rfc2136['descr'])?>
+ </td>
+ <td>
+ <a href="services_rfc2136_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext('Edit')?></a>
+ <a href="services_rfc2136.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext("Delete")?></a>
</td>
- <td valign="middle" class="list nowrap">
- <a href="services_rfc2136_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;<a href="services_rfc2136.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this client?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
+ </tr>
<?php
- $i++;
- endforeach;
-?>
- <tr>
- <td class="list" colspan="5">&nbsp;</td>
- <td class="list">
- <a href="services_rfc2136_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
- <tr>
- <td colspan="3" class="list">
- <p class="vexpl"><span class="red"><strong><br /></strong></span></p>
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
+ $i++;
+endforeach; ?>
+
+ </tbody>
+ </table>
+ </div>
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<nav class="action-buttons">
+ <a href="services_rfc2136_edit.php" class="btn btn-sm btn-success"><?=gettext('Add')?></a>
+</nav>
+
+<?php
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_rfc2136_edit.php b/src/usr/local/www/services_rfc2136_edit.php
index 686ca27..53445bb 100644
--- a/src/usr/local/www/services_rfc2136_edit.php
+++ b/src/usr/local/www/services_rfc2136_edit.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: dnsupdate
+ pfSense_MODULE: dnsupdate
*/
require("guiconfig.inc");
@@ -132,145 +132,164 @@ if ($_POST) {
$pgtitle = array(gettext("Services"), gettext("RFC 2136 client"), gettext("Edit"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<form action="services_rfc2136_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="rfs2136 edit">
- <tr>
- <td colspan="2" valign="top" class="optsect_t">
- <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="title">
- <tr>
- <td class="optsect_s">
- <strong><?=gettext("RFC 2136 client");?></strong>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Enable");?></td>
- <td width="78%" class="vtable">
- <input name="enable" type="checkbox" id="enable" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface to monitor");?></td>
- <td width="78%" class="vtable">
- <select name="interface" class="formselect" id="interface">
- <?php
- $iflist = get_configured_interface_with_descr();
- foreach ($iflist as $if => $ifdesc):?>
- <option value="<?=$if;?>" <?php if ($pconfig['interface'] == $if) echo "selected=\"selected\"";?>><?=$ifdesc;?></option>
- <?php
- endforeach;
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname");?></td>
- <td width="78%" class="vtable">
- <input name="host" type="text" class="formfld unknown" id="host" size="30" value="<?=htmlspecialchars($pconfig['host']);?>" />
- <br /><span>Fully qualified hostname of the host to be updated</span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("TTL"); ?></td>
- <td class="vtable">
- <input name="ttl" type="text" class="formfld unknown" id="ttl" size="6" value="<?=htmlspecialchars($pconfig['ttl']);?>" />
- <?=gettext("seconds");?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Key name");?></td>
- <td class="vtable">
- <input name="keyname" type="text" class="formfld unknown" id="keyname" size="30" value="<?=htmlspecialchars($pconfig['keyname']);?>" />
- <br />
- <?=gettext("This must match the setting on the DNS server.");?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Key type");?> </td>
- <td class="vtable">
- <input name="keytype" type="radio" value="zone" <?php if ($pconfig['keytype'] == "zone") echo "checked=\"checked\""; ?> /> <?=gettext("Zone");?> &nbsp;
- <input name="keytype" type="radio" value="host" <?php if ($pconfig['keytype'] == "host") echo "checked=\"checked\""; ?> /> <?=gettext("Host");?> &nbsp;
- <input name="keytype" type="radio" value="user" <?php if ($pconfig['keytype'] == "user") echo "checked=\"checked\""; ?> /><?=gettext(" User");?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Key");?></td>
- <td class="vtable">
- <input name="keydata" type="text" class="formfld unknown" id="keydata" size="70" value="<?=htmlspecialchars($pconfig['keydata']);?>" />
- <br />
- <?=gettext("Paste an HMAC-MD5 key here.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Server");?></td>
- <td width="78%" class="vtable">
- <input name="server" type="text" class="formfld unknown" id="server" size="30" value="<?=htmlspecialchars($pconfig['server'])?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol");?></td>
- <td width="78%" class="vtable">
- <input name="usetcp" type="checkbox" id="usetcp" value="<?=gettext("yes");?>" <?php if ($pconfig['usetcp']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Use TCP instead of UDP");?></strong>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Use Public IP");?></td>
- <td width="78%" class="vtable">
- <input name="usepublicip" type="checkbox" id="usepublicip" value="<?=gettext("yes");?>" <?php if ($pconfig['usepublicip']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("If the interface IP is private, attempt to fetch and use the public IP instead.");?></strong>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Record Type");?> </td>
- <td class="vtable">
- <input name="recordtype" type="radio" value="A" <?php if ($pconfig['recordtype'] == "A") echo "checked=\"checked\""; ?> /> <?=gettext("A (IPv4)");?> &nbsp;
- <input name="recordtype" type="radio" value="AAAA" <?php if ($pconfig['recordtype'] == "AAAA") echo "checked=\"checked\""; ?> /> <?=gettext("AAAA (IPv6)");?> &nbsp;
- <input name="recordtype" type="radio" value="both" <?php if ($pconfig['recordtype'] == "both") echo "checked=\"checked\""; ?> /> <?=gettext("Both");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="60" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
- <a href="services_rfc2136.php"><input name="Cancel" type="button" class="formbtn" value="<?=gettext("Cancel");?>" /></a>
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save &amp; Force Update");?>" onclick="enable_change(true)" />
- <?php if (isset($id) && $a_rfc2136[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <span class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Note:");?><br />
- </strong>
- </span>
- <?php printf(gettext("You must configure a DNS server in %sSystem: " .
- "General setup %sor allow the DNS server list to be overridden " .
- "by DHCP/PPP on WAN for dynamic DNS updates to work."), '<a href="system.php">', '</a>');?>
- </span>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+require('classes/Form.class.php');
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg);
+
+$form = new Form;
+
+$section = new Form_Section('RFC 2136 client');
+
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'Enable',
+ null,
+ $pconfig['enable']
+));
+
+$optionlist = array();
+$iflist = get_configured_interface_with_descr();
+
+foreach ($iflist as $ifnam => $ifdescr)
+ $optionlist[$ifnam] = $ifdescr;
+
+$section->addInput(new Form_Select(
+ 'ifname',
+ 'Interface',
+ $pconfig['ifname'],
+ $optionlist
+));
+
+$section->addInput(new Form_Input(
+ 'host',
+ 'Hostname',
+ 'text',
+ $pconfig['host']
+))->setHelp('Fully qualified hostname of the host to be updated');
+
+$section->addInput(new Form_Input(
+ 'ttl',
+ 'TTL (seconds)',
+ 'number',
+ $pconfig['ttl']
+));
+
+$section->addInput(new Form_Input(
+ 'keyname',
+ 'Key name',
+ 'text',
+ $pconfig['keyname']
+))->setHelp('This must match the setting on the DNS server.');
+
+$group = new Form_Group('Key Type');
+
+$group->add(new Form_Checkbox(
+ 'keytype',
+ 'Key Type',
+ 'Zone',
+ ($pconfig['keytype']=='zone'),
+ 'zone'
+))->displayAsRadio();
+
+$group->add($input = new Form_Checkbox(
+ 'keytype',
+ 'Key Type',
+ 'Host',
+ ($pconfig['keytype']=='host'),
+ 'host'
+))->displayAsRadio();
+
+$group->add($input = new Form_Checkbox(
+ 'keytype',
+ 'Key Type',
+ 'User',
+ ($pconfig['keytype']=='user'),
+ 'user'
+))->displayAsRadio();
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'keydata',
+ 'Key',
+ 'text',
+ $pconfig['keydata']
+))->setHelp('Paste an HMAC-MD5 key here.');
+
+$section->addInput(new Form_Input(
+ 'server',
+ 'Server',
+ 'text',
+ $pconfig['server']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'usetcp',
+ 'Protocol',
+ 'Use TCP instead of UDP',
+ $pconfig['usetcp']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'usepublicip',
+ 'Use public IP',
+ 'If the interface IP is private, attempt to fetch and use the public IP instead.',
+ $pconfig['usepublicip']
+));
+
+$group = new Form_Group('Record Type');
+
+$group->add(new Form_Checkbox(
+ 'recordtype',
+ 'Record Type',
+ 'A (IPv4)',
+ ($pconfig['keytype']=='A'),
+ 'A'
+))->displayAsRadio();
+
+$group->add($input = new Form_Checkbox(
+ 'recordtype',
+ 'Record Type',
+ 'AAAA (IPv6)',
+ ($pconfig['keytype']=='AAAA'),
+ 'AAAA'
+))->displayAsRadio();
+
+$group->add($input = new Form_Checkbox(
+ 'recordtype',
+ 'Record Type',
+ 'Both',
+ ($pconfig['keytype']=='both'),
+ 'both'
+))->displayAsRadio();
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+if (isset($id) && $a_rfc2136[$id]){
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+print($form);
+
+print_info_box(sprintf('You must configure a DNS server in %sSystem: ' .
+ 'General setup %sor allow the DNS server list to be overridden ' .
+ 'by DHCP/PPP on WAN for dynamic DNS updates to work.','<a href="system.php">', '</a>'));
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_snmp.php b/src/usr/local/www/services_snmp.php
index a29ade0..ec94af7 100644
--- a/src/usr/local/www/services_snmp.php
+++ b/src/usr/local/www/services_snmp.php
@@ -33,7 +33,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: snmp
+ pfSense_MODULE: snmp
*/
##|+PRIV
@@ -62,6 +62,7 @@ if (!is_array($config['snmpd']['modules'])) {
$config['snmpd']['modules']['ucd'] = true;
$config['snmpd']['modules']['regex'] = true;
}
+
$pconfig['enable'] = isset($config['snmpd']['enable']);
$pconfig['pollport'] = $config['snmpd']['pollport'];
$pconfig['syslocation'] = $config['snmpd']['syslocation'];
@@ -131,7 +132,6 @@ if ($_POST) {
do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
}
-
/* disabled until some docs show up on what this does.
if ($_POST['rwenable']) {
$reqdfields = explode(" ", "rwcommunity");
@@ -174,270 +174,193 @@ if ($_POST) {
}
}
+function build_iplist() {
+ $listenips = get_possible_listen_ips();
+ $iplist = array();
+ $iplist[''] = 'All';
+
+ foreach ($listenips as $lip => $ldescr) {
+ $iplist[$lip] = $ldescr;
+ }
+ unset($listenips);
+
+ return($iplist);
+}
+
$closehead = false;
$pgtitle = array(gettext("Services"), gettext("SNMP"));
$shortcut_section = "snmp";
+
include("head.inc");
-?>
-<script type="text/javascript">
-//<![CDATA[
-function check_deps() {
- if (jQuery('#hostres').prop('checked') == true) {
- jQuery('#mibii').prop('checked', true);
- }
-}
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg);
-function enable_change(whichone) {
-
- if (whichone.name == "trapenable") {
- if (whichone.checked == true) {
- document.iform.trapserver.disabled = false;
- document.iform.trapserverport.disabled = false;
- document.iform.trapstring.disabled = false;
- } else {
- document.iform.trapserver.disabled = true;
- document.iform.trapserverport.disabled = true;
- document.iform.trapstring.disabled = true;
- }
- }
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('SNMP Daemon');
+
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'Enable',
+ 'Enable the SNMP Daemon and its controls',
+ $pconfig['enable']
+));
+
+$form->add($section);
+
+$section = new Form_Section('SNMP Daemon settings');
+
+$section->addInput(new Form_Input(
+ 'pollport',
+ 'Polling Port',
+ 'text',
+ ($pconfig['pollport'] ? $pconfig['pollport']:'161')
+))->setHelp('Enter the port to accept polling events on (default 161)');
+
+$section->addInput(new Form_Input(
+ 'syslocation',
+ 'System Location',
+ 'text',
+ $pconfig['syslocation']
+));
+
+$section->addInput(new Form_Input(
+ 'syscontact',
+ 'System Contact',
+ 'text',
+ $pconfig['syscontact']
+));
+
+$section->addInput(new Form_Input(
+ 'rocommunity',
+ 'Read Community String',
+ 'text',
+ $pconfig['rocommunity']
+))->setHelp('The community string is like a password, restricting access to querying SNMP to hosts knowing the community string. Use a strong value here to protect from unauthorized information disclosure.');
+
+$form->add($section);
+
+$section = new Form_Section('SNMP Traps Enable');
+
+$section->addInput(new Form_Checkbox(
+ 'trapenable',
+ 'Enable',
+ 'Enable the SNMP Trap and its controls',
+ $pconfig['trapenable']
+))->toggles('.toggle-traps');
+
+$form->add($section);
+
+$section = new Form_Section('SNMP Trap settings');
+
+if($pconfig['trapenable'])
+ $section->addClass('toggle-traps', 'in');
+else
+ $section->addClass('toggle-traps', 'collapse');
+
+$section->addInput(new Form_Input(
+ 'trapserver',
+ 'Trap server',
+ 'text',
+ $pconfig['trapserver']
+))->setHelp('Enter the trap server name');
+
+$section->addInput(new Form_Input(
+ 'trapserverport',
+ 'Trap Server Port',
+ 'text',
+ ($pconfig['trapserverport'] ? $pconfig['trapserverport']:'162')
+))->setHelp('Enter the port to send the traps to (default 162)');
+
+$section->addInput(new Form_Input(
+ 'trapstring',
+ 'SNMP Trap String',
+ 'text',
+ $pconfig['trapstring']
+));
+
+$form->add($section);
+
+$section = new Form_Section('SNMP Modules');
+
+$group = new Form_MultiCheckboxGroup('SNMP modules');
+
+$group->add(new Form_MultiCheckbox(
+ 'mibii',
+ null,
+ 'MibII',
+ $pconfig['mibii']
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'netgraph',
+ null,
+ 'Netgraph',
+ $pconfig['netgraph']
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'pf',
+ null,
+ 'PF',
+ $pconfig['pf']
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'hostres',
+ null,
+ 'Host Resources',
+ $pconfig['hostres']
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'ucd',
+ null,
+ 'UCD',
+ $pconfig['ucd']
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'regex',
+ null,
+ 'Regex',
+ $pconfig['regex']
+));
+
+$section->add($group);
+$form->add($section);
+
+$section = new Form_Section('Interface Binding');
+
+$section->addInput(new Form_Select(
+ 'bindip',
+ 'Bind Interface',
+ $pconfig['bindip'],
+ build_iplist()
+));
+
+$form->add($section);
+
+print($form);
+?>
- /* disabled until some docs show up on what this does.
- if (whichone.name == "rwenable") {
- if (whichone.checked == true) {
- document.iform.rwcommunity.disabled = false;
- } else {
- document.iform.rwcommunity.disabled = true;
- }
- }
- */
-
- if (document.iform.enable.checked == true) {
- document.iform.pollport.disabled = false;
- document.iform.syslocation.disabled = false;
- document.iform.syscontact.disabled = false;
- document.iform.rocommunity.disabled = false;
- document.iform.trapenable.disabled = false;
- /* disabled until some docs show up on what this does.
- document.iform.rwenable.disabled = false;
- if (document.iform.rwenable.checked == true) {
- document.iform.rwcommunity.disabled = false;
- } else {
- document.iform.rwcommunity.disabled = true;
- }
- */
- if (document.iform.trapenable.checked == true) {
- document.iform.trapserver.disabled = false;
- document.iform.trapserverport.disabled = false;
- document.iform.trapstring.disabled = false;
- } else {
- document.iform.trapserver.disabled = true;
- document.iform.trapserverport.disabled = true;
- document.iform.trapstring.disabled = true;
- }
- document.iform.mibii.disabled = false;
- document.iform.netgraph.disabled = false;
- document.iform.pf.disabled = false;
- document.iform.hostres.disabled = false;
- document.iform.ucd.disabled = false;
- document.iform.regex.disabled = false;
- //document.iform.bridge.disabled = false;
- } else {
- document.iform.pollport.disabled = true;
- document.iform.syslocation.disabled = true;
- document.iform.syscontact.disabled = true;
- document.iform.rocommunity.disabled = true;
- /*
- document.iform.rwenable.disabled = true;
- document.iform.rwcommunity.disabled = true;
- */
- document.iform.trapenable.disabled = true;
- document.iform.trapserver.disabled = true;
- document.iform.trapserverport.disabled = true;
- document.iform.trapstring.disabled = true;
-
- document.iform.mibii.disabled = true;
- document.iform.netgraph.disabled = true;
- document.iform.pf.disabled = true;
- document.iform.hostres.disabled = true;
- document.iform.ucd.disabled = true;
- document.iform.regex.disabled = true;
- //document.iform.bridge.disabled = true;
- }
-}
-//]]>
-</script>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<form action="services_snmp.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="snmp">
- <tr>
- <td colspan="2" valign="top" class="optsect_t">
- <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="enable">
- <tr>
- <td class="optsect_s"><strong><?=gettext("SNMP Daemon");?></strong></td>
- <td align="right" class="optsect_s">
- <input name="enable" id="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(this)" /> <strong><?=gettext("Enable");?></strong>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Polling Port ");?></td>
- <td width="78%" class="vtable">
- <input name="pollport" type="text" class="formfld unknown" id="pollport" size="40" value="<?=htmlspecialchars($pconfig['pollport']) ? htmlspecialchars($pconfig['pollport']) : htmlspecialchars(161);?>" />
- <br /><?=gettext("Enter the port to accept polling events on (default 161)");?><br />
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("System location");?></td>
- <td width="78%" class="vtable">
- <input name="syslocation" type="text" class="formfld unknown" id="syslocation" size="40" value="<?=htmlspecialchars($pconfig['syslocation']);?>" />
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("System contact");?></td>
- <td width="78%" class="vtable">
- <input name="syscontact" type="text" class="formfld unknown" id="syscontact" size="40" value="<?=htmlspecialchars($pconfig['syscontact']);?>" />
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Read Community String");?></td>
- <td width="78%" class="vtable">
- <input name="rocommunity" type="text" class="formfld unknown" id="rocommunity" size="40" value="<?=htmlspecialchars($pconfig['rocommunity']);?>" />
- <br /><?=gettext("The community string is like a password, restricting access to querying SNMP to hosts knowing the community string. Use a strong value here to protect from unauthorized information disclosure.");?><br />
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- </tr>
-
- <tr>
- <td colspan="2" valign="top" class="optsect_t">
- <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="enable">
- <tr>
- <td class="optsect_s"><strong><?=gettext("SNMP Traps");?></strong></td>
- <td align="right" class="optsect_s">
- <input name="trapenable" id="trapenable" type="checkbox" value="yes" <?php if ($pconfig['trapenable']) echo "checked=\"checked\""; ?> onclick="enable_change(this)" /> <strong><?=gettext("Enable");?></strong>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Trap server");?></td>
- <td width="78%" class="vtable">
- <input name="trapserver" type="text" class="formfld unknown" id="trapserver" size="40" value="<?=htmlspecialchars($pconfig['trapserver']);?>" />
- <br /><?=gettext("Enter trap server name");?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Trap server port ");?></td>
- <td width="78%" class="vtable">
- <input name="trapserverport" type="text" class="formfld unknown" id="trapserverport" size="40" value="<?=htmlspecialchars($pconfig['trapserverport']) ? htmlspecialchars($pconfig['trapserverport']) : htmlspecialchars(162);?>" />
- <br /><?=gettext("Enter the port to send the traps to (default 162)");?><br />
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Enter the SNMP trap string");?></td>
- <td width="78%" class="vtable">
- <input name="trapstring" type="text" class="formfld unknown" id="trapstring" size="40" value="<?=htmlspecialchars($pconfig['trapstring']);?>" />
- <br /><?=gettext("Trap string");?><br />
- </td>
- </tr>
-
- <tr>
- <td>&nbsp;</td>
- </tr>
-
- <tr>
- <td colspan="2" valign="top" class="optsect_t">
- <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="modules">
- <tr>
- <td class="optsect_s"><strong><?=gettext("Modules");?></strong></td>
- <td align="right" class="optsect_s">&nbsp;</td>
- </tr>
- </table>
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("SNMP Modules");?></td>
- <td width="78%" class="vtable">
- <input name="mibii" type="checkbox" id="mibii" value="yes" onclick="check_deps()" <?php if ($pconfig['mibii']) echo "checked=\"checked\""; ?> /><?=gettext("MibII"); ?>
- <br />
- <input name="netgraph" type="checkbox" id="netgraph" value="yes" <?php if ($pconfig['netgraph']) echo "checked=\"checked\""; ?> /><?=gettext("Netgraph"); ?>
- <br />
- <input name="pf" type="checkbox" id="pf" value="yes" <?php if ($pconfig['pf']) echo "checked=\"checked\""; ?> /><?=gettext("PF"); ?>
- <br />
- <input name="hostres" type="checkbox" id="hostres" value="yes" onclick="check_deps()" <?php if ($pconfig['hostres']) echo "checked=\"checked\""; ?> /><?=gettext("Host Resources (Requires MibII)");?>
- <br />
- <input name="ucd" type="checkbox" id="ucd" value="yes" <?php if ($pconfig['ucd']) echo "checked=\"checked\""; ?> /><?=gettext("UCD"); ?>
- <br />
- <input name="regex" type="checkbox" id="regex" value="yes" <?php if ($pconfig['regex']) echo "checked=\"checked\""; ?> /><?=gettext("Regex"); ?>
- <br />
- </td>
- </tr>
-
- <tr>
- <td>&nbsp;</td>
- </tr>
-
- <tr>
- <td colspan="2" valign="top" class="optsect_t">
- <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="interface">
- <tr>
- <td class="optsect_s"><strong><?=gettext("Interface Binding");?></strong></td>
- <td align="right" class="optsect_s">&nbsp;</td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Bind Interface"); ?></td>
- <td width="78%" class="vtable">
- <select name="bindip" class="formselect">
- <option value="">All</option>
- <?php
- $listenips = get_possible_listen_ips();
- foreach ($listenips as $lip => $ldescr):
- $selected = "";
- if ($lip == $pconfig['bindip']) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$lip;?>" <?=$selected;?>>
- <?=htmlspecialchars($ldescr);?>
- </option>
- <?php
- endforeach;
- unset($listenips);
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
- </td>
- </tr>
- </table>
-</form>
<script type="text/javascript">
//<![CDATA[
-enable_change(this);
+
+// hostres requires mibii so we force that here
+events.push(function(){
+ $('#hostres').change(function(){
+ if($('#hostres').is(':checked'))
+ $('#mibii').attr('checked', 'checked');
+ });
+});
//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_unbound.php b/src/usr/local/www/services_unbound.php
index a197c8c..57f72e5 100644
--- a/src/usr/local/www/services_unbound.php
+++ b/src/usr/local/www/services_unbound.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: dnsresolver
+ pfSense_MODULE: dnsresolver
*/
##|+PRIV
@@ -88,6 +88,7 @@ if (empty($config['unbound']['active_interface'])) {
} else {
$pconfig['active_interface'] = explode(",", $config['unbound']['active_interface']);
}
+
if (empty($config['unbound']['outgoing_interface'])) {
$pconfig['outgoing_interface'] = array();
} else {
@@ -202,425 +203,323 @@ if ($_GET['act'] == "del") {
}
}
+function build_if_list() {
+ $interface_addresses = get_possible_listen_ips(true);
+ $iflist = array('options' => array(), 'selected' => array());
+
+ $iflist['options']['all'] = "All";
+ if (empty($pconfig['interface']) || empty($pconfig['interface'][0]))
+ array_push($iflist['selected'], "all");
+
+ foreach ($interface_addresses as $laddr => $ldescr) {
+ $iflist['options'][$laddr] = htmlspecialchars($ldescr);
+
+ if ($pconfig['interface'] && in_array($laddr, $pconfig['interface']))
+ array_push($iflist['selected'], $laddr);
+ }
+
+ unset($interface_addresses);
+
+ return($iflist);
+}
+
$closehead = false;
$pgtitle = array(gettext("Services"), gettext("DNS Resolver"));
$shortcut_section = "resolver";
+
include_once("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+$tab_array = array();
+$tab_array[] = array(gettext("General settings"), true, "services_unbound.php");
+$tab_array[] = array(gettext("Advanced settings"), false, "services_unbound_advanced.php");
+$tab_array[] = array(gettext("Access Lists"), false, "/services_unbound_acls.php");
+display_top_tabs($tab_array, true);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('General DNS Resolver Options');
+
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'Enable',
+ 'Enable DNS resolver',
+ $pconfig['enable']
+));
+
+$section->addInput(new Form_Input(
+ 'port',
+ 'Listen Port',
+ 'text',
+ $pconfig['port']
+))->setHelp('The port used for responding to DNS queries. It should normally be left blank unless another service needs to bind to TCP/UDP port 53.');
+
+$iflist = build_if_list();
+
+$section->addInput(new Form_Select(
+ 'active_interface',
+ 'Network Interfaces',
+ $iflist['selected'],
+ $iflist['options'],
+ true
+))->setHelp('Interface IPs used by the DNS Resolver for responding to queries from clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries to other interface IPs not selected below are discarded. ' .
+ 'The default behavior is to respond to queries on every available IPv4 and IPv6 address.');
+
+$section->addInput(new Form_Select(
+ 'outgoing_interface',
+ 'Outgoing Network Interfaces',
+ $iflist['selected'],
+ $iflist['options'],
+ true
+))->setHelp('Utilize different network interface(s) that the DNS Resolver will use to send queries to authoritative servers and receive their replies. By default all interfaces are used.');
+
+$section->addInput(new Form_Checkbox(
+ 'dnssec',
+ 'DNSSEC',
+ 'Enable DNSSEC Support',
+ $pconfig['dnssec']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'forwarding',
+ 'DNS Query Forwarding',
+ 'Enable Forwarding Mode',
+ $pconfig['forwarding']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'regdhcp',
+ 'DHCP Registration',
+ 'Register DHCP leases in the DNS Resolver',
+ $pconfig['regdhcp']
+))->setHelp(sprintf('If this option is set, then machines that specify their hostname when requesting a DHCP lease will be registered'.
+ ' in the DNS Resolver, so that their name can be resolved.'.
+ ' You should also set the domain in %sSystem: General setup%s to the proper value.','<a href="system.php">','</a>'));
+
+$section->addInput(new Form_Checkbox(
+ 'regdhcpstatic',
+ 'Static DHCP',
+ 'Register DHCP static mappings in the DNS Resolver',
+ $pconfig['regdhcpstatic']
+))->setHelp(sprintf('If this option is set, then DHCP static mappings will be registered in the DNS Resolver, so that their name can be '.
+ 'resolved. You should also set the domain in %s'.
+ 'System: General setup%s to the proper value.','<a href="system.php">','</a>'));
+
+$section->addInput(new Form_Checkbox(
+ 'txtsupport',
+ 'TXT Comment Support',
+ 'Register DHCP static mappings in the DNS Resolver',
+ $pconfig['txtsupport']
+))->setHelp('Any descriptions associated with Host entries and DHCP Static mappings will create a corresponding TXT record.');
+
+$btnadvdns = new Form_Button(
+ 'btnadvdns',
+ 'Advanced'
+);
+
+$btnadvdns->removeClass('btn-primary')->addClass('btn-default btn-sm');
+
+$section->addInput(new Form_StaticText(
+ 'Advanced',
+ $btnadvdns . '&nbsp;' . 'Show advanced optionss'
+));
+
+$section->addInput(new Form_TextArea (
+ 'custom_options',
+ 'Custom options',
+ $pconfig['custom_options']
+))->setHelp('Enter any additional configuration parameters to add to the DNS Resolver configuration here, separated by a newline');
+
+$form->add($section);
+print($form);
+
+print_info_box(sprintf(gettext("If the DNS Resolver is enabled, the DHCP".
+" service (if enabled) will automatically serve the LAN IP".
+" address as a DNS server to DHCP clients so they will use".
+" the DNS Resolver. If Forwarding, is enabled, the DNS Resolver will use the DNS servers".
+" entered in %sSystem: General setup%s".
+" or those obtained via DHCP or PPP on WAN if the &quot;Allow".
+" DNS server list to be overridden by DHCP/PPP on WAN&quot;".
+" is checked."),'<a href="system.php">','</a>'));
?>
-<script type="text/javascript">
+<script>
//<![CDATA[
-function enable_change(enable_over) {
- var endis;
- endis = !(jQuery('#enable').is(":checked") || enable_over);
- jQuery("#active_interface,#outgoing_interface,#dnssec,#forwarding,#regdhcp,#regdhcpstatic,#dhcpfirst,#port,#txtsupport,#custom_options").prop('disabled', endis);
-}
-function show_advanced_dns() {
- jQuery("#showadv").show();
- jQuery("#showadvbox").hide();
-}
+events.push(function(){
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
+ }
+
+ // If hte enable checkbox is not checked, disable the next three checkboxes
+ function disableDHCP() {
+ var hide = ! $('#enable').prop('checked');
+
+ disableInput('port', hide);
+ disableInput('active_interface', hide);
+ disableInput('outgoing_interface', hide);
+ disableInput('regdhcpstatic', hide);
+ disableInput('dnssec', hide);
+ disableInput('forwarding', hide);
+ disableInput('regdhcp', hide);
+ disableInput('regdhcpstatic', hide);
+ disableInput('txtsupport', hide);
+ disableInput('btnadvdns', hide);
+ }
+
+ // Make the ‘aditional options’ button a plain button, not a submit button
+ $("#btnadvdns").prop('type','button');
+
+ // Un-hide aditional controls
+ $("#btnadvdns").click(function() {
+ hideInput('custom_options', false);
+
+ });
+
+ // When 'enable' is clicked, diable/enable the following three checkboxes
+ $('#enable').click(function() {
+ disableDHCP();
+ });
+
+ // On initial load
+ hideInput('custom_options', true);
+ disableDHCP();
+
+});
//]]>
</script>
-</head>
-
-<body>
-<?php include("fbegin.inc"); ?>
-<form action="services_unbound.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('unbound')): ?><br/>
-<?php print_info_box_np(gettext("The configuration of the DNS Resolver has been changed") . ".<br />" . gettext("You must apply changes for them to take effect."));?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="services unbound">
- <tbody>
- <tr>
- <td class="tabnavtbl">
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("General settings"), true, "services_unbound.php");
- $tab_array[] = array(gettext("Advanced settings"), false, "services_unbound_advanced.php");
- $tab_array[] = array(gettext("Access Lists"), false, "/services_unbound_acls.php");
- display_top_tabs($tab_array, true);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tbody>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("General DNS Resolver Options");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Enable");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="enable" type="checkbox" id="enable" value="yes" <?php if (isset($pconfig['enable'])) echo "checked=\"checked\"";?> onclick="enable_change(false)" />
- <strong>
- <?=gettext("Enable DNS Resolver");?><br />
- </strong>
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Listen Port");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="port" type="text" id="port" size="6" <?php if ($pconfig['port']) echo "value=\"" . htmlspecialchars($pconfig['port']) . "\"";?> />
- <br /><br />
- <?=gettext("The port used for responding to DNS queries. It should normally be left blank unless another service needs to bind to TCP/UDP port 53.");?>
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Network Interfaces"); ?></td>
- <td width="78%" class="vtable">
- <?php
- $interface_addresses = get_possible_listen_ips(true);
- ?>
- <?=gettext("Interface IPs used by the DNS Resolver for responding to queries from clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries to other interface IPs not selected below are discarded. The default behavior is to respond to queries on every available IPv4 and IPv6 address.");?>
- <br /><br />
- <select id="active_interface" name="active_interface[]" multiple="multiple" size="<?php echo $size; ?>">
- <option value="all" <?php if (empty($pconfig['active_interface']) || empty($pconfig['active_interface'][0]) || in_array("all", $pconfig['active_interface'], true)) echo 'selected="selected"'; ?>>All</option>
- <?php
- foreach ($interface_addresses as $laddr => $ldescr):
- $selected = "";
- if (in_array($laddr, $pconfig['active_interface'])) {
- $selected = 'selected="selected"';
- }
- ?>
- <option value="<?=$laddr;?>" <?=$selected;?>>
- <?=htmlspecialchars($ldescr);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br /><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Outgoing Network Interfaces"); ?></td>
- <td width="78%" class="vtable">
- <?=gettext("Utilize different network interface(s) that the DNS Resolver will use to send queries to authoritative servers and receive their replies. By default all interfaces are used.");?>
- <br /><br />
- <select id="outgoing_interface" name="outgoing_interface[]" multiple="multiple" size="<?php echo $size; ?>">
- <option value="" <?php if (empty($pconfig['outgoing_interface']) || empty($pconfig['outgoing_interface'][0])) echo 'selected="selected"'; ?>>All</option>
- <?php
- foreach ($interface_addresses as $laddr => $ldescr):
- $selected = "";
- if (in_array($laddr, $pconfig['outgoing_interface'])) {
- $selected = 'selected="selected"';
- }
- ?>
- <option value="<?=$laddr;?>" <?=$selected;?>>
- <?=htmlspecialchars($ldescr);?>
- </option>
- <?php
- endforeach;
- unset($interface_addresses);
- ?>
- </select>
- <br /><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("DNSSEC");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="dnssec" type="checkbox" id="dnssec" value="yes" <?php echo (isset($pconfig['dnssec']) ? "checked=\"checked\"" : "");?> />
- <strong>
- <?=gettext("Enable DNSSEC Support");?><br />
- </strong>
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("DNS Query Forwarding");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="forwarding" type="checkbox" id="forwarding" value="yes" <?php echo (isset($pconfig['forwarding']) ? "checked=\"checked\"" : "");?> />
- <strong><?=gettext("Enable Forwarding Mode");?></strong><br />
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("DHCP Registration");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="regdhcp" type="checkbox" id="regdhcp" value="yes" <?php if (isset($pconfig['regdhcp'])) echo "checked=\"checked\"";?> />
- <strong>
- <?=gettext("Register DHCP leases in the DNS Resolver");?><br />
- </strong>
- <?php printf(gettext("If this option is set, then machines that specify".
- " their hostname when requesting a DHCP lease will be registered".
- " in the DNS Resolver, so that their name can be resolved.".
- " You should also set the domain in %sSystem:".
- " General setup%s to the proper value."), '<a href="system.php">', '</a>')?>
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Static DHCP");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="regdhcpstatic" type="checkbox" id="regdhcpstatic" value="yes" <?php if (isset($pconfig['regdhcpstatic'])) echo "checked=\"checked\"";?> />
- <strong>
- <?=gettext("Register DHCP static mappings in the DNS Resolver");?><br />
- </strong>
- <?php printf(gettext("If this option is set, then DHCP static mappings will ".
- "be registered in the DNS Resolver, so that their name can be ".
- "resolved. You should also set the domain in %s".
- "System: General setup%s to the proper value."), '<a href="system.php">', '</a>');?>
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("TXT Comment Support");?></td>
- <td width="78%" class="vtable">
- <p>
- <input name="txtsupport" type="checkbox" id="txtsupport" value="yes" <?php echo (isset($pconfig['txtsupport']) ? "checked=\"checked\"" : "");?> />
- <strong>
- <?=gettext("If this option is set, then any descriptions associated with Host entries and DHCP Static mappings will create a corresponding TXT record.");?><br />
- </strong>
- </p>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Advanced");?></td>
- <td width="78%" class="vtable">
- <div id="showadvbox" <?php if ($pconfig['custom_options']) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_dns()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
- </div>
- <div id="showadv" <?php if (empty($pconfig['custom_options'])) echo "style='display:none'"; ?>>
- <strong><?=gettext("Advanced");?><br /></strong>
- <textarea rows="6" cols="78" name="custom_options" id="custom_options"><?=htmlspecialchars($pconfig['custom_options']);?></textarea><br />
- <?=gettext("Enter any additional configuration parameters to add to the DNS Resolver configuration here, separated by a newline"); ?><br />
- </div>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <input name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- </td>
- </tr>
- </tbody>
-</table>
-
-
-<p>
- <span class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Note:");?><br />
- </strong>
- </span>
- <?php printf(gettext("If the DNS Resolver is enabled, the DHCP".
- " service (if enabled) will automatically serve the LAN IP".
- " address as a DNS server to DHCP clients so they will use".
- " the DNS Resolver. If Forwarding, is enabled, the DNS Resolver will use the DNS servers".
- " entered in %sSystem: General setup%s".
- " or those obtained via DHCP or PPP on WAN if the &quot;Allow".
- " DNS server list to be overridden by DHCP/PPP on WAN&quot;".
- " is checked."), '<a href="system.php">', '</a>');?>
- <br />
- </span>
-</p>
-
-&nbsp;<br />
-<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont" summary="host overrides">
- <tr>
- <td colspan="5" valign="top" class="listtopic"><?=gettext("Host Overrides");?></td>
- </tr>
- <tr>
- <td>
- <br />
- <?=gettext("Entries in this section override individual results from the forwarders.");?>
- <?=gettext("Use these for changing DNS results or for adding custom DNS records.");?>
- </td>
- </tr>
-</table>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont sortable" summary="results">
- <thead>
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Host");?></td>
- <td width="25%" class="listhdrr"><?=gettext("Domain");?></td>
- <td width="20%" class="listhdrr"><?=gettext("IP");?></td>
- <td width="30%" class="listhdr"><?=gettext("Description");?></td>
- <td width="5%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td width="17"></td>
- <td valign="middle"><a href="services_unbound_host_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- </thead>
- <tfoot>
- <tr>
- <td class="list" colspan="4"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Host Overrides")?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td width="17"></td>
- <td valign="middle"><a href="services_unbound_host_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ <th><?=gettext("Host")?></th>
+ <th><?=gettext("Domain")?></th>
+ <th><?=gettext("IP")?></th>
+ <th><?=gettext("Description")?></th>
+ <th></th>
</tr>
- </table>
- </td>
- </tr>
- </tfoot>
- <tbody>
+ </thead>
+ <tbody>
<?php
- $i = 0;
- foreach ($a_hosts as $hostent):
+$i = 0;
+foreach ($a_hosts as $hostent):
?>
- <tr>
- <td class="listlr" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
- <?=strtolower($hostent['host']);?>&nbsp;
- </td>
- <td class="listr" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
- <?=strtolower($hostent['domain']);?>&nbsp;
- </td>
- <td class="listr" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
- <?=$hostent['ip'];?>&nbsp;
- </td>
- <td class="listbg" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($hostent['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
<tr>
- <td valign="middle"><a href="services_unbound_host_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a></td>
- <td><a href="services_unbound.php?type=host&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this host?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a></td>
+ <td>
+ <?=strtolower($hostent['host'])?>
+ </td>
+ <td>
+ <?=strtolower($hostent['domain'])?>
+ </td>
+ <td>
+ <?=$hostent['ip']?>&nbsp;
+ </td>
+ <td>
+ <?=htmlspecialchars($hostent['descr'])?>
+ </td>
+ <td>
+ <a href="services_dnsmasq_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext('Edit')?></a>
+ <a href="services_dnsmasq.php?type=host&amp;act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext('Delete')?></a>
+ </td>
</tr>
- </table>
- </td>
- </tr>
-<?php
- if ($hostent['aliases']['item'] && is_array($hostent['aliases']['item'])):
- foreach ($hostent['aliases']['item'] as $alias):
-?>
- <tr>
- <td class="listlr" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
- <?=strtolower($alias['host']);?>&nbsp;
- </td>
- <td class="listr" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
- <?=strtolower($alias['domain']);?>&nbsp;
- </td>
- <td class="listr" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
- Alias for <?=$hostent['host'] ? $hostent['host'] . '.' . $hostent['domain'] : $hostent['domain'];?>&nbsp;
- </td>
- <td class="listbg" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($alias['description']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <a href="services_unbound_host_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- </td>
- </tr>
+
<?php
- endforeach;
- endif;
- $i++;
- endforeach;
+ if ($hostent['aliases']['item'] && is_array($hostent['aliases']['item'])):
+ foreach ($hostent['aliases']['item'] as $alias):
?>
- <tr style="display:none"><td></td></tr>
- </tbody>
-</table>
-<br />
-<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont" summary="domain overrides">
-<tr>
- <td colspan="5" valign="top" class="listtopic"><?=gettext("Domain Overrides");?></td>
-</tr>
-<tr>
- <td>
- <p>
- <?=gettext("Entries in this area override an entire domain by specifying an".
- " authoritative DNS server to be queried for that domain.");?>
- <?=gettext("If there are multiple authoritative DNS servers available for a domain then make a separate entry for each, using the same domain name.");?>
- </p>
- </td>
-</tr>
-</table>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont sortable" summary="results">
- <thead>
- <tr>
- <td width="35%" class="listhdrr"><?=gettext("Domain");?></td>
- <td width="20%" class="listhdrr"><?=gettext("IP");?></td>
- <td width="40%" class="listhdr"><?=gettext("Description");?></td>
- <td width="5%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
<tr>
- <td width="17" height="17"></td>
- <td><a href="services_unbound_domainoverride_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ <td>
+ <?=strtolower($alias['host'])?>
+ </td>
+ <td>
+ <?=strtolower($alias['domain'])?>
+ </td>
+ <td>
+ Alias for <?=$hostent['host'] ? $hostent['host'] . '.' . $hostent['domain'] : $hostent['domain']?>
+ </td>
+ <td>
+ <?=htmlspecialchars($alias['description'])?>
+ </td>
+ <td>
+ <a href="services_dnsmasq_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext('Edit')?></a>
+ </td>
</tr>
- </table>
- </td>
- </tr>
- </thead>
- <tfoot>
- <tr>
- <td class="list" colspan="3"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
+<?php
+ endforeach;
+ endif;
+ $i++;
+endforeach;
+?>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<nav class="action-buttons">
+ <a href="services_dnsmasq_edit.php" class="btn btn-sm btn-success"><?=gettext('Add')?></a>
+</nav>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Domain Overrides")?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td width="17" height="17"></td>
- <td><a href="services_unbound_domainoverride_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ <th><?=gettext("Domain")?></th>
+ <th><?=gettext("IP")?></th>
+ <th><?=gettext("Description")?></th>
+ <th></th>
</tr>
- </table>
- </td>
- </tr>
- </tfoot>
- <tbody>
+ </thead>
+
+ <tbody>
<?php
- $i = 0;
- foreach ($a_domainOverrides as $doment):
+$i = 0;
+foreach ($a_domainOverrides as $doment):
?>
- <tr>
- <td class="listlr">
- <?=strtolower($doment['domain']);?>&nbsp;
- </td>
- <td class="listr">
- <?=$doment['ip'];?>&nbsp;
- </td>
- <td class="listbg">
- <?=htmlspecialchars($doment['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
<tr>
- <td valign="middle">
- <a href="services_unbound_domainoverride_edit.php?id=<?=$i;?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" />
- </a>
+ <td>
+ <?=strtolower($doment['domain'])?>&nbsp;
</td>
- <td valign="middle">
- <a href="services_unbound.php?act=del&amp;type=doverride&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this domain override?");?>')">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" />
- </a>
+ <td>
+ <?=$doment['ip']?>&nbsp;
+ </td>
+ <td>
+ <?=htmlspecialchars($doment['descr'])?>&nbsp;
+ </td>
+ <td>
+ <a href="services_dnsmasq_domainoverride_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext('Edit')?></a>
+ <a href="services_dnsmasq.php?act=del&amp;type=doverride&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext('Delete')?></a>
</td>
</tr>
- </table>
- </td>
- </tr>
<?php
- $i++;
- endforeach;
+ $i++;
+endforeach;
?>
- <tr style="display:none"><td></td></tr>
- </tbody>
-</table>
-</form>
-<script type="text/javascript">
-//<![CDATA[
-enable_change(false);
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<nav class="action-buttons">
+ <a href="services_dnsmasq_domainoverride_edit.php" class="btn btn-sm btn-success"><?=gettext('Add')?></a>
+</nav>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_unbound_acls.php b/src/usr/local/www/services_unbound_acls.php
index 3a51b3e..c0ca3b8 100644
--- a/src/usr/local/www/services_unbound_acls.php
+++ b/src/usr/local/www/services_unbound_acls.php
@@ -33,12 +33,6 @@
require("guiconfig.inc");
require("unbound.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_unbound_acls.php');
-}
-
if (!is_array($config['unbound']['acls'])) {
$config['unbound']['acls'] = array();
}
@@ -46,6 +40,7 @@ if (!is_array($config['unbound']['acls'])) {
$a_acls = &$config['unbound']['acls'];
$id = $_GET['id'];
+
if (isset($_POST['aclid'])) {
$id = $_POST['aclid'];
}
@@ -56,6 +51,7 @@ if (!empty($id) && !is_numeric($id)) {
}
$act = $_GET['act'];
+
if (isset($_POST['act'])) {
$act = $_POST['act'];
}
@@ -82,17 +78,30 @@ if ($act == "edit") {
}
}
+// Add a row to the networks table
+if($_GET && $_GET['addrow'])
+ array_push($networkacl, array('acl_network' => '', 'mask' => '32', 'description' => ''));
+
if ($_POST) {
unset($input_errors);
$pconfig = $_POST;
-
+ $deleting = false;
+
+ // Delete a row from the networks table
+ for($idx = 0; $idx<50; $idx++) {
+ if($pconfig['dlt' . $idx] == 'Delete') {
+ unset($networkacl[$idx]);
+ $deleting = true;
+ break;
+ }
+ }
+
if ($_POST['apply']) {
$retval = services_unbound_configure();
$savemsg = get_std_save_message($retval);
- if ($retval == 0) {
+ if ($retval == 0)
clear_subsystem_dirty('unbound');
- }
- } else {
+ } else if(!$deleting) {
// input validation - only allow 50 entries in a single ACL
for ($x = 0; $x < 50; $x++) {
@@ -157,265 +166,177 @@ $pgtitle = "Services: DNS Resolver: Access Lists";
$shortcut_section = "resolver";
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('unbound'))
+ print_info_box_np(gettext("The configuration of the DNS Resolver, has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
+
+$tab_array = array();
+$tab_array[] = array(gettext("General Settings"), false, "/services_unbound.php");
+$tab_array[] = array(gettext("Advanced settings"), false, "services_unbound_advanced.php");
+$tab_array[] = array(gettext("Access Lists"), true, "/services_unbound_acls.php");
+display_top_tabs($tab_array, true);
+
+require('classes/Form.class.php');
+
+if($act=="new" || $act=="edit") {
+
+ $form = new Form();
+
+ $section = new Form_Section('New Access List');
+
+ $section->addInput(new Form_Input(
+ 'aclid',
+ null,
+ 'hidden',
+ $id
+ ));
+
+ $section->addInput(new Form_Input(
+ 'act',
+ null,
+ 'hidden',
+ $act
+ ));
+
+ $section->addInput(new Form_Input(
+ 'aclname',
+ 'Access LIst name',
+ 'text',
+ $pconfig['aclname']
+ ))->setHelp('Provide an Access List name.');
+
+ $section->addInput(new Form_Select(
+ 'action',
+ 'Action',
+ strtolower($pconfig['aclaction']),
+ array('allow' => 'Allow','deny' => 'Deny','refuse' => 'Refuse','allow snoop' => 'Allow Snoop')
+ ))->setHelp('Choose what to do with DNS requests that match the criteria specified below.' . '<br />' .
+ 'Deny: Stops queries from hosts within the netblock defined below.' . '<br />' .
+ 'Refuse: Stops queries from hosts within the netblock defined below, but sends a DNS rcode REFUSED error message back to the client.' . '<br />' .
+ 'Allow: Allow queries from hosts within the netblock defined below.' . '<br />' .
+ 'Allow Snoop: Allow recursive and nonrecursive access from hosts within the netblock defined below. Used for cache snooping and ideally should only be configured for your administrative host.');
+
+ $counter = 0;
+ $numrows = count($networkacl) - 1;
+
+ foreach($networkacl as $item) {
+ $network = $item['acl_network'];
+ $cidr = $item['mask'];
+ $description = $item['description'];
+
+ $group = new Form_Group($counter == 0 ? 'Networks':null);
+
+ $group->add(new Form_IpAddress(
+ 'acl_network' . $counter,
+ null,
+ $network
+ ))->setHelp(($counter == $numrows) ? 'Network':null);
+
+ $group->add(new Form_Select(
+ 'mask' . $counter,
+ null,
+ $cidr,
+ array_combine(range(32, 1, -1), range(32, 1, -1))
+ ))->setWidth(2)->setHelp(($counter == $numrows) ? 'Mask':null);
+
+ $group->add(new Form_Input(
+ 'description' . $counter,
+ null,
+ 'text',
+ $description
+ ))->setWidth(3)->setHelp(($counter == $numrows) ? 'Description':null);
+
+ $btndlt = new Form_Button(
+ 'dlt' . $counter,
+ 'Delete'
+ );
+
+ $btndlt->removeClass('btn-primary')->addClass('btn-sm btn-danger');
+
+ $group->add($btndlt);
+
+ $section->add($group);
+
+ $counter++;
+ }
+
+ $btnadd = new Form_Button(
+ 'btnadd',
+ 'Add row',
+ 'services_unbound_acls.php?act=' . $act . '&addrow=yes'
+ );
+
+ $btnadd->removeClass(btn-primary)->addClass('btn-sm btn-success');
+
+ $section->addInput(new Form_StaticText(
+ 'Add row',
+ $btnadd
+ ))->setHelp('Remember to save after each Add or Delete');
+
+ $section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+ ))->setHelp('You may enter a description here for your reference.');
+
+ $form->add($section);
+ print($form);
+}
+else // NOT 'edit' or 'add'
+{
?>
-
-<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
-<script type="text/javascript" src="/javascript/row_helper.js"></script>
-
-<script type="text/javascript">
-//<![CDATA[
- rowname[0] = "acl_network";
- rowtype[0] = "textbox,ipv4v6";
- rowsize[0] = "30";
-
- rowname[1] = "mask";
- rowtype[1] = "select,ipv4v6";
- rowsize[1] = "1";
-
- rowname[2] = "description";
- rowtype[2] = "textbox";
- rowsize[2] = "40";
-//]]>
-</script>
-</head>
-
-<body>
-
-<?php include("fbegin.inc"); ?>
-<form action="services_unbound_acls.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('unbound')): ?><br/>
-<?php print_info_box_np(gettext("The configuration of the DNS Resolver, has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
-<?php endif; ?>
-
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="services unbound acls">
- <tbody>
- <tr>
- <td class="tabnavtbl">
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("General Settings"), false, "/services_unbound.php");
- $tab_array[] = array(gettext("Advanced settings"), false, "services_unbound_advanced.php");
- $tab_array[] = array(gettext("Access Lists"), true, "/services_unbound_acls.php");
- display_top_tabs($tab_array, true);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
-<?php
- if ($act == "new" || $act == "edit"):
-?>
- <input name="aclid" type="hidden" value="<?=$id;?>" />
- <input name="act" type="hidden" value="<?=$act;?>" />
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=ucwords(sprintf(gettext("%s Access List"), $act));?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Access List name");?></td>
- <td width="78%" class="vtable">
- <input name="aclname" type="text" class="formfld" id="aclname" size="30" maxlength="30" value="<?=htmlspecialchars($pconfig['aclname']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Provide an Access List name.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Action");?></td>
- <td width="78%" class="vtable">
- <select name="aclaction" class="formselect">
- <?php
- $types = explode(",", "Allow,Deny,Refuse,Allow Snoop");
- foreach ($types as $type):
- ?>
- <option value="<?=strtolower($type);?>" <?php if (strtolower($type) == strtolower($pconfig['aclaction'])) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($type);?>
- </option>
- <?php
- endforeach;
- ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Choose what to do with DNS requests that match the criteria specified below.");?> <br />
- <?=gettext("<b>Deny:</b> This action stops queries from hosts within the netblock defined below.");?> <br />
- <?=gettext("<b>Refuse:</b> This action also stops queries from hosts within the netblock defined below, but sends a DNS rcode REFUSED error message back to the client.");?> <br />
- <?=gettext("<b>Allow:</b> This action allows queries from hosts within the netblock defined below.");?> <br />
- <?=gettext("<b>Allow Snoop:</b> This action allows recursive and nonrecursive access from hosts within the netblock defined below. Used for cache snooping and ideally should only be configured for your administrative host.");?> <br />
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Networks");?></td>
- <td width="78%" class="vtable">
- <table id="maintable" summary="networks">
- <tbody>
- <tr>
- <td><div id="onecolumn"><?=gettext("Network");?></div></td>
- <td><div id="twocolumn"><?=gettext("CIDR");?></div></td>
- <td><div id="threecolumn"><?=gettext("Description");?></div></td>
- </tr>
- <?php
- $counter = 0;
- if ($networkacl) {
- foreach ($networkacl as $item):
- $network = $item['acl_network'];
- $cidr = $item['mask'];
- $description = $item['description'];
- ?>
- <tr>
- <td>
- <input name="acl_network<?=$counter;?>" type="text" class="formfld unknown ipv4v6" id="acl_network<?=$counter;?>" size="30" value="<?=htmlspecialchars($network);?>" />
- </td>
- <td>
- <select name="mask<?=$counter;?>" class="formselect ipv4v6" id="mask<?=$counter;?>">
- <?php
- for ($i = 128; $i > 0; $i--) {
- echo "<option value=\"$i\" ";
- if ($i == $cidr) echo "selected=\"selected\"";
- echo ">" . $i . "</option>";
- }
- ?>
- </select>
- </td>
- <td>
- <input name="description<?=$counter;?>" type="text" class="formfld unknown" id="description<?=$counter;?>" size="40" value="<?=htmlspecialchars($description);?>" />
- </td>
- <td>
- <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" alt="delete" /></a>
- </td>
- </tr>
- <?php
- $counter++;
- endforeach;
- }
- ?>
- </tbody>
- </table>
- <a onclick="javascript:addRowTo('maintable', 'formfldalias'); return false;" href="#">
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
- </a>
- <script type="text/javascript">
- //<![CDATA[
- field_counter_js = 3;
- rows = 1;
- totalrows = <?php echo $counter; ?>;
- loaded = <?php echo $counter; ?>;
- //]]>
- </script>
-
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="description" type="text" class="formfld unknown" id="description" size="52" maxlength="52" value="<?=htmlspecialchars($pconfig['description']);?>" />
- <br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference.");?></span>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- &nbsp;<br />&nbsp;
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- </td>
- </tr>
- </table>
-<?php
- else:
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Access Lists to control access to the DNS Resolver')?></h2></div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Access List Name"); ?></th>
+ <th><?=gettext("Action"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ <th>&nbsp;</th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+ $i = 0;
+ foreach($a_acls as $acl):
?>
- <table class="sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="results">
- <thead>
- <tr>
- <td width="25%" class="listhdrr"><?=gettext("Access List Name"); ?></td>
- <td width="25%" class="listhdrr"><?=gettext("Action"); ?></td>
- <td width="45%" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="5%" class="list">&nbsp;</td>
- </tr>
- </thead>
- <tfoot>
- <tr>
- <td class="list" colspan="3">&nbsp;</td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
- <tr>
- <td width="17">&nbsp;</td>
- <td valign="middle">
- <a href="services_unbound_acls.php?act=new">
- <img src="./themes/<?=$g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("Add new Access List"); ?>" border="0" alt="add" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td colspan="4">
- <p>
- <?=gettext("Access Lists to control access to the DNS Resolver can be defined here.");?>
- </p>
- </td>
- </tr>
- </tfoot>
- <tbody>
- <?php
- $i = 0;
- foreach ($a_acls as $acl):
- ?>
- <tr ondblclick="document.location='services_unbound_acls.php?act=edit&amp;id=<?=$i;?>'">
- <td class="listlr">
- <?=htmlspecialchars($acl['aclname']);?>
- </td>
- <td class="listr">
- <?=htmlspecialchars($acl['aclaction']);?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($acl['description']);?>
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
- <tr>
- <td valign="middle">
- <a href="services_unbound_acls.php?act=edit&amp;id=<?=$i;?>">
- <img src="./themes/<?=$g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit access list"); ?>" width="17" height="17" border="0" alt="edit" />
- </a>
- </td>
- <td valign="middle">
- <a href="services_unbound_acls.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this access list?"); ?>')">
- <img src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete access list"); ?>" width="17" height="17" border="0" alt="delete" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <?php
- $i++;
- endforeach;
- ?>
- <tr style="display:none"><td></td></tr>
- </tbody>
- </table>
+ <tr ondblclick="document.location='services_unbound_acls.php?act=edit&amp;id=<?=$i?>'">
+ <td>
+ <?=htmlspecialchars($acl['aclname'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($acl['aclaction'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($acl['description'])?>
+ </td>
+ <td>
+ <a href="services_unbound_acls.php?act=edit&amp;id=<?=$i?>" class="btn btn-xs btn-info" >Edit</a>
+ <a href="services_unbound_acls.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger">Delete</a>
+ </td>
+ </tr>
<?php
- endif;
-?>
- </div>
- </td>
- </tr>
- </tbody>
-</table>
-</form>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ $i++;
+ endforeach;
+?>
+ </tbody>
+ </table>
+ </div>
+ <nav class="action-buttons">
+ <a href="services_unbound_acls.php?act=new" class="btn btn-sm btn-success">Add</a>
+ </nav>
+ </div>
+</div>
+<?php
+}
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_unbound_advanced.php b/src/usr/local/www/services_unbound_advanced.php
index 5fc4aed..26a9732 100644
--- a/src/usr/local/www/services_unbound_advanced.php
+++ b/src/usr/local/www/services_unbound_advanced.php
@@ -2,34 +2,60 @@
/* $Id$ */
/*
services_unbound_advanced.php
- part of the pfSense project (https://www.pfsense.org)
- Copyright (C) 2015 Warren Baker (warren@percol8.co.za)
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 22015 Warren Baker (warren@percol8.co.za)
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: dnsresolver
+ pfSense_MODULE: dnsresolver
*/
##|+PRIV
@@ -49,15 +75,19 @@ if (!is_array($config['unbound'])) {
if (isset($config['unbound']['hideidentity'])) {
$pconfig['hideidentity'] = true;
}
+
if (isset($config['unbound']['hideversion'])) {
$pconfig['hideversion'] = true;
}
+
if (isset($config['unbound']['prefetch'])) {
$pconfig['prefetch'] = true;
}
+
if (isset($config['unbound']['prefetchkey'])) {
$pconfig['prefetchkey'] = true;
}
+
if (isset($config['unbound']['dnssecstripped'])) {
$pconfig['dnssecstripped'] = true;
}
@@ -135,7 +165,6 @@ if ($_POST) {
}
if (!$input_errors) {
-
if (isset($_POST['hideidentity'])) {
$config['unbound']['hideidentity'] = true;
} else {
@@ -173,16 +202,19 @@ if ($_POST) {
$config['unbound']['infra_cache_numhosts'] = $_POST['infra_cache_numhosts'];
$config['unbound']['unwanted_reply_threshold'] = $_POST['unwanted_reply_threshold'];
$config['unbound']['log_verbosity'] = $_POST['log_verbosity'];
+
if (isset($_POST['disable_auto_added_access_control'])) {
$config['unbound']['disable_auto_added_access_control'] = true;
} else {
unset($config['unbound']['disable_auto_added_access_control']);
}
+
if (isset($_POST['use_caps'])) {
$config['unbound']['use_caps'] = true;
} else {
unset($config['unbound']['use_caps']);
}
+
write_config("DNS Resolver configured.");
mark_subsystem_dirty('unbound');
@@ -195,275 +227,161 @@ $pgtitle = array(gettext("Services"), gettext("DNS Resolver"), gettext("Advanced
$shortcut_section = "resolver";
include_once("head.inc");
-?>
-
-</head>
-
-<body>
-<?php include("fbegin.inc"); ?>
-<form action="services_unbound_advanced.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('unbound')): ?><br/>
-<?php print_info_box_np(gettext("The configuration of the DNS Resolver, has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="services unbound advanced">
- <tbody>
- <tr>
- <td class="tabnavtbl">
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("General settings"), false, "services_unbound.php");
- $tab_array[] = array(gettext("Advanced settings"), true, "services_unbound_advanced.php");
- $tab_array[] = array(gettext("Access Lists"), false, "/services_unbound_acls.php");
- display_top_tabs($tab_array, true);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tbody>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced Resolver Options");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Hide Identity");?></td>
- <td width="78%" class="vtable">
- <input name="hideidentity" type="checkbox" id="hideidentity" value="yes" <?php if (isset($pconfig['hideidentity'])) echo "checked=\"checked\"";?> /><br />
- <?=gettext("If enabled, id.server and hostname.bind queries are refused.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Hide Version");?></td>
- <td width="78%" class="vtable">
- <input name="hideversion" type="checkbox" id="hideversion" value="yes" <?php if (isset($pconfig['hideversion'])) echo "checked=\"checked\"";?> /><br />
- <?=gettext("If enabled, version.server and version.bind queries are refused.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Prefetch Support");?></td>
- <td width="78%" class="vtable">
- <input name="prefetch" type="checkbox" id="prefetch" value="yes" <?php if (isset($pconfig['prefetch'])) echo "checked=\"checked\"";?> /><br />
- <?=gettext("Message cache elements are prefetched before they expire to help keep the cache up to date. When enabled, this option can cause an increase of around 10% more DNS traffic and load on the server, but frequently requested items will not expire from the cache.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Prefetch DNS Key Support");?></td>
- <td width="78%" class="vtable">
- <input name="prefetchkey" type="checkbox" id="prefetchkey" value="yes" <?php if (isset($pconfig['prefetchkey'])) echo "checked=\"checked\"";?> /><br />
- <?=sprintf(gettext("DNSKEYs are fetched earlier in the validation process when a %sDelegation signer%s is encountered. This helps lower the latency of requests but does utilize a little more CPU."), "<a href='http://en.wikipedia.org/wiki/List_of_DNS_record_types'>", "</a>");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Harden DNSSEC data");?></td>
- <td width="78%" class="vtable">
- <input name="dnssecstripped" type="checkbox" id="dnssecstripped" value="yes" <?php if (isset($pconfig['dnssecstripped'])) echo "checked=\"checked\"";?> /><br />
- <?=gettext("DNSSEC data is required for trust-anchored zones. If such data is absent, the zone becomes bogus. If this is disabled and no DNSSEC data is received, then the zone is made insecure.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Message Cache Size");?></td>
- <td width="78%" class="vtable">
- <select id="msgcachesize" name="msgcachesize">
-<?php
- foreach (array("4", "10", "20", "50", "100", "250", "512") as $size) :
-?>
- <option value="<?php echo $size; ?>" <?php if ($pconfig['msgcachesize'] == "{$size}") echo "selected=\"selected\""; ?>>
- <?php echo $size; ?>MB
- </option>
-<?php
- endforeach;
-?>
- </select><br />
- <?=gettext("Size of the message cache. The message cache stores DNS rcodes and validation statuses. The RRSet cache will automatically be set to twice this amount. The RRSet cache contains the actual RR data. The default is 4 megabytes.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Outgoing TCP Buffers");?></td>
- <td width="78%" class="vtable">
- <select id="outgoing_num_tcp" name="outgoing_num_tcp">
-<?php
- for ($num_tcp = 0; $num_tcp <= 50; $num_tcp += 10):
-?>
- <option value="<?php echo $num_tcp; ?>" <?php if ($pconfig['outgoing_num_tcp'] == "{$num_tcp}") echo "selected=\"selected\""; ?>>
- <?php echo $num_tcp; ?>
- </option>
-<?php
- endfor;
-?>
- </select><br />
- <?=gettext("The number of outgoing TCP buffers to allocate per thread. The default value is 10. If 0 is selected then no TCP queries, to authoritative servers, are done.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Incoming TCP Buffers");?></td>
- <td width="78%" class="vtable">
- <select id="incoming_num_tcp" name="incoming_num_tcp">
-<?php
- for ($num_tcp = 0; $num_tcp <= 50; $num_tcp += 10):
-?>
- <option value="<?php echo $num_tcp; ?>" <?php if ($pconfig['incoming_num_tcp'] == "{$num_tcp}") echo "selected=\"selected\""; ?>>
- <?php echo $num_tcp; ?>
- </option>
-<?php
- endfor;
-?>
- </select><br />
- <?=gettext("The number of incoming TCP buffers to allocate per thread. The default value is 10. If 0 is selected then no TCP queries, from clients, are accepted.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("EDNS Buffer Size");?></td>
- <td width="78%" class="vtable">
- <select id="edns_buffer_size" name="edns_buffer_size">
-<?php
- foreach (array("512", "1480", "4096") as $size) :
-?>
- <option value="<?php echo $size; ?>" <?php if ($pconfig['edns_buffer_size'] == "{$size}") echo "selected=\"selected\""; ?>>
- <?php echo $size; ?>
- </option>
-<?php
- endforeach;
-?>
- </select><br />
- <?=gettext("Number of bytes size to advertise as the EDNS reassembly buffer size. This is the value that is used in UDP datagrams sent to peers. RFC recommendation is 4096 (which is the default). If you have fragmentation reassemble problems, usually seen as timeouts, then a value of 1480 should help. The 512 value bypasses most MTU path problems, but it can generate an excessive amount of TCP fallback.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Number of queries per thread");?></td>
- <td width="78%" class="vtable">
- <select id="num_queries_per_thread" name="num_queries_per_thread">
-<?php
- foreach (array("512", "1024", "2048") as $queries) :
-?>
- <option value="<?php echo $queries; ?>" <?php if ($pconfig['num_queries_per_thread'] == "{$queries}") echo "selected=\"selected\""; ?>>
- <?php echo $queries; ?>
- </option>
-<?php
- endforeach;
-?>
- </select><br />
- <?=gettext("The number of queries that every thread will service simultaneously. If more queries arrive that need to be serviced, and no queries can be jostled, then these queries are dropped.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Jostle Timeout");?></td>
- <td width="78%" class="vtable">
- <select id="jostle_timeout" name="jostle_timeout">
-<?php
- foreach (array("100", "200", "500", "1000") as $timeout) :
-?>
- <option value="<?php echo $timeout; ?>" <?php if ($pconfig['jostle_timeout'] == "{$timeout}") echo "selected=\"selected\""; ?>>
- <?php echo $timeout; ?>
- </option>
-<?php
- endforeach;
-?>
- </select><br />
- <?=gettext("This timeout is used for when the server is very busy. This protects against denial of service by slow queries or high query rates. The default value is 200 milliseconds.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Maximum TTL for RRsets and messages");?></td>
- <td width="78%" class="vtable">
- <input type="text" id="cache_max_ttl" name="cache_max_ttl" size="5" value="<?php if (isset($pconfig['cache_max_ttl'])) echo htmlspecialchars($pconfig['cache_max_ttl']); ?>" /><br />
- <?=gettext("Configure a maximum Time to live for RRsets and messages in the cache. The default is 86400 seconds (1 day). When the internal TTL expires the cache item is expired. This can be configured to force the resolver to query for data more often and not trust (very large) TTL values.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Minimum TTL for RRsets and messages");?></td>
- <td width="78%" class="vtable">
- <input type="text" id="cache_min_ttl" name="cache_min_ttl" size="5" value="<?php if (isset($pconfig['cache_min_ttl'])) echo htmlspecialchars($pconfig['cache_min_ttl']); ?>" /><br />
- <?=gettext("Configure a minimum Time to live for RRsets and messages in the cache. The default is 0 seconds. If the minimum value kicks in, the data is cached for longer than the domain owner intended, and thus less queries are made to look up the data. The 0 value ensures the data in the cache is as the domain owner intended. High values can lead to trouble as the data in the cache might not match up with the actual data anymore.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("TTL for Host cache entries");?></td>
- <td width="78%" class="vtable">
- <select id="infra_host_ttl" name="infra_host_ttl">
- <option value="60" <?php if ($pconfig['infra_host_ttl'] == "60") echo "selected=\"selected\""; ?>>1 minute</option>
- <option value="120" <?php if ($pconfig['infra_host_ttl'] == "120") echo "selected=\"selected\""; ?>>2 minutes</option>
- <option value="300" <?php if ($pconfig['infra_host_ttl'] == "300") echo "selected=\"selected\""; ?>>5 minutes</option>
- <option value="600" <?php if ($pconfig['infra_host_ttl'] == "600") echo "selected=\"selected\""; ?>>10 minutes</option>
- <option value="900" <?php if ($pconfig['infra_host_ttl'] == "900") echo "selected=\"selected\""; ?>>15 minutes</option>
- </select><br />
- <?=gettext("Time to live for entries in the host cache. The host cache contains roundtrip timing, lameness and EDNS support information. The default is 15 minutes.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Number of Hosts to cache");?></td>
- <td width="78%" class="vtable">
- <select id="infra_cache_numhosts" name="infra_cache_numhosts">
- <option value="1000" <?php if ($pconfig['infra_cache_numhosts'] == "1000") echo "selected=\"selected\""; ?>>1000</option>
- <option value="5000" <?php if ($pconfig['infra_cache_numhosts'] == "5000") echo "selected=\"selected\""; ?>>5000</option>
- <option value="10000" <?php if ($pconfig['infra_cache_numhosts'] == "10000") echo "selected=\"selected\""; ?>>10 000</option>
- <option value="20000" <?php if ($pconfig['infra_cache_numhosts'] == "20000") echo "selected=\"selected\""; ?>>20 000</option>
- <option value="50000" <?php if ($pconfig['infra_cache_numhosts'] == "50000") echo "selected=\"selected\""; ?>>50 000</option>
- </select><br />
- <?=gettext("Number of hosts for which information is cached. The default is 10,000.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Unwanted Reply Threshold");?></td>
- <td width="78%" class="vtable">
- <select id="unwanted_reply_threshold" name="unwanted_reply_threshold">
- <option value="disabled" <?php if ($pconfig['unwanted_reply_threshold'] == "disabled") echo "selected=\"selected\""; ?>>disabled</option>
- <option value="5000000" <?php if ($pconfig['unwanted_reply_threshold'] == "5000000") echo "selected=\"selected\""; ?>>5 million</option>
- <option value="10000000" <?php if ($pconfig['unwanted_reply_threshold'] == "10000000") echo "selected=\"selected\""; ?>>10 million</option>
- <option value="20000000" <?php if ($pconfig['unwanted_reply_threshold'] == "20000000") echo "selected=\"selected\""; ?>>20 million</option>
- <option value="40000000" <?php if ($pconfig['unwanted_reply_threshold'] == "40000000") echo "selected=\"selected\""; ?>>40 million</option>
- <option value="50000000" <?php if ($pconfig['unwanted_reply_threshold'] == "50000000") echo "selected=\"selected\""; ?>>50 million</option>
- </select><br />
- <?=gettext("If enabled, a total number of unwanted replies is kept track of in every thread. When it reaches the threshold, a defensive action is taken and a warning is printed to the log file. This defensive action is to clear the RRSet and message caches, hopefully flushing away any poison. The default is disabled, but if enabled a value of 10 million is suggested.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Log level verbosity");?></td>
- <td width="78%" class="vtable">
- <select id="log_verbosity" name="log_verbosity">
-<?php
- for ($level = 0; $level <= 5; $level++):
-?>
- <option value="<?php echo $level; ?>" <?php if ($pconfig['log_verbosity'] == "{$level}") echo "selected=\"selected\""; ?>>
- Level <?php echo $level; ?>
- </option>
-<?php
- endfor;
-?>
- </select><br />
- <?=gettext("Select the log verbosity.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Disable auto-added access control");?></td>
- <td width="78%" class="vtable">
- <input name="disable_auto_added_access_control" type="checkbox" id="disable_auto_added_access_control" value="yes" <?php if (isset($pconfig['disable_auto_added_access_control'])) echo "checked=\"checked\"";?> />
- <?=gettext("Check this box to disable the automatically-added access control entries. By default, IPv4 and IPv6 networks residing on internal interfaces of this system are permitted. Allowed networks must be manually configured on the Access Lists tab if the auto-added entries are disabled.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Experimental Bit 0x20 Support");?></td>
- <td width="78%" class="vtable">
- <input name="use_caps" type="checkbox" id="use_caps" value="yes" <?php if (isset($pconfig['use_caps'])) echo "checked=\"checked\"";?> /> <br />
- <?=sprintf(gettext("Use 0x-20 encoded random bits in the DNS query to foil spoofing attempts. See the implementation %sdraft dns-0x20%s for more information."), "<a href='https://tools.ietf.org/html/draft-vixie-dnsext-dns0x20-00'>", "</a>");?>
- </td>
- </tr>
- <tr>
- <td width="22%"></td>
- <td width="78%">
- <input type="submit" name="Save" class="formbtn" id="save" value="Save" />
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- </td>
- </tr>
- </tbody>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+$tab_array = array();
+$tab_array[] = array(gettext("General settings"), false, "services_unbound.php");
+$tab_array[] = array(gettext("Advanced settings"), true, "services_unbound_advanced.php");
+$tab_array[] = array(gettext("Access Lists"), false, "/services_unbound_acls.php");
+display_top_tabs($tab_array, true);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Advanced Resolver Options');
+
+$section->addInput(new Form_Checkbox(
+ 'hideidentity',
+ 'Hide identity',
+ 'id.server and hostname.bind queries are refused',
+ $pconfig['hideidentity']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'hideversion',
+ 'Hide version',
+ 'version.server and version.bind queries are refused',
+ $pconfig['hideversion']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'prefetch',
+ 'Prefetch support',
+ 'Message cache elements are prefetched before they expire to help keep the cache up to date',
+ $pconfig['prefetch']
+))->setHelp('When enabled, this option can cause an increase of around 10% more DNS traffic and load on the server, but frequently requested items will not expire from the cache');
+
+$section->addInput(new Form_Checkbox(
+ 'prefetchkey',
+ 'Prefetch DNS Key Support',
+ 'DNSKEYs are fetched earlier in the validation process when a Delegation signer is encountered',
+ $pconfig['prefetchkey']
+))->setHelp('This helps lower the latency of requests but does utilize a little more CPU. See: <a href="http://en.wikipedia.org/wiki/List_of_DNS_record_types">Wikipedia</a>');
+
+$section->addInput(new Form_Checkbox(
+ 'dnssecstripped',
+ 'Harden DNSSEC data',
+ 'DNSSEC data is required for trust-anchored zones.',
+ $pconfig['dnssecstripped']
+))->setHelp('If such data is absent, the zone becomes bogus. If Disabled and no DNSSEC data is received, then the zone is made insecure. ');
+
+$section->addInput(new Form_Select(
+ 'msgcachesize',
+ 'Message Cache size',
+ $pconfig['msgcachesize'],
+ array_combine(array("4", "10", "20", "50", "100", "250", "512"), array("4 MB", "10 MB", "20 MB", "50 MB", "100 MB", "250 MB", "512 MB"))
+))->setHelp('Size of the message cache. The message cache stores DNS rcodes and validation statuses. The RRSet cache will automatically be set to twice this amount. The RRSet cache contains the actual RR data. The default is 4 megabytes.');
+
+$section->addInput(new Form_Select(
+ 'outgoing_num_tcp',
+ 'Outgoing TCP Buffers',
+ $pconfig['outgoing_num_tcp'],
+ array_combine(array("0", "10", "20", "30", "50", "50"), array("0", "10", "20", "30", "50", "50"))
+))->setHelp('The number of outgoing TCP buffers to allocate per thread. The default value is 10. If 0 is selected then no TCP queries, to authoritative servers, are done.');
+
+$section->addInput(new Form_Select(
+ 'incoming_num_tcp',
+ 'Incoming TCP Buffers',
+ $pconfig['incoming_num_tcp'],
+ array_combine(array("0", "10", "20", "30", "50", "50"), array("0", "10", "20", "30", "50", "50"))
+))->setHelp('The number of outgoing TCP buffers to allocate per thread. The default value is 10. If 0 is selected then no TCP queries, to authoritative servers, are done.');
+
+$section->addInput(new Form_Select(
+ 'edns_buffer_size',
+ 'EDNS Buffer size',
+ $pconfig['edns_buffer_size'],
+ array_combine(array("512", "1480", "4096"), array("512", "1480", "4096"))
+))->setHelp('Number of bytes size to advertise as the EDNS reassembly buffer size. This is the value that is used in UDP datagrams sent to peers. ' .
+ 'RFC recommendation is 4096 (which is the default). If you have fragmentation reassemble problems, usually seen as timeouts, then a value of 1480 should help. ' .
+ 'The 512 value bypasses most MTU path problems, but it can generate an excessive amount of TCP fallback.');
+
+$section->addInput(new Form_Select(
+ 'num_queries_per_thread',
+ 'Number of queries per thread',
+ $pconfig['num_queries_per_thread'],
+ array_combine(array("512", "1024", "2048"), array("512", "1024", "2048"))
+))->setHelp('The number of queries that every thread will service simultaneously. If more queries arrive that need to be serviced, and no queries can be jostled, then these queries are dropped');
+
+$section->addInput(new Form_Select(
+ 'jostle_timeout',
+ 'Jostle Timeout',
+ $pconfig['jostle_timeout'],
+ array_combine(array("100", "200", "500", "1000"), array("100", "200", "500", "1000"))
+))->setHelp('This timeout is used for when the server is very busy. This protects against denial of service by slow queries or high query rates. The default value is 200 milliseconds. ');
+
+$section->addInput(new Form_Input(
+ 'cache_max_ttl',
+ 'Maximum TTL for RRsets and messages',
+ 'text',
+ $pconfig['cache_max_ttl']
+))->setHelp('Configure a maximum Time to live for RRsets and messages in the cache. The default is 86400 seconds (1 day). ' .
+ 'When the internal TTL expires the cache item is expired. This can be configured to force the resolver to query for data more often and not trust (very large) TTL values');
+
+$section->addInput(new Form_Input(
+ 'cache_min_ttl',
+ 'Minimum TTL for RRsets and messages',
+ 'text',
+ $pconfig['cache_min_ttl']
+))->setHelp('Configure a minimum Time to live for RRsets and messages in the cache. ' .
+ 'The default is 0 seconds. If the minimum value kicks in, the data is cached for longer than the domain owner intended, and thus less queries are made to look up the data. ' .
+ 'The 0 value ensures the data in the cache is as the domain owner intended. High values can lead to trouble as the data in the cache might not match up with the actual data anymore.');
+
+$section->addInput(new Form_Select(
+ 'infra_host_ttl',
+ 'TTL for Host Cache entries',
+ $pconfig['infra_host_ttl'],
+ array_combine(array("60", "120", "300", "600", "900"), array("1 minute", "2 minutes", "5 minutes", "10 minutes", "15 minutes"))
+))->setHelp('This timeout is used for when the server is very busy. This protects against denial of service by slow queries or high query rates. The default value is 200 milliseconds. ');
+
+$section->addInput(new Form_Select(
+ 'infra_cache_numhosts',
+ 'Number of Hosts to Cache',
+ $pconfig['infra_cache_numhosts'],
+ array_combine(array("1000", "5000", "10000", "20000", "50000"), array("1000", "5000", "10000", "20000", "50000"))
+))->setHelp('Number of hosts for which information is cached. The default is 10,000.');
+
+$section->addInput(new Form_Select(
+ 'unwanted_reply_threshold',
+ 'Unwanted Reply Threshold',
+ $pconfig['unwanted_reply_threshold'],
+ array_combine(array("disabled", "5000000", "10000000", "20000000", "40000000", "50000000"),
+ array("Disabled", "5 million", "10 million", "20 million", "40 million", "50 million"))
+))->setHelp('If enabled, a total number of unwanted replies is kept track of in every thread. When it reaches the threshold, a defensive action is taken ' .
+ 'and a warning is printed to the log file. This defensive action is to clear the RRSet and message caches, hopefully flushing away any poison. ' .
+ 'The default is disabled, but if enabled a value of 10 million is suggested.');
+
+$section->addInput(new Form_Select(
+ 'log_verbosity',
+ 'Log level',
+ $pconfig['log_verbosity'],
+ array_combine(array("0", "1", "2", "3", "4", "5"), array("Level 0", "Level 1", "Level 2", "Level 3", "Level 4", "Level 5"))
+))->setHelp('Select the log verbosity.');
+
+$section->addInput(new Form_Checkbox(
+ 'disable_auto_added_access_control',
+ 'Disable auto-added access control',
+ 'disable the automatically-added access control entries',
+ $pconfig['hdisable_auto_added_access_control']
+))->setHelp('By default, IPv4 and IPv6 networks residing on internal interfaces of this system are permitted. ' .
+ 'Allowed networks must be manually configured on the Access Lists tab if the auto-added entries are disabled.');
+
+$section->addInput(new Form_Checkbox(
+ 'use_caps',
+ 'Experimental Bit 0x20 Support',
+ 'Use 0x-20 encoded random bits in the DNS query to foil spoofing attempts.',
+ $pconfig['use_caps']
+))->setHelp('See the implementation <a href="https://tools.ietf.org/html/draft-vixie-dnsext-dns0x20-00">draft dns-0x20</a> for more information: ');
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_unbound_domainoverride_edit.php b/src/usr/local/www/services_unbound_domainoverride_edit.php
index 28a8424..2f8533c 100644
--- a/src/usr/local/www/services_unbound_domainoverride_edit.php
+++ b/src/usr/local/www/services_unbound_domainoverride_edit.php
@@ -31,7 +31,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: dnsresolver
+ pfSense_MODULE: dnsresolver
*/
##|+PRIV
@@ -43,15 +43,8 @@
require("guiconfig.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_unbound.php');
-}
-
-if (!is_array($config['unbound']['domainoverrides'])) {
+if (!is_array($config['unbound']['domainoverrides']))
$config['unbound']['domainoverrides'] = array();
-}
$a_domainOverrides = &$config['unbound']['domainoverrides'];
@@ -128,56 +121,44 @@ $pgtitle = array(gettext("Services"), gettext("DNS Resolver"), gettext("Edit Dom
$shortcut_section = "resolver";
include("head.inc");
-?>
-
-<body>
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
- <form action="services_unbound_domainoverride_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="domain override">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Domain");?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="domain" type="text" class="formfld unknown" id="domain" size="40" value="<?=htmlspecialchars($pconfig['domain']);?>" /><br />
- <span class="vexpl">
- <?=gettext("Domain to override (NOTE: this does not have to be a valid TLD!)"); ?><br />
- <?=gettext("e.g."); ?> <em><?=gettext("test"); ?></em> <?=gettext("or"); ?> <em>mycompany.localdomain</em> <?=gettext("or"); ?> <em>1.168.192.in-addr.arpa</em>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("IP address");?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="ip" type="text" class="formfld unknown" id="ip" size="40" value="<?=htmlspecialchars($pconfig['ip']);?>" /><br />
- <span class="vexpl">
- <?=gettext("IP address of the authoritative DNS server for this domain"); ?><br />
- <?=gettext("e.g."); ?> <em>192.168.100.100</em><br />
- <?=gettext("To use a nondefault port for communication, append an '@' with the port number."); ?><br />
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" /><br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed).");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_domainOverrides[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Domain Override');
+
+$section->addInput(new Form_Input(
+ 'domain',
+ 'Domain',
+ 'text',
+ $pconfig['domain']
+))->setHelp('Domain to override (NOTE: this does not have to be a valid TLD!) e.g.: testormycompany.localdomainor1.168.192.in-addr.arpa');
+
+$section->addInput(new Form_IpAddress(
+ 'ip',
+ 'IP Address',
+ $pconfig['ip']
+))->setHelp('IP address of the authoritative DNS server for this domain. e.g.: 192.168.100.100' . '<br />' .
+ 'To use a nondefault port for communication, append an \'@\' with the port number.');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'GUI Log Entries',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+if (isset($id) && $a_domainOverrides[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+
+print $form;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_unbound_host_edit.php b/src/usr/local/www/services_unbound_host_edit.php
index 6b365f2..ed3bbb2 100644
--- a/src/usr/local/www/services_unbound_host_edit.php
+++ b/src/usr/local/www/services_unbound_host_edit.php
@@ -32,7 +32,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: dnsresolver
+ pfSense_MODULE: dnsresolver
*/
##|+PRIV
@@ -42,12 +42,6 @@
##|*MATCH=services_unbound_host_edit.php*
##|-PRIV
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_unbound.php');
-}
-
function hostcmp($a, $b) {
return strcasecmp($a['host'], $b['host']);
}
@@ -132,6 +126,7 @@ if ($_POST) {
$aliases[$entry][$field] = $value;
}
}
+
$pconfig['aliases']['item'] = $aliases;
/* validate aliases */
@@ -140,6 +135,7 @@ if ($_POST) {
$aliasreqdfieldsn = array(gettext("Alias Domain"));
do_input_validation($_POST, $aliasreqdfields, $aliasreqdfieldsn, $input_errors);
+
if ($alias['host']) {
if (!is_hostname($alias['host'])) {
$input_errors[] = gettext("Hostnames in an alias list can only contain the characters A-Z, 0-9 and '-'. They may not start or end with '-'.");
@@ -192,146 +188,128 @@ if ($_POST) {
}
}
-$pgtitle = array(gettext("Services"), gettext("DNS Resolver"), gettext("Edit host"));
+// Delete a row in the options table
+if($_GET['act'] == "delopt") {
+ $idx = $_GET['id'];
+
+ if($pconfig['aliases'] && is_array($pconfig['aliases']['item'][$idx])) {
+ unset($pconfig['aliases']['item'][$idx]);
+ }
+}
+
+// Add an option row
+if($_GET['act'] == "addopt") {
+ if(!is_array($pconfig['aliases']['item']))
+ $pconfig['aliases']['item'] = array();
+
+ array_push($pconfig['aliases']['item'], array('host' => null, 'domain' => null, 'description' => null));
+}
+
+$pgtitle = array(gettext("Services"),gettext("DNS Resolver"),gettext("Edit host"));
$shortcut_section = "resolver";
include("head.inc");
-?>
-
-<body onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-
-<script type="text/javascript" src="/javascript/row_helper.js">
-</script>
-
-<script type="text/javascript">
-//<![CDATA[
- rowname[0] = "aliashost";
- rowtype[0] = "textbox";
- rowsize[0] = "20";
- rowname[1] = "aliasdomain";
- rowtype[1] = "textbox";
- rowsize[1] = "20";
- rowname[2] = "aliasdescription";
- rowtype[2] = "textbox";
- rowsize[2] = "20";
-//]]>
-</script>
-
-<?php if ($input_errors) print_input_errors($input_errors); ?>
- <form action="services_unbound_host_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="host edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit DNS Resolver entry");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Host");?></td>
- <td width="78%" class="vtable">
- <input name="host" type="text" class="formfld unknown" id="host" size="40" value="<?=htmlspecialchars($pconfig['host']);?>" /><br />
- <span class="vexpl"><?=gettext("Name of the host, without domain part"); ?><br />
- <?=gettext("e.g."); ?> <em><?=gettext("myhost"); ?></em>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Domain");?></td>
- <td width="78%" class="vtable">
- <input name="domain" type="text" class="formfld unknown" id="domain" size="40" value="<?=htmlspecialchars($pconfig['domain']);?>" /><br />
- <span class="vexpl"><?=gettext("Domain of the host"); ?><br />
- <?=gettext("e.g."); ?> <em><?=gettext("example.com"); ?></em>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("IP address");?></td>
- <td width="78%" class="vtable">
- <input name="ip" type="text" class="formfld unknown" id="ip" size="40" value="<?=htmlspecialchars($pconfig['ip']);?>" /><br />
- <span class="vexpl"><?=gettext("IP address of the host"); ?><br />
- <?=gettext("e.g."); ?> <em>192.168.100.100</em> <?=gettext("or"); ?> <em>fd00:abcd::1</em>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" /><br />
- <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><div id="addressnetworkport"><?=gettext("Aliases"); ?></div></td>
- <td width="78%" class="vtable">
- <table id="maintable" summary="aliases">
- <tbody>
- <tr>
- <td colspan="4">
- <div style="padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066; background-color: #ffffff; color: #000000; font-size: 8pt;" id="itemhelp">
- <?=gettext("Enter additional names for this host."); ?>
- </div>
- </td>
- </tr>
- <tr>
- <td><div id="onecolumn"><?=gettext("Host");?></div></td>
- <td><div id="twocolumn"><?=gettext("Domain");?></div></td>
- <td><div id="threecolumn"><?=gettext("Description");?></div></td>
- </tr>
- <?php
- $counter = 0;
- if ($pconfig['aliases']['item']):
- foreach ($pconfig['aliases']['item'] as $item):
- $host = $item['host'];
- $domain = $item['domain'];
- $description = $item['description'];
- ?>
- <tr>
- <td>
- <input autocomplete="off" name="aliashost<?php echo $counter; ?>" type="text" class="formfld unknown" id="aliashost<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($host);?>" />
- </td>
- <td>
- <input autocomplete="off" name="aliasdomain<?php echo $counter; ?>" type="text" class="formfld unknown" id="aliasdomain<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($domain);?>" />
- </td>
- <td>
- <input name="aliasdescription<?php echo $counter; ?>" type="text" class="formfld unknown" id="aliasdescription<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($description);?>" />
- </td>
- <td>
- <a onclick="removeRow(this); return false;" href="#">
- <img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="" title="<?=gettext("remove this entry"); ?>" />
- </a>
- </td>
- </tr>
- <?php
- $counter++;
- endforeach;
- endif;
- ?>
- </tbody>
- </table>
- <a onclick="javascript:addRowTo('maintable', 'formfldalias'); return false;" href="#">
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
- </a>
- <script type="text/javascript">
- //<![CDATA[
- field_counter_js = 3;
- rows = 1;
- totalrows = <?php echo $counter; ?>;
- loaded = <?php echo $counter; ?>;
- //]]>
- </script>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_hosts[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Edit DNS Rersolver Entry');
+
+$section->addInput(new Form_Input(
+ 'host',
+ 'Host',
+ 'text',
+ $pconfig['domain']
+))->setHelp('Name of the host, without the domain part' . '<br />' .
+ 'e.g.: "myhost"');
+
+$section->addInput(new Form_Input(
+ 'domain',
+ 'Domain',
+ 'text',
+ $pconfig['domain']
+))->setHelp('Domain of the host' . '<br />' .
+ 'e.g.: "example.com"');
+
+$section->addInput(new Form_IpAddress(
+ 'ip',
+ 'IP Address',
+ $pconfig['ip']
+))->setHelp('IP address of the host' . '<br />' .
+ 'e.g.: 192.168.100.100 or fd00:abcd::1');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+if (isset($id) && $a_hosts[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $pconfig['id']
+ ));
+}
+
+$form->add($section);
+
+$section = new Form_Section('Additional names for this host');
+
+if( $pconfig['aliases']['item']) {
+ $counter = 0;
+ $last = count($pconfig['aliases']['item']) - 1;
+
+ foreach($pconfig['aliases']['item'] as $item) {
+ $group = new Form_Group(null);
+
+ $group->add(new Form_Input(
+ 'aliashost' . $counter,
+ null,
+ 'text',
+ $item['host']
+ ))->setHelp($counter == $last ? 'Host name':null);
+
+ $group->add(new Form_Input(
+ 'aliasdomain' . $counter,
+ null,
+ 'text',
+ $item['domain']
+ ))->setHelp($counter == $last ? 'Value':null);
+
+ $group->add(new Form_Input(
+ 'aliasdescription' . $counter,
+ null,
+ 'text',
+ $item['description']
+ ))->setHelp($counter == $last ? 'Description':null);
+
+ $btn = new Form_Button(
+ 'btn' . $counter,
+ 'Delete',
+ 'services_unbound_host_edit.php?act=delopt' . '&id=' . $counter
+ );
+
+ $btn->removeClass('btn-primary')->addClass('btn-danger btn-sm');
+ $group->add($btn);
+ $section->add($group);
+ $counter++;
+ }
+}
+
+$btnaddopt = new Form_Button(
+ 'btnaddopt',
+ 'Add Option',
+ 'services_unbound_host_edit.php?act=addopt'
+);
+
+$btnaddopt->removeClass('btn-primary')->addClass('btn-success btn-sm');
+
+$section->addInput($btnaddopt);
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_wol.php b/src/usr/local/www/services_wol.php
index e443ab0..40917d9 100644
--- a/src/usr/local/www/services_wol.php
+++ b/src/usr/local/www/services_wol.php
@@ -42,13 +42,14 @@
##|-PRIV
require("guiconfig.inc");
+require('classes/Form.class.php');
if (!is_array($config['wol']['wolentry'])) {
$config['wol']['wolentry'] = array();
}
$a_wol = &$config['wol']['wolentry'];
-if ($_GET['wakeall'] <> "") {
+if($_GET['wakeall'] != "") {
$i = 0;
$savemsg = "";
foreach ($a_wol as $wolent) {
@@ -123,111 +124,92 @@ include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<form action="services_wol.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="wake on lan">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Wake on LAN");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
- <td width="78%" class="vtable">
- <select name="interface" class="formselect">
- <?php
- $interfaces = get_configured_interface_with_descr();
- foreach ($interfaces as $iface => $ifacename): ?>
- <option value="<?=$iface;?>" <?php if (!link_interface_to_bridge($iface) && $iface == $if) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Choose which interface the host to be woken up is connected to.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("MAC address");?></td>
- <td width="78%" class="vtable">
- <input name="mac" type="text" class="formfld unknown" id="mac" size="20" value="<?=htmlspecialchars($mac);?>" />
- <br />
- <?=gettext("Enter a MAC address ");?><span class="vexpl"> <?=gettext("in the following format: xx:xx:xx:xx:xx:xx");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Send");?>" />
- </td>
- </tr>
- </table>
- &nbsp;<br />
- <?=gettext("Wake all clients at once: ");?><a href="services_wol.php?wakeall=true"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_wol_all.gif" width="17" height="17" border="0" alt="wol all" /></a><br/>
- <?=gettext("Or Click the MAC address to wake up an individual device:");?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont" summary="clients">
- <tr>
- <td width="15%" class="listhdrr"><?=gettext("Interface");?></td>
- <td width="25%" class="listhdrr"><?=gettext("MAC address");?></td>
- <td width="50%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td valign="middle" width="17"></td>
- <td valign="middle"><a href="services_wol_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
+<p><?=gettext("This service can be used to wake up (power on) computers by sending special") . '\'' . gettext("Magic Packets") . '\'' . gettext("The NIC in the computer that is to be woken up must support Wake on LAN and has to be configured properly (WOL cable, BIOS settings). ")?></p>
+
<?php
- $i = 0;
- foreach ($a_wol as $wolent):
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg);
+
+$form = new Form('Send');
+
+$section = new Form_Section('Wake on LAN');
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ (link_interface_to_bridge($if) ? null : $if),
+ get_configured_interface_with_descr()
+))->setHelp('Choose which interface the host to be woken up is connected to.');
+
+$section->addInput(new Form_Input(
+ 'mac',
+ 'MAC address',
+ 'text',
+ $mac
+))->setHelp(gettext('Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx'));
+
+$form->add($section);
+print $form;
?>
- <tr>
- <td class="listlr" ondblclick="document.location='services_wol_edit.php?id=<?=$i;?>';">
- <?=convert_friendly_interface_to_friendly_descr($wolent['interface']);?>
- </td>
- <td class="listr" ondblclick="document.location='services_wol_edit.php?id=<?=$i;?>';">
- <a href="?mac=<?=$wolent['mac'];?>&amp;if=<?=$wolent['interface'];?>"><?=strtolower($wolent['mac']);?></a>
- </td>
- <td class="listbg" ondblclick="document.location='services_wol_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($wolent['descr']);?>
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+
+<div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title">Wake on LAN devices</h2>
+ </div>
+
+ <div class="panel-body">
+ <p><?=gettext("Click the MAC address to wake up an individual device.")?></p>
+ <div class="table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
<tr>
- <td valign="middle"><a href="services_wol_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a></td>
- <td valign="middle"><a href="services_wol.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this entry?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a></td>
+ <th><?=gettext("Interface")?></th>
+ <th><?=gettext("MAC address")?></th>
+ <th><?=gettext("Description")?></th>
+ <th></th>
</tr>
- </table>
- </td>
- </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($a_wol as $i => $wolent): ?>
+ <tr>
+ <td>
+ <?=convert_friendly_interface_to_friendly_descr($wolent['interface']);?>
+ </td>
+ <td>
+ <a href="?mac=<?=$wolent['mac'];?>&amp;if=<?=$wolent['interface'];?>"><?=strtolower($wolent['mac']);?></a>
+ </td>
+ <td>
+ <?=htmlspecialchars($wolent['descr']);?>
+ </td>
+ <td>
+ <a class="btn btn-xs btn-primary" href="services_wol_edit.php?id=<?=$i?>">
+ edit
+ </a>
+ <a class="btn btn-xs btn-danger" href="services_wol.php?act=del&amp;id=<?=$i?>">
+ delete
+ </a>
+ </td>
+ </tr>
+ <?php endforeach?>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ <div class="panel-footer">
+ <a class="btn btn-success" href="services_wol_edit.php">
+ Add
+ </a>
+
+ <a href="services_wol.php?wakeall=true" role="button" class="btn btn-primary">
+ <?=gettext("Wake all devices")?>
+ </a>
+ </div>
+</div>
+
<?php
- $i++;
- endforeach;
-?>
- <tr>
- <td class="list" colspan="3"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td valign="middle" width="17"></td>
- <td valign="middle"><a href="services_wol_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- <span class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Note:");?><br />
- </strong>
- </span>
- <?=gettext("This service can be used to wake up (power on) computers by sending special"); ?> &quot;<?=gettext("Magic Packets"); ?>&quot;. <?=gettext("The NIC in the computer that is to be woken up must support Wake on LAN and has to be configured properly (WOL cable, BIOS settings). ");?>
- </span>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_wol_edit.php b/src/usr/local/www/services_wol_edit.php
index 031ba83..2c750ed 100644
--- a/src/usr/local/www/services_wol_edit.php
+++ b/src/usr/local/www/services_wol_edit.php
@@ -51,12 +51,7 @@ function wol_sort() {
}
require("guiconfig.inc");
-
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_wol.php');
-}
+require('classes/Form.class.php');
if (!is_array($config['wol']['wolentry'])) {
$config['wol']['wolentry'] = array();
@@ -121,60 +116,44 @@ if ($_POST) {
$pgtitle = array(gettext("Services"), gettext("Wake on LAN"), gettext("Edit"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="services_wol_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="wol edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit WOL entry");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
- <td width="78%" class="vtable">
- <select name="interface" class="formfld">
- <?php
- $interfaces = get_configured_interface_with_descr();
- foreach ($interfaces as $iface => $ifacename): ?>
- <option value="<?=$iface;?>" <?php if (!link_interface_to_bridge($iface) && $iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Choose which interface this host is connected to.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("MAC address");?></td>
- <td width="78%" class="vtable">
- <input name="mac" type="text" class="formfld unknown" id="mac" size="20" value="<?=htmlspecialchars($pconfig['mac']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br /> <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_wol[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+$form = new Form;
+
+if (isset($id) && $a_wol[$id]) {
+ $form->addGlobal(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$section = new Form_Section('Edit WOL entry');
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ (link_interface_to_bridge($pconfig['interface']) ? null : $pconfig['interface']),
+ get_configured_interface_with_descr()
+))->setHelp('Choose which interface this host is connected to.');
+
+$section->addInput(new Form_Input(
+ 'mac',
+ 'MAC address',
+ 'text',
+ $pconfig['mac']
+))->setHelp(gettext('Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx'));
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp(gettext('You may enter a description here for your reference (not parsed).'));
+
+$form->add($section);
+print $form;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/shortcuts/pkg_upnp.inc b/src/usr/local/www/shortcuts/pgk_upnp.php
index 2b068a7..3ee7f81 100644
--- a/src/usr/local/www/shortcuts/pkg_upnp.inc
+++ b/src/usr/local/www/shortcuts/pgk_upnp.php
@@ -8,4 +8,4 @@ $shortcuts['upnp']['log'] = "diag_logs_routing.php";
$shortcuts['upnp']['status'] = "status_upnp.php";
$shortcuts['upnp']['service'] = "miniupnpd";
-?>
+?> \ No newline at end of file
diff --git a/src/usr/local/www/status.php b/src/usr/local/www/status.php
index 6561c98..e8c92fe 100755
--- a/src/usr/local/www/status.php
+++ b/src/usr/local/www/status.php
@@ -55,13 +55,6 @@ require_once("functions.inc");
$output_path = "/tmp/status_output/";
$output_file = "/tmp/status_output.tgz";
-if (is_dir($output_path)) {
- unlink_if_exists("{$output_path}/*");
- @rmdir($output_path);
-}
-unlink_if_exists($output_file);
-mkdir($output_path);
-
function doCmdT($title, $command) {
global $output_path, $output_file;
/* Fixup output directory */
@@ -72,6 +65,11 @@ function doCmdT($title, $command) {
echo "\t<tr><td class=\"listtopic\">" . $title . "</td></tr>\n";
echo "\t<tr>\n\t\t<td class=\"listlr\">\n\t\t\t<pre>"; /* no newline after pre */
+ print('<div class="panel panel-default">');
+ print( '<div class="panel-heading">' . $title . '</div>');
+ print( '<div class="panel-body">');
+ print( '<pre>');
+
if ($command == "dumpconfigxml") {
$ofd = @fopen("{$output_path}/config-sanitized.xml", "w");
$fd = @fopen("/conf/config.xml", "r");
@@ -114,8 +112,10 @@ function doCmdT($title, $command) {
}
fclose($ofd);
}
- echo "\n\t\t\t</pre>\n\t\t</td>\n\t</tr>\n";
- echo "</table>\n";
+
+ print( '</pre>');
+ print( '</div>');
+ print('</div>');
}
/* Define a command, with a title, to be executed later. */
@@ -127,14 +127,24 @@ function defCmdT($title, $command) {
/* List all of the commands as an index. */
function listCmds() {
+ global $currentDate;
global $commands;
- $rubbish = array('|', '-', '/', '.', ' '); /* fixes the <a> tag to be W3C compliant */
- echo "\n<p>" . gettext("This status page includes the following information") . ":\n";
- echo "<ul>\n";
- for ($i = 0; isset($commands[$i]); $i++) {
- echo "\t<li><strong><a href=\"#" . str_replace($rubbish, '', $commands[$i][0]) . "\">" . $commands[$i][0] . "</a></strong></li>\n";
+
+ $rubbish = array('|', '-', '/', '.', ' '); /* fixes the <a> tag to be W3C compliant */
+
+ print('<div class="panel panel-default">');
+ print( '<div class="panel-heading">' . gettext("System status on ") . $currentDate . '</div>');
+ print( '<div class="panel-body">');
+
+ print("\n<p>" . gettext("This status page includes the following information") . ":\n");
+ print("<ul>\n");
+ for ($i = 0; isset($commands[$i]); $i++ ) {
+ print("\t<li><strong><a href=\"#" . str_replace($rubbish,'',$commands[$i][0]) . "\">" . $commands[$i][0] . "</a></strong></li>\n");
}
- echo "</ul>\n";
+
+ print("</ul>\n");
+ print(' </div>');
+ print('</div>');
}
/* Execute all of the commands which were defined by a call to defCmd. */
@@ -148,39 +158,13 @@ function execCmds() {
global $g, $config;
/* Set up all of the commands we want to execute. */
+defCmdT("System uptime","uptime");
+defCmdT("Interfaces","/sbin/ifconfig -a");
+defCmdT("PF Info","/sbin/pfctl -s info");
+defCmdT("Routing tables","netstat -nr");
+defCmdT("top | head -n5", "/usr/bin/top | /usr/bin/head -n5");
+defCmdT("sysctl hw.physmem","/sbin/sysctl hw.physmem");
-/* System stats/info */
-defCmdT("System uptime", "/usr/bin/uptime");
-defCmdT("Interfaces", "/sbin/ifconfig -a");
-defCmdT("Interface Statistics","/usr/bin/netstat -ni");
-defCmdT("Top Process Info", "/usr/bin/top | /usr/bin/head -n5");
-defCmdT("Processes", "/bin/ps xauww");
-defCmdT("Mounted Filesystems", "/sbin/mount");
-defCmdT("Free Disk Space", "/bin/df -hi");
-defCmdT("Routing tables", "/usr/bin/netstat -nWr");
-defCmdT("Mbuf Usage", "/usr/bin/netstat -mb");
-defCmdT("VMStat", "/usr/bin/vmstat -afimsz");
-defCmdT("Sockets", "/usr/bin/sockstat");
-
-/* Firewall rules and info */
-defCmdT("Generated Ruleset", "/bin/cat {$g['tmp_path']}/rules.debug");
-defCmdT("Generated Ruleset Limiters", "/bin/cat {$g['tmp_path']}/rules.limiter");
-defCmdT("Generated Ruleset Limits", "/bin/cat {$g['tmp_path']}/rules.limits");
-defCmdT("pf NAT Rules", "/sbin/pfctl -vvsn");
-defCmdT("pf Firewall Rules", "/sbin/pfctl -vvsr");
-defCmdT("pf Tables", "/sbin/pfctl -vs Tables");
-defCmdT("pf State Table Contents", "/sbin/pfctl -ss");
-defCmdT("pf Info", "/sbin/pfctl -si");
-defCmdT("pf Show All", "/sbin/pfctl -sa");
-defCmdT("pf Queues", "/sbin/pfctl -s queue -v");
-defCmdT("pf OSFP", "/sbin/pfctl -s osfp");
-defCmdT("pfsync stats", "/usr/bin/netstat -s -ppfsync");
-defCmdT("pftop Default", "/usr/local/sbin/pftop -a -b");
-defCmdT("pftop Long", "/usr/local/sbin/pftop -w 150 -a -b -v long");
-defCmdT("pftop Queue", "/usr/local/sbin/pftop -w 150 -a -b -v queue");
-defCmdT("pftop Rules", "/usr/local/sbin/pftop -w 150 -a -b -v rules");
-defCmdT("pftop Size", "/usr/local/sbin/pftop -w 150 -a -b -v size");
-defCmdT("pftop Speed", "/usr/local/sbin/pftop -w 150 -a -b -v speed");
if (isset($config['captiveportal']) && is_array($config['captiveportal'])) {
foreach ($config['captiveportal'] as $cpZone => $cpdata) {
if (isset($cpdata['enable'])) {
@@ -238,44 +222,11 @@ $currentDate = $dateOutput[0];
$pgtitle = array("{$g['product_name']}", "status");
include("head.inc");
-?>
-<style type="text/css">
-/*<![CDATA[*/
-pre {
- margin: 0px;
- font-family: courier new, courier;
- font-weight: normal;
- font-size: 9pt;
-}
-/*]]>*/
-</style>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<strong><?=$currentDate;?></strong>
-<p><span class="red"><strong><?=gettext("Note: make sure to remove any sensitive information " .
-"(passwords, maybe also IP addresses) before posting " .
-"information from this page in public places (like mailing lists)"); ?>!</strong></span><br />
-<?=gettext("Passwords in config.xml have been automatically removed"); ?>.<br /><br />
-<?=gettext("When the page has finished loading, the output will be stored in {$output_file}. It may be downloaded via scp or "); ?>
-<a href="/exec.php?dlPath=<?= $output_file ?>"><?=gettext("Diagnostics > Command Prompt")?></a>
-
-<div id="cmdspace" style="width:700px">
-<?php listCmds(); ?>
+print_info_box(gettext("Make sure all sensitive information is removed! (Passwords, maybe also IP addresses) before posting " .
+ "information from this page in public places (like mailing lists)") . '<br />' .
+ gettext("Passwords in config.xml have been automatically removed"));
-<?php execCmds(); ?>
-</div>
-<br />
-<?=gettext("Saving output to archive...");?>
-<?php
-if (is_dir($output_path)) {
- mwexec("/usr/bin/tar czpf " . escapeshellarg($output_file) . " -C " . escapeshellarg(dirname($output_path)) . " " . escapeshellarg(basename($output_path)));
- unlink_if_exists("{$output_path}/*");
- @rmdir($output_path);
-}
-?>
-<?=gettext("Done.");?>
+listCmds();
+execCmds();
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_captiveportal.php b/src/usr/local/www/status_captiveportal.php
index d88a452..efe6851 100644
--- a/src/usr/local/www/status_captiveportal.php
+++ b/src/usr/local/www/status_captiveportal.php
@@ -51,6 +51,7 @@ if (isset($_POST['zone'])) {
$cpzone = $_POST['zone'];
}
+
$pgtitle = array(gettext("Status: Captive portal"));
$shortcut_section = "captiveportal";
@@ -80,12 +81,6 @@ if ($_GET['act'] == "del" && !empty($cpzone) && isset($cpzoneid) && isset($_GET[
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php
-
flush();
function clientcmp($a, $b) {
@@ -112,149 +107,149 @@ if (!empty($cpzone)) {
}
}
+if (!empty($cpzone) && isset($config['voucher'][$cpzone]['enable'])):
+ $tab_array = array();
+ $tab_array[] = array(gettext("Active Users"), true, "status_captiveportal.php?zone=" . htmlspecialchars($cpzone));
+ $tab_array[] = array(gettext("Active Vouchers"), false, "status_captiveportal_vouchers.php?zone=" . htmlspecialchars($cpzone));
+ $tab_array[] = array(gettext("Voucher Rolls"), false, "status_captiveportal_voucher_rolls.php?zone=" . htmlspecialchars($cpzone));
+ $tab_array[] = array(gettext("Test Vouchers"), false, "status_captiveportal_test.php?zone=" . htmlspecialchars($cpzone));
+ $tab_array[] = array(gettext("Expire Vouchers"), false, "status_captiveportal_expire.php?zone=" . htmlspecialchars($cpzone));
+ display_top_tabs($tab_array);
+endif;
+
// Load MAC-Manufacturer table
$mac_man = load_mac_manufacturer_table();
+require('classes/Form.class.php');
+
+if (count($a_cp) > 1) {
+ $form = new Form();
+
+ $section = new Form_Section('Captive Portal Zone');
+
+ $zonelist = array("" => 'None');
+
+ foreach ($a_cp as $cpkey => $cp)
+ $zonelist[$cpkey] = $cp['zone'];
+
+ $section->addInput(new Form_Select(
+ 'zone',
+ 'Where to show rule descriptions',
+ $cpzone,
+ $zonelist
+ ));
+
+ $form->add($section);
+ print($form);
+}
?>
-<?php if (!empty($cpzone) && isset($config['voucher'][$cpzone]['enable'])): ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab pane">
- <tr><td class="tabnavtbl">
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Captive Portal Status (")?><?=$a_cp[$cpzone]['zone']?>)</h2></div>
+ <div class="panel-body table-responsive">
+
+ <table class="table table-striped table-hover table-condensed">
+
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Active Users"), true, "status_captiveportal.php?zone=" . htmlspecialchars($cpzone));
- $tab_array[] = array(gettext("Active Vouchers"), false, "status_captiveportal_vouchers.php?zone=" . htmlspecialchars($cpzone));
- $tab_array[] = array(gettext("Voucher Rolls"), false, "status_captiveportal_voucher_rolls.php?zone=" . htmlspecialchars($cpzone));
- $tab_array[] = array(gettext("Test Vouchers"), false, "status_captiveportal_test.php?zone=" . htmlspecialchars($cpzone));
- $tab_array[] = array(gettext("Expire Vouchers"), false, "status_captiveportal_expire.php?zone=" . htmlspecialchars($cpzone));
- display_top_tabs($tab_array);
-?>
- </td></tr>
- <tr>
- <td class="tabcont">
-<?php endif; ?>
-
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="20%" class="vncell" valign="top">
- <br /><?=gettext("Captive Portal Zone"); ?><br/><br />
- </td>
- <td class="vncell" width="30%" align="center">
+if (!empty($cpzone)): ?>
+
+ <tr>
+ <th>
+ <a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=ip&amp;showact=<?=htmlspecialchars($_GET['showact'])?>"><?=gettext("IP address")?></a>
+ </th>
+ <th>
+ <a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=mac&amp;showact=<?=htmlspecialchars($_GET['showact'])?>"><?=gettext("MAC address")?></a>
+ </th>
+ <th>
+ <a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=user&amp;showact=<?=htmlspecialchars($_GET['showact'])?>"><?=gettext("Username")?></a>
+ </th>
+ <th>
+ <a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=start&amp;showact=<?=htmlspecialchars($_GET['showact'])?>"><?=gettext("Session start")?></a>
+ </th>
+
<?php
- if (count($a_cp) > 1) {
+ if ($_GET['showact']):
?>
- <form action="status_captiveportal.php" method="post" enctype="multipart/form-data" name="form1" id="form1">
- <select name="zone" class="formselect" onchange="document.form1.submit()">
- <option value="">none</option>
+ <th>
+ <a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=lastact&amp;showact=<?=htmlspecialchars($_GET['showact'])?>"><?=gettext("Last activity")?></a>
+ </th>
<?php
- foreach ($a_cp as $cpkey => $cp) {
- echo "<option value=\"" . htmlspecialchars($cpkey) . "\" ";
- if ($cpzone == $cpkey) {
- echo "selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($cp['zone']) . "</option>\n";
- }
+ endif;
?>
- </select>
- <br />
- </form>
+ <th></th>
+ </tr>
<?php
- } else {
- echo htmlspecialchars($a_cp[$cpzone]['zone']);
- }
-?>
- </td>
- <td colspan="3" width="50%"></td>
- </tr>
- <tr>
- <td colspan="5"><br /></td>
- </tr>
+
+ foreach ($cpdb as $cpent): ?>
+ <tr>
+ <td>
+ <?=$cpent[2]?>
+ </td>
+ <td>
<?php
- if (!empty($cpzone)):
-?>
- <tr>
- <td colspan="5" valign="top" class="listtopic"><?=gettext("Captive Portal status");?></td>
- </tr>
- <tr>
- <td class="listhdrr"><a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=ip&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("IP address");?></a></td>
- <td class="listhdrr"><a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=mac&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("MAC address");?></a></td>
- <td class="listhdrr"><a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=user&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Username");?></a></td>
+ $mac=trim($cpent[3]);
+ if (!empty($mac)) {
+ $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
+ print htmlentities($mac);
+ if(isset($mac_man[$mac_hi])) {
+ print "<br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>";
+ }
+ }
+?> &nbsp;
+ </td>
+ <td>
+ <?=htmlspecialchars($cpent[4])?>&nbsp;
+ </td>
<?php
if ($_GET['showact']):
-?>
- <td class="listhdrr"><a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=start&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Session start");?></a></td>
- <td class="listhdr"><a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=lastact&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Last activity");?></a></td>
+ $last_act = captiveportal_get_last_activity($cpent[2], $cpent[3]); ?>
+ <td>
+ <?=htmlspecialchars(date("m/d/Y H:i:s", $cpent[0]))?>
+ </td>
+ <td>
<?php
- else:
-?>
- <td class="listhdr" colspan="2"><a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=start&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Session start");?></a></td>
+ if ($last_act != 0)
+ echo htmlspecialchars(date("m/d/Y H:i:s", $last_act))?>
+ </td>
<?php
- endif;
+ else:
?>
- <td class="list sort_ignore"></td>
- </tr>
+ <td colspan="2">
+ <?=htmlspecialchars(date("m/d/Y H:i:s", $cpent[0]))?>
+ </td>
<?php
- foreach ($cpdb as $cpent):
+ endif;
?>
- <tr>
- <td class="listlr"><?=$cpent[2];?></td>
- <td class="listr">
+ <td>
+ <a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=<?=$_GET['order']?>&amp;showact=<?=htmlspecialchars($_GET['showact'])?>&amp;act=del&amp;id=<?=$cpent[5]?>" class="btn btn-xs brn-danger"><?=gettext("Disconnect")?></a>
+ </td>
+ </tr>
<?php
- $mac=trim($cpent[3]);
- if (!empty($mac)) {
- $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
- print htmlentities($mac);
- if (isset($mac_man[$mac_hi])) {
- print "<br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>";
- }
- }
+ endforeach;
+endif;
?>
- &nbsp;
- </td>
- <td class="listr"><?=htmlspecialchars($cpent[4]);?>&nbsp;</td>
+
+</table>
+
+<form action="status_captiveportal.php" method="get" style="margin: 14px;">
+ <input type="hidden" name="order" value="<?=htmlspecialchars($_GET['order'])?>" />
+
<?php
- if ($_GET['showact']):
- $last_act = captiveportal_get_last_activity($cpent[2], $cpent[3]);
-?>
- <td class="listr"><?=htmlspecialchars(date("m/d/Y H:i:s", $cpent[0]));?></td>
- <td class="listr"><?php if ($last_act != 0) echo htmlspecialchars(date("m/d/Y H:i:s", $last_act));?></td>
+if (!empty($cpzone)):
+ if ($_GET['showact']): ?>
+ <input type="hidden" name="showact" value="0" />
+ <input type="submit" class="btn btn-default" value="<?=gettext("Don't show last activity")?>" />
<?php
- else:
+ else:
?>
- <td class="listr" colspan="2"><?=htmlspecialchars(date("m/d/Y H:i:s", $cpent[0]));?></td>
+ <input type="hidden" name="showact" value="1" />
+ <input type="submit" class="btn btn-default" value="<?=gettext("Show last activity")?>" />
<?php
- endif;
+ endif;
?>
- <td valign="middle" class="list nowrap">
- <a href="?zone=<?=htmlspecialchars($cpzone);?>&amp;order=<?=$_GET['order'];?>&amp;showact=<?=htmlspecialchars($_GET['showact']);?>&amp;act=del&amp;id=<?=$cpent[5];?>" onclick="return confirm('<?=gettext("Do you really want to disconnect this client?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("Disconnect");?>"></a>
- </td>
- </tr>
+ <input type="hidden" name="zone" value="<?=htmlspecialchars($cpzone)?>" />
<?php
- endforeach;
- endif;
+endif;
?>
- </table>
-
-<?php if (!empty($cpzone) && isset($config['voucher'][$cpzone]['enable'])): ?>
- </td>
- </tr>
-</table>
-<?php endif; ?>
-
-<form action="status_captiveportal.php" method="get" style="margin: 14px;">
- <input type="hidden" name="order" value="<?=htmlspecialchars($_GET['order']);?>" />
-<?php if (!empty($cpzone)): ?>
-<?php if ($_GET['showact']): ?>
- <input type="hidden" name="showact" value="0" />
- <input type="submit" class="formbtn" value="<?=gettext("Don't show last activity");?>" />
-<?php else: ?>
- <input type="hidden" name="showact" value="1" />
- <input type="submit" class="formbtn" value="<?=gettext("Show last activity");?>" />
-<?php endif; ?>
- <input type="hidden" name="zone" value="<?=htmlspecialchars($cpzone);?>" />
-<?php endif; ?>
</form>
-<?php include("fend.inc"); ?>
-
-</body>
-</html>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_captiveportal_expire.php b/src/usr/local/www/status_captiveportal_expire.php
index 7d786b4..0e0631f 100644
--- a/src/usr/local/www/status_captiveportal_expire.php
+++ b/src/usr/local/www/status_captiveportal_expire.php
@@ -27,7 +27,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: captiveportal
+ pfSense_MODULE: captiveportal
*/
##|+PRIV
@@ -62,65 +62,44 @@ $a_cp =& $config['captiveportal'];
$pgtitle = array(gettext("Status"), gettext("Captive portal"), gettext("Expire Vouchers"), $a_cp[$cpzone]['zone']);
include("head.inc");
-?>
-<body>
-<?php include("fbegin.inc"); ?>
-<form action="status_captiveportal_expire.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab pane">
- <tr><td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Active Users"), false, "status_captiveportal.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Active Vouchers"), false, "status_captiveportal_vouchers.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Voucher Rolls"), false, "status_captiveportal_voucher_rolls.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Test Vouchers"), false, "status_captiveportal_test.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Expire Vouchers"), true, "status_captiveportal_expire.php?zone={$cpzone}");
- display_top_tabs($tab_array);
-?>
- </td></tr>
- <tr>
- <td class="tabcont">
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="content pane">
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Voucher(s)"); ?></td>
- <td class="vtable">
- <textarea name="vouchers" cols="65" rows="3" id="vouchers" class="formpre"><?=htmlspecialchars($_POST['vouchers']);?></textarea>
- <br />
- <?=gettext("Enter multiple vouchers separated by space or newline. All valid vouchers will be marked as expired"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="zone" type="hidden" value="<?=htmlspecialchars($cpzone);?>" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Submit"); ?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
-</form>
-<br/>
-<?php
+$tab_array = array();
+$tab_array[] = array(gettext("Active Users"), false, "status_captiveportal.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Active Vouchers"), false, "status_captiveportal_vouchers.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Voucher Rolls"), false, "status_captiveportal_voucher_rolls.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Test Vouchers"), false, "status_captiveportal_test.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Expire Vouchers"), true, "status_captiveportal_expire.php?zone={$cpzone}");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form;
+
+$section = new Form_Section('Expire Vouchers');
+
+$section->addInput(new Form_Textarea(
+ 'vouchers',
+ 'Vouchers',
+ $_POST['vouchers']
+))->setHelp('Enter multiple vouchers separated by space or newline. All valid vouchers will be marked as expired.');
+
+$section->addInput(new Form_Input(
+ 'zone',
+ null,
+ 'hidden',
+ $cpzone
+));
+
+$form->add($section);
+print($form);
+
if ($_POST) {
if ($_POST['vouchers']) {
- $result = voucher_expire($_POST['vouchers']);
- echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"4\" width=\"100%\" summary=\"results\">\n";
- if ($result) {
- echo "<tr><td bgcolor=\"#D9DEE8\"><img src=\"/themes/{$g['theme']}/images/icons/icon_pass.gif\" alt=\"pass\" /></td>";
- echo "<td bgcolor=\"#D9DEE8\">Success</td></tr>";
- } else {
- echo "<tr><td bgcolor=\"#FFD9D1\"><img src=\"/themes/{$g['theme']}/images/icons/icon_block.gif\" alt=\"block\" /></td>";
- echo "<td bgcolor=\"#FFD9D1\">Error</td></tr>";
- }
- echo "</table>";
+ if(voucher_expire($_POST['vouchers']))
+ print_info_box(gettext('Voucher successfully marked'), 'success');
+ else
+ print_info_box(gettext('Error: Voucher could not be processed'), 'danger');
}
}
-include("fend.inc");
-?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_captiveportal_test.php b/src/usr/local/www/status_captiveportal_test.php
index 2a3dfc3..6a7993e 100644
--- a/src/usr/local/www/status_captiveportal_test.php
+++ b/src/usr/local/www/status_captiveportal_test.php
@@ -63,66 +63,52 @@ $pgtitle = array(gettext("Status"), gettext("Captive portal"), gettext("Test Vou
$shortcut_section = "captiveportal-vouchers";
include("head.inc");
-?>
-<body>
-<?php include("fbegin.inc"); ?>
-<form action="status_captiveportal_test.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab pane">
- <tr><td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Active Users"), false, "status_captiveportal.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Active Vouchers"), false, "status_captiveportal_vouchers.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Voucher Rolls"), false, "status_captiveportal_voucher_rolls.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Test Vouchers"), true, "status_captiveportal_test.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Expire Vouchers"), false, "status_captiveportal_expire.php?zone={$cpzone}");
- display_top_tabs($tab_array);
-?>
- </td></tr>
- <tr>
- <td class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="content pane">
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Voucher(s)"); ?></td>
- <td class="vtable">
- <textarea name="vouchers" cols="65" rows="3" id="vouchers" class="formpre"><?=htmlspecialchars($_POST['vouchers']);?></textarea>
- <br />
- <?=gettext("Enter multiple vouchers separated by space or newline. The remaining time, if valid, will be shown for each voucher"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="zone" type="hidden" value="<?=htmlspecialchars($cpzone);?>" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Submit"); ?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
-</form>
-<br/>
-<?php
+$tab_array = array();
+$tab_array[] = array(gettext("Active Users"), false, "status_captiveportal.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Active Vouchers"), false, "status_captiveportal_vouchers.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Voucher Rolls"), false, "status_captiveportal_voucher_rolls.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Test Vouchers"), true, "status_captiveportal_test.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Expire Vouchers"), false, "status_captiveportal_expire.php?zone={$cpzone}");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form;
+
+$section = new Form_Section('Test Vouchers');
+
+$section->addInput(new Form_Textarea(
+ 'vouchers',
+ 'Vouchers',
+ $_POST['vouchers']
+))->setHelp('Enter multiple vouchers separated by space or newline. The remaining time, if valid, will be shown for each voucher.');
+
+$section->addInput(new Form_Input(
+ 'zone',
+ null,
+ 'hidden',
+ $cpzone
+));
+
+$form->add($section);
+print($form);
+
if ($_POST) {
if ($_POST['vouchers']) {
$test_results = voucher_auth($_POST['vouchers'], 1);
- echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"4\" width=\"100%\" summary=\"results\">\n";
+ $output = "";
+
foreach ($test_results as $result) {
if (strpos($result, " good ") || strpos($result, " granted ")) {
- echo "<tr><td bgcolor=\"#D9DEE8\"><img src=\"/themes/{$g['theme']}/images/icons/icon_pass.gif\" alt=\"pass\" /></td>";
- echo "<td bgcolor=\"#D9DEE8\">$result</td></tr>";
+ $output .= '<font color="green">' . $result . '</font>' . '<br />';
} else {
- echo "<tr><td bgcolor=\"#FFD9D1\"><img src=\"/themes/{$g['theme']}/images/icons/icon_block.gif\" alt=\"block\" /></td>";
- echo "<td bgcolor=\"#FFD9D1\">$result</td></tr>";
+ $output .= '<font color="red">' . $result . '</font>' . '<br />';
}
}
- echo "</table>";
+
+ print_info_box($output);
}
}
-include("fend.inc");
-?>
-</body>
-</html>
+include("foot.inc");
diff --git a/src/usr/local/www/status_captiveportal_voucher_rolls.php b/src/usr/local/www/status_captiveportal_voucher_rolls.php
index 512356b..f7f3ac9 100644
--- a/src/usr/local/www/status_captiveportal_voucher_rolls.php
+++ b/src/usr/local/www/status_captiveportal_voucher_rolls.php
@@ -28,7 +28,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: captiveportal
+ pfSense_MODULE: captiveportal
*/
##|+PRIV
@@ -65,83 +65,73 @@ $shortcut_section = "captiveportal-vouchers";
if (!is_array($config['voucher'][$cpzone]['roll'])) {
$config['voucher'][$cpzone]['roll'] = array();
}
+
$a_roll = &$config['voucher'][$cpzone]['roll'];
include("head.inc");
+
+$tab_array = array();
+$tab_array[] = array(gettext("Active Users"), false, "status_captiveportal.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Active Vouchers"), false, "status_captiveportal_vouchers.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Voucher Rolls"), true, "status_captiveportal_voucher_rolls.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Test Vouchers"), false, "status_captiveportal_test.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Expire Vouchers"), false, "status_captiveportal_expire.php?zone={$cpzone}");
+display_top_tabs($tab_array);
?>
-<body>
-<?php include("fbegin.inc"); ?>
-
-<form action="status_captiveportal_voucher_rolls.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab pane">
- <tr>
- <td class="tabnavtbl">
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Active Users"), false, "status_captiveportal.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Active Vouchers"), false, "status_captiveportal_vouchers.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Voucher Rolls"), true, "status_captiveportal_voucher_rolls.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Test Vouchers"), false, "status_captiveportal_test.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Expire Vouchers"), false, "status_captiveportal_expire.php?zone={$cpzone}");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="content pane">
- <tr>
- <td class="listhdrr"><?=gettext("Roll#"); ?></td>
- <td class="listhdrr"><?=gettext("Minutes/Ticket"); ?></td>
- <td class="listhdrr"><?=gettext("# of Tickets"); ?></td>
- <td class="listhdrr"><?=gettext("Comment"); ?></td>
- <td class="listhdrr"><?=gettext("used"); ?></td>
- <td class="listhdrr"><?=gettext("active"); ?></td>
- <td class="listhdr"><?=gettext("ready"); ?></td>
- </tr>
- <?php
- $voucherlck = lock("vouche{$cpzone}r");
- $i = 0;
- foreach ($a_roll as $rollent):
- $used = voucher_used_count($rollent['number']);
- $active = count(voucher_read_active_db($rollent['number']), $rollent['minutes']);
- $ready = $rollent['count'] - $used;
- /* used also count active vouchers, remove them */
- $used = $used - $active;
- ?>
- <tr>
- <td class="listlr">
- <?=htmlspecialchars($rollent['number']); ?>&nbsp;
- </td>
- <td class="listr">
- <?=htmlspecialchars($rollent['minutes']);?>&nbsp;
- </td>
- <td class="listr">
- <?=htmlspecialchars($rollent['count']);?>&nbsp;
- </td>
- <td class="listr">
- <?=htmlspecialchars($rollent['comment']); ?>&nbsp;
- </td>
- <td class="listr">
- <?=htmlspecialchars($used); ?>&nbsp;
- </td>
- <td class="listr">
- <?=htmlspecialchars($active); ?>&nbsp;
- </td>
- <td class="listr">
- <?=htmlspecialchars($ready); ?>&nbsp;
- </td>
- </tr>
- <?php
- $i++;
- endforeach;
- unlock($voucherlck);
- ?>
- </table>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Roll#"); ?></th>
+ <th><?=gettext("Minutes/Ticket"); ?></th>
+ <th><?=gettext("# of Tickets"); ?></th>
+ <th><?=gettext("Comment"); ?></th>
+ <th><?=gettext("used"); ?></th>
+ <th><?=gettext("active"); ?></th>
+ <th><?=gettext("ready"); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+ $voucherlck = lock("vouche{$cpzone}r");
+ $i = 0;
+ foreach($a_roll as $rollent):
+ $used = voucher_used_count($rollent['number']);
+ $active = count(voucher_read_active_db($rollent['number']),$rollent['minutes']);
+ $ready = $rollent['count'] - $used;
+ /* used also count active vouchers, remove them */
+ $used = $used - $active;
+?>
+ <tr>
+ <td>
+ <?=htmlspecialchars($rollent['number'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($rollent['minutes'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($rollent['count'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($rollent['comment'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($used)?>
+ </td>
+ <td>
+ <?=htmlspecialchars($active)?>
+ </td>
+ <td>
+ <?=htmlspecialchars($ready)?>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+
+ unlock($voucherlck)?>
+ </tbody>
+ </table>
+</div>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_captiveportal_vouchers.php b/src/usr/local/www/status_captiveportal_vouchers.php
index a7ab959..8ff5c20 100644
--- a/src/usr/local/www/status_captiveportal_vouchers.php
+++ b/src/usr/local/www/status_captiveportal_vouchers.php
@@ -27,7 +27,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: captiveportal
+ pfSense_MODULE: captiveportal
*/
##|+PRIV
@@ -69,6 +69,7 @@ function clientcmp($a, $b) {
if (!is_array($config['voucher'][$cpzone]['roll'])) {
$config['voucher'][$cpzone]['roll'] = array();
}
+
$a_roll = $config['voucher'][$cpzone]['roll'];
$db = array();
@@ -85,6 +86,7 @@ foreach ($a_roll as $rollent) {
foreach ($active_vouchers as $voucher => $line) {
list($voucher, $timestamp, $minutes) = explode(",", $line);
$remaining = (($timestamp + 60*$minutes) - time());
+
if ($remaining > 0) {
$dbent[0] = $voucher;
$dbent[1] = $roll;
@@ -102,49 +104,43 @@ if ($_GET['order']) {
}
include("head.inc");
+
+$tab_array = array();
+$tab_array[] = array(gettext("Active Users"), false, "status_captiveportal.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Active Vouchers"), true, "status_captiveportal_vouchers.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Voucher Rolls"), false, "status_captiveportal_voucher_rolls.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Test Vouchers"), false, "status_captiveportal_test.php?zone={$cpzone}");
+$tab_array[] = array(gettext("Expire Vouchers"), false, "status_captiveportal_expire.php?zone={$cpzone}");
+display_top_tabs($tab_array);
?>
-<body>
-<?php include("fbegin.inc"); ?>
-<form action="status_captiveportal_vouchers.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab pane">
- <tr><td class="tabnavtbl">
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><a href="?order=0&amp;showact=<?=htmlspecialchars($_GET['showact'])?>"><?=gettext("Voucher"); ?></a></th>
+ <th><a href="?order=1&amp;showact=<?=htmlspecialchars($_GET['showact'])?>"><?=gettext("Roll"); ?></a></th>
+ <th><a href="?order=2&amp;showact=<?=htmlspecialchars($_GET['showact'])?>"><?=gettext("Activated at"); ?></a></th>
+ <th><a href="?order=3&amp;showact=<?=htmlspecialchars($_GET['showact'])?>"><?=gettext("Expires in"); ?></a></th>
+ <th><a href="?order=4&amp;showact=<?=htmlspecialchars($_GET['showact'])?>"><?=gettext("Expires at"); ?></a></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Active Users"), false, "status_captiveportal.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Active Vouchers"), true, "status_captiveportal_vouchers.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Voucher Rolls"), false, "status_captiveportal_voucher_rolls.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Test Vouchers"), false, "status_captiveportal_test.php?zone={$cpzone}");
- $tab_array[] = array(gettext("Expire Vouchers"), false, "status_captiveportal_expire.php?zone={$cpzone}");
- display_top_tabs($tab_array);
+foreach ($db as $dbent):
?>
- </td></tr>
- <tr>
- <td class="tabcont">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="content pane">
- <tr>
- <td class="listhdrr"><a href="?order=0&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Voucher"); ?></a></td>
- <td class="listhdrr"><a href="?order=1&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Roll"); ?></a></td>
- <td class="listhdrr"><a href="?order=2&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Activated at"); ?></a></td>
- <td class="listhdrr"><a href="?order=3&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Expires in"); ?></a></td>
- <td class="listhdr"><a href="?order=4&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Expires at"); ?></a></td>
- <td class="list"></td>
- </tr>
-<?php foreach ($db as $dbent): ?>
- <tr>
- <td class="listlr"><?=$dbent[0];?></td>
- <td class="listr"><?=$dbent[1];?></td>
- <td class="listr"><?=htmlspecialchars(date("m/d/Y H:i:s", $dbent[2]));?></td>
- <td class="listr"><?=$dbent[3];?> <?=gettext("min"); ?></td>
- <td class="listr"><?=htmlspecialchars(date("m/d/Y H:i:s", $dbent[4]));?></td>
- <td class="list"></td>
- </tr>
-<?php endforeach; ?>
- </table>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ <tr>
+ <td><?=$dbent[0]?></td>
+ <td><?=$dbent[1]?></td>
+ <td><?=htmlspecialchars(date("m/d/Y H:i:s", $dbent[2]))?></td>
+ <td><?=$dbent[3]?><?=gettext("min"); ?></td>
+ <td><?=htmlspecialchars(date("m/d/Y H:i:s", $dbent[4]))?></td>
+ </tr>
+<?php
+endforeach;
+?>
+ </tbody>
+ </table>
+</div>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_dhcp_leases.php b/src/usr/local/www/status_dhcp_leases.php
index 4c37f21..c961eca 100644
--- a/src/usr/local/www/status_dhcp_leases.php
+++ b/src/usr/local/www/status_dhcp_leases.php
@@ -85,13 +85,10 @@ if (($_GET['deleteip']) && (is_ipaddr($_GET['deleteip']))) {
header("Location: status_dhcp_leases.php?all={$_GET['all']}");
}
-include("head.inc");
-
-?>
+// Load MAC-Manufacturer table
+$mac_man = load_mac_manufacturer_table();
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php
+include("head.inc");
function leasecmp($a, $b) {
return strcmp($a[$_GET['order']], $b[$_GET['order']]);
@@ -312,146 +309,139 @@ if ($_GET['order']) {
/* only print pool status when we have one */
if (count($pools) > 0) {
?>
-<table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcp leases">
- <tr>
- <td class="listhdrr"><?=gettext("Failover Group"); ?></a></td>
- <td class="listhdrr"><?=gettext("My State"); ?></a></td>
- <td class="listhdrr"><?=gettext("Since"); ?></a></td>
- <td class="listhdrr"><?=gettext("Peer State"); ?></a></td>
- <td class="listhdrr"><?=gettext("Since"); ?></a></td>
- </tr>
-<?php
- foreach ($pools as $data) {
- echo "<tr>\n";
- echo "<td class=\"listlr\">{$fspans}{$data['name']}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}{$data['mystate']}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['mydate']) . "{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}{$data['peerstate']}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['peerdate']) . "{$fspane}</td>\n";
- echo "<td class=\"list\" valign=\"middle\" width=\"17\">&nbsp;</td>\n";
- echo "<td class=\"list\" valign=\"middle\" width=\"17\">&nbsp;</td>\n";
- echo "</tr>\n";
- }
-?>
-</table>
-
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Pool status')?></h2></div>
+ <div class="panel-body">
+ <table class="table">
+ <thead>
+ <tr>
+ <th><?=gettext("Failover Group")?></a></th>
+ <th><?=gettext("My State")?></a></th>
+ <th><?=gettext("Since")?></a></th>
+ <th><?=gettext("Peer State")?></a></th>
+ <th><?=gettext("Since")?></a></th>
+ </tr>
+ </thead>
+ <tbody>
+<? foreach ($pools as $data):?>
+ <tr>
+ <td><?=$data['name']?></td>
+ <td><?=$data['mystate']?></td>
+ <td><?=adjust_gmt($data['mydate'])?></td>
+ <td><?=$data['peerstate']?></td>
+ <td><?=adjust_gmt($data['peerdate'])?></td>
+ </tr>
+<? endforeach?>
+ </tbody>
+ </table>
+ </div>
+</div>
<?php
/* only print pool status when we have one */
}
?>
-
-<br/>
-
-<table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcp leases">
- <tr>
- <td class="listhdrr"><a href="#"><?=gettext("IP address"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("MAC address"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("Hostname"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("Start"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("End"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("Online"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("Lease Type"); ?></a></td>
- </tr>
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Leases')?></h2></div>
+ <div class="panel-body">
+ <table class="table">
+ <thead>
+ <tr>
+ <th><!-- icon --></th>
+ <th><?=gettext("IP address")?></th>
+ <th><?=gettext("MAC address")?></th>
+ <th><?=gettext("Hostname")?></th>
+ <th><?=gettext("Start")?></th>
+ <th><?=gettext("End")?></th>
+ <th><?=gettext("Online")?></th>
+ <th><?=gettext("Lease Type")?></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
-// Load MAC-Manufacturer table
-$mac_man = load_mac_manufacturer_table();
-foreach ($leases as $data) {
- if (($data['act'] == "active") || ($data['act'] == "static" && !empty($data['ip'])) || ($_GET['all'] == 1)) {
- if ($data['act'] != "active" && $data['act'] != "static") {
- $fspans = "<span class=\"gray\">";
- $fspane = "&nbsp;</span>";
- } else {
- $fspans = "";
- $fspane = "&nbsp;";
- }
- $lip = ip2ulong($data['ip']);
- if ($data['act'] != "static") {
- foreach ($config['dhcpd'] as $dhcpif => $dhcpifconf) {
- if (!is_array($dhcpifconf['range'])) {
- continue;
- }
- if (($lip >= ip2ulong($dhcpifconf['range']['from'])) && ($lip <= ip2ulong($dhcpifconf['range']['to']))) {
- $data['if'] = $dhcpif;
- break;
- }
- // Check if the IP is in the range of any DHCP pools
- if (is_array($dhcpifconf['pool'])) {
- foreach ($dhcpifconf['pool'] as $dhcppool) {
- if (is_array($dhcppool['range'])) {
- if (($lip >= ip2ulong($dhcppool['range']['from'])) && ($lip <= ip2ulong($dhcppool['range']['to']))) {
- $data['if'] = $dhcpif;
- break 2;
- }
- }
- }
- }
- }
- }
- echo "<tr>\n";
- echo "<td class=\"listlr\">{$fspans}{$data['ip']}{$fspane}</td>\n";
- $mac=$data['mac'];
- $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
- if ($data['online'] != "online") {
- if (isset($mac_man[$mac_hi])) { // Manufacturer for this MAC is defined
- echo "<td class=\"listr\">{$fspans}<a href=\"services_wol.php?if={$data['if']}&amp;mac=$mac\" title=\"" . gettext("$mac - send Wake on LAN packet to this MAC address") ."\">{$mac}</a><br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>{$fspane}</td>\n";
- } else {
- echo "<td class=\"listr\">{$fspans}<a href=\"services_wol.php?if={$data['if']}&amp;mac={$data['mac']}\" title=\"" . gettext("send Wake on LAN packet to this MAC address") ."\">{$data['mac']}</a>{$fspane}</td>\n";
- }
- } else {
- if (isset($mac_man[$mac_hi])) { // Manufacturer for this MAC is defined
- echo "<td class=\"listr\">{$fspans}{$mac}<br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>{$fspane}</td>\n";
- } else {
- echo "<td class=\"listr\">{$fspans}{$data['mac']}{$fspane}</td>\n";
- }
- }
- echo "<td class=\"listr\">{$fspans}" . htmlentities($data['hostname']) . "{$fspane}</td>\n";
- if ($data['type'] != "static") {
- echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['start']) . "{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['end']) . "{$fspane}</td>\n";
- } else {
- echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
- }
- echo "<td class=\"listr\">{$fspans}{$data['online']}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}{$data['act']}{$fspane}</td>\n";
- echo "<td valign=\"middle\">&nbsp;";
- if ($data['type'] == "dynamic") {
- echo "<a href=\"services_dhcp_edit.php?if={$data['if']}&amp;mac={$data['mac']}&amp;hostname={$data['hostname']}\">";
- echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("add a static mapping for this MAC address") ."\" alt=\"add\" /></a>&nbsp;\n";
- } else {
- echo "<a href=\"services_dhcp_edit.php?if={$data['if']}&amp;id={$data['staticmap_array_index']}\">";
- echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_e.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("edit the static mapping for this entry") ."\" alt=\"add\" />&nbsp;\n";
- }
-
- echo "<a href=\"services_wol_edit.php?if={$data['if']}&amp;mac={$data['mac']}&amp;descr={$data['hostname']}\">";
- echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_wol_all.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("add a Wake on LAN mapping for this MAC address") ."\" alt=\"add\" /></a>&nbsp;\n";
+foreach ($leases as $data):
+ if ($data['act'] != "active" && $data['act'] != "static" && $_GET['all'] != 1)
+ continue;
- /* Only show the button for offline dynamic leases */
- if (($data['type'] == "dynamic") && ($data['online'] != "online")) {
- echo "<a href=\"status_dhcp_leases.php?deleteip={$data['ip']}&amp;all=" . htmlspecialchars($_GET['all']) . "\">";
- echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_x.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("delete this DHCP lease") . "\" alt=\"delete\" /></a>&nbsp;\n";
+ if ($data['act'] == 'active')
+ $icon = 'icon-ok-circle';
+ elseif ($data['act'] == 'expired')
+ $icon = 'icon-ban-circle';
+ else
+ $icon = 'icon-remove-circle';
+
+ $lip = ip2ulong($data['ip']);
+ if ($data['act'] != "static") {
+ foreach ($config['dhcpd'] as $dhcpif => $dhcpifconf) {
+ if (!is_array($dhcpifconf['range']))
+ continue;
+ if (($lip >= ip2ulong($dhcpifconf['range']['from'])) && ($lip <= ip2ulong($dhcpifconf['range']['to']))) {
+ $data['if'] = $dhcpif;
+ break;
+ }
}
- echo "</td></tr>\n";
}
-}
+ $mac = $data['mac'];
+ $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
?>
-</table>
-<br/>
-<form action="status_dhcp_leases.php" method="get">
- <input type="hidden" name="order" value="<?=htmlspecialchars($_GET['order']);?>" />
+ <tr>
+ <td><i class="icon <?=$icon?>"></i></td>
+ <td><?=$data['ip']?></td>
+ <td>
+ <?=$mac?>
+
+ <? if(isset($mac_man[$mac_hi])):?>
+ (<?=$mac_man[$mac_hi]?>)
+ <?endif?>
+ </td>
+ <td><?=htmlentities($data['hostname'])?></td>
+<? if ($data['type'] != "static"):?>
+ <td><?=adjust_gmt($data['start'])?></td>
+ <td><?=adjust_gmt($data['end'])?></td>
+<? else: ?>
+ <td>n/a</td>
+ <td>n/a</td>
+<? endif; ?>
+ <td><?=$data['online']?></td>
+ <td><?=$data['act']?></td>
+ <td>
+<? if ($data['type'] == "dynamic"): ?>
+ <a class="btn btn-xs btn-primary" href="services_dhcp_edit.php?if=<?=$data['if']?>&amp;mac=<?=$data['mac']?>&amp;hostname=<?=htmlspecialchars($data['hostname'])?>">
+ <?=gettext("add static mapping")?>
+ </a>
+<? else: ?>
+ <a class="btn btn-xs btn-primary" href="services_dhcp_edit.php?if=<?=$data['if']?>&amp;id=<?=$data['staticmap_array_index']?>">
+ <?=gettext("edit static mapping")?>
+ </a>
+<? endif; ?>
+
+ <a class="btn btn-xs btn-success" href="services_wol_edit.php?if=<?=$data['if']?>&amp;mac=<?=$data['mac']?>&amp;descr=<?=htmlentities($data['hostname'])?>">
+ add WOL mapping
+ </a>
+
+<? if ($data['online'] != "online"):?>
+ <a class="btn btn-xs btn-warning" href="services_wol.php?if=<?=$data['if']?>&amp;mac=<?=$data['mac']?>">
+ send WOL packet
+ </a>
+<? endif; ?>
+
+<? if ($data['type'] == "dynamic" && $data['online'] != "online"):?>
+ <a class="btn btn-xs btn-danger" href="status_dhcp_leases.php?deleteip=<?=$data['ip']?>&amp;all=<?=intval($_GET['all'])?>">
+ delete lease
+ </a>
+<? endif?>
+ </td>
+<? endforeach; ?>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
+
<?php if ($_GET['all']): ?>
- <input type="hidden" name="all" value="0" />
- <input type="submit" class="formbtn" value="<?=gettext("Show active and static leases only"); ?>" />
+ <a class="btn btn-default" href="status_dhcp_leases.php?all=0"><?=gettext("Show active and static leases only")?></a>
<?php else: ?>
- <input type="hidden" name="all" value="1" />
- <input type="submit" class="formbtn" value="<?=gettext("Show all configured leases"); ?>" />
-<?php endif; ?>
-</form>
-<?php if ($leases == 0): ?>
-<p><strong><?=gettext("No leases file found. Is the DHCP server active"); ?>?</strong></p>
-<?php endif; ?>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ <a class="btn btn-default" href="status_dhcp_leases.php?all=1"><?=gettext("Show all configured leases")?></a>
+<?php endif;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_dhcpv6_leases.php b/src/usr/local/www/status_dhcpv6_leases.php
index 63f1946..925f2da 100644
--- a/src/usr/local/www/status_dhcpv6_leases.php
+++ b/src/usr/local/www/status_dhcpv6_leases.php
@@ -93,12 +93,6 @@ $mac_man = load_mac_manufacturer_table();
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php
-
function leasecmp($a, $b) {
return strcmp($a[$_GET['order']], $b[$_GET['order']]);
}
@@ -314,11 +308,11 @@ while ($i < $leases_count) {
$f = $f+2;
break;
case "client-hostname":
- if ($data[$f+1] <> "") {
- $entry['hostname'] = preg_replace('/"/', '', $data[$f+1]);
+ if($data[$f+1] != "") {
+ $entry['hostname'] = preg_replace('/"/','',$data[$f+1]);
} else {
$hostname = gethostbyaddr($entry['ip']);
- if ($hostname <> "") {
+ if($hostname != "") {
$entry['hostname'] = $hostname;
}
}
@@ -384,198 +378,218 @@ if ($_GET['order']) {
/* only print pool status when we have one */
if (count($pools) > 0) {
?>
-<table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcp leases">
- <tr>
- <td class="listhdrr"><?=gettext("Failover Group"); ?></a></td>
- <td class="listhdrr"><?=gettext("My State"); ?></a></td>
- <td class="listhdrr"><?=gettext("Since"); ?></a></td>
- <td class="listhdrr"><?=gettext("Peer State"); ?></a></td>
- <td class="listhdrr"><?=gettext("Since"); ?></a></td>
- </tr>
-<?php
- foreach ($pools as $data) {
- echo "<tr>\n";
- echo "<td class=\"listlr\">{$fspans}{$data['name']}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}{$data['mystate']}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['mydate']) . "{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}{$data['peerstate']}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['peerdate']) . "{$fspane}</td>\n";
- echo "<td class=\"list\" valign=\"middle\" width=\"17\">&nbsp;</td>\n";
- echo "<td class=\"list\" valign=\"middle\" width=\"17\">&nbsp;</td>\n";
- echo "</tr>\n";
- }
-?>
-</table>
-
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Pool status')?></h2></div>
+ <div class="panel-body">
+ <table class="table">
+ <thead>
+ <tr>
+ <th><?=gettext("Failover Group")?></a></th>
+ <th><?=gettext("My State")?></a></th>
+ <th><?=gettext("Since")?></a></th>
+ <th><?=gettext("Peer State")?></a></th>
+ <th><?=gettext("Since")?></a></th>
+ </tr>
+ </thead>
+ <tbody>
+<? foreach ($pools as $data):?>
+ <tr>
+ <td><?=$data['name']?></td>
+ <td><?=$data['mystate']?></td>
+ <td><?=adjust_gmt($data['mydate'])?></td>
+ <td><?=$data['peerstate']?></td>
+ <td><?=adjust_gmt($data['peerdate'])?></td>
+ </tr>
+<? endforeach?>
+ </tbody>
+ </table>
+ </div>
+</div>
<?php
/* only print pool status when we have one */
}
-?>
-<br/>
-
-<table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcp leases">
- <tr>
- <td class="listhdrr"><a href="#"><?=gettext("IPv6 address"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("IAID"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("DUID"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("Hostname/MAC"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("Start"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("End"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("Online"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("Lease Type"); ?></a></td>
- </tr>
+if (empty($leases))
+ print '<div class="alert alert-warning" role="alert">'. gettext("No leases file found. Is the DHCP server active?") .'</div>';
+
+?>
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Leases')?></h2></div>
+ <div class="panel-body">
+ <table class="table">
+ <thead>
+ <tr>
+ <th><!-- icon --></th>
+ <th><?=gettext("IPv6 address")?></th>
+ <th><?=gettext("IAID")?></th>
+ <th><?=gettext("DUID")?></th>
+ <th><?=gettext("MAC address")?></th>
+ <th><?=gettext("Hostname")?></th>
+ <th><?=gettext("Start")?></th>
+ <th><?=gettext("End")?></th>
+ <th><?=gettext("Online")?></th>
+ <th><?=gettext("Lease Type")?></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
-foreach ($leases as $data) {
- if (($data['act'] == "active") || ($data['act'] == "static") || ($_GET['all'] == 1)) {
- if ($data['act'] != "active" && $data['act'] != "static") {
- $fspans = "<span class=\"gray\">";
- $fspane = "&nbsp;</span>";
- } else {
- $fspans = "";
- $fspane = "&nbsp;";
- }
+foreach ($leases as $data):
+ if ($data['act'] != "active" && $data['act'] != "static" && $_GET['all'] != 1)
+ continue;
- if ($data['act'] == "static") {
- foreach ($config['dhcpdv6'] as $dhcpif => $dhcpifconf) {
- if (is_array($dhcpifconf['staticmap'])) {
- foreach ($dhcpifconf['staticmap'] as $staticent) {
- if ($data['ip'] == $staticent['ipaddr']) {
- $data['if'] = $dhcpif;
- break;
- }
+ if ($data['act'] == 'active')
+ $icon = 'icon-ok-circle';
+ elseif ($data['act'] == 'expired')
+ $icon = 'icon-ban-circle';
+ else
+ $icon = 'icon-remove-circle';
+
+ if ($data['act'] == "static") {
+ foreach ($config['dhcpdv6'] as $dhcpif => $dhcpifconf) {
+ if(is_array($dhcpifconf['staticmap'])) {
+ foreach ($dhcpifconf['staticmap'] as $staticent) {
+ if ($data['ip'] == $staticent['ipaddr']) {
+ $data['if'] = $dhcpif;
+ break;
}
}
- /* exit as soon as we have an interface */
- if ($data['if'] != "") {
- break;
- }
- }
- } else {
- $data['if'] = convert_real_interface_to_friendly_interface_name(guess_interface_from_ip($data['ip']));
- }
- echo "<tr>\n";
- echo "<td class=\"listlr\">{$fspans}{$data['ip']}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}{$data['iaid']}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}{$data['duid']}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}";
- if (!empty($data['hostname'])) {
- echo htmlentities($data['hostname']) . "<br />";
- }
-
- $mac=trim($ndpdata[$data['ip']]['mac']);
- if (!empty($mac)) {
- $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
- print htmlentities($mac);
- if (isset($mac_man[$mac_hi])) {
- print "<br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>";
}
+ /* exit as soon as we have an interface */
+ if ($data['if'] != "")
+ break;
}
-
- echo "{$fspane}&nbsp;</td>\n";
- if ($data['type'] != "static") {
- echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['start']) . "{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['end']) . "{$fspane}</td>\n";
- } else {
- echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
- }
- echo "<td class=\"listr\">{$fspans}{$data['online']}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}{$data['act']}{$fspane}</td>\n";
-
- if ($data['type'] == "dynamic") {
- echo "<td valign=\"middle\"><a href=\"services_dhcpv6_edit.php?if={$data['if']}&amp;duid={$data['duid']}&amp;hostname={$data['hostname']}\">";
- echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("add a static mapping for this MAC address") ."\" alt=\"add\" /></a></td>\n";
- } else {
- echo "<td class=\"list\" valign=\"middle\">";
- echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_plus_mo.gif\" width=\"17\" height=\"17\" border=\"0\" alt=\"add\" /></td>\n";
- }
-
- /* Only show the button for offline dynamic leases */
- if (($data['type'] == "dynamic") && ($data['online'] != "online")) {
- echo "<td class=\"list\" valign=\"middle\"><a href=\"status_dhcpv6_leases.php?deleteip={$data['ip']}&amp;all=" . htmlspecialchars($_GET['all']) . "\">";
- echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_x.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("delete this DHCP lease") . "\" alt=\"delete\" /></a></td>\n";
- }
- echo "</tr>\n";
+ } else {
+ $data['if'] = convert_real_interface_to_friendly_interface_name(guess_interface_from_ip($data['ip']));
}
-}
+
+ $mac = trim($ndpdata[$data['ip']]['mac']);
+ $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
?>
-</table>
-<br/>
-<h3>Delegated Prefixes</h3>
-<table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="prefixes">
- <tr>
- <td class="listhdrr"><a href="#"><?=gettext("IPv6 Prefix"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("IAID"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("DUID"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("Start"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("End"); ?></a></td>
- <td class="listhdrr"><a href="#"><?=gettext("State"); ?></a></td>
- </tr>
+ <tr>
+ <td><i class="icon <?=$icon?>"></i></td>
+ <td><?=$data['ip']?></td>
+ <td><?=$data['iaid']?></td>
+ <td><?=$data['duid']?></td>
+ <td>
+ <?=$mac?>
+
+ <? if(isset($mac_man[$mac_hi])):?>
+ (<?=$mac_man[$mac_hi]?>)
+ <?endif?>
+ </td>
+ <td><?=htmlentities($data['hostname'])?></td>
+<? if ($data['type'] != "static"):?>
+ <td><?=adjust_gmt($data['start'])?></td>
+ <td><?=adjust_gmt($data['end'])?></td>
+<? else: ?>
+ <td>n/a</td>
+ <td>n/a</td>
+<? endif; ?>
+ <td><?=$data['online']?></td>
+ <td><?=$data['act']?></td>
+ <td>
+<? if ($data['type'] == "dynamic"): ?>
+ <a class="btn btn-xs btn-primary" href="services_dhcpv6_edit.php?if=<?=$data['if']?>&amp;duid=<?=$data['duid']?>&amp;hostname=<?=htmlspecialchars($data['hostname'])?>">
+ <?=gettext("add static mapping")?>
+ </a>
+<? endif; ?>
+
+ <a class="btn btn-xs btn-success" href="services_wol_edit.php?if=<?=$data['if']?>&amp;mac=<?=$data['mac']?>&amp;descr=<?=htmlentities($data['hostname'])?>">
+ add WOL mapping
+ </a>
+
+<? if ($data['type'] == "dynamic" && $data['online'] != "online"):?>
+ <a class="btn btn-xs btn-danger" href="status_dhcpv6_leases.php?deleteip=<?=$data['ip']?>&amp;all=<?=intval($_GET['all'])?>">
+ delete lease
+ </a>
+<? endif?>
+ </td>
+<? endforeach; ?>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Delegated Prefixes')?></h2></div>
+ <div class="panel-body">
+ <table class="table">
+ <thead>
+ <tr>
+ <th><?=gettext("IPv6 Prefix")?></th>
+ <th><?=gettext("IAID")?></th>
+ <th><?=gettext("DUID")?></th>
+ <th><?=gettext("Start")?></th>
+ <th><?=gettext("End")?></th>
+ <th><?=gettext("State")?></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
-foreach ($prefixes as $data) {
- if (($data['act'] == "active") || ($data['act'] == "static") || ($_GET['all'] == 1)) {
- if ($data['act'] != "active" && $data['act'] != "static") {
- $fspans = "<span class=\"gray\">";
- $fspane = "&nbsp;</span>";
- } else {
- $fspans = "";
- $fspane = "&nbsp;";
- }
+foreach ($prefixes as $data):
+ if ($data['act'] != "active" && $data['act'] != "static" && $_GET['all'] != 1)
+ continue;
- if ($data['act'] == "static") {
- foreach ($config['dhcpdv6'] as $dhcpif => $dhcpifconf) {
- if (is_array($dhcpifconf['staticmap'])) {
- foreach ($dhcpifconf['staticmap'] as $staticent) {
- if ($data['ip'] == $staticent['ipaddr']) {
- $data['if'] = $dhcpif;
- break;
- }
+ if ($data['act'] == 'active')
+ $icon = 'icon-ok-circle';
+ elseif ($data['act'] == 'expired')
+ $icon = 'icon-ban-circle';
+ else
+ $icon = 'icon-remove-circle';
+
+ if ($data['act'] == "static") {
+ foreach ($config['dhcpdv6'] as $dhcpif => $dhcpifconf) {
+ if(is_array($dhcpifconf['staticmap'])) {
+ foreach ($dhcpifconf['staticmap'] as $staticent) {
+ if ($data['ip'] == $staticent['ipaddr']) {
+ $data['if'] = $dhcpif;
+ break;
}
}
- /* exit as soon as we have an interface */
- if ($data['if'] != "") {
- break;
- }
}
- } else {
- $data['if'] = convert_real_interface_to_friendly_interface_name(guess_interface_from_ip($data['ip']));
- }
- echo "<tr>\n";
- if ($mappings[$data['iaid'] . $data['duid']]) {
- $dip = "<br />Routed To: {$mappings[$data['iaid'] . $data['duid']]}";
- }
- echo "<td class=\"listlr\">{$fspans}{$data['prefix']}{$dip}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}{$data['iaid']}{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}{$data['duid']}{$fspane}</td>\n";
- if ($data['type'] != "static") {
- echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['start']) . "{$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['end']) . "{$fspane}</td>\n";
- } else {
- echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
- echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
+ /* exit as soon as we have an interface */
+ if ($data['if'] != "")
+ break;
}
- echo "<td class=\"listr\">{$fspans}{$data['act']}{$fspane}</td>\n";
- echo "</tr>\n";
+ } else {
+ $data['if'] = convert_real_interface_to_friendly_interface_name(guess_interface_from_ip($data['ip']));
+ }
+
+ {
+ $dip = "";
}
-}
?>
-</table>
-<br/>
-<form action="status_dhcpv6_leases.php" method="get">
- <input type="hidden" name="order" value="<?=htmlspecialchars($_GET['order']);?>" />
+ <tr>
+ <td><i class="icon <?=$icon?>"></i></td>
+ <td>
+ <?=$data['prefix']?>
+<? if ($mappings[$data['iaid'] . $data['duid']]): ?>
+ <br />
+ <?=gettext('Routed To')?>: <?=$mappings[$data['iaid'] . $data['duid']]?>
+<? endif; ?>
+ </td>
+ <td><?=$data['iaid']?></td>
+ <td><?=$data['duid']?></td>
+<? if ($data['type'] != "static"):?>
+ <td><?=adjust_gmt($data['start'])?></td>
+ <td><?=adjust_gmt($data['end'])?></td>
+<? else: ?>
+ <td>n/a</td>
+ <td>n/a</td>
+<? endif; ?>
+ <td><?=$data['act']?></td>
+<? endforeach; ?>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
+
<?php if ($_GET['all']): ?>
- <input type="hidden" name="all" value="0" />
- <input type="submit" class="formbtn" value="<?=gettext("Show active and static leases only"); ?>" />
+ <a class="btn btn-default" href="status_dhcpv6_leases.php?all=0"><?=gettext("Show active and static leases only")?></a>
<?php else: ?>
- <input type="hidden" name="all" value="1" />
- <input type="submit" class="formbtn" value="<?=gettext("Show all configured leases"); ?>" />
-<?php endif; ?>
-</form>
-<?php if ($leases == 0): ?>
-<p><strong><?=gettext("No leases file found. Is the DHCP server active"); ?>?</strong></p>
-<?php endif; ?>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ <a class="btn btn-default" href="status_dhcpv6_leases.php?all=1"><?=gettext("Show all configured leases")?></a>
+<?php endif;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_filter_reload.php b/src/usr/local/www/status_filter_reload.php
index 8844a48..434336a 100644
--- a/src/usr/local/www/status_filter_reload.php
+++ b/src/usr/local/www/status_filter_reload.php
@@ -67,28 +67,35 @@ if ($_POST['syncfilter']) {
include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-
-<?php include("fbegin.inc"); ?>
-<br />
-<form action="status_filter_reload.php" method="post" name="filter">
- <input type="submit" value="Reload Filter" name="reloadfilter" id="reloadfilter" />
-<?php if ($config['hasync'] && $config['hasync']["synchronizetoip"] != ""): ?>
- &nbsp;&nbsp;&nbsp;&nbsp;
- <input type="submit" value="Force Config Sync" name="syncfilter" id="syncfilter" />
-<?php endif; ?>
-</form>
-<br /><br /><br />
-<div id="status" style="padding:5px; border:1px dashed #990000; background-color: #ffffff; color: #000000;">
- <?php echo $status; ?>
-</div>
-<div id="doneurl">
-</div>
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Filter Reload</h2></div>
+ <div class="panel-body">
+ <form action="status_filter_reload.php" method="post" name="filter">
+ <input type="submit" class="btn btn-success" value="Reload Filter" name="reloadfilter" id="reloadfilter" />
+<?php
+if ($config['hasync'] && $config['hasync']["synchronizetoip"] != ""): ?>
+ < input type="submit" class="btn btn-default" value="Force Config Sync" name="syncfilter" id="syncfilter" />
+<?php
+endif;
+?>
+ </form>
+
+ <br />
+
+ <div id="status" class="panel panel-default">
+ <?=$status; ?>
+ </div>
-<br/>
+ <div id="doneurl">
+ </div>
-<div id="reloadinfo"><?=gettext("This page will automatically refresh every 3 seconds until the filter is done reloading"); ?>.</div>
+ <br/>
+
+ <div id="reloadinfo"><?=gettext("This page will automatically refresh every 3 seconds until the filter is done reloading"); ?>.</div>
+
+ </div>
+</div>
<script type="text/javascript">
//<![CDATA[
@@ -96,6 +103,7 @@ include("head.inc");
function update_status_thread() {
getURL('status_filter_reload.php?getstatus=true', update_data);
}
+
function update_data(obj) {
var result_text = obj.content;
var result_text_split = result_text.split("|");
@@ -103,9 +111,9 @@ function update_data(obj) {
result_text = result_text.replace("\n", "");
result_text = result_text.replace("\r", "");
if (result_text) {
- jQuery('#status').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /> ' + result_text + '...');
+ jQuery('#status').html('<img src="/themes/<?=$g['theme']?>/images/misc/loader.gif" alt="loader" /> ' + result_text + '...');
} else {
- jQuery('#status').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /> Obtaining filter status...');
+ jQuery('#status').html('<img src="/themes/<?=$g['theme']?>/images/misc/loader.gif" alt="loader" /> Obtaining filter status...');
}
if (result_text == "Initializing") {
jQuery('#status').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /> Initializing...');
@@ -169,11 +177,9 @@ if (typeof getURL == 'undefined') {
http_request.send(null);
}
}
+
window.setTimeout('update_status_thread()', 2500);
//]]>
</script>
-<?php include("fend.inc"); ?>
-
-</body>
-</html>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_gateway_groups.php b/src/usr/local/www/status_gateway_groups.php
index e9011c8..fa57d66 100755
--- a/src/usr/local/www/status_gateway_groups.php
+++ b/src/usr/local/www/status_gateway_groups.php
@@ -40,6 +40,14 @@
##|*MATCH=status_gateway_groups.php*
##|-PRIV
+define('COLOR', true);
+define('LIGHTGREEN', '#90EE90');
+define('LIGHTCORAL', '#F08080');
+define('KHAKI', '#F0E68C');
+define('LIGHTGRAY', '#D3D3D3');
+define('LIGHTBLUE', '#ADD8E6');
+define('WHITE', '#FFFFFF');
+
require("guiconfig.inc");
if (!is_array($config['gateways']['gateway_group'])) {
@@ -55,119 +63,120 @@ $pgtitle = array(gettext("Status"), gettext("Gateway Groups"));
$shortcut_section = "gateway-groups";
include("head.inc");
+$tab_array = array();
+$tab_array[0] = array(gettext("Gateways"), false, "status_gateways.php");
+$tab_array[1] = array(gettext("Gateway Groups"), true, "status_gateway_groups.php");
+display_top_tabs($tab_array);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td>
+<div class="table-responsive">
+ <table class="table table-hover table-condensed table-striped">
+ <thead>
+ <tr>
+ <th><?=gettext("Group Name"); ?></th>
+ <th><?=gettext("Gateways"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($a_gateway_groups as $gateway_group): ?>
+ <tr>
+ <td>
+ <?=htmlspecialchars($gateway_group['name'])?>
+ </td>
+ <td>
+ <table class="table table-bordered table-condensed">
<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Gateways"), false, "status_gateways.php");
- $tab_array[1] = array(gettext("Gateway Groups"), true, "status_gateway_groups.php");
- display_top_tabs($tab_array);
+ /* process which priorities we have */
+ $priorities = array();
+ foreach($gateway_group['item'] as $item) {
+ $itemsplit = explode("|", $item);
+ $priorities[$itemsplit[1]] = true;
+ }
+ $priority_count = count($priorities);
+ ksort($priorities);
?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Group Name"); ?></td>
- <td width="50%" class="listhdrr"><?=gettext("Gateways"); ?></td>
- <td width="30%" class="listhdr"><?=gettext("Description"); ?></td>
- </tr>
+ <thead>
+ <tr>
<?php
- $i = 0;
- foreach ($a_gateway_groups as $gateway_group):
+ // Make a column for each tier
+ foreach($priorities as $number => $tier) {
+ echo "<th>" . sprintf(gettext("Tier %s"), $number) . "</th>";
+ }
?>
- <tr>
- <td class="listlr">
+ </tr>
+ </thead>
+ <tbody>
<?php
- echo $gateway_group['name'];
+ /* inverse gateway group to gateway priority */
+ $priority_arr = array();
+ foreach($gateway_group['item'] as $item) {
+ $itemsplit = explode("|", $item);
+ $priority_arr[$itemsplit[1]][] = $itemsplit[0];
+ }
+ ksort($priority_arr);
+ $p = 1;
+ foreach($priority_arr as $number => $tier) {
+ /* for each priority process the gateways */
+ foreach($tier as $member) {
+ /* we always have $priority_count fields */
?>
- </td>
- <td class="listr">
- <table border='0'>
+ <tr>
<?php
- /* process which priorities we have */
- $priorities = array();
- foreach ($gateway_group['item'] as $item) {
- $itemsplit = explode("|", $item);
- $priorities[$itemsplit[1]] = true;
- }
- $priority_count = count($priorities);
- ksort($priorities);
-
- echo "<tr>";
- foreach ($priorities as $number => $tier) {
- echo "<td width='120'>" . sprintf(gettext("Tier %s"), $number) . "</td>";
- }
- echo "</tr>\n";
-
- /* inverse gateway group to gateway priority */
- $priority_arr = array();
- foreach ($gateway_group['item'] as $item) {
- $itemsplit = explode("|", $item);
- $priority_arr[$itemsplit[1]][] = $itemsplit[0];
- }
- ksort($priority_arr);
- $p = 1;
- foreach ($priority_arr as $number => $tier) {
- /* for each priority process the gateways */
- foreach ($tier as $member) {
- /* we always have $priority_count fields */
- echo "<tr>";
- $c = 1;
- while ($c <= $priority_count) {
- $monitor = lookup_gateway_monitor_ip_by_name($member);
- if ($p == $c) {
- $status = $gateways_status[$monitor]['status'];
- if (stristr($status, "down")) {
- $online = gettext("Offline");
- $bgcolor = "#F08080"; // lightcoral
- } elseif (stristr($status, "loss")) {
- $online = gettext("Warning, Packetloss");
- $bgcolor = "#F0E68C"; // khaki
- } elseif (stristr($status, "delay")) {
- $online = gettext("Warning, Latency");
- $bgcolor = "#F0E68C"; // khaki
- } elseif ($status == "none") {
- $online = gettext("Online");
- $bgcolor = "#90EE90"; // lightgreen
- } else {
- $online = gettext("Gathering data");
- $bgcolor = "#ADD8E6"; // lightblue
- }
- echo "<td bgcolor='$bgcolor'>&nbsp;". htmlspecialchars($member) .", $online&nbsp;</td>";
- } else {
- echo "<td>&nbsp;</td>";
- }
- $c++;
- }
- echo "</tr>\n";
- }
- $p++;
- }
+ $c = 1;
+ while($c <= $priority_count) {
+ $monitor = lookup_gateway_monitor_ip_by_name($member);
+ if($p == $c) {
+ $status = $gateways_status[$monitor]['status'];
+ if (stristr($status, "down")) {
+ $online = gettext("Offline");
+ $bgcolor = LIGHTCORAL;
+ } elseif (stristr($status, "loss")) {
+ $online = gettext("Warning, Packetloss");
+ $bgcolor = KHAKI;
+ } elseif (stristr($status, "delay")) {
+ $online = gettext("Warning, Latency");
+ $bgcolor = KHAKI;
+ } elseif ($status == "none") {
+ $online = gettext("Online");
+ $bgcolor = LIGHTGREEN;
+ } else {
+ $online = gettext("Gathering data");
+ $bgcolor = LIGHTBLUE;
+ }
+
+ if(!COLOR)
+ $bgcolor = WHITE;
+?>
+ <td bgcolor="<?=$bgcolor?>">
+ <?=htmlspecialchars($member);?>,<br /><?=$online?>
+ </td>
+
+<?php
+ } else {
?>
- </table>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($gateway_group['descr']);?>&nbsp;
- </td>
- </tr>
+ <td>
+ </td>
+<?php }
+ $c++;
+ }
+?>
+ </tr>
<?php
- $i++;
- endforeach;
+ }
+ $p++;
+ }
?>
-
- </table>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </tbody>
+ </table>
+ </td>
+ <td>
+ <?=htmlspecialchars($gateway_group['descr'])?>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+</div>
+
+<?php include("foot.inc");
diff --git a/src/usr/local/www/status_gateways.php b/src/usr/local/www/status_gateways.php
index e6fcf9d..71d25d2 100644
--- a/src/usr/local/www/status_gateways.php
+++ b/src/usr/local/www/status_gateways.php
@@ -42,6 +42,13 @@
require("guiconfig.inc");
+define('COLOR', true);
+define('LIGHTGREEN', '#90EE90');
+define('LIGHTCORAL', '#F08080');
+define('KHAKI', '#F0E68C');
+define('LIGHTGRAY', '#D3D3D3');
+define('WHITE', '#FFFFFF');
+
$a_gateways = return_gateways_array();
$gateways_status = array();
$gateways_status = return_gateways_status(true);
@@ -53,117 +60,107 @@ $pgtitle = array(gettext("Status"), gettext("Gateways"));
$shortcut_section = "gateways";
include("head.inc");
+/* active tabs */
+$tab_array = array();
+$tab_array[] = array(gettext("Gateways"), true, "status_gateways.php");
+$tab_array[] = array(gettext("Gateway Groups"), false, "status_gateway_groups.php");
+display_top_tabs($tab_array);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr><td class="tabnavtbl">
- <?php
- /* active tabs */
- $tab_array = array();
- $tab_array[] = array(gettext("Gateways"), true, "status_gateways.php");
- $tab_array[] = array(gettext("Gateway Groups"), false, "status_gateway_groups.php");
- display_top_tabs($tab_array);
- ?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td width="10%" class="listhdrr"><?=gettext("Name"); ?></td>
- <td width="10%" class="listhdrr"><?=gettext("Gateway"); ?></td>
- <td width="10%" class="listhdrr"><?=gettext("Monitor"); ?></td>
- <td width="8%" class="listhdrr"><?=gettext("RTT"); ?></td>
- <td width="7%" class="listhdrr"><?=gettext("Loss"); ?></td>
- <td width="35%" class="listhdrr"><?=gettext("Status"); ?></td>
- <td width="20%" class="listhdr"><?=gettext("Description"); ?></td>
- </tr>
-<?php
- foreach ($a_gateways as $gname => $gateway) {
+
+<div class="table-responsive">
+ <table class="table table-hover table-compact table-striped">
+ <thead>
+ <tr>
+ <th><?=gettext("Name"); ?></th>
+ <th><?=gettext("Gateway"); ?></th>
+ <th><?=gettext("Monitor"); ?></th>
+ <th><?=gettext("RTT"); ?></th>
+ <th><?=gettext("Loss"); ?></th>
+ <th><?=gettext("Status"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php foreach ($a_gateways as $gname => $gateway) {
+?>
+ <tr>
+ <td>
+ <?=$gateway['name'];?>
+ </td>
+ <td>
+ <?php echo lookup_gateway_ip_by_name($gname);?>
+ </td>
+ <td>
+<?php if ($gateways_status[$gname])
+ echo $gateways_status[$gname]['monitorip'];
+ else
+ echo $gateway['monitorip'];
+?>
+ </td>
+ <td>
+<?php if ($gateways_status[$gname])
+ echo $gateways_status[$gname]['delay'];
+ else
+ echo gettext("Pending");
+?>
+ <?php $counter++; ?>
+ </td>
+ <td>
+<?php if ($gateways_status[$gname])
+ echo $gateways_status[$gname]['loss'];
+ else
+ echo gettext("Pending");
+
+ $counter++;
?>
- <tr>
- <td class="listlr">
- <?=$gateway['name'];?>
- </td>
- <td class="listr" align="center" >
- <?php echo lookup_gateway_ip_by_name($gname);?>
- </td>
- <td class="listr" align="center" >
- <?php
- if ($gateways_status[$gname]) {
- echo $gateways_status[$gname]['monitorip'];
- } else {
- echo $gateway['monitorip'];
- }
- ?>
- </td>
- <td class="listr" align="center">
- <?php
- if ($gateways_status[$gname]) {
- echo $gateways_status[$gname]['delay'];
- } else {
- echo gettext("Pending");
- }
- ?>
- </td>
- <td class="listr" align="center">
- <?php
- if ($gateways_status[$gname]) {
- echo $gateways_status[$gname]['loss'];
- } else {
- echo gettext("Pending");
- }
- ?>
- </td>
- <td class="listr" >
- <table border="0" cellpadding="0" cellspacing="2">
- <?php
- if ($gateways_status[$gname]) {
- $status = $gateways_status[$gname];
- if (stristr($status['status'], "force_down")) {
- $online = gettext("Offline (forced)");
- $bgcolor = "#F08080"; // lightcoral
- } elseif (stristr($status['status'], "down")) {
- $online = gettext("Offline");
- $bgcolor = "#F08080"; // lightcoral
- } elseif (stristr($status['status'], "loss")) {
- $online = gettext("Warning, Packetloss").': '.$status['loss'];
- $bgcolor = "#F0E68C"; // khaki
- } elseif (stristr($status['status'], "delay")) {
- $online = gettext("Warning, Latency").': '.$status['delay'];
- $bgcolor = "#F0E68C"; // khaki
- } elseif ($status['status'] == "none") {
- $online = gettext("Online");
- $bgcolor = "#90EE90"; // lightgreen
- }
- } else if (isset($gateway['monitor_disable'])) {
- $online = gettext("Online");
- $bgcolor = "#90EE90"; // lightgreen
- } else {
- $online = gettext("Pending");
- $bgcolor = "#D3D3D3"; // lightgray
- }
- echo "<tr><td><table width='100%'><tr><td bgcolor=\"$bgcolor\">&nbsp;$online&nbsp;</td></tr><tr><td>";
- $lastchange = $gateways_status[$gname]['lastcheck'];
- if (!empty($lastchange)) {
- echo gettext("Last check:") . '<br />' . $lastchange;
- }
- echo "</td></tr></table></td></tr>";
- ?>
- </table>
- </td>
- <td class="listbg"> <?=$gateway['descr']; ?></td>
- </tr>
+ </td>
<?php
- } // foreach gateway
+ if ($gateways_status[$gname]) {
+ $status = $gateways_status[$gname];
+ if (stristr($status['status'], "force_down")) {
+ $online = gettext("Offline (forced)");
+ $bgcolor = LIGHTCORAL;
+ } elseif (stristr($status['status'], "down")) {
+ $online = gettext("Offline");
+ $bgcolor = LIGHTCORAL;
+ } elseif (stristr($status['status'], "loss")) {
+ $online = gettext("Warning, Packetloss").': '.$status['loss'];
+ $bgcolor = KHAKI;
+ } elseif (stristr($status['status'], "delay")) {
+ $online = gettext("Warning, Latency").': '.$status['delay'];
+ $bgcolor = KHAKI;
+ } elseif ($status['status'] == "none") {
+ $online = gettext("Online");
+ $bgcolor = LIGHTGREEN;
+ }
+ } else if (isset($gateway['monitor_disable'])) {
+ $online = gettext("Online");
+ $bgcolor = LIGHTGREEN;
+ } else {
+ $online = gettext("Pending");
+ $bgcolor = LIGHTGRAY;
+ }
+
+ $lastchange = $gateways_status[$gname]['lastcheck'];
+
+ if(!COLOR)
+ $bgcolor = WHITE;
?>
- </table>
- </div>
- </td>
- </tr>
-</table>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+ <td bgcolor="<?=$bgcolor?>">
+ <strong><?=$online?></strong> <?php
+ if(!empty($lastchange)) { ?>
+ <br /><i>Last checked <?=$lastchange?></i>
+<?php } ?>
+ </td>
+
+ <td>
+ <?=$gateway['descr']; ?>
+ </td>
+ </tr>
+<?php } ?> <!-- End-of-foreach -->
+ </tbody>
+ </table>
+</div>
+
+<?php include("foot.inc"); ?>
diff --git a/src/usr/local/www/status_graph.php b/src/usr/local/www/status_graph.php
index 056c297..5f2dbbb 100644
--- a/src/usr/local/www/status_graph.php
+++ b/src/usr/local/www/status_graph.php
@@ -75,8 +75,8 @@ foreach (array('server', 'client') as $mode) {
}
}
-if ($_GET['if']) {
- $curif = $_GET['if'];
+if ($_POST['if']) {
+ $curif = $_POST['if'];
$found = false;
foreach ($ifdescrs as $descr => $ifdescr) {
if ($descr == $curif) {
@@ -97,106 +97,131 @@ if ($_GET['if']) {
$curif = "wan";
}
}
-if ($_GET['sort']) {
- $cursort = $_GET['sort'];
+if ($_POST['sort']) {
+ $cursort = $_POST['sort'];
} else {
$cursort = "";
}
-if ($_GET['filter']) {
- $curfilter = $_GET['filter'];
+if ($_POST['filter']) {
+ $curfilter = $_POST['filter'];
} else {
$curfilter = "";
}
-if ($_GET['hostipformat']) {
- $curhostipformat = $_GET['hostipformat'];
+if ($_POST['hostipformat']) {
+ $curhostipformat = $_POST['hostipformat'];
} else {
$curhostipformat = "";
}
-$pgtitle = array(gettext("Status"), gettext("Traffic Graph"));
+function iflist() {
+ global $ifdescrs;
+
+ $iflist = array();
+
+ foreach ($ifdescrs as $ifn => $ifd) {
+ $iflist[$ifn] = $ifd;
+ }
+
+ return($iflist);
+}
+
+$pgtitle = array(gettext("Status"),gettext("Traffic Graph"));
include("head.inc");
+require('classes/Form.class.php');
+
+$form = new Form(false);
+$form->addClass('auto-submit');
+
+$section = new Form_Section('Graph settings');
+
+$group = new Form_Group('');
+
+$group->add(new Form_Select(
+ 'if',
+ null,
+ $curif,
+ iflist()
+))->setHelp('Interface');
+
+$group->add(new Form_Select(
+ 'sort',
+ null,
+ $cursort,
+ array (
+ 'in' => 'Bandwidth In',
+ 'out' => 'Bandwidth Out'
+ )
+))->setHelp('Sort by');
+
+$group->add(new Form_Select(
+ 'filter',
+ null,
+ $curfilter,
+ array (
+ 'local' => 'Local',
+ 'remote'=> 'Remote',
+ 'all' => 'All'
+ )
+))->setHelp('Filter');
+
+$group->add(new Form_Select(
+ 'hostipformat',
+ null,
+ $curhostipformat,
+ array (
+ '' => 'IP Address',
+ 'hostname' => 'Host Name',
+ 'fqdn' => 'FQDN'
+ )
+))->setHelp('Display');
+
+$section->add($group);
+
+$form->add($section);
+print $form;
+
?>
+<script>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-
-<script type="text/javascript">
-//<![CDATA[
-function updateBandwidth() {
- var hostinterface = jQuery("#if").val();
- var sorting = jQuery("#sort").val();
- var filter = jQuery("#filter").val();
- var hostipformat = jQuery("#hostipformat").val();
- bandwidthAjax(hostinterface, sorting, filter, hostipformat);
-}
+function updateBandwidth(){
+ $.ajax(
+ '/bandwidth_by_ip.php',
+ {
+ type: 'get',
+ data: $(document.forms[0]).serialize(),
+ success: function (data) {
+ var hosts_split = data.split("|");
-function bandwidthAjax(hostinterface, sorting, filter, hostipformat) {
- uri = "bandwidth_by_ip.php?if=" + hostinterface + "&sort=" + sorting + "&filter=" + filter + "&hostipformat=" + hostipformat;
- var opt = {
- // Use GET
- type: 'get',
- error: function(req) {
- /* XXX: Leave this for debugging purposes: Handle 404
- if (req.status == 404)
- alert('Error 404: location "' + uri + '" was not found.');
- */
- /* Handle other errors
- else
- alert('Error ' + req.status + ' -- ' + req.statusText + ' -- ' + uri);
- */
- },
- success: function(data) {
- updateBandwidthHosts(data);
- }
- }
- jQuery.ajax(uri, opt);
-}
+ $('#top10-hosts').empty();
-function updateBandwidthHosts(data) {
- var hosts_split = data.split("|");
- d = document;
- //parse top ten bandwidth abuser hosts
- for (var y = 0; y < 10; y++) {
- if ((y < hosts_split.length) && (hosts_split[y] != "") && (hosts_split[y] != "no info")) {
- hostinfo = hosts_split[y].split(";");
-
- //update host ip info
- var HostIpID = "hostip" + y;
- var hostip = d.getElementById(HostIpID);
- hostip.innerHTML = hostinfo[0];
-
- //update bandwidth inbound to host
- var hostbandwidthInID = "bandwidthin" + y;
- var hostbandwidthin = d.getElementById(hostbandwidthInID);
- hostbandwidthin.innerHTML = hostinfo[1] + " Bits/sec";
-
- //update bandwidth outbound from host
- var hostbandwidthOutID = "bandwidthout" + y;
- var hostbandwidthOut = d.getElementById(hostbandwidthOutID);
- hostbandwidthOut.innerHTML = hostinfo[2] + " Bits/sec";
-
- //make the row appear if hidden
- var rowid = "#host" + y;
- if (jQuery(rowid).css('display') == "none") {
- //hide rows that contain no data
- jQuery(rowid).show(1000);
- }
- } else {
- var rowid = "#host" + y;
- if (jQuery(rowid).css('display') != "none") {
- //hide rows that contain no data
- jQuery(rowid).fadeOut(2000);
- }
- }
- }
+ //parse top ten bandwidth abuser hosts
+ for (var y=0; y<10; y++){
+ if ((y < hosts_split.length) && (hosts_split[y] != "") && (hosts_split[y] != "no info")) {
+ hostinfo = hosts_split[y].split(";");
- setTimeout('updateBandwidth()', 1000);
+ $('#top10-hosts').append('<tr>'+
+ '<td>'+ hostinfo[0] +'</td>'+
+ '<td>'+ hostinfo[1] +' Bits/sec</td>'+
+ '<td>'+ hostinfo[2] +' Bits/sec</td>'+
+ '</tr>');
+ }
+ }
+ },
+ });
}
-//]]>
-</script>
+events.push(function(){
+ $('form.auto-submit').on('change', function(){
+ $(this).submit();
+ });
+
+ setInterval('updateBandwidth()', 1000);
+
+ updateBandwidth();
+});
+</script>
<?php
/* link the ipsec interface magically */
@@ -205,148 +230,34 @@ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enabl
}
?>
-<form name="form1" action="status_graph.php" method="get" style="padding-bottom: 10px; margin-bottom: 14px; border-bottom: 1px solid #999999">
-<?=gettext("Interface"); ?>:
- <select id="if" name="if" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
-<?php
- foreach ($ifdescrs as $ifn => $ifd) {
- echo "<option value=\"$ifn\"";
- if ($ifn == $curif) {
- echo " selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($ifd) . "</option>\n";
- }
-?>
- </select>
-, Sort by:
- <select id="sort" name="sort" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
- <option value="">Bw In</option>
- <option value="out"<?php if ($cursort == "out") echo " selected=\"selected\"";?>>Bw Out</option>
- </select>
-, Filter:
- <select id="filter" name="filter" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
- <option value="local"<?php if ($curfilter == "local") echo " selected=\"selected\"";?>>Local</option>
- <option value="remote"<?php if ($curfilter == "remote") echo " selected=\"selected\"";?>>Remote</option>
- <option value="all"<?php if ($curfilter == "all") echo " selected=\"selected\"";?>>All</option>
- </select>
-, Display:
- <select id="hostipformat" name="hostipformat" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
- <option value="">IP Address</option>
- <option value="hostname"<?php if ($curhostipformat == "hostname") echo " selected";?>>Host Name</option>
- <option value="descr"<?php if ($curhostipformat == "descr") echo " selected=\"selected\"";?>>Description</option>
- <option value="fqdn"<?php if ($curhostipformat == "fqdn") echo " selected=\"selected\"";?>>FQDN</option>
- </select>
-</form>
-<p>&nbsp;</p>
-<div id="niftyOutter">
- <div id="col1" style="float: left; width: 46%; padding: 5px; position: relative;">
- <object data="graph.php?ifnum=<?=htmlspecialchars($curif);?>&amp;ifname=<?=rawurlencode($ifdescrs[htmlspecialchars($curif)]);?>">
- <param name="id" value="graph" />
- <param name="type" value="image/svg+xml" />
- <param name="width" value="<? echo $width; ?>" />
- <param name="height" value="<? echo $height; ?>" />
- <param name="pluginspage" value="http://www.adobe.com/svg/viewer/install/auto" />
- </object>
+<div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title">Traffic graph</h2>
</div>
- <div id="col2" style="float: right; width: 48%; padding: 5px; position: relative;">
- <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="status">
- <tr>
- <td class="listtopic" valign="top"><?=(($curhostipformat == "") ? gettext("Host IP") : gettext("Host Name or IP")); ?></td>
- <td class="listtopic" valign="top"><?=gettext("Bandwidth In"); ?></td>
- <td class="listtopic" valign="top"><?=gettext("Bandwidth Out"); ?></td>
- </tr>
- <tr id="host0" style="display:none">
- <td id="hostip0" class="vncell">
- </td>
- <td id="bandwidthin0" class="listr">
- </td>
- <td id="bandwidthout0" class="listr">
- </td>
- </tr>
- <tr id="host1" style="display:none">
- <td id="hostip1" class="vncell">
- </td>
- <td id="bandwidthin1" class="listr">
- </td>
- <td id="bandwidthout1" class="listr">
- </td>
- </tr>
- <tr id="host2" style="display:none">
- <td id="hostip2" class="vncell">
- </td>
- <td id="bandwidthin2" class="listr">
- </td>
- <td id="bandwidthout2" class="listr">
- </td>
- </tr>
- <tr id="host3" style="display:none">
- <td id="hostip3" class="vncell">
- </td>
- <td id="bandwidthin3" class="listr">
- </td>
- <td id="bandwidthout3" class="listr">
- </td>
- </tr>
- <tr id="host4" style="display:none">
- <td id="hostip4" class="vncell">
- </td>
- <td id="bandwidthin4" class="listr">
- </td>
- <td id="bandwidthout4" class="listr">
- </td>
- </tr>
- <tr id="host5" style="display:none">
- <td id="hostip5" class="vncell">
- </td>
- <td id="bandwidthin5" class="listr">
- </td>
- <td id="bandwidthout5" class="listr">
- </td>
- </tr>
- <tr id="host6" style="display:none">
- <td id="hostip6" class="vncell">
- </td>
- <td id="bandwidthin6" class="listr">
- </td>
- <td id="bandwidthout6" class="listr">
- </td>
- </tr>
- <tr id="host7" style="display:none">
- <td id="hostip7" class="vncell">
- </td>
- <td id="bandwidthin7" class="listr">
- </td>
- <td id="bandwidthout7" class="listr">
- </td>
- </tr>
- <tr id="host8" style="display:none">
- <td id="hostip8" class="vncell">
- </td>
- <td id="bandwidthin8" class="listr">
- </td>
- <td id="bandwidthout8" class="listr">
- </td>
- </tr>
- <tr id="host9" style="display:none">
- <td id="hostip9" class="vncell">
- </td>
- <td id="bandwidthin9" class="listr">
- </td>
- <td id="bandwidthout9" class="listr">
- </td>
- </tr>
- </table>
+ <div class="panel-body">
+ <div class="col-sm-6">
+ <object data="graph.php?ifnum=<?=htmlspecialchars($curif);?>&amp;ifname=<?=rawurlencode($ifdescrs[htmlspecialchars($curif)]);?>">
+ <param name="id" value="graph" />
+ <param name="type" value="image/svg+xml" />
+ <param name="width" value="<? echo $width; ?>" />
+ <param name="height" value="<? echo $height; ?>" />
+ <param name="pluginspage" value="http://www.adobe.com/svg/viewer/install/auto" />
+ </object>
+ </div>
+ <div class="col-sm-6">
+ <table class="table table-striped table-condensed">
+ <thead>
+ <tr>
+ <th><?=(($curhostipformat=="") ? gettext("Host IP") : gettext("Host Name or IP")); ?></th>
+ <th><?=gettext("Bandwidth In"); ?></th>
+ <th><?=gettext("Bandwidth Out"); ?></th>
+ </tr>
+ </thead>
+ <tbody id="top10-hosts">
+ <!-- to be added by javascript -->
+ </tbody>
+ </table>
+ </div>
</div>
- <div style="clear: both;"></div>
</div>
-<p><span class="red"><strong><?=gettext("Note"); ?>:</strong></span> <?=gettext("the"); ?> <a href="http://www.adobe.com/svg/viewer/install/" target="_blank"><?=gettext("Adobe SVG Viewer"); ?></a>, <?=gettext("Firefox 1.5 or later or other browser supporting SVG is required to view the graph"); ?>.</p>
-
-<?php include("fend.inc"); ?>
-
-<script type="text/javascript">
-//<![CDATA[
-jQuery(document).ready(updateBandwidth);
-//]]>
-</script>
-</body>
-</html>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_graph_cpu.php b/src/usr/local/www/status_graph_cpu.php
index 6712508..43c37e0 100644
--- a/src/usr/local/www/status_graph_cpu.php
+++ b/src/usr/local/www/status_graph_cpu.php
@@ -29,7 +29,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: system
+ pfSense_MODULE: system
*/
##|+PRIV
@@ -42,14 +42,21 @@
$pgtitle = array(gettext("Status"), gettext("CPU load"));
require("guiconfig.inc");
include("head.inc");
-include("fbegin.inc");
$pgtitle = gettext("Status: CPU Graph");
?>
-<div align="center">
- <embed src="graph_cpu.php" type="image/svg+xml"
- width="550" height="275" pluginspage="http://www.adobe.com/svg/viewer/install/auto" />
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">CPU Load graph</h2></div>
+ <div class="panel-body" align="center">
+ <embed src="graph_cpu.php" type="image/svg+xml"
+ width="550" height="275" pluginspage="http://www.adobe.com/svg/viewer/install/auto" />
+ </div>
+
+ <p align="center"><strong><?=gettext("Note"); ?>:</strong><?=gettext("if you can't see the graph, you may have to install the")?>
+ <a href="http://www.adobe.com/svg/viewer/install/" target="_blank"><?=gettext("Adobe SVG viewer"); ?></a>
+ </p>
</div>
-<br /><span class="red"><strong><?=gettext("Note"); ?>:</strong></span> <?=gettext("if you can't see the graph, you may have to install the"); ?> <a href="http://www.adobe.com/svg/viewer/install/" target="_blank"><?=gettext("Adobe SVG viewer"); ?></a>.
-<?php include("fend.inc"); ?>
+
+<?php
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_interfaces.php b/src/usr/local/www/status_interfaces.php
index 67ab96f..017c205 100644
--- a/src/usr/local/www/status_interfaces.php
+++ b/src/usr/local/www/status_interfaces.php
@@ -58,550 +58,144 @@ if ($_POST['if'] && $_POST['submit']) {
exit;
}
-$pgtitle = array(gettext("Status"), gettext("Interfaces"));
+$formtemplate = '<form name="%s" action="status_interfaces.php" method="post">' .
+ '<input type="hidden" name="if" value="%s" />' .
+ '<input type="hidden" name="status" value="%s" />' .
+ '%s' .
+ '<input type="submit" name="submit" class="btn btn-warning btn-xs" value="%s" />' .
+ '</form>';
+
+// Display a term/definition pair
+function showDef($show, $term, $def) {
+ if($show) {
+ print('<dt>' . $term . '</dt>');
+ print('<dd>' . htmlspecialchars($def) . '</dd>');
+ }
+}
+
+// Display a term/definition pair with a button
+function showDefBtn($show, $term, $def, $ifval, $btnlbl) {
+ global $formtemplate;
+
+ if($show) {
+ print('<dt>' . $term . '</dt>');
+ print('<dd>');
+ printf($formtemplate, $term, $ifvalue, $show, htmlspecialchars($def) . ' ', $btnlbl);
+ print('</dd>');
+ }
+}
+
+$pgtitle = array(gettext("Status"),gettext("Interfaces"));
$shortcut_section = "interfaces";
include("head.inc");
-?>
+ $ifdescrs = get_configured_interface_with_descr(false, true);
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="status interfaces">
-<?php
- $i = 0;
- $ifdescrs = get_configured_interface_with_descr(false, true);
- foreach ($ifdescrs as $ifdescr => $ifname):
- $ifinfo = get_interface_info($ifdescr);
- // Load MAC-Manufacturer table
- $mac_man = load_mac_manufacturer_table();
-?>
-<?php
- if ($i):
-?>
- <tr>
- <td colspan="8" class="list" height="12"></td>
- </tr>
-<?php
- endif;
-?>
- <tr>
- <td colspan="2" class="listtopic">
- <?=htmlspecialchars($ifname);?> <?=gettext("interface"); ?> (<?=htmlspecialchars($ifdescr);?>, <?=htmlspecialchars($ifinfo['hwif']);?>)
- </td>
- </tr>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Status"); ?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['status']);?>
- </td>
- </tr>
-<?php
- if ($ifinfo['dhcplink']):
-?>
- <tr>
- <td width="22%" class="vncellt">
- DHCP
- </td>
- <td width="78%" class="listr">
- <form name="dhcplink_form" action="status_interfaces.php" method="post">
- <input type="hidden" name="if" value="<?php echo $ifdescr; ?>" />
- <input type="hidden" name="status" value="<?php echo $ifinfo['dhcplink']; ?>" />
- <?=htmlspecialchars($ifinfo['dhcplink']);?>&nbsp;&nbsp;
- <?php $action = ($ifinfo['dhcplink'] == "up" ? gettext("Release") : gettext("Renew")); ?>
- <input type="submit" name="submit" class="formbtn" value="<?php echo $action; ?>" />
- </form>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['dhcp6link']):
-?>
- <tr>
- <td width="22%" class="vncellt">
- DHCP6
- </td>
- <td width="78%" class="listr">
- <form name="dhcp6link_form" action="status_interfaces.php" method="post">
- <input type="hidden" name="if" value="<?php echo $ifdescr; ?>" />
- <input type="hidden" name="status" value="<?php echo $ifinfo['dhcp6link']; ?>" />
- <?=htmlspecialchars($ifinfo['dhcp6link']);?>&nbsp;&nbsp;
- <?php $action = ($ifinfo['dhcp6link'] == "up" ? gettext("Release") : gettext("Renew")); ?>
- <input type="submit" name="submit" class="formbtn" value="<?php echo $action; ?>" />
- </form>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['pppoelink']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("PPPoE"); ?></td>
- <td width="78%" class="listr">
- <form name="pppoelink_form" action="status_interfaces.php" method="post">
- <input type="hidden" name="if" value="<?php echo $ifdescr; ?>" />
- <input type="hidden" name="status" value="<?php echo $ifinfo['pppoelink']; ?>" />
- <?=htmlspecialchars($ifinfo['pppoelink']);?>&nbsp;&nbsp;
- <?php $action = ($ifinfo['pppoelink'] == "up" ? gettext("Disconnect") : gettext("Connect")); ?>
- <input type="submit" name="submit" class="formbtn" value="<?php echo $action; ?>" />
- </form>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['pptplink']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("PPTP"); ?></td>
- <td width="78%" class="listr">
- <form name="pptplink_form" action="status_interfaces.php" method="post">
- <input type="hidden" name="if" value="<?php echo $ifdescr; ?>" />
- <input type="hidden" name="status" value="<?php echo $ifinfo['pptplink']; ?>" />
- <?=htmlspecialchars($ifinfo['pptplink']);?>&nbsp;&nbsp;
- <?php $action = ($ifinfo['pptplink'] == "up" ? gettext("Disconnect") : gettext("Connect")); ?>
- <input type="submit" name="submit" class="formbtn" value="<?php echo $action; ?>" />
- </form>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['l2tplink']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("L2TP"); ?></td>
- <td width="78%" class="listr">
- <form name="l2tplink_form" action="status_interfaces.php" method="post">
- <input type="hidden" name="if" value="<?php echo $ifdescr; ?>" />
- <input type="hidden" name="status" value="<?php echo $ifinfo['l2tplink']; ?>" />
- <?=htmlspecialchars($ifinfo['l2tplink']);?>&nbsp;&nbsp;
- <?php $action = ($ifinfo['l2tplink'] == "up" ? gettext("Disconnect") : gettext("Connect")); ?>
- <input type="submit" name="submit" class="formbtn" value="<?php echo $action; ?>" />
- </form>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['ppplink']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("PPP"); ?></td>
- <td width="78%" class="listr">
- <form name="ppplink_form" action="status_interfaces.php" method="post">
- <input type="hidden" name="if" value="<?php echo $ifdescr; ?>" />
- <input type="hidden" name="status" value="<?php echo $ifinfo['ppplink']; ?>" />
- <?=htmlspecialchars($ifinfo['ppplink']);?>
- <?php if ($ifinfo['ppplink'] == "up"): ?>
- <input type="submit" name="submit" class="formbtn" value="<?php echo gettext("Disconnect"); ?>" />
- <?php else: ?>
- <?php if (!$ifinfo['nodevice']): ?>
- <input type="submit" name="submit" class="formbtn" value="<?php echo gettext("Connect"); ?>" />
- <?php endif; ?>
- <?php endif; ?>
- </form>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['ppp_uptime'] || $ifinfo['ppp_uptime_accumulated']):
+ foreach ($ifdescrs as $ifdescr => $ifname):
+ $ifinfo = get_interface_info($ifdescr);
+ $mac_man = load_mac_manufacturer_table();
?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Uptime ");?><?php if ($ifinfo['ppp_uptime_accumulated']) echo "(historical)"; ?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['ppp_uptime']);?> <?=htmlspecialchars($ifinfo['ppp_uptime_accumulated']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['cell_rssi']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Cell Signal (RSSI)");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['cell_rssi']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['cell_mode']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Cell Mode");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['cell_mode']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['cell_simstate']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Cell SIM State");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['cell_simstate']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['cell_service']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Cell Service");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['cell_service']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['cell_bwupstream']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Cell Upstream");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['cell_bwupstream']);?> kbit/s
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['cell_bwdownstream']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Cell Downstream");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['cell_bwdownstream']);?> kbit/s
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['cell_upstream']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Cell Current Up");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['cell_upstream']);?> kbit/s
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['cell_downstream']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Cell Current Down");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['cell_downstream']);?> kbit/s
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['macaddr']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("MAC address");?></td>
- <td width="78%" class="listr">
- <?php
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=htmlspecialchars($ifname)?><?=gettext(" interface "); ?>(<?=htmlspecialchars($ifdescr)?>, <?=htmlspecialchars($ifinfo['hwif'])?>)</h2></div>
+ <div class="panel-body">
+ <dl class="dl-horizontal">
+<?php
+ showDef(true, gettext("Status"), $ifinfo['status']);
+ showDefBtn($ifinfo['dhcplink'], 'DHCP', $ifinfo['dhcplink'], $ifdescr, $ifinfo['dhcplink'] == "up" ? gettext("Release") : gettext("Renew"));
+ showDefBtn($ifinfo['dhcp6link'], 'DHCP6', $ifinfo['dhcp6link'], $ifdescr, $ifinfo['dhcp6link'] == "up" ? gettext("Release") : gettext("Renew"));
+ showDefBtn($ifinfo['pppoelink'], 'PPPoE', $ifinfo['pppoelink'], $ifdescr, $ifinfo['pppoelink'] == "up" ? gettext("Disconnect") : gettext("Connect"));
+ showDefBtn($ifinfo['pptplink'], 'PPTP', $ifinfo['pptplink'], $ifdescr, $ifinfo['pptplink'] == "up" ? gettext("Disconnect") : gettext("Connect"));
+ showDefBtn($ifinfo['l2tplink'], 'L2TP', $ifinfo['l2tplink'], $ifdescr, $ifinfo['l2tplink'] == "up" ? gettext("Disconnect") : gettext("Connect"));
+ showDefBtn($ifinfo['ppplink'], 'L2TP', $ifinfo['ppplink'], $ifdescr, ($ifinfo['ppplink'] == "up" && !$ifinfo['nodevice']) ? gettext("Disconnect") : gettext("Connect"));
+ showDef($ifinfo['ppp_uptime'] || $ifinfo['ppp_uptime_accumulated'], gettext("Uptime ") . $ifinfo['ppp_uptime_accumulated'] ? '(historical)':'', $ifinfo['ppp_uptime'] . $ifinfo['ppp_uptime_accumulated']);
+ showDef($ifinfo['cell_rssi'], gettext("Cell Signal (RSSI)"), $ifinfo['cell_rssi']);
+ showDef($ifinfo['cell_mode'], gettext("Cell Mode"), $ifinfo['cell_mode']);
+ showDef($ifinfo['cell_simstate'], gettext("Cell SIM State"), $ifinfo['cell_simstate']);
+ showDef($ifinfo['cell_service'], gettext("Cell Service"), $ifinfo['cell_service']);
+ showDef($ifinfo['cell_bwupstream'], gettext("Cell Upstream"), $ifinfo['cell_bwupstream']);
+ showDef($ifinfo['cell_bwdownstream'], gettext("Cell Downstream"), $ifinfo['cell_bwdownstream']);
+ showDef($ifinfo['cell_upstream'], gettext("Cell Current Up"), $ifinfo['cell_upstream']);
+ showDef($ifinfo['cell_downstream'], gettext("Cell Current Down"), $ifinfo['cell_downstream']);
+
+ if ($ifinfo['macaddr']) {
$mac=$ifinfo['macaddr'];
$mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
- if (isset($mac_man[$mac_hi])) {
- print "<span>" . $mac . " - " . htmlspecialchars($mac_man[$mac_hi]); print "</span>";
- } else {
- print htmlspecialchars($mac);
+ showDef(isset($mac_man[$mac_hi]), gettext('MAC Address'), ' - ' . $mac_man[$mac_hi]);
}
- ?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['status'] != "down"):
-?>
-<?php
- if ($ifinfo['dhcplink'] != "down" && $ifinfo['pppoelink'] != "down" && $ifinfo['pptplink'] != "down"):
- if ($ifinfo['ipaddr']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("IPv4 address");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['ipaddr']);?>
- &nbsp;
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['subnet']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Subnet mask IPv4");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['subnet']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['gateway']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Gateway IPv4");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($config['interfaces'][$ifdescr]['gateway']);?>
- <?=htmlspecialchars($ifinfo['gateway']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['linklocal']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("IPv6 Link Local");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['linklocal']);?>
- &nbsp;
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['ipaddrv6']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("IPv6 address");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['ipaddrv6']);?>
- &nbsp;
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['subnetv6']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Subnet mask IPv6");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['subnetv6']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['gatewayv6']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Gateway IPv6");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($config['interfaces'][$ifdescr]['gatewayv6']);?>
- <?=htmlspecialchars($ifinfo['gatewayv6']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifdescr == "wan" && file_exists("{$g['varetc_path']}/resolv.conf")):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("ISP DNS servers");?></td>
- <td width="78%" class="listr">
- <?php
+
+ if ($ifinfo['status'] != "down") {
+ if ($ifinfo['dhcplink'] != "down" && $ifinfo['pppoelink'] != "down" && $ifinfo['pptplink'] != "down") {
+ showDef($ifinfo['ipaddr'], gettext('IPv4 Address'), $ifinfo['ipaddr']);
+ showDef($ifinfo['subnet'], gettext('Subnet mask IPv4'), $ifinfo['subnet']);
+ showDef($ifinfo['gateway'], gettext('Gateway IPv4'), $ifinfo['gateway']);
+ showDef($ifinfo['linklocal'], gettext('IPv6 Link Local'), $ifinfo['linklocal']);
+ showDef($ifinfo['ipaddrv6'], gettext('IPv6 Address'), $ifinfo['ipaddrv6']);
+ showDef($ifinfo['subnetv6'], gettext('Subnet mask IPv6'), $ifinfo['subnetv6']);
+ showDef($ifinfo['gatewayv6'], gettext("Gateway IPv6"), $config['interfaces'][$ifdescr]['gatewayv6'] . $ifinfo['gatewayv6']);
+
+ if ($ifdescr == "wan" && file_exists("{$g['varetc_path']}/resolv.conf")) {
$dns_servers = get_dns_servers();
- foreach ($dns_servers as $dns) {
- echo "{$dns}<br />";
+ $dnscnt = 0;
+ foreach($dns_servers as $dns) {
+ showDef(true, $dnscnt == 0 ? gettext('ISP DNS servers'):'', $dns);
+ $dnscnt++;
}
- ?>
- </td>
- </tr>
-<?php
- endif;
- endif;
- if ($ifinfo['mtu']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("MTU");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['mtu']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['media']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Media");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['media']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['laggproto']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("LAGG Protocol");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['laggproto']);?>
- </td>
- </tr>
-<?php
- endif;
- if (is_array($ifinfo['laggport'])):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("LAGG Ports");?></td>
- <td width="78%" class="listr">
- <?php
- foreach ($ifinfo['laggport'] as $laggport) {
- echo htmlspecialchars($laggport);
- ?>
- <br />
- <?php
}
- ?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['channel']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Channel");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['channel']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['ssid']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("SSID");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['ssid']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['bssid']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("BSSID");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['bssid']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['rate']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Rate");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['rate']);?>
- </td>
- </tr>
-<?php
- endif;
- if ($ifinfo['rssi']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("RSSI");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['rssi']);?>
- </td>
- </tr>
-<?php
- endif;
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("In/out packets");?></td>
- <td width="78%" class="listr">
- <?php
- echo htmlspecialchars($ifinfo['inpkts'] . "/" . $ifinfo['outpkts'] . " (");
- echo htmlspecialchars(format_bytes($ifinfo['inbytes']) . "/" . format_bytes($ifinfo['outbytes']) . ")");
- ?>
- </td>
- </tr>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("In/out packets (pass)");?></td>
- <td width="78%" class="listr">
- <?php
- echo htmlspecialchars($ifinfo['inpktspass'] . "/" . $ifinfo['outpktspass'] . " (");
- echo htmlspecialchars(format_bytes($ifinfo['inbytespass']) . "/" . format_bytes($ifinfo['outbytespass']) . ")");
- ?>
- </td>
- </tr>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("In/out packets (block)");?></td>
- <td width="78%" class="listr">
- <?php
- echo htmlspecialchars($ifinfo['inpktsblock'] . "/" . $ifinfo['outpktsblock'] . " (");
- echo htmlspecialchars(format_bytes($ifinfo['inbytesblock']) . "/" . format_bytes($ifinfo['outbytesblock']) . ")");
- ?>
- </td>
- </tr>
-<?php
- if (isset($ifinfo['inerrs'])):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("In/out errors");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['inerrs'] . "/" . $ifinfo['outerrs']);?>
- </td>
- </tr>
-<?php
- endif;
- if (isset($ifinfo['collisions'])):
-?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Collisions");?></td>
- <td width="78%" class="listr">
- <?=htmlspecialchars($ifinfo['collisions']);?>
- </td>
- </tr>
-<?php
- endif;
- endif;
-?>
-<?php
- if ($ifinfo['bridge']):
-?>
- <tr>
- <td width="22%" class="vncellt"><?php printf(gettext("Bridge (%s)"), $ifinfo['bridgeint']);?></td>
- <td width="78%" class="listr">
- <?=$ifinfo['bridge'];?>
- </td>
- </tr>
-<?php
- endif;
- if (file_exists("/usr/bin/vmstat")):
+ }
+
+ showDef($ifinfo['mtu'], gettext("MTU"), $ifinfo['mtu']);
+ showDef($ifinfo['media'], gettext("Media"), $ifinfo['media']);
+ showDef($ifinfo['laggproto'], gettext("LAGG Protocol"), $ifinfo['laggproto']);
+ showDef($ifinfo['laggport'],gettext("LAGG Ports"),$laggport);
+ showDef($ifinfo['channel'],gettext("Channel"),$ifinfo['channel']);
+ showDef($ifinfo['ssid'],gettext("SSID"),$ifinfo['ssid']);
+ showDef($ifinfo['bssid'],gettext("BSSID"),$ifinfo['bssid']);
+ showDef($ifinfo['rate'],gettext("Rate"),$ifinfo['rate']);
+ showDef($ifinfo['rssi'],gettext("RSSI"),$ifinfo['rssi']);
+ showDef(true,gettext("In/out packets"),$ifinfo['inpkts'] . '/' . $ifinfo['outpkts']);
+ showDef(true,gettext("In/out packets (pass)"),$ifinfo['inpktspass'] . "/" . $ifinfo['outpktspass']);
+ showDef(true,gettext("In/out packets (block)"),$ifinfo['inpktsblock'] . "/" . $ifinfo['outpktsblock']);
+ showDef(isset($ifinfo['inerrs']),gettext("In/out errors"),$ifinfo['inerrs'] . "/" . $ifinfo['outerrs']);
+ showDef(isset($ifinfo['collisions']),gettext("Collisions"),$ifinfo['collisions']);
+ } // e-o-if ($ifinfo['status'] != "down")
+
+ showDef($ifinfo['bridge'], gettext('Bridge (') . $ifinfo['bridgeint'] . ')', $ifinfo['bridge']);
+
+ if(file_exists("/usr/bin/vmstat")) {
$real_interface = "";
$interrupt_total = "";
$interrupt_sec = "";
$real_interface = $ifinfo['hwif'];
$interrupt_total = `vmstat -i | grep $real_interface | awk '{ print $3 }'`;
$interrupt_sec = `vmstat -i | grep $real_interface | awk '{ print $4 }'`;
- if (strstr($interrupt_total, "hci")) {
+
+ if(strstr($interrupt_total, "hci")) {
$interrupt_total = `vmstat -i | grep $real_interface | awk '{ print $4 }'`;
$interrupt_sec = `vmstat -i | grep $real_interface | awk '{ print $5 }'`;
}
- unset($interrupt_total); // XXX: FIX ME! Need a regex and parse correct data 100% of the time.
- if ($interrupt_total): ?>
- <tr>
- <td width="22%" class="vncellt"><?=gettext("Interrupts/Second");?></td>
- <td width="78%" class="listr">
- <?php
- echo $interrupt_total . " " . gettext("total");
- echo "<br />";
- echo $interrupt_sec . " " . gettext("rate");
- ?>
- </td>
- </tr>
+
+ unset($interrupt_total);
+
+ showDef($interrupt_total, gettext('Total interrupts'), $interrupt_total);
+ showDef($interrupt_total, '', $interrupt_sec . " " . $interrupt_total);
+ }
+?>
+ </dl>
+ </div>
+</div>
+
<?php
- endif;
- endif;
- $i++;
+ break;
endforeach;
?>
-</table>
-
-<br />
-<?php printf(gettext("Using dial-on-demand will bring the connection up again if any packet ".
-"triggers it. To substantiate this point: disconnecting manually ".
-"will %snot%s prevent dial-on-demand from making connections ".
-"to the outside! Don't use dial-on-demand if you want to make sure that the line ".
-"is kept disconnected."), '<strong>', '</strong>')?>
+<div class="alert alert-warning" role="alert">
+ <?=gettext("Using dial-on-demand will bring the connection up again if any packet ".
+ "triggers it. To substantiate this point: disconnecting manually ".
+ "will <strong>not</strong> prevent dial-on-demand from making connections ".
+ "to the outside! Don't use dial-on-demand if you want to make sure that the line ".
+ "is kept disconnected.");?>
+</div>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php include("foot.inc"); ?>
diff --git a/src/usr/local/www/status_lb_pool.php b/src/usr/local/www/status_lb_pool.php
index 984ab9e..50d42e8 100644
--- a/src/usr/local/www/status_lb_pool.php
+++ b/src/usr/local/www/status_lb_pool.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -46,18 +46,32 @@ require_once("filter.inc");
require_once("shaper.inc");
require_once("vslb.inc");
+define('COLOR', true);
+define('LIGHTGREEN', '#90EE90');
+define('LIGHTCORAL', '#F08080');
+define('KHAKI', '#F0E68C');
+define('LIGHTGRAY', '#D3D3D3');
+define('WHITE', '#FFFFFF');
+
if (!is_array($config['load_balancer']['lbpool'])) {
$config['load_balancer']['lbpool'] = array();
}
+
$a_pool = &$config['load_balancer']['lbpool'];
$lb_logfile = "{$g['varlog_path']}/relayd.log";
+$nentries = $config['syslog']['nentries'];
+
+if (!$nentries)
+ $nentries = 50;
+
$now = time();
$year = date("Y");
$pgtitle = array(gettext("Status"), gettext("Load Balancer"), gettext("Pool"));
$shortcut_section = "relayd";
+
include("head.inc");
$relay_hosts = get_lb_summary();
@@ -72,6 +86,7 @@ if ($_POST) {
} else {
/* Keep a list of servers we find in POST variables */
$newservers = array();
+
foreach ($_POST as $name => $value) {
/* Look through the POST vars to find the pool data */
if (strpos($name, '|') !== false) {
@@ -82,6 +97,7 @@ if ($_POST) {
$newservers[$name][] = $value;
}
}
+
foreach ($a_pool as & $pool) {
if (is_array($pool['servers']) && is_array($pool['serversdisabled'])) {
$oldservers = array_merge($pool['servers'], $pool['serversdisabled']);
@@ -97,135 +113,145 @@ if ($_POST) {
$pool['serversdisabled'] = array_diff($oldservers, $newservers[$pool['name']]);
}
}
+
mark_subsystem_dirty('loadbalancer');
write_config("Updated load balancer pools via status screen.");
}
}
+if (is_subsystem_dirty('loadbalancer'))
+ print_info_box_np('The load balancer configuration has been changed You must apply the changes in order for them to take effect.');
+
+/* active tabs */
+$tab_array = array();
+$tab_array[] = array(gettext("Pools"), true, "status_lb_pool.php");
+$tab_array[] = array(gettext("Virtual Servers"), false, "status_lb_vs.php");
+display_top_tabs($tab_array);
+
+$rowsprinted = 0;
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
+
<form action="status_lb_pool.php" method="post">
-<?php if (is_subsystem_dirty('loadbalancer')): ?><br/>
-<?php print_info_box_np(sprintf(gettext("The load balancer configuration has been changed%sYou must apply the changes in order for them to take effect."), "<br />"));?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status load balancer pools">
- <tr><td class="tabnavtbl">
- <?php
- /* active tabs */
- $tab_array = array();
- $tab_array[] = array(gettext("Pools"), true, "status_lb_pool.php");
- $tab_array[] = array(gettext("Virtual Servers"), false, "status_lb_vs.php");
- display_top_tabs($tab_array);
- ?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont sortable" id="sortabletable" summary="main area">
- <tr>
- <td width="10%" class="listhdrr"><?=gettext("Name");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Mode");?></td>
- <td width="20%" class="listhdrr"><?=gettext("Servers");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Monitor");?></td>
- <td width="30%" class="listhdr"><?=gettext("Description");?></td>
- </tr>
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Load Balancer Pools</h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Name")?></th>
+ <th><?=gettext("Mode")?></th>
+ <th><?=gettext("Servers")?></th>
+ <th><?=gettext("Monitor")?></th>
+ <th><?=gettext("Description")?></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- foreach ($a_pool as & $pool):
+foreach ($a_pool as $pool):
+ $rowsprinted++;
?>
- <tr>
- <td class="listlr">
- <?=$pool['name'];?>
- </td>
- <td class="listr" align="center" >
+ <tr>
+ <td>
+ <?=$pool['name']?>
+ </td>
+ <td>
<?php
- switch ($pool['mode']) {
- case "loadbalance":
- echo "Load balancing";
- break;
- case "failover":
- echo "Manual failover";
- break;
- default:
- echo "(default)";
- }
+ switch($pool['mode']) {
+ case "loadbalance":
+ echo "Load balancing";
+ break;
+ case "failover":
+ echo "Manual failover";
+ break;
+ default:
+ echo "(default)";
+ }
?>
- </td>
- <td class="listr" align="center">
- <table border="0" cellpadding="2" cellspacing="0" summary="status">
+ </td>
+ <td>
+ <table> <!-- Mini-table allows manipulation of cell colors-->
+<?php
+ $pool_hosts=array();
+
+ foreach ((array) $pool['servers'] as $server) {
+ $svr['ip']['addr']=$server;
+ $svr['ip']['state']=$relay_hosts[$pool['name'].":".$pool['port']][$server]['state'];
+ $svr['ip']['avail']=$relay_hosts[$pool['name'].":".$pool['port']][$server]['avail'];
+ $pool_hosts[]=$svr;
+ }
+
+ foreach ((array) $pool['serversdisabled'] as $server) {
+ $svr['ip']['addr']="$server";
+ $svr['ip']['state']='disabled';
+ $svr['ip']['avail']='disabled';
+ $pool_hosts[]=$svr;
+ }
+
+ asort($pool_hosts);
+
+ foreach ((array) $pool_hosts as $server) {
+ if($server['ip']['addr']!="") {
+ switch ($server['ip']['state']) {
+ case 'up':
+ $bgcolor = LIGHTGREEN; // lightgreen
+ $checked = "checked=\"checked\"";
+ break;
+ case 'disabled':
+ $bgcolor = WHITE;
+ $checked = "";
+ break;
+ default:
+ $bgcolor = LIGHTCORAL; // lightcoral
+ $checked = "checked=\"checked\"";
+ }
+?>
+ <tr>
+<?php
+ switch ($pool['mode']) {
+ case 'loadbalance':
+ print("<td><input type=\"checkbox\" name=\"{$pool['name']}|" . str_replace('.', '_', $server['ip']['addr']) . "\" {$checked} /></td>\n");
+ break;
+ case 'failover':
+ print("<td><input type=\"radio\" name=\"{$pool['name']}\" value=\"{$server['ip']['addr']}\" {$checked} /></td>\n");
+ break;
+ }
+
+ print("<td bgcolor=\"{$bgcolor}\">&nbsp;{$server['ip']['addr']}:{$pool['port']}&nbsp;</td><td bgcolor=\"{$bgcolor}\">&nbsp;");
+
+ if($server['ip']['avail'])
+ print(" ({$server['ip']['avail']}) ");
+?>
+ </td>
+ </tr>
<?php
- $pool_hosts = array();
- foreach ((array) $pool['servers'] as $server) {
- $svr['ip']['addr'] = $server;
- $svr['ip']['state'] = $relay_hosts[$pool['name'] . ":" . $pool['port']][$server]['state'];
- $svr['ip']['avail'] = $relay_hosts[$pool['name'] . ":" . $pool['port']][$server]['avail'];
- $pool_hosts[]=$svr;
- }
- foreach ((array) $pool['serversdisabled'] as $server) {
- $svr['ip']['addr'] = "$server";
- $svr['ip']['state'] = 'disabled';
- $svr['ip']['avail'] = 'disabled';
- $pool_hosts[]=$svr;
- }
- asort($pool_hosts);
-
- foreach ((array) $pool_hosts as $server) {
- if ($server['ip']['addr'] != "") {
- switch ($server['ip']['state']) {
- case 'up':
- $bgcolor = "#90EE90"; // lightgreen
- $checked = "checked=\"checked\"";
- break;
- case 'disabled':
- $bgcolor = "white";
- $checked = "";
- break;
- default:
- $bgcolor = "#F08080"; // lightcoral
- $checked = "checked=\"checked\"";
- }
- echo "<tr>";
- switch ($pool['mode']) {
- case 'loadbalance':
- echo "<td><input type=\"checkbox\" name=\"{$pool['name']}|" . str_replace('.', '_', $server['ip']['addr']) . "\" {$checked} /></td>\n";
- break;
- case 'failover':
- echo "<td><input type=\"radio\" name=\"{$pool['name']}\" value=\"{$server['ip']['addr']}\" {$checked} /></td>\n";
- break;
- }
- echo "<td bgcolor=\"{$bgcolor}\">&nbsp;{$server['ip']['addr']}:{$pool['port']}&nbsp;</td><td bgcolor=\"{$bgcolor}\">&nbsp;";
-# echo "<td bgcolor=\"{$bgcolor}\">&nbsp;{$server['ip']['addr']}:{$pool['port']} ";
- if ($server['ip']['avail']) {
- echo " ({$server['ip']['avail']}) ";
- }
- echo "&nbsp;</td></tr>";
}
}
?>
- </table>
- </td>
- <td class="listr" >
- <?php echo $pool['monitor']; ?>
- </td>
- <td class="listbg" >
- <?=$pool['descr'];?>
- </td>
- </tr>
+ </table>
+ </td>
+ <td >
+ <?=$pool['monitor']; ?>
+ </td>
+ <td>
+ <?=$pool['descr']?>
+ </td>
+ </tr>
<?php
- endforeach;
+endforeach;
?>
- <tr>
- <td colspan="5">
- <input name="Submit" type="submit" class="formbtn" value="<?= gettext("Save"); ?>" />
- <input name="Reset" type="reset" class="formbtn" value="<?= gettext("Reset"); ?>" />
- </td>
- </tr>
+ </tbody>
</table>
- </div>
- </td>
- </tr>
-</table>
+<?php
+if($rowsprinted > 0) {
+?>
+ <nav class="action-buttons">
+ <input name="Submit" type="submit" class="btn btn-primary" value="<?= gettext("Save"); ?>" />
+ <input name="Reset" type="reset" class="btn btn-danger" value="<?= gettext("Reset"); ?>" />
+ </nav>
+<?php
+}
+?>
+ </div>
+ </div>
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_lb_vs.php b/src/usr/local/www/status_lb_vs.php
index 0d0bd60..953c710 100644
--- a/src/usr/local/www/status_lb_vs.php
+++ b/src/usr/local/www/status_lb_vs.php
@@ -31,7 +31,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /usr/local/sbin/relayctl
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -41,6 +41,13 @@
##|*MATCH=status_lb_vs.php*
##|-PRIV
+define('COLOR', true);
+define('LIGHTGREEN', '#90EE90');
+define('LIGHTCORAL', '#F08080');
+define('KHAKI', '#F0E68C');
+define('LIGHTGRAY', '#D3D3D3');
+define('WHITE', '#FFFFFF');
+
require_once("guiconfig.inc");
require_once("vslb.inc");
@@ -57,102 +64,90 @@ $rdr_a = get_lb_redirects();
$pgtitle = array(gettext("Status"), gettext("Load Balancer"), gettext("Virtual Server"));
include("head.inc");
+/* active tabs */
+$tab_array = array();
+$tab_array[] = array(gettext("Pools"), false, "status_lb_pool.php");
+$tab_array[] = array(gettext("Virtual Servers"), true, "status_lb_vs.php");
+display_top_tabs($tab_array);
+
+if(empty($a_vs))
+ print('<div class="alert alert-danger">No load balancers have been configured!</div>');
+else {
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status load balancer virtual servers">
- <tr><td class="tabnavtbl">
- <?php
- /* active tabs */
- $tab_array = array();
- $tab_array[] = array(gettext("Pools"), false, "status_lb_pool.php");
- $tab_array[] = array(gettext("Virtual Servers"), true, "status_lb_vs.php");
- display_top_tabs($tab_array);
- ?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td width="10%" class="listhdrr"><?=gettext("Name"); ?></td>
- <td width="20%" class="listhdrr"><?=gettext("Address"); ?></td>
- <td width="10%" class="listhdrr"><?=gettext("Servers"); ?></td>
- <td width="25%" class="listhdrr"><?=gettext("Status"); ?></td>
- <td width="25%" class="listhdr"><?=gettext("Description"); ?></td>
- </tr>
-<?php
- $i = 0;
- foreach ($a_vs as $vsent):
-?>
- <tr>
- <td class="listlr">
- <?=$vsent['name'];?>
- </td>
- <td class="listr" align="center" >
- <?=$vsent['ipaddr']." : ".$vsent['port'];?>
- <br />
- </td>
- <td class="listr" align="center" >
- <table border="0" cellpadding="0" cellspacing="2" summary="servers">
+ <div class="table-responsive"></div>
+ <table class="table table-striped table-hover table-condensed">
+ <tr>
+ <td><?=gettext("Name"); ?></td>
+ <td><?=gettext("Address"); ?></td>
+ <td><?=gettext("Servers"); ?></td>
+ <td><?=gettext("Status"); ?></td>
+ <td><?=gettext("Description"); ?></td>
+ </tr>
<?php
- foreach ($a_pool as $vipent) {
- if ($vipent['name'] == $vsent['poolname']) {
- foreach ((array) $vipent['servers'] as $server) {
- print "<tr><td> {$server} </td></tr>";
- }
- }
- }
- ?>
- </table>
- </td>
+ $i = 0;
+ foreach ($a_vs as $vsent): ?>
+ <tr>
+ <td>
+ <?=$vsent['name']?>
+ </td>
+ <td>
+ <?=$vsent['ipaddr']." : ".$vsent['port']?><br />
+ </td>
+ <td>
+
+ <?php
+ foreach ($a_pool as $vipent) {
+ if ($vipent['name'] == $vsent['poolname']) {
+ foreach ((array) $vipent['servers'] as $server) { ?>
+ <?=$server?> <br />
<?php
- switch (trim($rdr_a[$vsent['name']]['status'])) {
- case 'active':
- $bgcolor = "#90EE90"; // lightgreen
- $rdr_a[$vsent['name']]['status'] = "Active";
- break;
- case 'down':
- $bgcolor = "#F08080"; // lightcoral
- $rdr_a[$vsent['name']]['status'] = "Down";
- break;
- default:
- $bgcolor = "#D3D3D3"; // lightgray
- $rdr_a[$vsent['name']]['status'] = 'Unknown - relayd not running?';
- }
+ }
+ }
+ }
?>
- <td class="listr nowrap">
- <table border="0" cellpadding="3" cellspacing="2" summary="status">
- <tr>
- <td bgcolor="<?=$bgcolor?>"><?=$rdr_a[$vsent['name']]['status']?> </td>
- </tr>
- </table>
-<?php
- if (!empty($rdr_a[$vsent['name']]['total'])) {
- echo "Total Sessions: {$rdr_a[$vsent['name']]['total']}\n";
- }
- if (!empty($rdr_a[$vsent['name']]['last'])) {
- echo "<br />Last: {$rdr_a[$vsent['name']]['last']}\n";
- }
- if (!empty($rdr_a[$vsent['name']]['average'])) {
- echo "<br />Average: {$rdr_a[$vsent['name']]['average']}\n";
- }
+ </td>
+ <?php
+ switch (trim($rdr_a[$vsent['name']]['status'])) {
+ case 'active':
+ $bgcolor = LIGHTGREEN;
+ $rdr_a[$vsent['name']]['status'] = "Active";
+ break;
+ case 'down':
+ $bgcolor = LIGHTCORAL;
+ $rdr_a[$vsent['name']]['status'] = "Down";
+ break;
+ default:
+ $bgcolor = LIGHTGRAY;
+ $rdr_a[$vsent['name']]['status'] = 'Unknown - relayd not running?';
+ }
+
+ if(!COLOR)
+ $bgcolor = WHITE;
?>
- </td>
- <td class="listbg" >
- <?=$vsent['descr'];?>
- </td>
- </tr>
+ <td bgcolor="<?=$bgcolor?>">
+ <?=$rdr_a[$vsent['name']]['status']?>
+ </td>
+ <td>
<?php
- $i++;
- endforeach;
-?>
- </table>
- </div>
- </td>
- </tr>
-</table>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ if (!empty($rdr_a[$vsent['name']]['total'])) { ?>
+ Total Sessions: <?=$rdr_a[$vsent['name']]['total']?><br>/><?php
+ }
+ if (!empty($rdr_a[$vsent['name']]['last'])) { ?>
+ Last: <?=$rdr_a[$vsent['name']]['last']?><br>/><?php
+ }
+ if (!empty($rdr_a[$vsent['name']]['average'])) { ?>
+ Average: <?=$rdr_a[$vsent['name']]['average']?><?php
+ } ?>
+ </td>
+ <td>
+ <?=$vsent['descr']?>
+ </td>
+ </tr>
+
+<?php $i++; endforeach; ?>
+ </table>
+ </div>
+
+<?php }
+
+include("foot.inc"); ?> \ No newline at end of file
diff --git a/src/usr/local/www/status_ntpd.php b/src/usr/local/www/status_ntpd.php
index 329764b..bf00ced 100644
--- a/src/usr/local/www/status_ntpd.php
+++ b/src/usr/local/www/status_ntpd.php
@@ -32,7 +32,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /usr/local/sbin/ntpd /usr/local/sbin/ntpq
- pfSense_MODULE: ntpd
+ pfSense_MODULE: ntpd
*/
##|+PRIV
@@ -145,7 +145,6 @@ if (!isset($config['ntpd']['noquery'])) {
}
}
}
-
}
if (isset($config['ntpd']['gps']['type']) && ($config['ntpd']['gps']['type'] == 'SureGPS') && (isset($gps_ok))) {
@@ -164,157 +163,142 @@ if (isset($config['ntpd']['gps']['type']) && ($config['ntpd']['gps']['type'] ==
$pgtitle = array(gettext("Status"), gettext("NTP"));
$shortcut_section = "ntp";
+
include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status ntpd">
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="heading">
- <tr>
- <td class="listtopic">Network Time Protocol Status</td>
- </tr>
- </table>
- <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <thead>
- <tr>
- <th class="listhdrr"><?=gettext("Status"); ?></th>
- <th class="listhdrr"><?=gettext("Server"); ?></th>
- <th class="listhdrr"><?=gettext("Ref ID"); ?></th>
- <th class="listhdrr"><?=gettext("Stratum"); ?></th>
- <th class="listhdrr"><?=gettext("Type"); ?></th>
- <th class="listhdrr"><?=gettext("When"); ?></th>
- <th class="listhdrr"><?=gettext("Poll"); ?></th>
- <th class="listhdrr"><?=gettext("Reach"); ?></th>
- <th class="listhdrr"><?=gettext("Delay"); ?></th>
- <th class="listhdrr"><?=gettext("Offset"); ?></th>
- <th class="listhdr"><?=gettext("Jitter"); ?></th>
- </tr>
- </thead>
- <tbody>
-<?php
- if (isset($config['ntpd']['noquery'])):
-?>
- <tr>
- <td class="listlr" colspan="11" align="center">
- Statistics unavailable because ntpq and ntpdc queries are disabled in the <a href="services_ntpd.php">NTP service settings</a>.
- </td>
- </tr>
-<?php
- elseif (count($ntpq_servers) == 0):
-?>
- <tr>
- <td class="listlr" colspan="11" align="center">
- No peers found, <a href="status_services.php">is the ntp service running?</a>.
- </td>
- </tr>
-<?php
- else:
- $i = 0;
- foreach ($ntpq_servers as $server):
-?>
- <tr>
- <td class="listlr nowrap">
- <?=$server['status'];?>
- </td>
- <td class="listr">
- <?=$server['server'];?>
- </td>
- <td class="listr">
- <?=$server['refid'];?>
- </td>
- <td class="listr">
- <?=$server['stratum'];?>
- </td>
- <td class="listr">
- <?=$server['type'];?>
- </td>
- <td class="listr">
- <?=$server['when'];?>
- </td>
- <td class="listr">
- <?=$server['poll'];?>
- </td>
- <td class="listr">
- <?=$server['reach'];?>
- </td>
- <td class="listr">
- <?=$server['delay'];?>
- </td>
- <td class="listr">
- <?=$server['offset'];?>
- </td>
- <td class="listr">
- <?=$server['jitter'];?>
- </td>
- </tr>
-<?php
- $i++;
- endforeach;
- endif;
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Network Time Protocol Status</h2></div>
+ <div class="panel-body">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Status"); ?></th>
+ <th><?=gettext("Server"); ?></th>
+ <th><?=gettext("Ref ID"); ?></th>
+ <th><?=gettext("Stratum"); ?></th>
+ <th><?=gettext("Type"); ?></th>
+ <th><?=gettext("When"); ?></th>
+ <th><?=gettext("Poll"); ?></th>
+ <th><?=gettext("Reach"); ?></th>
+ <th><?=gettext("Delay"); ?></th>
+ <th><?=gettext("Offset"); ?></th>
+ <th><?=gettext("Jitter"); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php if (isset($config['ntpd']['noquery'])): ?>
+ <tr>
+ <td class="warning" colspan="11">
+ Statistics unavailable because ntpq and ntpdc queries are disabled in the <a href="services_ntpd.php">NTP service settings</a>.
+ </td>
+ </tr>
+ <?php elseif (count($ntpq_servers) == 0): ?>
+ <tr>
+ <td class="warning" colspan="11">
+ No peers found, <a href="status_services.php">is the ntp service running?</a>
+ </td>
+ </tr>
+ <?php else:
+
+ $i = 0;
+ foreach ($ntpq_servers as $server): ?>
+ <tr>
+ <td><?=$server['status']?></td>
+ <td><?=$server['server']?></td>
+ <td><?=$server['refid']?></td>
+ <td><?=$server['stratum']?></td>
+ <td><?=$server['type']?></td>
+ <td><?=$server['when']?></td>
+ <td><?=$server['poll']?></td>
+ <td><?=$server['reach']?></td>
+ <td><?=$server['delay']?></td>
+ <td><?=$server['offset']?></td>
+ <td><?=$server['jitter']?></td>
+ </tr> <?php
+ $i++;
+ endforeach;
+ endif;
?>
- </tbody>
- </table>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+
<?php
- if (($gps_ok) && ($gps_lat) && ($gps_lon)):
- $gps_goo_lnk = 2;
-?>
- <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="gps status">
+
+// GPS satellite information (if available)
+if (($gps_ok) && ($gps_lat) && ($gps_lon)):
+ $gps_goo_lnk = 2; ?>
+
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">GPS information</h2></div>
+ <div class="panel-body">
+ <table class="table table-striped table-hover table-condensed">
<thead>
- <tr>
- <th class="listhdrr"><?=gettext("Clock Latitude"); ?></th>
- <th class="listhdrr"><?=gettext("Clock Longitude"); ?></th>
-<?php
- if (isset($gps_alt)) {
- echo '<th class="listhdrr">' . gettext("Clock Altitude") . '</th>';
- $gps_goo_lnk++;
- }
+ <tr>
+ <th>
+ <?=gettext("Clock Latitude"); ?>
+ </th>
+ <th>
+ <?=gettext("Clock Longitude"); ?>
+ </th>
+ <?php if (isset($gps_alt)) { ?>
+ <th>
+ <?=gettext("Clock Altitude")?>
+ </th>
+ <?php $gps_goo_lnk++;
+ }
- if (isset($gps_sat) || isset($gps_satview)) {
- echo '<th class="listhdrr">' . gettext("Satellites") . '</th>';
- $gps_goo_lnk++;
- }
-?>
+ if (isset($gps_sat) || isset($gps_satview)) { ?>
+ <th>
+ <?=gettext("Satellites")?>
+ </th> <?php
+ $gps_goo_lnk++;
+ }?>
</tr>
</thead>
+
<tbody>
<tr>
- <td class="listlr" align="center"><?php echo sprintf("%.5f", $gps_lat); ?> (<?php echo sprintf("%d", $gps_lat_deg); ?>&deg; <?php echo sprintf("%.5f", $gps_lat_min*60); ?><?php echo $gps_vars[4]; ?>)</td>
- <td class="listlr" align="center"><?php echo sprintf("%.5f", $gps_lon); ?> (<?php echo sprintf("%d", $gps_lon_deg); ?>&deg; <?php echo sprintf("%.5f", $gps_lon_min*60); ?><?php echo $gps_vars[6]; ?>)</td>
-<?php
- if (isset($gps_alt)) {
- echo '<td class="listlr" align="center">' . $gps_alt . ' ' . $gps_alt_unit . '</td>';
- }
+ <td>
+ <?=printf("%.5f", $gps_lat); ?> (<?=printf("%d", $gps_lat_deg); ?>&deg; <?=printf("%.5f", $gps_lat_min*60); ?><?=$gps_vars[4]; ?>)
+ </td>
+ <td>
+ <?=printf("%.5f", $gps_lon); ?> (<?=printf("%d", $gps_lon_deg); ?>&deg; <?=printf("%.5f", $gps_lon_min*60); ?><?=$gps_vars[6]; ?>)
+ </td>
- if (isset($gps_sat) || isset($gps_satview)) {
- echo '<td class="listr" align="center">';
- if (isset($gps_satview)) {
- echo 'in view ' . intval($gps_satview);
- }
- if (isset($gps_sat) && isset($gps_satview)) {
- echo ', ';
- }
- if (isset($gps_sat)) {
- echo 'in use ' . $gps_sat;
- }
- echo '</td>';
- }
-?>
+ <?php if (isset($gps_alt)) { ?>
+ <td>
+ <?=$gps_alt . ' ' . $gps_alt_unit?>
+ </td>
+ }
+
+ if (isset($gps_sat) || isset($gps_satview)) { ?>
+ <td align="center"> <?php
+ if (isset($gps_satview)) {
+ print('in view ' . intval($gps_satview));
+ }
+
+ if (isset($gps_sat) && isset($gps_satview)) {
+ print(', ');
+ }
+ if (isset($gps_sat)) {
+ print('in use ' . $gps_sat);
+ } ?>
+ </td> <?php
+ }
+ ?>
</tr>
<tr>
- <td class="listlr" colspan="<?php echo $gps_goo_lnk; ?>" align="center"><a target="_gmaps" href="http://maps.google.com/?q=<?php echo $gps_lat; ?>,<?php echo $gps_lon; ?>">Google Maps Link</a></td>
+ <td colspan="<?=$gps_goo_lnk; ?>"><a target="_gmaps" href="http://maps.google.com/?q=<?=$gps_lat; ?>,<?=$gps_lon; ?>">Google Maps Link</a></td>
</tr>
</tbody>
- </table>
-<?php
- endif;
-?>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </table>
+ </div>
+ </div>
+
+<?php endif;
+
+include("foot.inc"); ?> \ No newline at end of file
diff --git a/src/usr/local/www/status_openvpn.php b/src/usr/local/www/status_openvpn.php
index e9d2073..8c765d9 100644
--- a/src/usr/local/www/status_openvpn.php
+++ b/src/usr/local/www/status_openvpn.php
@@ -52,10 +52,10 @@ require_once("shortcuts.inc");
require_once("service-utils.inc");
/* Handle AJAX */
-if ($_GET['action']) {
- if ($_GET['action'] == "kill") {
- $port = $_GET['port'];
- $remipp = $_GET['remipp'];
+if($_GET['action']) {
+ if($_GET['action'] == "kill") {
+ $port = $_GET['port'];
+ $remipp = $_GET['remipp'];
if (!empty($port) and !empty($remipp)) {
$retval = kill_client($port, $remipp);
echo htmlentities("|{$port}|{$remipp}|{$retval}|");
@@ -72,8 +72,8 @@ function kill_client($port, $remipp) {
//$tcpsrv = "tcp://127.0.0.1:{$port}";
$tcpsrv = "unix://{$g['varetc_path']}/openvpn/{$port}.sock";
- $errval;
- $errstr;
+ $errval = null;
+ $errstr = null;
/* open a tcp connection to the management port of each server */
$fp = @stream_socket_client($tcpsrv, $errval, $errstr, 1);
@@ -115,10 +115,10 @@ include("head.inc"); ?>
<script type="text/javascript">
//<![CDATA[
function killClient(mport, remipp) {
- var busy = function(index, icon) {
- jQuery(icon).bind("onclick", "");
- jQuery(icon).attr('src', jQuery(icon).attr('src').replace("\.gif", "_d.gif"));
- jQuery(icon).css("cursor", "wait");
+ var busy = function(index,icon) {
+ jQuery(icon).bind("onclick","");
+ jQuery(icon).attr('src',jQuery(icon).attr('src').replace("\.gif", "_d.gif"));
+ jQuery(icon).css("cursor","wait");
}
jQuery('img[name="i:' + mport + ":" + remipp + '"]').each(busy);
@@ -132,13 +132,13 @@ include("head.inc"); ?>
function killComplete(req) {
var values = req.responseText.split("|");
- if (values[3] != "0") {
+ if(values[3] != "0") {
alert('<?=gettext("An error occurred.");?>' + ' (' + values[3] + ')');
return;
}
jQuery('tr[name="r:' + values[1] + ":" + values[2] + '"]').each(
- function(index, row) { jQuery(row).fadeOut(1000); }
+ function(index,row) { jQuery(row).fadeOut(1000); }
);
}
//]]>
@@ -157,61 +157,61 @@ include("head.inc"); ?>
<tr>
<td>
<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="connections">
- <tr>
- <td class="listhdrr"><?=gettext("Common Name"); ?></td>
- <td class="listhdrr"><?=gettext("Real Address"); ?></td>
- <td class="listhdrr"><?=gettext("Virtual Address"); ?></td>
- <td class="listhdrr"><?=gettext("Connected Since"); ?></td>
- <td class="listhdrr"><?=gettext("Bytes Sent"); ?></td>
- <td class="listhdrr"><?=gettext("Bytes Received"); ?></td>
- </tr>
+ <tr>
+ <td class="listhdrr"><?=gettext("Common Name"); ?></td>
+ <td class="listhdrr"><?=gettext("Real Address"); ?></td>
+ <td class="listhdrr"><?=gettext("Virtual Address"); ?></td>
+ <td class="listhdrr"><?=gettext("Connected Since"); ?></td>
+ <td class="listhdrr"><?=gettext("Bytes Sent"); ?></td>
+ <td class="listhdrr"><?=gettext("Bytes Received"); ?></td>
+ </tr>
<?php
foreach ($server['conns'] as $conn):
?>
- <tr id="<?php echo "r:{$server['mgmt']}:{$conn['remote_host']}"; ?>">
- <td class="listlr">
- <?=$conn['common_name'];?>
- </td>
- <td class="listr">
- <?=$conn['remote_host'];?>
- </td>
- <td class="listr">
- <?=$conn['virtual_addr'];?>
- </td>
- <td class="listr">
- <?=$conn['connect_time'];?>
- </td>
- <td class="listr">
- <?=format_bytes($conn['bytes_sent']);?>
- </td>
- <td class="listr">
- <?=format_bytes($conn['bytes_recv']);?>
- </td>
- <td class="list">
- <img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" height="17" width="17" border="0"
- onclick="killClient('<?php echo $server['mgmt']; ?>', '<?php echo $conn['remote_host']; ?>');" style="cursor:pointer;"
- id="<?php echo "i:{$server['mgmt']}:{$conn['remote_host']}"; ?>"
- title="<?php echo gettext("Kill client connection from") . " " . $conn['remote_host']; ?>" alt="delete" />
- </td>
- </tr>
+ <tr id="<?php echo "r:{$server['mgmt']}:{$conn['remote_host']}"; ?>">
+ <td class="listlr">
+ <?=$conn['common_name'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['remote_host'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['virtual_addr'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['connect_time'];?>
+ </td>
+ <td class="listr">
+ <?=format_bytes($conn['bytes_sent']);?>
+ </td>
+ <td class="listr">
+ <?=format_bytes($conn['bytes_recv']);?>
+ </td>
+ <td class="list">
+ <img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" height="17" width="17" border="0"
+ onclick="killClient('<?php echo $server['mgmt']; ?>', '<?php echo $conn['remote_host']; ?>');" style="cursor:pointer;"
+ id="<?php echo "i:{$server['mgmt']}:{$conn['remote_host']}"; ?>"
+ title="<?php echo gettext("Kill client connection from") . " " . $conn['remote_host']; ?>" alt="delete" />
+ </td>
+ </tr>
<?php
endforeach;
?>
<tfoot>
+ <tr>
+ <td colspan="2" class="list" height="12">
+ <table>
<tr>
- <td colspan="2" class="list" height="12">
- <table>
- <tr>
- <td><?php $ssvc = find_service_by_openvpn_vpnid($server['vpnid']); ?>
- <?= get_service_status_icon($ssvc, true, true); ?>
- <?= get_service_control_links($ssvc, true); ?></td>
- </tr>
- </table>
- </td>
- <td colspan="4" class="list" height="12">&nbsp;</td>
+ <td><?php $ssvc = find_service_by_openvpn_vpnid($server['vpnid']); ?>
+ <?= get_service_status_icon($ssvc, true, true); ?>
+ <?= get_service_control_links($ssvc, true); ?></td>
</tr>
+ </table>
+ </td>
+ <td colspan="4" class="list" height="12">&nbsp;</td>
+ </tr>
</tfoot>
- </table>
+ </table>
</td>
</tr>
</table>
@@ -219,8 +219,8 @@ include("head.inc"); ?>
if (is_array($server['routes']) && count($server['routes'])):
?>
<div id="shroutebut-<?= $i ?>">
- <input type="button" onClick="show_routes('tabroute-<?= $i ?>', 'shroutebut-<?= $i ?>')" value="<?php echo gettext("Show Routing Table"); ?>" /> - <?= gettext("Display OpenVPN's internal routing table for this server.") ?>
- <br /><br />
+<input type="button" onClick="show_routes('tabroute-<?= $i ?>','shroutebut-<?= $i ?>')" value="<?php echo gettext("Show Routing Table"); ?>" /> - <?= gettext("Display OpenVPN's internal routing table for this server.") ?>
+<br /><br />
</div>
<table style="display: none; padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0" id="tabroute-<?= $i ?>" summary="routing table">
<tr>
@@ -231,39 +231,39 @@ include("head.inc"); ?>
<tr>
<td>
<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="results">
- <tr>
- <td class="listhdrr"><?=gettext("Common Name"); ?></td>
- <td class="listhdrr"><?=gettext("Real Address"); ?></td>
- <td class="listhdrr"><?=gettext("Target Network"); ?></td>
- <td class="listhdrr"><?=gettext("Last Used"); ?></td>
- </tr>
+ <tr>
+ <td class="listhdrr"><?=gettext("Common Name"); ?></td>
+ <td class="listhdrr"><?=gettext("Real Address"); ?></td>
+ <td class="listhdrr"><?=gettext("Target Network"); ?></td>
+ <td class="listhdrr"><?=gettext("Last Used"); ?></td>
+ </tr>
<?php
foreach ($server['routes'] as $conn):
?>
- <tr id="<?php echo "r:{$server['mgmt']}:{$conn['remote_host']}"; ?>">
- <td class="listlr">
- <?=$conn['common_name'];?>
- </td>
- <td class="listr">
- <?=$conn['remote_host'];?>
- </td>
- <td class="listr">
- <?=$conn['virtual_addr'];?>
- </td>
- <td class="listr">
- <?=$conn['last_time'];?>
- </td>
- </tr>
+ <tr id="<?php echo "r:{$server['mgmt']}:{$conn['remote_host']}"; ?>">
+ <td class="listlr">
+ <?=$conn['common_name'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['remote_host'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['virtual_addr'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['last_time'];?>
+ </td>
+ </tr>
<?php
endforeach;
?>
<tfoot>
- <tr>
- <td colspan="6" class="list" height="12"><?= gettext("An IP address followed by C indicates a host currently connected through the VPN.") ?></td>
- </tr>
+ <tr>
+ <td colspan="6" class="list" height="12"><?= gettext("An IP address followed by C indicates a host currently connected through the VPN.") ?></td>
+ </tr>
</tfoot>
- </table>
+ </table>
</td>
</tr>
</table>
@@ -289,53 +289,53 @@ include("head.inc"); ?>
<tr>
<td>
<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="results">
- <tr>
- <td class="listhdrr"><?=gettext("Name"); ?></td>
- <td class="listhdrr"><?=gettext("Status"); ?></td>
- <td class="listhdrr"><?=gettext("Connected Since"); ?></td>
- <td class="listhdrr"><?=gettext("Virtual Addr"); ?></td>
- <td class="listhdrr"><?=gettext("Remote Host"); ?></td>
- <td class="listhdrr"><?=gettext("Bytes Sent"); ?></td>
- <td class="listhdrr"><?=gettext("Bytes Rcvd"); ?></td>
- <td class="listhdrr"><?=gettext("Service"); ?></td>
- </tr>
+ <tr>
+ <td class="listhdrr"><?=gettext("Name"); ?></td>
+ <td class="listhdrr"><?=gettext("Status"); ?></td>
+ <td class="listhdrr"><?=gettext("Connected Since"); ?></td>
+ <td class="listhdrr"><?=gettext("Virtual Addr"); ?></td>
+ <td class="listhdrr"><?=gettext("Remote Host"); ?></td>
+ <td class="listhdrr"><?=gettext("Bytes Sent"); ?></td>
+ <td class="listhdrr"><?=gettext("Bytes Rcvd"); ?></td>
+ <td class="listhdrr"><?=gettext("Service"); ?></td>
+ </tr>
<?php
foreach ($sk_servers as $sk_server):
?>
- <tr id="<?php echo "r:{$sk_server['port']}:{$sk_server['vpnid']}"; ?>">
- <td class="listlr">
- <?=$sk_server['name'];?>
- </td>
- <td class="listr">
- <?=$sk_server['status'];?>
- </td>
- <td class="listr">
- <?=$sk_server['connect_time'];?>
- </td>
- <td class="listr">
- <?=$sk_server['virtual_addr'];?>
- </td>
- <td class="listr">
- <?=$sk_server['remote_host'];?>
- </td>
- <td class="listr">
- <?=format_bytes($sk_server['bytes_sent']);?>
- </td>
- <td class="listr">
- <?=format_bytes($sk_server['bytes_recv']);?>
- </td>
- <td class="listr">
- <table>
- <tr>
- <td><?php $ssvc = find_service_by_openvpn_vpnid($sk_server['vpnid']); ?>
- <?= get_service_status_icon($ssvc, false, true); ?>
+ <tr id="<?php echo "r:{$sk_server['port']}:{$sk_server['vpnid']}"; ?>">
+ <td class="listlr">
+ <?=$sk_server['name'];?>
+ </td>
+ <td class="listr">
+ <?=$sk_server['status'];?>
+ </td>
+ <td class="listr">
+ <?=$sk_server['connect_time'];?>
+ </td>
+ <td class="listr">
+ <?=$sk_server['virtual_addr'];?>
+ </td>
+ <td class="listr">
+ <?=$sk_server['remote_host'];?>
+ </td>
+ <td class="listr">
+ <?=format_bytes($sk_server['bytes_sent']);?>
+ </td>
+ <td class="listr">
+ <?=format_bytes($sk_server['bytes_recv']);?>
+ </td>
+ <td class="listr">
+ <table>
+ <tr>
+ <td><?php $ssvc = find_service_by_openvpn_vpnid($sk_server['vpnid']); ?>
+ <?= get_service_status_icon($ssvc, false, true); ?>
<?= get_service_control_links($ssvc, true); ?>
</td>
- </tr>
- </table>
- </td>
</tr>
+ </table>
+ </td>
+ </tr>
<?php
endforeach;
?>
@@ -360,54 +360,54 @@ include("head.inc"); ?>
<tr>
<td>
<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="results">
- <tr>
- <td class="listhdrr"><?=gettext("Name"); ?></td>
- <td class="listhdrr"><?=gettext("Status"); ?></td>
- <td class="listhdrr"><?=gettext("Connected Since"); ?></td>
- <td class="listhdrr"><?=gettext("Virtual Addr"); ?></td>
- <td class="listhdrr"><?=gettext("Remote Host"); ?></td>
- <td class="listhdrr"><?=gettext("Bytes Sent"); ?></td>
- <td class="listhdrr"><?=gettext("Bytes Rcvd"); ?></td>
- <td class="listhdrr"><?=gettext("Service"); ?></td>
- </tr>
+ <tr>
+ <td class="listhdrr"><?=gettext("Name"); ?></td>
+ <td class="listhdrr"><?=gettext("Status"); ?></td>
+ <td class="listhdrr"><?=gettext("Connected Since"); ?></td>
+ <td class="listhdrr"><?=gettext("Virtual Addr"); ?></td>
+ <td class="listhdrr"><?=gettext("Remote Host"); ?></td>
+ <td class="listhdrr"><?=gettext("Bytes Sent"); ?></td>
+ <td class="listhdrr"><?=gettext("Bytes Rcvd"); ?></td>
+ <td class="listhdrr"><?=gettext("Service"); ?></td>
+ </tr>
<?php
foreach ($clients as $client):
?>
- <tr id="<?php echo "r:{$client['port']}:{$client['vpnid']}"; ?>">
- <td class="listlr">
- <?=$client['name'];?>
- </td>
- <td class="listr">
- <?=$client['status'];?>
- </td>
- <td class="listr">
- <?=$client['connect_time'];?>
- </td>
- <td class="listr">
- <?=$client['virtual_addr'];?>
- </td>
- <td class="listr">
- <?=$client['remote_host'];?>
- </td>
- <td class="listr">
- <?=format_bytes($client['bytes_sent']);?>
- </td>
- <td class="listr">
- <?=format_bytes($client['bytes_recv']);?>
- </td>
- <td class="listr" height="12">
- <table>
- <tr>
+ <tr id="<?php echo "r:{$client['port']}:{$client['vpnid']}"; ?>">
+ <td class="listlr">
+ <?=$client['name'];?>
+ </td>
+ <td class="listr">
+ <?=$client['status'];?>
+ </td>
+ <td class="listr">
+ <?=$client['connect_time'];?>
+ </td>
+ <td class="listr">
+ <?=$client['virtual_addr'];?>
+ </td>
+ <td class="listr">
+ <?=$client['remote_host'];?>
+ </td>
+ <td class="listr">
+ <?=format_bytes($client['bytes_sent']);?>
+ </td>
+ <td class="listr">
+ <?=format_bytes($client['bytes_recv']);?>
+ </td>
+ <td class="listr" height="12">
+ <table>
+ <tr>
<td>
<?php $ssvc = find_service_by_openvpn_vpnid($client['vpnid']); ?>
- <?= get_service_status_icon($ssvc, false, true); ?>
+ <?= get_service_status_icon($ssvc, false, true); ?>
<?= get_service_control_links($ssvc, true); ?>
</td>
- </tr>
- </table>
- </td>
</tr>
+ </table>
+ </td>
+ </tr>
<?php
endforeach;
?>
@@ -416,16 +416,16 @@ include("head.inc"); ?>
</tr>
</table>
-<?php
- }
+<?php
+}
- if ($DisplayNote) {
- echo "<br /><b>" . gettext("NOTE") . ":</b> " . gettext("If you have custom options that override the management features of OpenVPN on a client or server, they will cause that OpenVPN instance to not work correctly with this status page.");
- }
+if ($DisplayNote) {
+ echo "<br /><b>" . gettext("NOTE") . ":</b> " . gettext("If you have custom options that override the management features of OpenVPN on a client or server, they will cause that OpenVPN instance to not work correctly with this status page.");
+}
- if ((empty($clients)) && (empty($servers)) && (empty($sk_servers))) {
- echo gettext("No OpenVPN instances defined");
- }
+if ((empty($clients)) && (empty($servers)) && (empty($sk_servers))) {
+ echo gettext("No OpenVPN instances defined");
+}
?>
</form>
diff --git a/src/usr/local/www/status_rrd_graph.php b/src/usr/local/www/status_rrd_graph.php
index ae9c709..037f521 100644
--- a/src/usr/local/www/status_rrd_graph.php
+++ b/src/usr/local/www/status_rrd_graph.php
@@ -51,10 +51,11 @@ if (!isset($config['rrd']['enable'])) {
header("Location: status_rrd_graph_settings.php");
}
+$home = getcwd();
$rrddbpath = "/var/db/rrd/";
chdir($rrddbpath);
$databases = glob("*.rrd");
-
+chdir($home);
if ($_GET['cat']) {
$curcat = htmlspecialchars($_GET['cat']);
@@ -66,14 +67,17 @@ if ($_GET['cat']) {
}
}
-if ($_GET['zone']) {
+if ($_POST['cat']) {
+ $curcat = htmlspecialchars($_POST['cat']);
+}
+
+if ($_GET['zone'])
$curzone = $_GET['zone'];
-} else {
+else
$curzone = '';
-}
-if ($_GET['period']) {
- $curperiod = $_GET['period'];
+if ($_POST['period']) {
+ $curperiod = $_POST['period'];
} else {
if (!empty($config['rrd']['period'])) {
$curperiod = $config['rrd']['period'];
@@ -82,10 +86,20 @@ if ($_GET['period']) {
}
}
-if ($_GET['option']) {
- $curoption = $_GET['option'];
+if ($_POST['style']) {
+ $curstyle = $_POST['style'];
+} else {
+ if(! empty($config['rrd']['style'])) {
+ $curstyle = $config['rrd']['style'];
+ } else {
+ $curstyle = "absolute";
+ }
+}
+
+if ($_POST['option']) {
+ $curoption = $_POST['option'];
} else {
- switch ($curcat) {
+ switch($curcat) {
case "system":
$curoption = "processor";
break;
@@ -154,12 +168,15 @@ if ($curcat == "custom") {
if ($start < ($now - (3600 * 24 * 365 * 5))) {
$start = $now - (8 * 3600);
}
- $start = $_GET['start'];
- } else if ($_GET['start']) {
- $start = strtotime($_GET['start']);
+
+ $start = $_POST['start'];
+ } else if ($_POST['start']) {
+ $start = strtotime($_POST['start']);
+
if ($start === FALSE || $start === -1) {
- $input_errors[] = gettext("Invalid start date/time:") . " '{$_GET['start']}'";
- $start = $now - (8 * 3600);
+ $input_errors[] = gettext("Invalid start date/time:") . " '{$_POST['start']}'";
+
+ $start = $now - (8 * 3600);
}
} else {
$start = $now - (8 * 3600);
@@ -171,8 +188,9 @@ if (is_numeric($_GET['end'])) {
} else if ($_GET['end']) {
$end = strtotime($_GET['end']);
if ($end === FALSE || $end === -1) {
- $input_errors[] = gettext("Invalid end date/time:") . " '{$_GET['end']}'";
- $end = $now;
+ $input_errors[] = gettext("Invalid end date/time:") . " '{$_POST['end']}'";
+
+ $end = $now;
}
} else {
$end = $now;
@@ -189,38 +207,21 @@ $seconds = $end - $start;
$styles = array('inverse' => gettext('Inverse'),
'absolute' => gettext('Absolute'));
-// Set default and override later
-$curstyle = "inverse";
-
-if ($_GET['style']) {
- foreach ($styles as $style) {
- if (strtoupper($style) == strtoupper($_GET['style'])) {
- $curstyle = $_GET['style'];
- }
- }
-} else {
- if (!empty($config['rrd']['style'])) {
- $curstyle = $config['rrd']['style'];
- } else {
- $curstyle = "inverse";
- }
-}
-
/* sort names reverse so WAN comes first */
rsort($databases);
/* these boilerplate databases are required for the other menu choices */
$dbheader = array("allgraphs-traffic.rrd",
- "allgraphs-quality.rrd",
- "allgraphs-wireless.rrd",
- "allgraphs-cellular.rrd",
- "allgraphs-vpnusers.rrd",
- "allgraphs-packets.rrd",
- "system-allgraphs.rrd",
- "system-throughput.rrd",
- "outbound-quality.rrd",
- "outbound-packets.rrd",
- "outbound-traffic.rrd");
+ "allgraphs-quality.rrd",
+ "allgraphs-wireless.rrd",
+ "allgraphs-cellular.rrd",
+ "allgraphs-vpnusers.rrd",
+ "allgraphs-packets.rrd",
+ "system-allgraphs.rrd",
+ "system-throughput.rrd",
+ "outbound-quality.rrd",
+ "outbound-packets.rrd",
+ "outbound-traffic.rrd");
/* additional menu choices for the custom tab */
$dbheader_custom = array("system-throughput.rrd");
@@ -285,34 +286,6 @@ if ($captiveportal && is_array($config['captiveportal'])) {
}
}
-include("head.inc");
-?>
-
-<?php if ($curcat === "custom") { ?>
- <link rel="stylesheet" type="text/css" href="/javascript/jquery-ui-timepicker-addon/css/jquery-ui-timepicker-addon.css" />
- <?php if (file_exists("{$g['www_path']}/themes/{$g['theme']}/jquery-ui-1.11.1.css")) { ?>
- <link rel="stylesheet" type="text/css" href="/themes/<?= $g['theme'] ?>/jquery-ui-1.11.1.css" />
- <?php } else { ?>
- <link rel="stylesheet" type="text/css" href="/javascript/jquery/jquery-ui-1.11.1.css" />
- <?php } ?>
- <script type="text/javascript" src="/javascript/jquery-ui-timepicker-addon/js/jquery-ui-timepicker-addon.js"></script>
- <script type="text/javascript">
- //<![CDATA[
- jQuery(function ($) {
- var options = {
- dateFormat: 'mm/dd/yy',
- timeFormat: 'hh:mm:ss',
- showSecond: true
- };
- $("#startDateTime").datetimepicker(options);
- $("#endDateTime").datetimepicker(options);
- });
- //]]>
- </script>
-<?php } ?>
-
-<?php
-
function get_dates($curperiod, $graph) {
global $graph_length;
$now = time();
@@ -413,290 +386,309 @@ function get_dates($curperiod, $graph) {
return $dates;
}
+function make_tabs() {
+ global $curcat;
+
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), ($curcat == "system"), "status_rrd_graph.php?cat=system");
+ $tab_array[] = array(gettext("Traffic"), ($curcat == "traffic"), "status_rrd_graph.php?cat=traffic");
+ $tab_array[] = array(gettext("Packets"), ($curcat == "packets"), "status_rrd_graph.php?cat=packets");
+ $tab_array[] = array(gettext("Quality"), ($curcat == "quality"), "status_rrd_graph.php?cat=quality");
+
+ if($queues) {
+ $tab_array[] = array(gettext("Queues"), ($curcat == "queues"), "status_rrd_graph.php?cat=queues");
+ $tab_array[] = array(gettext("QueueDrops"), ($curcat == "queuedrops"), "status_rrd_graph.php?cat=queuedrops");
+ }
+
+ if($wireless) {
+ $tab_array[] = array(gettext("Wireless"), ($curcat == "wireless"), "status_rrd_graph.php?cat=wireless");
+ }
+
+ if($cellular) {
+ $tab_array[] = array(gettext("Cellular"), ($curcat == "cellular"), "status_rrd_graph.php?cat=cellular");
+ }
+
+ if($vpnusers) {
+ $tab_array[] = array(gettext("VPN"), ($curcat == "vpnusers"), "status_rrd_graph.php?cat=vpnusers");
+ }
+
+ if($captiveportal) {
+ $tab_array[] = array(gettext("Captive Portal"), ($curcat == "captiveportal"), "status_rrd_graph.php?cat=captiveportal");
+ }
+
+ if(isset($config['ntpd']['statsgraph'])) {
+ $tab_array[] = array("NTP", ($curcat == "ntpd"), "status_rrd_graph.php?cat=ntpd");
+ }
+
+ $tab_array[] = array(gettext("Custom"), ($curcat == "custom"), "status_rrd_graph.php?cat=custom");
+ $tab_array[] = array(gettext("Settings"), ($curcat == "settings"), "status_rrd_graph_settings.php");
+
+ return($tab_array);
+}
+
+// Create the selectable list of graphs
+function build_options() {
+ global $curcat, $custom_databases, $ui_databases;
+
+ $optionslist = array();
+
+ if($curcat == "custom") {
+ foreach ($custom_databases as $db => $database) {
+ $optionc = explode("-", $database);
+ $friendly = convert_friendly_interface_to_friendly_descr(strtolower($optionc[0]));
+ if (empty($friendly)) {
+ $friendly = $optionc[0];
+ }
+
+ $search = array("-", ".rrd", $optionc[0]);
+ $replace = array(" :: ", "", $friendly);
+ $prettyprint = ucwords(str_replace($search, $replace, $database));
+ $optionslist[$database] = htmlspecialchars($prettyprint);
+ }
+ }
+
+ foreach ($ui_databases as $db => $database) {
+ if(! preg_match("/($curcat)/i", $database))
+ continue;
+
+ if (($curcat == "captiveportal") && !empty($curzone) && !preg_match("/captiveportal-{$curzone}/i", $database))
+ continue;
+
+ $optionc = explode("-", $database);
+ $search = array("-", ".rrd", $optionc);
+ $replace = array(" :: ", "", $friendly);
+
+ switch($curcat) {
+ case "captiveportal":
+ $optionc = str_replace($search, $replace, $optionc[2]);
+ $prettyprint = ucwords(str_replace($search, $replace, $optionc));
+ $optionslist[$optionc] = htmlspecialchars($prettyprint);
+ break;
+ case "system":
+ $optionc = str_replace($search, $replace, $optionc[1]);
+ $prettyprint = ucwords(str_replace($search, $replace, $optionc));
+ $optionslist[$optionc] = htmlspecialchars($prettyprint);
+ break;
+ default:
+ /* Deduce an interface if possible and use the description */
+ $optionc = "$optionc[0]";
+ $friendly = convert_friendly_interface_to_friendly_descr(strtolower($optionc));
+ if(empty($friendly)) {
+ $friendly = $optionc;
+ }
+ $search = array("-", ".rrd", $optionc);
+ $replace = array(" :: ", "", $friendly);
+ $prettyprint = ucwords(str_replace($search, $replace, $friendly));
+ $optionslist[$optionc] = htmlspecialchars($prettyprint);
+ }
+ }
+
+ return($optionslist);
+}
+include("head.inc");
+
+display_top_tabs(make_tabs());
+
+if ($input_errors && count($input_errors))
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'submit',
+ 'Go!'
+ ));
+
+$form->addClass('auto-submit');
+
+$section = new Form_Section('Graph settings');
+
+$group = new Form_Group('Options');
+
+$group->add(new Form_Select(
+ 'option',
+ 'Graphs',
+ $curoption,
+ build_options()
+))->setHelp('Graph');
+
+$group->add(new Form_Select(
+ 'style',
+ 'Style',
+ $curstyle,
+ $styles
+))->setHelp('Style');
+
+$group->add(new Form_Select(
+ 'period',
+ 'Period',
+ $curperiod,
+ $periods
+))->setHelp('Period');
+
+if($curcat == 'custom')
+ $group->setHelp('Any changes to these option may not take affect until the next auto-refresh.');
+
+$section->add($group);
+
+if($curcat == 'custom') {
+
+ $section->addInput(new Form_Input(
+ 'cat',
+ null,
+ 'hidden',
+ 'custom'
+ ));
+
+ $tz = date_default_timezone_get();
+ $tz_msg = gettext("Enter date and/or time. Current timezone:") . " $tz";
+ $start_fmt = strftime("%m/%d/%Y %H:%M:%S", $start);
+ $end_fmt = strftime("%m/%d/%Y %H:%M:%S", $end);
+
+ $group = new Form_Group('');
+
+ $group->add(new Form_Input(
+ 'start',
+ 'Start',
+ 'datetime',
+ $start_fmt
+ ))->setHelp('Start');
+
+ $group->add(new Form_Input(
+ 'end',
+ 'End',
+ 'datetime',
+ $end_fmt
+ ))->setHelp('End');
+
+ if($curcat != 'custom')
+ $group->setHelp('Any changes to these option may not take affect until the next auto-refresh');
+
+ $section->add($group);
+
+ $form->add($section);
+ print($form);
+
+ $curdatabase = $curoption;
+ $graph = "custom-$curdatabase";
+ if(in_array($curdatabase, $custom_databases)) {
+ $id = "{$graph}-{$curoption}-{$curdatabase}";
+ $id = preg_replace('/\./', '_', $id);
?>
-</head>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors && count($input_errors)) { print_input_errors($input_errors); } ?>
-<form name="form1" action="status_rrd_graph.php" method="get">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="rrd graphs">
- <tr>
- <td>
- <input type="hidden" name="cat" value="<?php echo "$curcat"; ?>" />
- <?php
- $tab_array = array();
- if ($curcat == "system") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("System"), $tabactive, "status_rrd_graph.php?cat=system");
- if ($curcat == "traffic") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Traffic"), $tabactive, "status_rrd_graph.php?cat=traffic");
- if ($curcat == "packets") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Packets"), $tabactive, "status_rrd_graph.php?cat=packets");
- if ($curcat == "quality") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Quality"), $tabactive, "status_rrd_graph.php?cat=quality");
- if ($queues) {
- if ($curcat == "queues") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Queues"), $tabactive, "status_rrd_graph.php?cat=queues");
- if ($curcat == "queuedrops") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("QueueDrops"), $tabactive, "status_rrd_graph.php?cat=queuedrops");
- }
- if ($wireless) {
- if ($curcat == "wireless") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Wireless"), $tabactive, "status_rrd_graph.php?cat=wireless");
+ <div class="panel panel-default">
+ <img align="center" name="<?=$id?>" id="<?=$id?>" alt="<?=$prettydb?> Graph" src="status_rrd_graph_img.php?start=<?=$start?>&amp;end={<?=$end?>&amp;database=<?=$curdatabase?>&amp;style=<?=$curstyle?>&amp;graph=<?=$graph?>" />
+ </div>
+<?php
+
+ }
+} else {
+ $form->add($section);
+ print($form);
+
+ foreach($graphs as $graph) {
+ /* check which databases are valid for our category */
+ foreach($ui_databases as $curdatabase) {
+ if(! preg_match("/($curcat)/i", $curdatabase))
+ continue;
+
+ if (($curcat == "captiveportal") && !empty($curzone) && !preg_match("/captiveportal-{$curzone}/i", $curdatabase))
+ continue;
+
+ $optionc = explode("-", $curdatabase);
+ $search = array("-", ".rrd", $optionc);
+ $replace = array(" :: ", "", $friendly);
+
+ switch($curoption) {
+ case "outbound":
+ /* make sure we do not show the placeholder databases in the outbound view */
+ if((stristr($curdatabase, "outbound")) || (stristr($curdatabase, "allgraphs"))) {
+ continue 2;
}
- if ($cellular) {
- if ($curcat == "cellular") {
- $tabactive = True;
- } else {
- $tabactive = False;
+ /* only show interfaces with a gateway */
+ $optionc = "$optionc[0]";
+ if(!interface_has_gateway($optionc)) {
+ if(!isset($gateways_arr)) {
+ if(preg_match("/quality/i", $curdatabase))
+ $gateways_arr = return_gateways_array();
+ else
+ $gateways_arr = array();
}
- $tab_array[] = array(gettext("Cellular"), $tabactive, "status_rrd_graph.php?cat=cellular");
- }
- if ($vpnusers) {
- if ($curcat == "vpnusers") {
- $tabactive = True;
- } else {
- $tabactive = False;
+ $found_gateway = false;
+ foreach ($gateways_arr as $gw) {
+ if ($gw['name'] == $optionc) {
+ $found_gateway = true;
+ break;
+ }
}
- $tab_array[] = array("VPN", $tabactive, "status_rrd_graph.php?cat=vpnusers");
- }
- if ($captiveportal) {
- if ($curcat == "captiveportal") {
- $tabactive = True;
- } else {
- $tabactive = False;
+ if(!$found_gateway) {
+ continue 2;
}
- $tab_array[] = array("Captive Portal", $tabactive, "status_rrd_graph.php?cat=captiveportal");
}
- if ($ntpd) {
- if ($curcat == "ntpd") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array("NTP", $tabactive, "status_rrd_graph.php?cat=ntpd");
+
+ if(! preg_match("/(^$optionc-|-$optionc\\.)/i", $curdatabase)) {
+ continue 2;
}
- if ($curcat == "custom") {
- $tabactive = True;
- } else {
- $tabactive = False;
+ break;
+ case "allgraphs":
+ /* make sure we do not show the placeholder databases in the all view */
+ if((stristr($curdatabase, "outbound")) || (stristr($curdatabase, "allgraphs"))) {
+ continue 2;
}
- $tab_array[] = array(gettext("Custom"), $tabactive, "status_rrd_graph.php?cat=custom");
- if ($curcat == "settings") {
- $tabactive = True;
- } else {
- $tabactive = False;
+ break;
+ default:
+ /* just use the name here */
+ if(! preg_match("/(^$curoption-|-$curoption\\.)/i", $curdatabase)) {
+ continue 2;
}
- $tab_array[] = array(gettext("Settings"), $tabactive, "status_rrd_graph_settings.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
-<?php if ($curcat == "captiveportal") : ?>
- <tr>
- <td class="tabnavtbl">
- <?php display_top_tabs($cp_zones_tab_array); ?>
- </td>
- </tr>
-<?php endif; ?>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
- <tr>
- <td colspan="2" class="list"><p><b><?=gettext("Note: Change of color and/or style may not take effect until the next refresh");?></b></p></td>
- </tr>
- <tr>
- <td colspan="2" class="list">
- <?=gettext("Graphs:");?>
- <?php if (!empty($curzone)): ?>
- <input type="hidden" name="zone" value="<?= htmlspecialchars($curzone) ?>" />
- <?php endif; ?>
- <select name="option" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
- <?php
- if ($curcat == "custom") {
- foreach ($custom_databases as $db => $database) {
- $optionc = explode("-", $database);
- $friendly = convert_friendly_interface_to_friendly_descr(strtolower($optionc[0]));
- if (empty($friendly)) {
- $friendly = $optionc[0];
- }
- $search = array("-", ".rrd", $optionc[0]);
- $replace = array(" :: ", "", $friendly);
- echo "<option value=\"{$database}\"";
- $prettyprint = ucwords(str_replace($search, $replace, $database));
- if ($curoption == $database) {
- echo " selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($prettyprint) . "</option>\n";
- }
- }
- foreach ($ui_databases as $db => $database) {
- if (!preg_match("/($curcat)/i", $database)) {
- continue;
- }
-
- if (($curcat == "captiveportal") && !empty($curzone) && !preg_match("/captiveportal-{$curzone}/i", $database)) {
- continue;
- }
-
- $optionc = explode("-", $database);
- $search = array("-", ".rrd", $optionc);
- $replace = array(" :: ", "", $friendly);
-
- switch ($curcat) {
- case "captiveportal":
- $optionc = str_replace($search, $replace, $optionc[2]);
- echo "<option value=\"$optionc\"";
- $prettyprint = ucwords(str_replace($search, $replace, $optionc));
- break;
- case "system":
- $optionc = str_replace($search, $replace, $optionc[1]);
- echo "<option value=\"$optionc\"";
- $prettyprint = ucwords(str_replace($search, $replace, $optionc));
- break;
- default:
- /* Deduce a interface if possible and use the description */
- $optionc = "$optionc[0]";
- $friendly = convert_friendly_interface_to_friendly_descr(strtolower($optionc));
- if (empty($friendly)) {
- $friendly = $optionc;
- }
- $search = array("-", ".rrd", $optionc);
- $replace = array(" :: ", "", $friendly);
- echo "<option value=\"$optionc\"";
- $prettyprint = ucwords(str_replace($search, $replace, $friendly));
- }
- if ($curoption == $optionc) {
- echo " selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($prettyprint) . "</option>\n";
- }
- ?>
- </select>
-
- <?=gettext("Style:");?>
- <select name="style" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
- <?php
- foreach ($styles as $style => $styled) {
- echo "<option value=\"$style\"";
- if ($style == $curstyle) {
- echo " selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($styled) . "</option>\n";
- }
- ?>
- </select>
+ }
-<?php
- if ($curcat == "custom") {
- // Custom tab displays start and end time selectors.
- $tz = date_default_timezone_get();
- $tz_msg = gettext("Enter date and/or time. Current timezone:") . " $tz";
- $start_fmt = strftime("%m/%d/%Y %H:%M:%S", $start);
- $end_fmt = strftime("%m/%d/%Y %H:%M:%S", $end);
-?>
- <?=gettext("Start:");?>
- <input id="startDateTime" title="<?= htmlentities($tz_msg); ?>." type="text" name="start" class="formfld unknown" size="24" value="<?= htmlentities($start_fmt); ?>" />
- <?=gettext("End:");?>
- <input id="endDateTime" title="<?= htmlentities($tz_msg); ?>." type="text" name="end" class="formfld unknown" size="24" value="<?= htmlentities($end_fmt); ?>" />
- <input type="submit" name="Submit" value="<?=gettext("Go"); ?>" />
-<?php
- } else {
- // Not on the custom tab - show the Period selector
+ if(in_array($curdatabase, $ui_databases)) {
+ $id = "{$graph}-{$curoption}-{$curdatabase}";
+ $id = preg_replace('/\./', '_', $id);
+
+ $dates = get_dates($curperiod, $graph);
+ $start = $dates['start'];
+ $end = $dates['end'];
?>
- <?=gettext("Period:");?>
- <select name="period" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
- <?php
- foreach ($periods as $period => $value) {
- echo "<option value=\"$period\"";
- if ($period == $curperiod) {
- echo " selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($value) . "</option>\n";
- }
- ?>
- </select>
+ <div class="panel panel-default" align="center">
+ <img name="<?=$id?>" id="<?=$id?>" alt="<?=$prettydb?> Graph" src="status_rrd_graph_img.php?start=<?=$start?>&amp;end={<?=$end?>&amp;database=<?=$curdatabase?>&amp;style=<?=$curstyle?>&amp;graph=<?=$graph?>" />
+ </div>
<?php
+ }
+ }
}
+}
+
?>
- </td>
- </tr>
-<?php
- if ($curcat == "custom") {
- // Insert the chosen graph
- $curdatabase = $curoption;
- $graph = "custom-$curdatabase";
- if (in_array($curdatabase, $custom_databases)) {
- $id = "{$graph}-{$curoption}-{$curdatabase}";
- $id = preg_replace('/\./', '_', $id);
-
- echo "<tr><td colspan=\"2\" class=\"list\">\n";
- echo "<img border=\"0\" name=\"{$id}\" ";
- echo "id=\"{$id}\" alt=\"$prettydb Graph\" ";
- echo "src=\"status_rrd_graph_img.php?start={$start}&amp;end={$end}&amp;database={$curdatabase}&amp;style={$curstyle}&amp;graph={$graph}\" />\n";
- echo "<br /><hr /><br />\n";
- echo "</td></tr>\n";
- }
- } else {
- // Insert each of the graphs for the various set time periods
- foreach ($graphs as $graph) {
+<script type="text/javascript">
+//<![CDATA[
+ function update_graph_images() {
+ //alert('updating');
+ var randomid = Math.floor(Math.random()*11);
+ <?php
+ foreach($graphs as $graph) {
/* check which databases are valid for our category */
- foreach ($ui_databases as $curdatabase) {
- if (!preg_match("/($curcat)/i", $curdatabase)) {
+ foreach($ui_databases as $curdatabase) {
+ if(! stristr($curdatabase, $curcat)) {
continue;
}
-
- if (($curcat == "captiveportal") && !empty($curzone) && !preg_match("/captiveportal-{$curzone}/i", $curdatabase)) {
- continue;
- }
-
$optionc = explode("-", $curdatabase);
$search = array("-", ".rrd", $optionc);
$replace = array(" :: ", "", $friendly);
- switch ($curoption) {
+ switch($curoption) {
case "outbound":
/* make sure we do not show the placeholder databases in the outbound view */
- if ((stristr($curdatabase, "outbound")) || (stristr($curdatabase, "allgraphs"))) {
+ if((stristr($curdatabase, "outbound")) || (stristr($curdatabase, "allgraphs"))) {
continue 2;
}
/* only show interfaces with a gateway */
$optionc = "$optionc[0]";
- if (!interface_has_gateway($optionc)) {
- if (!isset($gateways_arr)) {
- if (preg_match("/quality/i", $curdatabase)) {
+ if(!interface_has_gateway($optionc)) {
+ if(!isset($gateways_arr))
+ if(preg_match("/quality/i", $curdatabase))
$gateways_arr = return_gateways_array();
- } else {
+ else
$gateways_arr = array();
- }
- }
$found_gateway = false;
foreach ($gateways_arr as $gw) {
if ($gw['name'] == $optionc) {
@@ -704,131 +696,52 @@ function get_dates($curperiod, $graph) {
break;
}
}
- if (!$found_gateway) {
+ if(!$found_gateway) {
continue 2;
}
}
- if (!preg_match("/(^$optionc-|-$optionc\\.)/i", $curdatabase)) {
+ if(! preg_match("/(^$optionc-|-$optionc\\.)/i", $curdatabase)) {
continue 2;
}
break;
case "allgraphs":
/* make sure we do not show the placeholder databases in the all view */
- if ((stristr($curdatabase, "outbound")) || (stristr($curdatabase, "allgraphs"))) {
+ if((stristr($curdatabase, "outbound")) || (stristr($curdatabase, "allgraphs"))) {
continue 2;
}
break;
default:
/* just use the name here */
- if (!preg_match("/(^$curoption-|-$curoption\\.)/i", $curdatabase)) {
+ if(! preg_match("/(^$curoption-|-$curoption\\.)/i", $curdatabase)) {
continue 2;
}
}
- if (in_array($curdatabase, $ui_databases)) {
- $id = "{$graph}-{$curoption}-{$curdatabase}";
- $id = preg_replace('/\./', '_', $id);
-
- $dates = get_dates($curperiod, $graph);
- $start = $dates['start'];
+ $dates = get_dates($curperiod, $graph);
+ $start = $dates['start'];
+ if($curperiod == "current") {
$end = $dates['end'];
- echo "<tr><td colspan=\"2\" class=\"list\">\n";
- echo "<img border=\"0\" name=\"{$id}\" ";
- echo "id=\"{$id}\" alt=\"$prettydb Graph\" ";
- echo "src=\"status_rrd_graph_img.php?start={$start}&amp;end={$end}&amp;database={$curdatabase}&amp;style={$curstyle}&amp;graph={$graph}\" />\n";
- echo "<br /><hr /><br />\n";
- echo "</td></tr>\n";
+ }
+ /* generate update events utilizing jQuery('') feature */
+ $id = "{$graph}-{$curoption}-{$curdatabase}";
+ $id = preg_replace('/\./', '_', $id);
+
+ echo "\n";
+ echo "\t\tjQuery('#{$id}').attr('src','status_rrd_graph_img.php?start={$start}&graph={$graph}&database={$curdatabase}&style={$curstyle}&tmp=' + randomid);\n";
}
}
- }
+ ?>
+ window.setTimeout('update_graph_images()', 355000);
}
-?>
- <tr>
- <td colspan="2" class="list">
- <script type="text/javascript">
- //<![CDATA[
- function update_graph_images() {
- //alert('updating');
- var randomid = Math.floor(Math.random()*11);
- <?php
- foreach ($graphs as $graph) {
- /* check which databases are valid for our category */
- foreach ($ui_databases as $curdatabase) {
- if (!stristr($curdatabase, $curcat)) {
- continue;
- }
- $optionc = explode("-", $curdatabase);
- $search = array("-", ".rrd", $optionc);
- $replace = array(" :: ", "", $friendly);
- switch ($curoption) {
- case "outbound":
- /* make sure we do not show the placeholder databases in the outbound view */
- if ((stristr($curdatabase, "outbound")) || (stristr($curdatabase, "allgraphs"))) {
- continue 2;
- }
- /* only show interfaces with a gateway */
- $optionc = "$optionc[0]";
- if (!interface_has_gateway($optionc)) {
- if (!isset($gateways_arr)) {
- if (preg_match("/quality/i", $curdatabase)) {
- $gateways_arr = return_gateways_array();
- } else {
- $gateways_arr = array();
- }
- }
- $found_gateway = false;
- foreach ($gateways_arr as $gw) {
- if ($gw['name'] == $optionc) {
- $found_gateway = true;
- break;
- }
- }
- if (!$found_gateway) {
- continue 2;
- }
- }
- if (!preg_match("/(^$optionc-|-$optionc\\.)/i", $curdatabase)) {
- continue 2;
- }
- break;
- case "allgraphs":
- /* make sure we do not show the placeholder databases in the all view */
- if ((stristr($curdatabase, "outbound")) || (stristr($curdatabase, "allgraphs"))) {
- continue 2;
- }
- break;
- default:
- /* just use the name here */
- if (!preg_match("/(^$curoption-|-$curoption\\.)/i", $curdatabase)) {
- continue 2;
- }
- }
- $dates = get_dates($curperiod, $graph);
- $start = $dates['start'];
- if ($curperiod == "current") {
- $end = $dates['end'];
- }
- /* generate update events utilizing jQuery('') feature */
- $id = "{$graph}-{$curoption}-{$curdatabase}";
- $id = preg_replace('/\./', '_', $id);
-
- echo "\n";
- echo "\t\tjQuery('#{$id}').attr('src','status_rrd_graph_img.php?start={$start}&graph={$graph}&database={$curdatabase}&style={$curstyle}&tmp=' + randomid);\n";
- }
- }
- ?>
- window.setTimeout('update_graph_images()', 355000);
- }
- window.setTimeout('update_graph_images()', 355000);
- //]]>
- </script>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ window.setTimeout('update_graph_images()', 355000);
+//]]>
+</script>
+
+<script>
+events.push(function(){
+ $('.auto-submit').on('change', function(){
+ $(this).submit();
+ });
+});
+</script>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_rrd_graph_settings.php b/src/usr/local/www/status_rrd_graph_settings.php
index ede9f41..359c548 100644
--- a/src/usr/local/www/status_rrd_graph_settings.php
+++ b/src/usr/local/www/status_rrd_graph_settings.php
@@ -30,7 +30,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /usr/bin/find
- pfSense_MODULE: system
+ pfSense_MODULE: system
*/
##|+PRIV
@@ -77,9 +77,6 @@ if ($_POST['ResetRRD']) {
unset($input_errors);
$pconfig = $_POST;
- /* input validation */
- /* none */
-
if (!$input_errors) {
$config['rrd']['enable'] = $_POST['enable'] ? true : false;
$config['rrd']['category'] = $_POST['category'];
@@ -93,9 +90,11 @@ if ($_POST['ResetRRD']) {
}
}
+$here = getcwd();
$rrddbpath = "/var/db/rrd/";
chdir($rrddbpath);
-$databases = glob("*.rrd");
+$databases = glob('*.rrd');
+chdir($here); // Need to go back home otherwise the 'include/requires fail!
foreach ($databases as $database) {
if (stristr($database, "wireless")) {
@@ -118,199 +117,83 @@ foreach ($databases as $database) {
$pgtitle = array(gettext("Status"), gettext("RRD Graphs"));
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<form action="status_rrd_graph_settings.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="rrd graph settings">
- <tr>
- <td>
- <?php
- $tab_array = array();
- if ($curcat == "system") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("System"), $tabactive, "status_rrd_graph.php?cat=system");
- if ($curcat == "traffic") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Traffic"), $tabactive, "status_rrd_graph.php?cat=traffic");
- if ($curcat == "packets") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Packets"), $tabactive, "status_rrd_graph.php?cat=packets");
- if ($curcat == "quality") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Quality"), $tabactive, "status_rrd_graph.php?cat=quality");
- if ($queues) {
- if ($curcat == "queues") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Queues"), $tabactive, "status_rrd_graph.php?cat=queues");
- if ($curcat == "queuedrops") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("QueueDrops"), $tabactive, "status_rrd_graph.php?cat=queuedrops");
- }
- if ($wireless) {
- if ($curcat == "wireless") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Wireless"), $tabactive, "status_rrd_graph.php?cat=wireless");
- }
- if ($cellular) {
- if ($curcat == "cellular") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Cellular"), $tabactive, "status_rrd_graph.php?cat=cellular");
- }
- if ($vpnusers) {
- if ($curcat == "vpnusers") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("VPN"), $tabactive, "status_rrd_graph.php?cat=vpnusers");
- }
- if ($captiveportal) {
- if ($curcat == "captiveportal") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Captive Portal"), $tabactive, "status_rrd_graph.php?cat=captiveportal");
- }
- if (isset($config['ntpd']['statsgraph'])) {
- if ($curcat == "ntpd") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array("NTP", $tabactive, "status_rrd_graph.php?cat=ntpd");
- }
- if ($curcat == "custom") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Custom"), $tabactive, "status_rrd_graph.php?cat=custom");
- if ($curcat == "settings") {
- $tabactive = True;
- } else {
- $tabactive = False;
- }
- $tab_array[] = array(gettext("Settings"), $tabactive, "status_rrd_graph_settings.php");
-
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="6" summary="main area">
- <tr>
- <td width="22%" valign="top" class="vtable"><?=gettext("RRD Graphs");?></td>
- <td width="78%" class="vtable">
- <input name="enable" type="checkbox" id="enable" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\"" ?> onclick="enable_change(false)" />
- <b><?=gettext("Enables the RRD graphing backend.");?></b>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vtable"><?=gettext("Default category");?></td>
- <td width="78%" class="vtable">
- <select name="category" id="category" class="formselect" style="z-index: -10;" >
- <?php
- foreach ($categories as $category => $categoryd) {
- echo "<option value=\"$category\"";
- if ($category == $pconfig['category']) {
- echo " selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($categoryd) . "</option>\n";
- }
- ?>
- </select>
- <b><?=gettext("This selects default category.");?></b>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vtable"><?=gettext("Default style");?></td>
- <td width="78%" class="vtable">
- <select name="style" class="formselect" style="z-index: -10;" >
- <?php
- foreach ($styles as $style => $styled) {
- echo "<option value=\"$style\"";
- if ($style == $pconfig['style']) {
- echo " selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($styled) . "</option>\n";
- }
- ?>
- </select>
- <b><?=gettext("This selects the default style.");?></b>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vtable"><?=gettext("Default period");?></td>
- <td width="78%" class="vtable">
- <select name="period" class="formselect" style="z-index: -10;" >
- <?php
- foreach ($periods as $period => $periodd) {
- echo "<option value=\"$period\"";
- if ($period == $pconfig['period']) {
- echo " selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($periodd) . "</option>\n";
- }
- ?>
- </select>
- <b><?=gettext("This selects the default period.");?></b>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="ResetRRD" type="submit" class="formbtn" value="<?=gettext("Reset RRD Data");?>" onclick="return confirm('<?=gettext('Do you really want to reset the RRD graphs? This will erase all graph data.');?>')" />
- </td>
- </tr>
- <tr>
- <td width="22%" height="53" valign="top">&nbsp;</td>
- <td width="78%"><strong><span class="red"><?=gettext("Note:");?></span></strong><br />
- <?=gettext("Graphs will not be allowed to be recreated within a 1 minute interval, please " .
- "take this into account after changing the style.");?>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+$tab_array[] = array(gettext("System"), ($curcat == "system"), "status_rrd_graph.php?cat=system");
+$tab_array[] = array(gettext("Traffic"), ($curcat == "traffic"), "status_rrd_graph.php?cat=traffic");
+$tab_array[] = array(gettext("Packets"), ($curcat == "packets"), "status_rrd_graph.php?cat=packets");
+$tab_array[] = array(gettext("Quality"), ($curcat == "quality"), "status_rrd_graph.php?cat=quality");
+
+if($queues) {
+ $tab_array[] = array(gettext("Queues"), ($curcat == "queues"), "status_rrd_graph.php?cat=queues");
+ $tab_array[] = array(gettext("QueueDrops"), ($curcat == "queuedrops"), "status_rrd_graph.php?cat=queuedrops");
+}
+
+if($wireless)
+ $tab_array[] = array(gettext("Wireless"), ($curcat == "wireless"), "status_rrd_graph.php?cat=wireless");
+
+if($cellular)
+ $tab_array[] = array(gettext("Cellular"), ($curcat == "cellular"), "status_rrd_graph.php?cat=cellular");
+
+if($vpnusers)
+ $tab_array[] = array(gettext("VPN"), ($curcat == "vpnusers"), "status_rrd_graph.php?cat=vpnusers");
+
+if($captiveportal)
+ $tab_array[] = array(gettext("Captive Portal"), ($curcat == "captiveportal"), "status_rrd_graph.php?cat=captiveportal");
+
+if(isset($config['ntpd']['statsgraph']))
+ $tab_array[] = array(gettext("NTP"), ($curcat == "ntpd"), "status_rrd_graph.php?cat=ntpd");
+
+$tab_array[] = array(gettext("Custom"), ($curcat == "custom"), "status_rrd_graph.php?cat=custom");
+$tab_array[] = array(gettext("Settings"), ($curcat == "settings"), "status_rrd_graph_settings.php");
+
+display_top_tabs($tab_array);
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg);
+
+require('classes/Form.class.php');
+
+$form = new Form;
+
+$section = new Form_Section('Graph settings');
+
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'RRD Graphs',
+ 'Enable the RRD Graphing backend',
+ $pconfig['enable']
+));
+
+$section->addInput(new Form_Select(
+ 'category',
+ 'Default category',
+ $pconfig['category'],
+ $categories
+));
+
+$section->addInput(new Form_Select(
+ 'style',
+ 'Default style',
+ $pconfig['style'],
+ $styles
+));
+
+$section->addInput(new Form_Select(
+ 'period',
+ 'Default period',
+ $pconfig['period'],
+ $periods
+))->setHelp('Graphs will not be allowed to be recreated within a 1 minute interval, please ' .
+ 'take this into account after changing the style.');
+
+$form->addGlobal(new Form_Button(
+ 'resetRRD',
+ 'Reset RRD Data'
+))->removeClass('btn-primary')->addClass('btn-danger');
+
+$form->add($section);
+print $form;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_services.php b/src/usr/local/www/status_services.php
index ac13b32..3dcf4cf 100755
--- a/src/usr/local/www/status_services.php
+++ b/src/usr/local/www/status_services.php
@@ -59,6 +59,7 @@ if (!empty($service_name)) {
$savemsg = service_control_stop($service_name, $_GET);
break;
}
+
sleep(5);
}
@@ -70,66 +71,81 @@ if ($_GET['batch']) {
$pgtitle = array(gettext("Status"), gettext("Services"));
include("head.inc");
-?>
+if ($savemsg)
+ print_info_box($savemsg, 'success');
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php
-include("fbegin.inc");
+$services = get_services();
+
+if (count($services) > 0) {
?>
<form action="status_services.php" method="post">
-<?php if ($savemsg) print_info_box($savemsg); ?>
-
-<div id="boxarea">
-<table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="status services">
- <thead>
- <tr>
- <td class="listhdrr" align="center"><?=gettext("Service");?></td>
- <td class="listhdrr" align="center"><?=gettext("Description");?></td>
- <td class="listhdrr" align="center"><?=gettext("Status");?></td>
- </tr>
- </thead>
- <tbody>
+ <div class="panel-body panel-default">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Service")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><?=gettext("Status")?></th>
+ <th><?=gettext("Actions")?></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
-$services = get_services();
-
-if (count($services) > 0) {
uasort($services, "service_name_compare");
- foreach ($services as $service) {
- if (empty($service['name'])) {
+
+ foreach($services as $service) {
+ if (empty($service['name']))
continue;
- }
- if (empty($service['description'])) {
+
+ if (empty($service['description']))
$service['description'] = get_pkg_descr($service['name']);
- }
- echo "<tr><td class=\"listlr\" width=\"20%\">" . $service['name'] . "</td>\n";
- echo "<td class=\"listr\" width=\"55%\">" . $service['description'] . "</td>\n";
+?>
+ <tr>
+ <td>
+ <?=$service['name']?>
+ </td>
+
+ <td>
+ <?=$service['description']?>
+ </td>
+<?php
// if service is running then listr else listbg
$bgclass = null;
- if (get_service_status($service)) {
- $bgclass = "listr";
- } else {
- $bgclass = "listbg";
- }
- echo "<td class=\"" . $bgclass . "\" align=\"center\">" . get_service_status_icon($service, true, true) . "</td>\n";
- echo "<td valign=\"middle\" class=\"list nowrap\">" . get_service_control_links($service);
+ $running = false;
+
+ if (get_service_status($service))
+ $running = true;
+?>
+ <td>
+ <?=$running ? '<font color="green">Running</font>':'<font color="red">Stopped</font>'?>
+ </td>
+ <td>
+ <?=get_service_control_links($service)?>
+
+<?php
$scut = get_shortcut_by_service_name($service['name']);
+
if (!empty($scut)) {
echo get_shortcut_main_link($scut, true, $service);
echo get_shortcut_status_link($scut, true, $service);
echo get_shortcut_log_link($scut, true);
}
- echo "</td></tr>\n";
+?>
+ </td>
+ </tr>
+<?php
}
+?>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</form>
+<?php
} else {
- echo "<tr><td colspan=\"3\" align=\"center\">" . gettext("No services found") . " . </td></tr>\n";
+ print_info_box(gettext("No services found"), 'danger');
}
-?>
- </tbody>
-</table>
-</div>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_upnp.php b/src/usr/local/www/status_upnp.php
index 62349df..abf53dc 100644
--- a/src/usr/local/www/status_upnp.php
+++ b/src/usr/local/www/status_upnp.php
@@ -31,7 +31,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /sbin/pfctl
- pfSense_MODULE: upnp
+ pfSense_MODULE: upnp
*/
##|+PRIV
@@ -44,7 +44,7 @@
require("guiconfig.inc");
if ($_POST) {
- if ($_POST['clear'] == "Clear") {
+ if ($_POST['clear']) {
upnp_action('restart');
$savemsg = gettext("Rules have been cleared and the daemon restarted");
}
@@ -53,78 +53,80 @@ if ($_POST) {
$rdr_entries = array();
exec("/sbin/pfctl -aminiupnpd -sn", $rdr_entries, $pf_ret);
-$now = time();
-$year = date("Y");
-
-$pgtitle = array(gettext("Status"), gettext("UPnP &amp; NAT-PMP Status"));
+$pgtitle = array(gettext("Status"),gettext("UPnP &amp; NAT-PMP Status"));
$shortcut_section = "upnp";
+
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php
-if (!$config['installedpackages'] || !$config['installedpackages']['miniupnpd']['config'][0]['iface_array'] ||
- !$config['installedpackages']['miniupnpd']['config'][0]['enable']) {
- echo gettext("UPnP is currently disabled.");
- include("fend.inc");
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if(!$config['installedpackages'] || !$config['installedpackages']['miniupnpd']['config'][0]['iface_array'] ||
+ !$config['installedpackages']['miniupnpd']['config'][0]['enable']) {
+
+ print_info_box('UPnP is currently disabled.', 'danger');
+ include("foot.inc");
exit;
}
+
?>
-<div id="mainlevel">
-<table width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td class="tabcont" >
- <form action="status_upnp.php" method="post">
- <input type="submit" name="clear" id="clear" value="<?=gettext("Clear");?>" /> <?=gettext("all currently connected sessions");?>.
- </form>
- </td>
- </tr>
- <tr>
- <td class="tabcont" >
- <table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont">
+
+<div class="panel-body panel-default">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td width="10%" class="listhdrr"><?=gettext("Port");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Protocol");?></td>
- <td width="20%" class="listhdrr"><?=gettext("Internal IP");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Int. Port");?></td>
- <td width="50%" class="listhdr"><?=gettext("Description");?></td>
- </tr>
+ <th><?=gettext("Port")?></th>
+ <th><?=gettext("Protocol")?></th>
+ <th><?=gettext("Internal IP")?></th>
+ <th><?=gettext("Int. Port")?></th>
+ <th><?=gettext("Description")?></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- foreach ($rdr_entries as $rdr_entry) {
- if (preg_match("/on (.*) inet proto (.*) from any to any port = (.*) keep state label \"(.*)\" rtable [0-9] -> (.*) port (.*)/", $rdr_entry, $matches)) {
- $rdr_proto = $matches[2];
- $rdr_port = $matches[3];
- $rdr_label =$matches[4];
- $rdr_ip = $matches[5];
- $rdr_iport = $matches[6];
+$i = 0;
+
+foreach ($rdr_entries as $rdr_entry) {
+ if (preg_match("/on (.*) inet proto (.*) from any to any port = (.*) keep state label \"(.*)\" rtable [0-9] -> (.*) port (.*)/", $rdr_entry, $matches)) {
+ $rdr_proto = $matches[2];
+ $rdr_port = $matches[3];
+ $rdr_label =$matches[4];
+ $rdr_ip = $matches[5];
+ $rdr_iport = $matches[6];
+
?>
<tr>
- <td class="listlr">
- <?php print $rdr_port;?>
+ <td>
+ <?=$rdr_port?>
</td>
- <td class="listr">
- <?php print $rdr_proto;?>
+ <td>
+ <?=$rdr_proto?>
</td>
- <td class="listr">
- <?php print $rdr_ip;?>
+ <td>
+ <?=$rdr_ip?>
</td>
- <td class="listr">
- <?php print $rdr_iport;?>
+ <td>
+ <?=$rdr_iport?>
</td>
- <td class="listr">
- <?php print $rdr_label;?>
+ <td>
+ <?=$rdr_label?>
</td>
</tr>
<?php
- }
}
+ $i++;
+}
?>
- </table>
- </td>
- </tr>
-</table>
+ </tbody>
+ </table>
+ </div>
+ <form action="status_upnp.php" method="post">
+ <nav class="action-buttons">
+ <input class="btn btn-danger" type="submit" name="clear" id="clear" value="<?=gettext("Clear all sessions")?>" />
+ </nav>
+ </form>
</div>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/status_wireless.php b/src/usr/local/www/status_wireless.php
index be51458..798cc5d 100644
--- a/src/usr/local/www/status_wireless.php
+++ b/src/usr/local/www/status_wireless.php
@@ -27,7 +27,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -41,12 +41,13 @@ require_once("guiconfig.inc");
$pgtitle = array(gettext("Status"), gettext("Wireless"));
$shortcut_section = "wireless";
+
include("head.inc");
$if = $_POST['if'];
-if ($_GET['if'] <> "") {
+
+if($_GET['if'] != "")
$if = $_GET['if'];
-}
$ciflist = get_configured_interface_with_descr();
if (empty($if)) {
@@ -59,56 +60,49 @@ if (empty($if)) {
}
}
}
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php
-include("fbegin.inc");
-?>
-<form action="status_wireless.php" method="post">
-<?php if ($savemsg) print_info_box($savemsg); ?>
+$tab_array = array();
-<table width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr><td>
-<?php
- $tab_array = array();
- foreach ($ciflist as $interface => $ifdescr) {
- if (is_interface_wireless(get_real_interface($interface))) {
- $enabled = false;
- if ($if == $interface) {
- $enabled = true;
- }
- $tab_array[] = array(gettext("Status") . " ({$ifdescr})", $enabled, "status_wireless.php?if={$interface}");
- }
- }
- $rwlif = get_real_interface($if);
- if ($_POST['rescanwifi'] <> "") {
- mwexec_bg("/sbin/ifconfig {$rwlif} scan 2>&1");
- $savemsg = gettext("Rescan has been initiated in the background. Refresh this page in 10 seconds to see the results.");
+foreach($ciflist as $interface => $ifdescr) {
+ if (is_interface_wireless(get_real_interface($interface))) {
+ $enabled = false;
+ if($if == $interface)
+ $enabled = true;
+
+ $tab_array[] = array(gettext("Status") . " ({$ifdescr})", $enabled, "status_wireless.php?if={$interface}");
}
- if ($savemsg) print_info_box($savemsg);
- display_top_tabs($tab_array);
+}
+
+$rwlif = get_real_interface($if);
+
+if($_POST['rescanwifi'] != "") {
+ mwexec_bg("/sbin/ifconfig {$rwlif} scan 2>&1");
+ $savemsg = gettext("Rescan has been initiated in the background. Refresh this page in 10 seconds to see the results.");
+}
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+display_top_tabs($tab_array);
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea" class="tabcont">
- <input type="hidden" name="if" id="if" value="<?php echo htmlspecialchars($if); ?>">
- <b><input type="submit" name="rescanwifi" id="rescanwifi" value="Rescan"></b><br /><br />
- <b><?php echo gettext("Nearby access points or ad-hoc peers"); ?></b>
- <table class="tabcont sortable" colspan="3" cellpadding="3" width="100%">
- <thead>
- <tr bgcolor='#990000'>
- <td><b><font color='#ffffff'>SSID</font></b></td>
- <td><b><font color='#ffffff'>BSSID</font></b></td>
- <td><b><font color='#ffffff'>CHAN</font></b></td>
- <td><b><font color='#ffffff'>RATE</font></b></td>
- <td><b><font color='#ffffff'>RSSI</font></b></td>
- <td><b><font color='#ffffff'>INT</font></b></td>
- <td><b><font color='#ffffff'>CAPS</font></b></td>
- </tr>
- </thead>
- <tbody>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Nearby access points or ad-hoc peers")?></h2></div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>SSID</th>
+ <th>BSSID</th>
+ <th>CHAN</th>
+ <th>RATE</th>
+ <th>RSSI</th>
+ <th>INT</th>
+ <th>CAPS</th>
+ </tr>
+ </thead>
+ <tbody>
<?php
exec("/sbin/ifconfig {$rwlif} list scan 2>&1", $states, $ret);
/* Skip Header */
@@ -128,74 +122,102 @@ include("fbegin.inc");
$rssi = $split[3];
$int = $split[4];
$caps = "$split[5] $split[6] $split[7] $split[8] $split[9] $split[10] $split[11] ";
-
- print "<tr>";
- print "<td>{$ssid}</td>";
- print "<td>{$bssid}</td>";
- print "<td>{$channel}</td>";
- print "<td>{$rate}</td>";
- print "<td>{$rssi}</td>";
- print "<td>{$int}</td>";
- print "<td>{$caps}</td>";
- print "</tr>\n";
- }
?>
- </tbody>
- </table>
- <b><?php echo gettext("Associated or ad-hoc peers"); ?></b><br />
- <table class="tabcont sortable" colspan="3" cellpadding="3" width="100%">
- <thead>
- <tr bgcolor='#990000'>
- <td><b><font color='#ffffff'>ADDR</font></b></td>
- <td><b><font color='#ffffff'>AID</font></b></td>
- <td><b><font color='#ffffff'>CHAN</font></b></td>
- <td><b><font color='#ffffff'>RATE</font></b></td>
- <td><b><font color='#ffffff'>RSSI</font></b></td>
- <td><b><font color='#ffffff'>IDLE</font></b></td>
- <td><b><font color='#ffffff'>TXSEQ</font></b></td>
- <td><b><font color='#ffffff'>RXSEQ</font></b></td>
- <td><b><font color='#ffffff'>CAPS</font></b></td>
- <td><b><font color='#ffffff'>ERP</font></b></td>
- </tr>
- </thead>
- <tbody>
+ <tr>
+ <td>
+ <?=$ssid?>
+ </td>
+ <td>
+ <?=$bssid?>
+ </td>
+ <td>
+ <?=$channel?>
+ </td>
+ <td>
+ <?=$rate?>
+ </td>
+ <td>
+ <?=$rssi?>
+ </td>
+ <td>
+ <?=$int?>
+ </td>
+ <td>
+ <?=$caps?>
+ </td>
+ </tr>
+<?php
+ } // e-o-foreach
+?>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</div>
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Associated or ad-hoc peers")?></h2></div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>ADDR</font></th>
+ <th>AID</font></th>
+ <th>CHAN</font></th>
+ <th>RATE</font></th>
+ <th>RSSI</font></th>
+ <th>IDLE</font></th>
+ <th>TXSEQ</font></th>
+ <th>RXSEQ</font></th>
+ <th>CAPS</font></th>
+ <th>ERP</font></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
$states = array();
exec("/sbin/ifconfig {$rwlif} list sta 2>&1", $states, $ret);
array_shift($states);
- $counter = 0;
- foreach ($states as $state) {
+ $counter=0;
+
+ foreach($states as $state) {
$split = preg_split("/[ ]+/i", $state);
+?>
+ <tr>
+<?php
/* Split the rest by using spaces for this line using the 2nd part */
- print "<tr>";
- print "<td>{$split[0]}</td>";
- print "<td>{$split[1]}</td>";
- print "<td>{$split[2]}</td>";
- print "<td>{$split[3]}</td>";
- print "<td>{$split[4]}</td>";
- print "<td>{$split[5]}</td>";
- print "<td>{$split[6]}</td>";
- print "<td>{$split[7]}</td>";
- print "<td>{$split[8]}</td>";
- print "<td>{$split[9]}</td>";
- print "</tr>\n";
+ for($idx=0; $idx<10; $idx++) {
+?>
+ <td>
+ <?=$split[$idx]?>
+ </td>
+<?php
+ }
+?>
+ </tr>
+<?php
}
+?>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</div>
-/* XXX: what stats to we get for adhoc mode? */
-?>
- </tbody>
- </table>
- </div>
- <br />
- <b>Flags:</b> A = Authorized, E = Extended Rate (802.11g), P = Power save mode, H = High Throughput (HT), Q = QoS (WME)<br />
- <b>Capabilities:</b> WME = Wireless Multimedia Extensions (QoS), WPA = Wi-Fi Protected Access, RSN = 802.11i, HTCAP = 802.11n High Throughput, ATH = Atheros protocol extensions<br />
- </td>
- </tr>
-</table>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<form action="status_wireless.php" method="post">
+ <nav class="action-buttons">
+ <input type="hidden" name="if" id="if" value="<?=htmlspecialchars($if)?>">
+ <input type="submit" class="btn btn-success" name="rescanwifi" id="rescanwifi" value="Rescan">
+ </nav>
+</form>
+
+<?php
+print_info_box('<b>Flags:</b> A = authorized, E = Extended Rate (802.11g), P = Power saving mode<br />' .
+ '<b>Capabilities:</b> E = ESS (infrastructure mode), I = IBSS (ad-hoc mode), P = privacy (WEP/TKIP/AES), ' .
+ 'S = Short preamble, s = Short slot time');
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system.php b/src/usr/local/www/system.php
index b275129..cd028a4 100644
--- a/src/usr/local/www/system.php
+++ b/src/usr/local/www/system.php
@@ -12,11 +12,11 @@
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
+ this list of conditions and the following disclaimer.
2. 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.
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
@@ -31,7 +31,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /bin/kill /usr/bin/tar
- pfSense_MODULE: system
+ pfSense_MODULE: system
*/
##|+PRIV
@@ -181,7 +181,6 @@ if ($_POST) {
if (!$input_errors) {
update_if_changed("hostname", $config['system']['hostname'], $_POST['hostname']);
update_if_changed("domain", $config['system']['domain'], $_POST['domain']);
-
update_if_changed("timezone", $config['system']['timezone'], $_POST['timezone']);
update_if_changed("NTP servers", $config['system']['timeservers'], strtolower($_POST['timeservers']));
update_if_changed("NTP update interval", $config['system']['time-update-interval'], $_POST['timeupdateinterval']);
@@ -303,263 +302,123 @@ if ($_POST) {
$pgtitle = array(gettext("System"), gettext("General Setup"));
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php
- include("fbegin.inc");
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
-?>
- <form action="system.php" method="post">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="general setup">
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("System"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname"); ?></td>
- <td width="78%" class="vtable"> <input name="hostname" type="text" class="formfld unknown" id="hostname" size="40" value="<?=htmlspecialchars($pconfig['hostname']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Name of the firewall host, without domain part"); ?>
- <br />
- <?=gettext("e.g."); ?> <em>firewall</em>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Domain"); ?></td>
- <td width="78%" class="vtable"> <input name="domain" type="text" class="formfld unknown" id="domain" size="40" value="<?=htmlspecialchars($pconfig['domain']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Do not use 'local' as a domain name. It will cause local hosts running mDNS (avahi, bonjour, etc.) to be unable to resolve local hosts not running mDNS."); ?>
- <br />
- <?=gettext("e.g."); ?> <em><?=gettext("mycorp.com, home, office, private, etc."); ?></em>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("DNS servers"); ?></td>
- <td width="78%" class="vtable">
- <br />
- <table summary="dns servers and gateways">
- <tr>
- <td><b><?=gettext("DNS Server"); ?></b></td>
- <?php if ($multiwan): ?>
- <td><b><?=gettext("Use gateway"); ?></b></td>
- <?php endif; ?>
- </tr>
-<?php
- for ($dnscounter = 1; $dnscounter < 5; $dnscounter++):
- $fldname="dns{$dnscounter}gw";
-?>
- <tr>
- <td>
- <input name="dns<?php echo $dnscounter;?>" type="text" class="formfld unknown" id="dns<?php echo $dnscounter;?>" size="28" value="<?php echo $pconfig['dns'.$dnscounter];?>" />
- </td>
- <td>
-<?php
- if ($multiwan):
-?>
- <select name='<?=$fldname;?>'>
-<?php
- $gwname = "none";
- $dnsgw = "dns{$dnscounter}gw";
- if ($pconfig[$dnsgw] == $gwname) {
- $selected = "selected=\"selected\"";
- } else {
- $selected = "";
- }
- echo "<option value='$gwname' $selected>$gwname</option>\n";
- foreach ($arr_gateways as $gwname => $gwitem) {
- //echo $pconfig[$dnsgw];
- if ((is_ipaddrv4(lookup_gateway_ip_by_name($pconfig[$dnsgw])) && (is_ipaddrv6($gwitem['gateway'])))) {
- continue;
- }
- if ((is_ipaddrv6(lookup_gateway_ip_by_name($pconfig[$dnsgw])) && (is_ipaddrv4($gwitem['gateway'])))) {
- continue;
- }
- if ($pconfig[$dnsgw] == $gwname) {
- $selected = "selected=\"selected\"";
- } else {
- $selected = "";
- }
- echo "<option value='$gwname' $selected>$gwname - {$gwitem['friendlyiface']} - {$gwitem['gateway']}</option>\n";
- }
-?>
- </select>
-<?php
- endif;
-?>
- </td>
- </tr>
+<div id="container">
<?php
- endfor;
-?>
- </table>
- <br />
- <span class="vexpl">
- <?=gettext("Enter IP addresses to be used by the system for DNS resolution. " .
- "These are also used for the DHCP service, DNS forwarder and for PPTP VPN clients."); ?>
- <br />
- <?php if ($multiwan): ?>
- <br />
- <?=gettext("In addition, optionally select the gateway for each DNS server. " .
- "When using multiple WAN connections there should be at least one unique DNS server per gateway."); ?>
- <br />
- <?php endif; ?>
- <br />
- <input name="dnsallowoverride" type="checkbox" id="dnsallowoverride" value="yes" <?php if ($pconfig['dnsallowoverride']) echo "checked=\"checked\""; ?> />
- <strong>
- <?=gettext("Allow DNS server list to be overridden by DHCP/PPP on WAN"); ?>
- </strong>
- <br />
- <?php printf(gettext("If this option is set, %s will " .
- "use DNS servers assigned by a DHCP/PPP server on WAN " .
- "for its own purposes (including the DNS forwarder). " .
- "However, they will not be assigned to DHCP and PPTP " .
- "VPN clients."), $g['product_name']); ?>
- <br />
- <br />
- <input name="dnslocalhost" type="checkbox" id="dnslocalhost" value="yes" <?php if ($pconfig['dnslocalhost']) echo "checked=\"checked\""; ?> />
- <strong>
- <?=gettext("Do not use the DNS Forwarder or Resolver as a DNS server for the firewall"); ?>
- </strong>
- <br />
- <?=gettext("By default localhost (127.0.0.1) will be used as the first DNS server where the DNS Forwarder or DNS Resolver is enabled and set to listen on Localhost, so system can use the local DNS service to perform lookups. ".
- "Checking this box omits localhost from the list of DNS servers."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Time zone"); ?></td>
- <td width="78%" class="vtable">
- <select name="timezone" id="timezone">
- <?php foreach ($timezonelist as $value): ?>
- <?php if (strstr($value, "GMT")) continue; ?>
- <option value="<?=htmlspecialchars($value);?>" <?php if ($value == $pconfig['timezone']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($value);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Select the location closest to you"); ?>
- </span>
- </td>
- </tr>
-<!--
- <tr>
- <td width="22%" valign="top" class="vncell">Time update interval</td>
- <td width="78%" class="vtable">
- <input name="timeupdateinterval" type="text" class="formfld unknown" id="timeupdateinterval" size="4" value="<?=htmlspecialchars($pconfig['timeupdateinterval']);?>" />
- <br />
- <span class="vexpl">
- Minutes between network time sync. 300 recommended,
- or 0 to disable
- </span>
- </td>
- </tr>
--->
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("NTP time server"); ?></td>
- <td width="78%" class="vtable">
- <input name="timeservers" type="text" class="formfld unknown" id="timeservers" size="40" value="<?=htmlspecialchars($pconfig['timeservers']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Use a space to separate multiple hosts (only one " .
- "required). Remember to set up at least one DNS server " .
- "if you enter a host name here!"); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?php echo gettext("Language");?></td>
- <td width="78%" class="vtable">
- <select name="language">
- <?php
- foreach (get_locale_list() as $lcode => $ldesc) {
- $selected = ' selected="selected"';
- if ($lcode != $pconfig['language']) {
- $selected = '';
- }
- echo "<option value=\"{$lcode}\"{$selected}>{$ldesc}</option>";
- }
- ?>
- </select>
- <strong>
- <?=gettext("Choose a language for the webConfigurator"); ?>
- </strong>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
-<?php
- if (!$g['disablethemeselection']):
-?>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Theme"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell">&nbsp;</td>
- <td width="78%" class="vtable">
- <select name="theme">
-<?php
- $files = return_dir_as_array("/usr/local/www/themes/");
- foreach ($files as $f):
- if ((substr($f, 0, 1) == "_") && !isset($config['system']['developer'])) {
+
+require('classes/Form.class.php');
+$form = new Form;
+$section = new Form_Section('System');
+$section->addInput(new Form_Input(
+ 'hostname',
+ 'Hostname',
+ 'text',
+ $pconfig['hostname'],
+ ['placeholder' => 'pfSense']
+))->setHelp('Name of the firewall host, without domain part');
+$section->addInput(new Form_Input(
+ 'domain',
+ 'Domain',
+ 'text',
+ $pconfig['domain'],
+ ['placeholder' => 'mycorp.com, home, office, private, etc.']
+))->setHelp('Do not use \'local\' as a domain name. It will cause local '.
+ 'hosts running mDNS (avahi, bonjour, etc.) to be unable to resolve '.
+ 'local hosts not running mDNS.');
+$form->add($section);
+
+$section = new Form_Section('DNS server settings');
+
+for ($i=1; $i<5; $i++)
+{
+ if (!isset($pconfig['dns'.$i]))
+ continue;
+
+ $group = new Form_Group('DNS Server');
+ $group->add(new Form_Input('dns['.$i.']', 'DNS Server', 'text', $pconfig['dns'.$i]));
+ $help = "Enter IP addresses to be used by the system for DNS resolution. " .
+ "These are also used for the DHCP service, DNS forwarder and for PPTP VPN clients.";
+
+ if ($multiwan)
+ {
+ $options = array('none' => 'none');
+
+ foreach($arr_gateways as $gwname => $gwitem)
+ {
+ if((is_ipaddrv4(lookup_gateway_ip_by_name($pconfig[$dnsgw])) && (is_ipaddrv6($gwitem['gateway'])))) {
continue;
}
- if ($f == "CVS") {
+ if((is_ipaddrv6(lookup_gateway_ip_by_name($pconfig[$dnsgw])) && (is_ipaddrv4($gwitem['gateway'])))) {
continue;
}
- $curtheme = "pfsense";
- if ($config['theme']) {
- $curtheme = $config['theme'];
- }
- $selected = "";
- if ($f == $curtheme) {
- $selected = " selected=\"selected\"";
- }
-?>
- <option <?=$selected;?>><?=$f;?></option>
-<?php
- endforeach;
-?>
- </select>
- <strong>
- <?=gettext("This will change the look and feel of"); ?>
- <?=$g['product_name'];?>.
- </strong>
- </td>
- </tr>
-<?php
- endif;
-?>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- </table>
- </form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+ $options[$gwname] = $gwname.' - '.$gwitem['friendlyiface'].' - '.$gwitem['gateway'];
+ }
+
+ $group->add(new Form_Select(
+ 'gateway',
+ 'Gateway',
+ $pconfig['dns'.$i.'gw'],
+ $options
+ ));
+
+ $help .= '<br/>'. "In addition, optionally select the gateway for each DNS server. " .
+ "When using multiple WAN connections there should be at least one unique DNS server per gateway.";
+ }
+
+ $group->setHelp($help);
+ $section->add($group);
+}
+
+$section->addInput(new Form_Checkbox(
+ 'dnsallowoverride',
+ 'DNS server override',
+ 'Allow DNS server list to be overridden by DHCP/PPP on WAN',
+ $pconfig['dnsallowoverride']
+))->setHelp(sprintf(gettext('If this option is set, %s will use DNS servers'.
+ 'assigned by a DHCP/PPP server on WAN for its own purposes (including '.
+ 'the DNS forwarder). However, they will not be assigned to DHCP and PPTP '.
+ 'VPN clients.'), $g['product_name']));
+
+$section->addInput(new Form_Checkbox(
+ 'dnslocalhost',
+ 'Disable DNS forwarder',
+ 'Do not use the DNS Forwarder as a DNS server for the firewall',
+ $pconfig['dnslocalhost']
+))->setHelp('By default localhost (127.0.0.1) will be used as the first DNS'.
+ 'server where the DNS Forwarder or DNS Resolver is enabled and set to '.
+ 'listen on Localhost, so system can use the local DNS service to perform'.
+ 'lookups. Checking this box omits localhost from the list of DNS servers.');
+
+$form->add($section);
+
+$section = new Form_Section('Localization');
+$section->addInput(new Form_Select(
+ 'timezone',
+ 'Timezone',
+ $pconfig['timezone'],
+ array_combine($timezonelist, $timezonelist)
+))->setHelp('Select the location closest to you');
+$section->addInput(new Form_Input(
+ 'timeservers',
+ 'Timeservers',
+ 'text',
+ $pconfig['timeservers']
+))->setHelp('Use a space to separate multiple hosts (only one required). '.
+ 'Remember to set up at least one DNS server if you enter a host name here!');
+$section->addInput(new Form_Select(
+ 'language',
+ 'Language',
+ $pconfig['language'],
+ get_locale_list()
+))->setHelp('Choose a language for the webConfigurator');
+
+$form->add($section);
+
+print $form;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_advanced_admin.php b/src/usr/local/www/system_advanced_admin.php
index a449452..5691034 100644
--- a/src/usr/local/www/system_advanced_admin.php
+++ b/src/usr/local/www/system_advanced_admin.php
@@ -70,8 +70,8 @@ $pconfig['sshdkeyonly'] = isset($config['system']['ssh']['sshdkeyonly']);
$pconfig['quietlogin'] = isset($config['system']['webgui']['quietlogin']);
$a_cert =& $config['cert'];
-
$certs_available = false;
+
if (is_array($a_cert) && count($a_cert)) {
$certs_available = true;
}
@@ -123,7 +123,6 @@ if ($_POST) {
flush();
if (!$input_errors) {
-
if (update_if_changed("webgui protocol", $config['system']['webgui']['protocol'], $_POST['webguiproto'])) {
$restart_webgui = true;
}
@@ -137,14 +136,14 @@ if ($_POST) {
$restart_webgui = true;
}
- if ($_POST['disablehttpredirect'] == "yes") {
+ if ($_POST['webgui-redirect'] == "yes") {
$config['system']['webgui']['disablehttpredirect'] = true;
$restart_webgui = true;
} else {
unset($config['system']['webgui']['disablehttpredirect']);
$restart_webgui = true;
}
- if ($_POST['quietlogin'] == "yes") {
+ if ($_POST['webgui-login-messages'] == "yes") {
$config['system']['webgui']['quietlogin'] = true;
} else {
unset($config['system']['webgui']['quietlogin']);
@@ -286,359 +285,278 @@ if ($_POST) {
$pgtitle = array(gettext("System"), gettext("Advanced: Admin Access"));
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
+print('WebGUIProto = ' . $pconfig['webguiproto']);
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+$tab_array = array();
+$tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
+$tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+$tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+$tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+$tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+$tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+display_top_tabs($tab_array);
+
+?><div id="container"><?php
+
+require('classes/Form.class.php');
+$form = new Form;
+$section = new Form_Section('WebConfigurator');
+$group = new Form_Group('Protocol');
+
+$group->add(new Form_Checkbox(
+ 'webguiproto',
+ 'Protocol',
+ 'HTTP',
+ ($pconfig['webguiproto']=='http'),
+ 'http'
+))->displayAsRadio();
+
+$group->add(new Form_Checkbox(
+ 'webguiproto',
+ 'Protocol',
+ 'HTTPS',
+ ($pconfig['webguiproto']=='https'),
+ 'https'
+))->displayAsRadio();
+
+$group->setHelp($certs_available ? '':'No Certificates have been defined. You must '.
+ '<a href="system_certmanager.php">'. gettext("Create or Import").'</a> '.
+ 'a Certificate before SSL can be enabled.');
+
+$section->add($group);
+
+$values = array();
+foreach($a_cert as $cert)
+ $values[ $cert['refid'] ] = $cert['descr'];
+
+$section->addInput($input = new Form_Select(
+ 'ssl-certref',
+ 'SSL Certificate',
+ $pconfig['ssl-certref'],
+ $values
+));
+
+$section->addInput(new Form_Input(
+ 'tcp-port',
+ 'TCP port',
+ 'number',
+ $config['system']['webgui']['port'],
+ ['min' => 1, 'max' => 65535]
+))->setHelp('Enter a custom port number for the webConfigurator '.
+ 'above if you want to override the default (80 for HTTP, 443 '.
+ 'for HTTPS). Changes will take effect immediately after save.');
+
+$section->addInput(new Form_Input(
+ 'max-processes',
+ 'Max Processes',
+ 'number',
+ $pconfig['max_procs']
+))->setHelp('Enter the number of webConfigurator processes you '.
+ 'want to run. This defaults to 2. Increasing this will allow more '.
+ 'users/browsers to access the GUI concurrently.');
+
+$section->addInput(new Form_Checkbox(
+ 'webgui-redirect',
+ 'WebGUI redirect',
+ 'Disable webConfigurator redirect rule',
+ $pconfig['disablehttpredirect']
+))->setHelp('When this is unchecked, access to the webConfigurator '.
+ 'is always permitted even on port 80, regardless of the listening port configured. '.
+ 'Check this box to disable this automatically added redirect rule.');
+
+$section->addInput(new Form_Checkbox(
+ 'webgui-login-autocomplete',
+ 'WebGUI Login Autocomplete',
+ 'Enable webConfigurator login autocomplete',
+ $pconfig['loginautocomplete']
+))->setHelp('When this is checked, login credentials for the webConfigurator may '.
+ 'be saved by the browser. While convenient, some security standards require this '.
+ 'to be disabled. Check this box to enable autocomplete on the login form so that '.
+ 'browsers will prompt to save credentials (NOTE: Some browsers do not respect '.
+ 'this option).');
+
+$section->addInput(new Form_Checkbox(
+ 'webgui-login-messages',
+ 'WebGUI login messages',
+ 'Disable logging of webConfigurator successful logins',
+ $pconfig['quietlogin']
+))->setHelp('When this is checked, successful logins to the webConfigurator will '.
+ 'not be logged.');
+
+if ($config['interfaces']['lan'])
+ $lockout_interface = "LAN";
+else
+ $lockout_interface = "WAN";
+
+$section->addInput(new Form_Checkbox(
+ 'anti-lockout',
+ 'Anti-lockout',
+ 'Disable webConfigurator anti-lockout rule',
+ $pconfig['noantilockout']
+))->setHelp('When this is '.
+ 'unchecked, access to the webConfigurator on the %s interface is always '.
+ 'permitted, regardless of the user-defined firewall rule set. Check this box to '.
+ 'disable this automatically added rule, so access to the webConfigurator is '.
+ 'controlled by the user-defined firewall rules (ensure you have a firewall rule '.
+ 'in place that allows you in, or you will lock yourself out!)<em>Hint: the &quot;Set interface(s) IP address&quot; '.
+ 'option in the console menu resets this setting as well.</em>', [$lockout_interface]);
+
+$section->addInput(new Form_Checkbox(
+ 'dns-rebind-check',
+ 'DNS Rebind Check',
+ 'Disable DNS Rebinding Checks',
+ $pconfig['nodnsrebindcheck']
+))->setHelp('When this is unchecked, your system is protected against<a '.
+ 'href=\"http://en.wikipedia.org/wiki/DNS_rebinding\">DNS Rebinding attacks</a>. '.
+ 'This blocks private IP responses from your configured DNS servers. Check this '.
+ 'box to disable this protection if it interferes with webConfigurator access or '.
+ 'name resolution in your environment.');
+
+$section->addInput(new Form_Input(
+ 'alternate-hostnames',
+ 'Alternate Hostnames',
+ 'text',
+ htmlspecialchars($pconfig['althostnames'])
+))->setHelp('Alternate Hostnames for DNS Rebinding and HTTP_REFERER Checks. Here '.
+ 'you can specify alternate hostnames by which the router may be queried, to '.
+ 'bypass the DNS Rebinding Attack checks. Separate hostnames with spaces.');
+
+$section->addInput(new Form_Checkbox(
+ 'browser-http_referer-enforcement',
+ 'Browser HTTP_REFERER enforcement',
+ 'Disable HTTP_REFERER enforcement check',
+ $pconfig['nohttpreferercheck']
+))->setHelp('When this is unchecked, access to the webConfigurator is protected '.
+ 'against HTTP_REFERER redirection attempts. Check this box to disable this '.
+ 'protection if you find that it interferes with webConfigurator access in certain '.
+ 'corner cases such as using external scripts to interact with this system. More '.
+ 'information on HTTP_REFERER is available from<a target="_blank" '.
+ 'href="http://en.wikipedia.org/wiki/HTTP_referrer">Wikipedia</a>.');
+
+$section->addInput(new Form_Checkbox(
+ 'browser-tab-text',
+ 'Browser tab text',
+ 'Display page name first in browser tab',
+ $pconfig['pagenamefirst']
+))->setHelp('When this is unchecked, the browser tab shows the host name followed '.
+ 'by the current page. Check this box to display the current page followed by the '.
+ 'host name.');
+
+$form->add($section);
+$section = new Form_Section('Secure Shell');
+
+$section->addInput(new Form_Checkbox(
+ 'secure-shell-server',
+ 'Secure Shell Server',
+ 'Enable Secure Shell',
+ isset($pconfig['enablesshd'])
+));
+
+$section->addInput(new Form_Checkbox(
+ 'authentication-method',
+ 'Authentication Method',
+ 'Disable password login for Secure Shell (RSA/DSA key only)',
+ $pconfig['sshdkeyonly']
+))->setHelp('When enabled, authorized keys need to be configured for each<a '.
+ 'href="system_usermanager.php">user</a>that has been granted secure shell '.
+ 'access.');
+
+$section->addInput(new Form_Input(
+ 'ssh-port',
+ 'SSH port',
+ 'number',
+ $pconfig['sshport'],
+ ['min' => 1, 'max' => 65535, 'placeholder' => 22]
+))->setHelp('Note: Leave this blank for the default of 22.');
+
+
+if (!$g['enableserial_force'] && ($g['platform'] == "pfSense" || $g['platform'] == "cdrom" || file_exists("/etc/nano_use_vga.txt")))
+{
+ $form->add($section);
+ $section = new Form_Section('Serial Communications');
+
+ $section->addInput(new Form_Checkbox(
+ 'serial-terminal',
+ 'Serial Terminal',
+ 'Enables the first serial port with 115200/8/N/1 by default, or another speed selectable below.',
+ isset($pconfig['enableserial'])
+ ))->setHelp('Note: This will redirect the console output and messages to '.
+ 'the serial port. You can still access the console menu from the internal video '.
+ 'card/keyboard. A<b>null modem</b>serial cable or adapter is required to use the '.
+ 'serial console.');
+
+ $section->addInput(new Form_Select(
+ 'serial-speed',
+ 'Serial Speed',
+ $pconfig['serialspeed'],
+ array(115200, 57600, 38400, 19200, 14400, 9600)
+ ))->setHelp('Allows selection of different speeds for the serial console port.');
+
+ $section->addInput(new Form_Select(
+ 'primary-console',
+ 'Primary Console',
+ $pconfig['primaryconsole'],
+ array(
+ 'serial' => 'Serial Console',
+ 'video' => 'VGA Console',
+ )
+ ))->setHelp('Select the preferred console if multiple consoles are present. '.
+ 'The preferred console will show pfSense boot script output. All consoles '.
+ 'display OS boot messages, console messages, and the console menu.');
+}
-function prot_change() {
+$form->add($section);
+$section = new Form_Section('Console Options');
- if (document.iform.https_proto.checked) {
- document.getElementById("ssl_opts").style.display="";
- } else {
- document.getElementById("ssl_opts").style.display="none";
- }
-}
+$section->addInput(new Form_Checkbox(
+ 'console-menu',
+ 'Console menu',
+ 'Password protect the console menu',
+ $pconfig['disableconsolemenu']
+));
+
+$form->add($section);
+print $form;
-//]]>
-</script>
-<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
?>
- <form action="system_advanced_admin.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system advanced admin">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <span class="vexpl">
- <span class="red">
- <strong><?=gettext("NOTE:"); ?>&nbsp;</strong>
- </span>
- <?=gettext("The options on this page are intended for use by advanced users only."); ?>
- <br />
- </span>
- <br />
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("webConfigurator"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Protocol"); ?></td>
- <td width="78%" class="vtable">
- <?php
- if ($pconfig['webguiproto'] == "http") {
- $http_chk = "checked=\"checked\"";
- }
- if ($pconfig['webguiproto'] == "https") {
- $https_chk = "checked=\"checked\"";
- }
- if (!$certs_available) {
- $https_disabled = "disabled=\"disabled\"";
- }
- ?>
- <input name="webguiproto" id="http_proto" type="radio" value="http" <?=$http_chk;?> onclick="prot_change()" />
- <?=gettext("HTTP"); ?>
- &nbsp;&nbsp;&nbsp;
- <input name="webguiproto" id="https_proto" type="radio" value="https" <?=$https_chk;?> <?=$https_disabled;?> onclick="prot_change()" />
- <?=gettext("HTTPS"); ?>
- <?php if (!$certs_available): ?>
- <br />
- <?=gettext("No Certificates have been defined. You must"); ?>
- <a href="system_certmanager.php"><?=gettext("Create or Import"); ?></a>
- <?=gettext("a Certificate before SSL can be enabled."); ?>
- <?php endif; ?>
- </td>
- </tr>
- <tr id="ssl_opts">
- <td width="22%" valign="top" class="vncell"><?=gettext("SSL Certificate"); ?></td>
- <td width="78%" class="vtable">
- <select name="ssl-certref" id="ssl-certref" class="formselect">
- <?php
- foreach ($a_cert as $cert):
- $selected = "";
- if ($pconfig['ssl-certref'] == $cert['refid']) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$cert['refid'];?>" <?=$selected;?>><?=htmlspecialchars($cert['descr']);?></option>
- <?php
- endforeach;
- if (!count($a_cert)) {
- echo "<option></option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("TCP port"); ?></td>
- <td class="vtable">
- <input name="webguiport" type="text" class="formfld unknown" id="webguiport" size="5" value="<?=htmlspecialchars($config['system']['webgui']['port']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Enter a custom port number for the webConfigurator " .
- "above if you want to override the default (80 for HTTP, 443 " .
- "for HTTPS). Changes will take effect immediately after save."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Max Processes"); ?></td>
- <td class="vtable">
- <input name="max_procs" type="text" class="formfld unknown" id="max_procs" size="5" value="<?=htmlspecialchars($pconfig['max_procs']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("Enter the number of webConfigurator processes you " .
- "want to run. This defaults to 2. Increasing this will allow more " .
- "users/browsers to access the GUI concurrently."); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("WebGUI redirect"); ?></td>
- <td width="78%" class="vtable">
- <input name="disablehttpredirect" type="checkbox" id="disablehttpredirect" value="yes" <?php if ($pconfig['disablehttpredirect']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable webConfigurator redirect rule"); ?></strong>
- <br />
- <?php echo gettext("When this is unchecked, access to the webConfigurator " .
- "is always permitted even on port 80, regardless of the listening port configured. " .
- "Check this box to disable this automatically added redirect rule. ");
- ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("WebGUI Login Autocomplete"); ?></td>
- <td width="78%" class="vtable">
- <input name="loginautocomplete" type="checkbox" id="loginautocomplete" value="yes" <?php if ($pconfig['loginautocomplete']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable webConfigurator login autocomplete"); ?></strong>
- <br />
- <?php echo gettext("When this is checked, login credentials for the webConfigurator " .
- "may be saved by the browser. While convenient, some security standards require this to be disabled. " .
- "Check this box to enable autocomplete on the login form so that browsers will prompt to save credentials (NOTE: Some browsers do not respect this option). ");
- ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("WebGUI login messages"); ?></td>
- <td width="78%" class="vtable">
- <input name="quietlogin" type="checkbox" id="quietlogin" value="yes" <?php if ($pconfig['quietlogin']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable logging of webConfigurator successful logins"); ?></strong>
- <br />
- <?php echo gettext("When this is checked, successful logins to the webConfigurator " .
- "will not be logged.");
- ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Anti-lockout"); ?></td>
- <td width="78%" class="vtable">
- <?php
- if ($config['interfaces']['lan']) {
- $lockout_interface = "LAN";
- } else {
- $lockout_interface = "WAN";
- }
- ?>
- <input name="noantilockout" type="checkbox" id="noantilockout" value="yes" <?php if ($pconfig['noantilockout']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable webConfigurator anti-lockout rule"); ?></strong>
- <br />
- <?php printf(gettext("When this is unchecked, access to the webConfigurator " .
- "on the %s interface is always permitted, regardless of the user-defined firewall " .
- "rule set. Check this box to disable this automatically added rule, so access " .
- "to the webConfigurator is controlled by the user-defined firewall rules " .
- "(ensure you have a firewall rule in place that allows you in, or you will " .
- "lock yourself out!)"), $lockout_interface); ?>
- <em> <?=gettext("Hint: the &quot;Set interface(s) IP address&quot; option in the console menu resets this setting as well."); ?> </em>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("DNS Rebind Check"); ?></td>
- <td width="78%" class="vtable">
- <input name="nodnsrebindcheck" type="checkbox" id="nodnsrebindcheck" value="yes" <?php if ($pconfig['nodnsrebindcheck']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable DNS Rebinding Checks"); ?></strong>
- <br />
- <?php echo gettext("When this is unchecked, your system " .
- "is protected against <a href=\"http://en.wikipedia.org/wiki/DNS_rebinding\">DNS Rebinding attacks</a>. " .
- "This blocks private IP responses from your configured DNS servers. Check this box to disable this protection if it interferes with " .
- "webConfigurator access or name resolution in your environment. "); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Alternate Hostnames"); ?></td>
- <td width="78%" class="vtable">
- <input name="althostnames" type="text" class="formfld unknown" id="althostnames" size="75" value="<?=htmlspecialchars($pconfig['althostnames']);?>"/>
- <br />
- <strong><?=gettext("Alternate Hostnames for DNS Rebinding and HTTP_REFERER Checks"); ?></strong>
- <br />
- <?php echo gettext("Here you can specify alternate hostnames by which the router may be queried, to " .
- "bypass the DNS Rebinding Attack checks. Separate hostnames with spaces."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Browser HTTP_REFERER enforcement"); ?></td>
- <td width="78%" class="vtable">
- <input name="nohttpreferercheck" type="checkbox" id="nohttpreferercheck" value="yes" <?php if ($pconfig['nohttpreferercheck']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable HTTP_REFERER enforcement check"); ?></strong>
- <br />
- <?php echo gettext("When this is unchecked, access to the webConfigurator " .
- "is protected against HTTP_REFERER redirection attempts. " .
- "Check this box to disable this protection if you find that it interferes with " .
- "webConfigurator access in certain corner cases such as using external scripts to interact with this system. More information on HTTP_REFERER is available from <a target='_blank' href='http://en.wikipedia.org/wiki/HTTP_referrer'>Wikipedia</a>."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Browser tab text"); ?></td>
- <td width="78%" class="vtable">
- <input name="pagenamefirst" type="checkbox" id="pagenamefirst" value="yes" <?php if ($pconfig['pagenamefirst']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Display page name first in browser tab"); ?></strong>
- <br />
- <?php echo gettext("When this is unchecked, the browser tab shows the host name followed by the current page. "); ?>
- <br />
- <?php echo gettext("Check this box to display the current page followed by the host name."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Secure Shell"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Secure Shell Server"); ?></td>
- <td width="78%" class="vtable">
- <input name="enablesshd" type="checkbox" id="enablesshd" value="yes" <?php if (isset($pconfig['enablesshd'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable Secure Shell"); ?></strong>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Authentication Method"); ?></td>
- <td width="78%" class="vtable">
- <input name="sshdkeyonly" type="checkbox" id="sshdkeyonly" value="yes" <?php if ($pconfig['sshdkeyonly']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable password login for Secure Shell (RSA/DSA key only)"); ?></strong>
- <br />
- <?=gettext("When enabled, authorized keys need to be configured for each"); ?>
- <a href="system_usermanager.php"><?=gettext("user"); ?></a>
- <?=gettext("that has been granted secure shell access."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("SSH port"); ?></td>
- <td width="78%" class="vtable">
- <input name="sshport" type="text" id="sshport" value="<?php echo htmlspecialchars($pconfig['sshport']); ?>" />
- <br />
- <span class="vexpl"><?=gettext("Note: Leave this blank for the default of 22."); ?></span>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Serial Communications"); ?></td>
- </tr>
- <?php if (!$g['enableserial_force'] && ($g['platform'] == "pfSense" || $g['platform'] == "cdrom" || file_exists("/etc/nano_use_vga.txt"))): ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Serial Terminal"); ?></td>
- <td width="78%" class="vtable">
- <input name="enableserial" type="checkbox" id="enableserial" value="yes" <?php if (isset($pconfig['enableserial'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enables the first serial port with 115200/8/N/1 by default, or another speed selectable below."); ?></strong>
- <span class="vexpl"><?=gettext("Note: This will redirect the console output and messages to the serial port. You can still access the console menu from the internal video card/keyboard. A <b>null modem</b> serial cable or adapter is required to use the serial console."); ?></span>
- </td>
- </tr>
- <?php endif; ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Serial Speed")?></td>
- <td width="78%" class="vtable">
- <select name="serialspeed" id="serialspeed" class="formselect">
- <option value="115200" <?php if ($pconfig['serialspeed'] == "115200") echo "selected=\"selected\"";?>>115200</option>
- <option value="57600" <?php if ($pconfig['serialspeed'] == "57600") echo "selected=\"selected\"";?>>57600</option>
- <option value="38400" <?php if ($pconfig['serialspeed'] == "38400") echo "selected=\"selected\"";?>>38400</option>
- <option value="19200" <?php if ($pconfig['serialspeed'] == "19200") echo "selected=\"selected\"";?>>19200</option>
- <option value="14400" <?php if ($pconfig['serialspeed'] == "14400") echo "selected=\"selected\"";?>>14400</option>
- <option value="9600" <?php if ($pconfig['serialspeed'] == "9600") echo "selected=\"selected\"";?>>9600</option>
- </select> bps
- <br /><?=gettext("Allows selection of different speeds for the serial console port."); ?>
- </td>
- </tr>
- <?php if (!$g['primaryconsole_force'] && ($g['platform'] == "pfSense" || $g['platform'] == "cdrom" || file_exists("/etc/nano_use_vga.txt"))): ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Primary Console")?></td>
- <td width="78%" class="vtable">
- <select name="primaryconsole" id="primaryconsole" class="formselect">
- <option value="serial" <?php if ($pconfig['primaryconsole'] == "serial") echo "selected=\"selected\"";?>>Serial Console</option>
- <option value="video" <?php if ($pconfig['primaryconsole'] == "video") echo "selected=\"selected\"";?>>VGA Console</option>
- </select>
- <br /><?=gettext("Select the preferred console if multiple consoles are present. The preferred console will show pfSense boot script output. All consoles display OS boot messages, console messages, and the console menu."); ?>
- </td>
- </tr>
- <?php endif; ?>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Console Options"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Console menu"); ?></td>
- <td width="78%" class="vtable">
- <input name="disableconsolemenu" type="checkbox" id="disableconsolemenu" value="yes" <?php if ($pconfig['disableconsolemenu']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Password protect the console menu"); ?></strong>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%"><input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" /></td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- </table>
- </form>
- <script type="text/javascript">
- //<![CDATA[
- prot_change();
- //]]>
- </script>
-
-<?php include("fend.inc"); ?>
+<script>
+//<![CDATA[
+events.push(function(){
+
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
+
+ // On page load . .
+ hideInput('ssl-certificate', $('input[name=webguiproto]:checked').val() == 'http');
+
+ // On click . .
+ $('[id=webguiproto]').click(function () {
+ hideInput('ssl-certificate', $('input[name=webguiproto]:checked').val() == 'http');
+ });
+});
+//]]>
+</script>
+
<?php
- if ($restart_webgui) {
- echo "<meta http-equiv=\"refresh\" content=\"20;url={$url}\" />";
- }
-?>
-</body>
-</html>
+include("foot.inc");
-<?php
-if ($restart_sshd) {
+if ($restart_webgui)
+ echo "<meta http-equiv=\"refresh\" content=\"20;url={$url}\" />";
+if ($restart_sshd)
+{
killbyname("sshd");
log_error(gettext("secure shell configuration has changed. Stopping sshd."));
@@ -647,11 +565,11 @@ if ($restart_sshd) {
send_event("service restart sshd");
}
}
-if ($restart_webgui) {
+
+if ($restart_webgui)
+{
ob_flush();
flush();
log_error(gettext("webConfigurator configuration has changed. Restarting webConfigurator."));
send_event("service restart webgui");
-}
-
-?>
+} \ No newline at end of file
diff --git a/src/usr/local/www/system_advanced_firewall.php b/src/usr/local/www/system_advanced_firewall.php
index fc6b0ed..a31bfab 100644
--- a/src/usr/local/www/system_advanced_firewall.php
+++ b/src/usr/local/www/system_advanced_firewall.php
@@ -49,10 +49,8 @@ require_once("filter.inc");
require_once("shaper.inc");
$pconfig['disablefilter'] = $config['system']['disablefilter'];
-$pconfig['rfc959workaround'] = $config['system']['rfc959workaround'];
$pconfig['scrubnodf'] = $config['system']['scrubnodf'];
$pconfig['scrubrnid'] = $config['system']['scrubrnid'];
-$pconfig['tcpidletimeout'] = $config['filter']['tcpidletimeout'];
$pconfig['optimization'] = $config['filter']['optimization'];
$pconfig['adaptivestart'] = $config['system']['adaptivestart'];
$pconfig['adaptiveend'] = $config['system']['adaptiveend'];
@@ -99,16 +97,16 @@ if ($_POST) {
if (!empty($_POST['adaptivestart']) && !is_numericint($_POST['adaptivestart'])) {
$input_errors[] = gettext("The Firewall Adaptive Start value must be an integer.");
}
- if (!empty($_POST['adaptiveend']) && !is_numericint($_POST['adaptiveend'])) {
+ if (!empty($_POST['adaptive-end']) && !is_numericint($_POST['adaptive-end'])) {
$input_errors[] = gettext("The Firewall Adaptive End value must be an integer.");
}
- if ($_POST['maximumstates'] && !is_numericint($_POST['maximumstates'])) {
+ if ($_POST['firewall-maximum-states'] && !is_numericint($_POST['firewall-maximum-states'])) {
$input_errors[] = gettext("The Firewall Maximum States value must be an integer.");
}
- if ($_POST['aliasesresolveinterval'] && !is_numericint($_POST['aliasesresolveinterval'])) {
+ if ($_POST['aliases-hostnames-resolve-interval'] && !is_numericint($_POST['aliases-hostnames-resolve-interval'])) {
$input_errors[] = gettext("The Aliases Hostname Resolve Interval value must be an integer.");
}
- if ($_POST['maximumtableentries'] && !is_numericint($_POST['maximumtableentries'])) {
+ if ($_POST['firewall-maximum-table-entries'] && !is_numericint($_POST['firewall-maximum-table-entries'])) {
$input_errors[] = gettext("The Firewall Maximum Table Entries value must be an integer.");
}
if ($_POST['maximumfrags'] && !is_numericint($_POST['maximumfrags'])) {
@@ -326,7 +324,7 @@ if ($_POST) {
unset($config['system']['enablenatreflectionhelper']);
}
- $config['system']['reflectiontimeout'] = $_POST['reflectiontimeout'];
+ $config['system']['reflectiontimeout'] = $_POST['reflection-timeout'];
if ($_POST['bypassstaticroutes'] == "yes") {
$config['filter']['bypassstaticroutes'] = $_POST['bypassstaticroutes'];
@@ -346,8 +344,8 @@ if ($_POST) {
unset($config['system']['tftpinterface']);
}
- if ($_POST['bogonsinterval'] != $config['system']['bogons']['interval']) {
- switch ($_POST['bogonsinterval']) {
+ if ($_POST['update-frequency'] != $config['system']['bogons']['interval']) {
+ switch ($_POST['update-frequency']) {
case 'daily':
install_cron_job("/usr/bin/nice -n20 /etc/rc.update_bogons.sh", true, "1", "3", "*", "*", "*");
break;
@@ -359,7 +357,7 @@ if ($_POST) {
default:
install_cron_job("/usr/bin/nice -n20 /etc/rc.update_bogons.sh", true, "1", "3", "1", "*", "*");
}
- $config['system']['bogons']['interval'] = $_POST['bogonsinterval'];
+ $config['system']['bogons']['interval'] = $_POST['update-frequency'];
}
write_config();
@@ -383,425 +381,334 @@ if ($_POST) {
$pgtitle = array(gettext("System"), gettext("Advanced: Firewall and NAT"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
+$tab_array[] = array(gettext("Firewall / NAT"), true, "system_advanced_firewall.php");
+$tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+$tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+$tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+$tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+display_top_tabs($tab_array);
+
+?><div id="container"><?php
+
+require('classes/Form.class.php');
+$form = new Form;
+$section = new Form_Section('Firewall Advanced');
+
+$section->addInput(new Form_Checkbox(
+ 'ip-do-not-fragment-compatibility',
+ 'IP Do-Not-Fragment compatibility',
+ 'Clear invalid DF bits instead of dropping the packets',
+ isset($config['system']['scrubnodf'])
+))->setHelp('This allows for communications with hosts that generate fragmented '.
+ 'packets with the don"t fragment (DF) bit set. Linux NFS is known to do this. '.
+ 'This will cause the filter to not drop such packets but instead clear the don"t '.
+ 'fragment bit.');
+
+$section->addInput(new Form_Checkbox(
+ 'ip-random-id-generation',
+ 'IP Random id generation',
+ 'Insert a stronger id into IP header of packets passing through the filter.',
+ isset($config['system']['scrubrnid'])
+))->setHelp('Replaces the IP identification field of packets with random values to '.
+ 'compensate for operating systems that use predictable values. This option only '.
+ 'applies to packets that are not fragmented after the optional packet '.
+ 'reassembly.');
+
+$section->addInput($input = new Form_Select(
+ 'firewall-optimization-options',
+ 'Firewall Optimization Options',
+ $config['system']['optimization'],
+ array(
+ 'normal' => 'normal: the default optimization algorithm',
+ 'high-latency' => 'high-latency: used for eg. satellite links. Expires idle connections later than default',
+ 'aggressive' => 'aggressive: expires idle connections quicker. More efficient use of CPU and memory but can drop legitimate idle connections',
+ 'conservative' => 'conservative: tries to avoid dropping any legitimate idle connections at the expense of increased memory usage and CPU utilization.',
+ )
+))->setHelp('Select the type of state table optimization to use');
+
+$section->addInput(new Form_Checkbox(
+ 'disable-firewall',
+ 'Disable Firewall',
+ 'Disable all packet filtering.',
+ isset($config['system']['disablefilter'])
+))->setHelp('Note: This converts %s into a routing only platform!<br/>'.
+ 'Note: This will also turn off NAT! If you only want to disable NAT, '.
+ 'and not firewall rules, visit the <a href="firewall_nat_out.php">Outbound '.
+ 'NAT</a>page.', [$g["product_name"]]);
+
+$section->addInput(new Form_Checkbox(
+ 'disable-firewall-scrub',
+ 'Disable Firewall Scrub',
+ 'Disables the PF scrubbing option which can sometimes interfere with NFS and PPTP traffic.',
+ isset($config['system']['disablescrub'])
+));
+
+$group = new Form_Group('Firewall Adaptive Timeouts');
+
+$group->add(new Form_Input(
+ 'adaptive-start',
+ 'Adaptive start',
+ 'number',
+ $pconfig['adaptivestart'],
+ ['min' => 1]
+))->setHelp('When the number of state entries exceeds this value, adaptive '.
+ 'scaling begins. All timeout values are scaled linearly with factor '.
+ '(adaptive.end - number of states) / (adaptive.end - adaptive.start).');
+
+$group->add(new Form_Input(
+ 'adaptive-end',
+ 'Adaptive end',
+ 'number',
+ $pconfig['adaptiveend'],
+ ['min' => 1]
+))->setHelp('When reaching this number of state entries, all timeout values '.
+ 'become zero, effectively purging all state entries immediately. This '.
+ 'value is used to define the scale factor, it should not actually be '.
+ 'reached (set a lower state limit, see below).');
+
+$group->setHelp('Timeouts for states can be scaled adaptively as the number of '.
+ 'state table entries grows. Leave blank for the default (0)');
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'firewall-maximum-states',
+ 'Firewall Maximum States',
+ 'number',
+ $pconfig['maximumstates'],
+ ['min' => 1, 'placeholder' => pfsense_default_state_size()]
+))->setHelp('Maximum number of connections to hold in the firewall state table.. '.
+ '<br/>Note: Leave this blank for the default. On your system the default '.
+ 'size is: %d', [pfsense_default_state_size()]);
+
+$section->addInput(new Form_Input(
+ 'firewall-maximum-table-entries',
+ 'Firewall Maximum Table Entries',
+ 'text',
+ $pconfig['maximumtableentries'],
+ ['placeholder' => pfsense_default_table_entries_size()]
+))->setHelp('Maximum number of table entries for systems such as aliases, '.
+ 'sshlockout, snort, etc, combined..<br/>Note: Leave this blank for the '.
+ 'default. On your system the default size is: %d',
+ [pfsense_default_table_entries_size()]);
+
+$section->addInput(new Form_Checkbox(
+ 'static-route-filtering',
+ 'Static route filtering',
+ 'Bypass firewall rules for traffic on the same interface',
+ $pconfig['bypassstaticroutes']
+))->setHelp('This option only applies if you have defined one or more static '.
+ 'routes. If it is enabled, traffic that enters and leaves through the same '.
+ 'interface will not be checked by the firewall. This may be desirable in some '.
+ 'situations where multiple subnets are connected to the same interface.');
+
+$section->addInput(new Form_Checkbox(
+ 'disable-auto-added-vpn-rules',
+ 'Disable Auto-added VPN rules',
+ 'Disable all auto-added VPN rules.',
+ isset($config['system']['disablevpnrules'])
+))->setHelp('<span>Note: This disables automatically added rules for IPsec, '.
+ 'PPTP.</span>');
+
+$section->addInput(new Form_Checkbox(
+ 'disable-reply-to',
+ 'Disable reply-to',
+ 'Disable reply-to on WAN rules',
+ $pconfig['disablereplyto']
+))->setHelp('With Multi-WAN you generally want to ensure traffic leaves the same '.
+ 'interface it arrives on, hence reply-to is added automatically by default. When '.
+ 'using bridging, you must disable this behavior if the WAN gateway IP is '.
+ 'different from the gateway IP of the hosts behind the bridged interface.');
+
+$section->addInput(new Form_Checkbox(
+ 'disable-negate-rules',
+ 'Disable Negate rules',
+ 'Disable Negate rule on policy routing rules',
+ $pconfig['disablenegate']
+))->setHelp('With Multi-WAN you generally want to ensure traffic reaches directly '.
+ 'connected networks and VPN networks when using policy routing. You can disable '.
+ 'this for special purposes but it requires manually creating rules for these '.
+ 'networks');
+
+$section->addInput(new Form_Input(
+ 'aliases-hostnames-resolve-interval',
+ 'Aliases Hostnames Resolve Interval',
+ 'text',
+ $pconfig['aliasesresolveinterval'],
+ ['placeholder' => '300']
+))->setHelp('Interval, in seconds, that will be used to resolve hostnames '.
+ 'configured on aliases.. <br/>Note: Leave this blank for the default '.
+ '(300s).');
+
+$section->addInput(new Form_Checkbox(
+ 'check-certificate-of-aliases-urls',
+ 'Check certificate of aliases URLs',
+ 'Verify HTTPS certificates when downloading alias URLs',
+ $pconfig['checkaliasesurlcert']
+))->setHelp('Make sure the certificate is valid for all HTTPS addresses on '.
+ 'aliases. If it\'s not valid or is revoked, do not download it.');
+
+$form->add($section);
+$section = new Form_Section('Bogon Networks');
+
+$section->addInput(new Form_Select(
+ 'update-frequency',
+ 'Update Frequency',
+ empty($pconfig['bogonsinterval']) ? 'monthly' : $pconfig['bogonsinterval'],
+ array(
+ 'monthly' => 'Monthly',
+ 'weekly' => 'Weekly',
+ 'daily' => 'Daily',
+ )
+))->setHelp('The frequency of updating the lists of IP addresses that are '.
+ 'reserved (but not RFC 1918) or not yet assigned by IANA.');
+
+$form->add($section);
+
+if (count($config['interfaces']) > 1)
+{
+ $section = new Form_Section('Network Address Translation');
+
+ if (isset($config['system']['disablenatreflection']))
+ $value = 'disable';
+ elseif (!isset($config['system']['enablenatreflectionpurenat']))
+ $value = 'proxy';
+ else
+ $value = 'purenat';
+
+ $section->addInput(new Form_Select(
+ 'nat-reflection-mode-for-port-forwards',
+ 'NAT Reflection mode for port forwards',
+ $value,
+ array(
+ 'disable' => 'disabled',
+ 'proxy' => 'NAT + proxy',
+ 'purenat' => 'Pure NAT',
+ )
+ ))->setHelp('<ul><li>The pure NAT mode uses a set of NAT rules to direct '.
+ 'packets to the target of the port forward. It has better scalability, '.
+ 'but it must be possible to accurately determine the interface and '.
+ 'gateway IP used for communication with the target at the time the '.
+ 'rules are loaded. There are no inherent limits to the number of ports '.
+ 'other than the limits of the protocols. All protocols available for '.
+ 'port forwards are supported.</li><li>The NAT + proxy mode uses a '.
+ 'helper program to send packets to the target of the port forward. '.
+ 'It is useful in setups where the interface and/or gateway IP used '.
+ 'for communication with the target cannot be accurately determined at '.
+ 'the time the rules are loaded. Reflection rules are not created for '.
+ 'ranges larger than 500 ports and will not be used for more than 1000 '.
+ 'ports total between all port forwards. Only TCP and UDP protocols are '.
+ 'supported.</li></ul>Individual rules may be configured to override '.
+ 'this system setting on a per-rule basis.');
+
+ $section->addInput(new Form_Input(
+ 'reflection-timeout',
+ 'Reflection Timeout',
+ 'number',
+ $config['system']['reflectiontimeout'],
+ ['min' => 1]
+ ))->setHelp('Enter value for Reflection timeout in seconds.<br/>Note: Only '.
+ 'applies to Reflection on port forwards in NAT + proxy mode.');
+
+ $section->addInput(new Form_Checkbox(
+ 'enable-nat-reflection-for-1-1-nat',
+ 'Enable NAT Reflection for 1:1 NAT',
+ 'Automatic creation of additional NAT redirect rules from within your internal networks.',
+ isset($config['system']['enablebinatreflection'])
+ ))->setHelp('Note: Reflection on 1:1 mappings is only for the inbound component of '.
+ 'the 1:1 mappings. This functions the same as the pure NAT mode for port '.
+ 'forwards. For more details, refer to the pure NAT mode description '.
+ 'above. Individual rules may be configured to override this system setting on a '.
+ 'per-rule basis.');
+
+ $section->addInput(new Form_Checkbox(
+ 'enable-automatic-outbound-nat-for-reflection',
+ 'Enable automatic outbound NAT for Reflection',
+ 'Automatic create outbound NAT rules that direct traffic back out to the same subnet it originated from.',
+ isset($config['system']['enablenatreflectionhelper'])
+ ))->setHelp('Required for full functionality of the pure NAT mode of NAT '.
+ 'Reflection for port forwards or NAT Reflection for 1:1 NAT.Note: This only works '.
+ 'for assigned interfaces. Other interfaces require manually creating the '.
+ 'outbound NAT rules that direct the reply packets back through the router.');
+
+ $section->addInput(new Form_Select(
+ 'tftp-proxy',
+ 'TFTP Proxy',
+ $pconfig['tftpinterface'],
+ get_configured_interface_with_descr(),
+ true
+ ))->setHelp('Choose the interfaces where you want TFTP proxy helper to be enabled.');
+
+ $form->add($section);
+}
-<script type="text/javascript">
-//<![CDATA[
+$section = new Form_Section('State Timeouts');
+
+$group = new Form_Group('TCP Timeouts');
+$tcpTimeouts = array('First', 'Opening', 'Established', 'Closing', 'FIN', 'closed');
+foreach ($tcpTimeouts as $name)
+{
+ $group->add(new Form_Input(
+ 'tcp'. strtolower($name) .'timeout',
+ 'TCP '. $name,
+ 'number',
+ $config['system']['tcp'. strtolower($name) .'timeout']
+ ))->setHelp('Enter value for TCP '. $name .' timeout in seconds. Leave blank for '.
+ 'default (recommended).');
+}
-var descs=new Array(5);
-descs[0]="<?=gettext("as the name says, it's the normal optimization algorithm");?>";
-descs[1]="<?=gettext("used for high latency links, such as satellite links. Expires idle connections later than default");?>";
-descs[2]="<?=gettext("expires idle connections quicker. More efficient use of CPU and memory but can drop legitimate idle connections");?>";
-descs[3]="<?=gettext("tries to avoid dropping any legitimate idle connections at the expense of increased memory usage and CPU utilization.");?>";
+$section->add($group);
+
+$group = new Form_Group('UDP Timeouts');
+$udpTimeouts = array('First', 'Single', 'Multiple');
+foreach ($udpTimeouts as $name)
+{
+ $group->add(new Form_Input(
+ 'udp'. strtolower($name) .'timeout',
+ 'UDP '. $name,
+ 'number',
+ $config['system']['udo'. strtolower($name) .'timeout']
+ ))->setHelp('Enter value for UDP '. $name .' timeout in seconds. Leave blank for '.
+ 'default (recommended).');
+}
-function update_description(itemnum) {
- document.forms[0].info.value=descs[itemnum];
+$section->add($group);
+
+$group = new Form_Group('ICMP Timeouts');
+$udpTimeouts = array('First', 'Error');
+foreach ($udpTimeouts as $name)
+{
+ $group->add(new Form_Input(
+ 'icmp'. strtolower($name) .'timeout',
+ 'UDP '. $name,
+ 'number',
+ $config['system']['icmp'. strtolower($name) .'timeout']
+ ))->setHelp('Enter value for ICMP '. $name .' timeout in seconds. Leave blank for '.
+ 'default (recommended).');
+}
+$section->add($group);
+
+$group = new Form_Group('Other Timeouts');
+foreach ($udpTimeouts as $name)
+{
+ $group->add(new Form_Input(
+ 'other'. strtolower($name) .'timeout',
+ 'Other '. $name,
+ 'number',
+ $config['system']['other'. strtolower($name) .'timeout']
+ ))->setHelp('Enter value for ICMP '. $name .' timeout in seconds. Leave blank for '.
+ 'default (recommended).');
}
-//]]>
-</script>
+$section->add($group);
-<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
-?>
- <form action="system_advanced_firewall.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system advanced firewall/nat">
- <tr>
- <td class="tabnavtbl">
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), true, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <span class="vexpl">
- <span class="red">
- <strong><?=gettext("NOTE:");?>&nbsp;</strong>
- </span>
- <?=gettext("The options on this page are intended for use by advanced users only.");?>
- <br />
- </span>
- <br />
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Firewall Advanced");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IP Do-Not-Fragment compatibility");?></td>
- <td width="78%" class="vtable">
- <input name="scrubnodf" type="checkbox" id="scrubnodf" value="yes" <?php if (isset($config['system']['scrubnodf'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Clear invalid DF bits instead of dropping the packets");?></strong><br />
- <?=gettext("This allows for communications with hosts that generate fragmented " .
- "packets with the don't fragment (DF) bit set. Linux NFS is known to " .
- "do this. This will cause the filter to not drop such packets but " .
- "instead clear the don't fragment bit.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IP Random id generation");?></td>
- <td width="78%" class="vtable">
- <input name="scrubrnid" type="checkbox" id="scrubrnid" value="yes" <?php if (isset($config['system']['scrubrnid'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Insert a stronger id into IP header of packets passing through the filter.");?></strong><br />
- <?=gettext("Replaces the IP identification field of packets with random values to " .
- "compensate for operating systems that use predictable values. " .
- "This option only applies to packets that are not fragmented after the " .
- "optional packet reassembly.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Firewall Optimization Options");?></td>
- <td width="78%" class="vtable">
- <select onchange="update_description(this.selectedIndex);" name="optimization" id="optimization">
- <option value="normal"<?php if ($config['system']['optimization'] == "normal") echo " selected=\"selected\""; ?>><?=gettext("normal");?></option>
- <option value="high-latency"<?php if ($config['system']['optimization'] == "high-latency") echo " selected=\"selected\""; ?>><?=gettext("high-latency");?></option>
- <option value="aggressive"<?php if ($config['system']['optimization'] == "aggressive") echo " selected=\"selected\""; ?>><?=gettext("aggressive");?></option>
- <option value="conservative"<?php if ($config['system']['optimization'] == "conservative") echo " selected=\"selected\""; ?>><?=gettext("conservative");?></option>
- </select>
- <br />
- <textarea readonly="readonly" cols="60" rows="2" id="info" name="info" style="padding:5px; border:1px dashed #990000; background-color: #ffffff; color: #000000; font-size: 8pt;"></textarea>
- <script type="text/javascript">
- //<![CDATA[
- update_description(document.forms[0].optimization.selectedIndex);
- //]]>
- </script>
- <br />
- <?=gettext("Select the type of state table optimization to use");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Disable Firewall");?></td>
- <td width="78%" class="vtable">
- <input name="disablefilter" type="checkbox" id="disablefilter" value="yes" <?php if (isset($config['system']['disablefilter'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable all packet filtering.");?></strong>
- <br />
- <span class="vexpl"><?php printf(gettext("Note: This converts %s into a routing only platform!"), $g['product_name']);?><br />
- <?=gettext("Note: This will also turn off NAT!");?>
- <br /><?=gettext("If you only want to disable NAT, and not firewall rules, visit the");?> <a href="firewall_nat_out.php"><?=gettext("Outbound NAT");?></a> <?=gettext("page");?>.
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Disable Firewall Scrub");?></td>
- <td width="78%" class="vtable">
- <input name="disablescrub" type="checkbox" id="disablescrub" value="yes" <?php if (isset($config['system']['disablescrub'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disables the PF scrubbing option which can sometimes interfere with NFS and PPTP traffic.");?></strong>
- <br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Firewall Adaptive Timeouts");?></td>
- <td width="78%" class="vtable">
- <strong><?=gettext("Timeouts for states can be scaled adaptively as the number of state table entries grows.");?></strong>
- <br />
- <input name="adaptivestart" type="text" id="adaptivestart" value="<?php echo htmlspecialchars($pconfig['adaptivestart']); ?>" />
- <br /><?=gettext("When the number of state entries exceeds this value, adaptive scaling begins. All timeout values are scaled linearly with factor (adaptive.end - number of states) / (adaptive.end - adaptive.start).");?>
-
- <br />
- <input name="adaptiveend" type="text" id="adaptiveend" value="<?php echo htmlspecialchars($pconfig['adaptiveend']); ?>" />
- <br /><?=gettext("When reaching this number of state entries, all timeout values become zero, effectively purging all state entries immediately. This value is used to define the scale factor, it should not actually be reached (set a lower state limit, see below).");?>
- <br />
- <span class="vexpl"><?=gettext("Note: Leave this blank for the default, which auto-calculates these values from your maximum state table size. Adaptive start is 60% and end is 120% of the state table size by default.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Firewall Maximum States");?></td>
- <td width="78%" class="vtable">
- <input name="maximumstates" type="text" id="maximumstates" value="<?php echo htmlspecialchars($pconfig['maximumstates']); ?>" />
- <br />
- <strong><?=gettext("Maximum number of connections to hold in the firewall state table.");?></strong>
- <br />
- <span class="vexpl"><?=gettext("Note: Leave this blank for the default. On your system the default size is:");?> <?= pfsense_default_state_size() ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Firewall Maximum Table Entries");?></td>
- <td width="78%" class="vtable">
- <input name="maximumtableentries" type="text" id="maximumtableentries" value="<?php echo htmlspecialchars($pconfig['maximumtableentries']); ?>" />
- <br />
- <strong><?=gettext("Maximum number of table entries for systems such as aliases, sshlockout, snort, etc, combined.");?></strong>
- <br />
- <span class="vexpl">
- <?=gettext("Note: Leave this blank for the default.");?>
- <?php if (empty($pconfig['maximumtableentries'])): ?>
- <?= gettext("On your system the default size is:");?> <?= pfsense_default_table_entries_size(); ?>
- <?php endif; ?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Firewall Maximum Fragment Entries");?></td>
- <td width="78%" class="vtable">
- <input name="maximumfrags" type="text" id="maximumfrags" value="<?php echo htmlspecialchars($pconfig['maximumfrags']); ?>" />
- <br />
- <strong><?=gettext("Maximum number of packet fragments to hold for reassembly by scrub rules.");?></strong>
- <br />
- <span class="vexpl">
- <?=gettext("Note: Leave this blank for the default (5000).");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Static route filtering");?></td>
- <td width="78%" class="vtable">
- <input name="bypassstaticroutes" type="checkbox" id="bypassstaticroutes" value="yes" <?php if ($pconfig['bypassstaticroutes']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Bypass firewall rules for traffic on the same interface");?></strong>
- <br />
- <?=gettext("This option only applies if you have defined one or more static routes. If it is enabled, traffic that enters and " .
- "leaves through the same interface will not be checked by the firewall. This may be desirable in some situations where " .
- "multiple subnets are connected to the same interface.");?>
- <br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell">Disable Auto-added VPN rules</td>
- <td width="78%" class="vtable">
- <input name="disablevpnrules" type="checkbox" id="disablevpnrules" value="yes" <?php if (isset($config['system']['disablevpnrules'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable all auto-added VPN rules.");?></strong>
- <br />
- <span class="vexpl">
- <?=gettext("Note: This disables automatically added rules for IPsec, PPTP.");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell">Disable reply-to</td>
- <td width="78%" class="vtable">
- <input name="disablereplyto" type="checkbox" id="disablereplyto" value="yes" <?php if ($pconfig['disablereplyto']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable reply-to on WAN rules");?></strong>
- <br />
- <?=gettext("With Multi-WAN you generally want to ensure traffic leaves the same interface it arrives on, hence reply-to is added automatically by default. " .
- "When using bridging, you must disable this behavior if the WAN gateway IP is different from the gateway IP of the hosts behind the bridged interface.");?>
- <br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell">Disable Negate rules</td>
- <td width="78%" class="vtable">
- <input name="disablenegate" type="checkbox" id="disablenegate" value="yes" <?php if ($pconfig['disablenegate']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable Negate rule on policy routing rules");?></strong>
- <br />
- <?=gettext("With Multi-WAN you generally want to ensure traffic reaches directly connected networks and VPN networks when using policy routing. You can disable this for special purposes but it requires manually creating rules for these networks");?>
- <br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Aliases Hostnames Resolve Interval");?></td>
- <td width="78%" class="vtable">
- <input name="aliasesresolveinterval" type="text" id="aliasesresolveinterval" value="<?php echo htmlspecialchars($pconfig['aliasesresolveinterval']); ?>" />
- <br />
- <strong><?=gettext("Interval, in seconds, that will be used to resolve hostnames configured on aliases.");?></strong>
- <br />
- <span class="vexpl"><?=gettext("Note: Leave this blank for the default (300s).");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Check certificate of aliases URLs");?></td>
- <td width="78%" class="vtable">
- <input name="checkaliasesurlcert" type="checkbox" id="checkaliasesurlcert" value="yes" <?php if ($pconfig['checkaliasesurlcert']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Verify HTTPS certificates when downloading alias URLs");?></strong>
- <br />
- <?=gettext("Make sure the certificate is valid for all HTTPS addresses on aliases. If it's not valid or is revoked, do not download it.");?>
- <br />
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Bogon Networks");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Update Frequency");?></td>
- <td width="78%" class="vtable">
- <select name="bogonsinterval" class="formselect">
- <option value="monthly" <?php if (empty($pconfig['bogonsinterval']) || $pconfig['bogonsinterval'] == 'monthly') echo "selected=\"selected\""; ?>><?=gettext("Monthly"); ?></option>
- <option value="weekly" <?php if ($pconfig['bogonsinterval'] == 'weekly') echo "selected=\"selected\""; ?>><?=gettext("Weekly"); ?></option>
- <option value="daily" <?php if ($pconfig['bogonsinterval'] == 'daily') echo "selected=\"selected\""; ?>><?=gettext("Daily"); ?></option>
- </select>
- <br />
- <?=gettext("The frequency of updating the lists of IP addresses that are reserved (but not RFC 1918) or not yet assigned by IANA.");?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
-<?php
- if (count($config['interfaces']) > 1):
-?>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Network Address Translation");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("NAT Reflection mode for port forwards");?></td>
- <td width="78%" class="vtable">
- <select name="natreflection" class="formselect">
- <option value="disable" <?php if (isset($config['system']['disablenatreflection'])) echo "selected=\"selected\""; ?>><?=gettext("Disable"); ?></option>
- <option value="proxy" <?php if (!isset($config['system']['disablenatreflection']) && !isset($config['system']['enablenatreflectionpurenat'])) echo "selected=\"selected\""; ?>><?=gettext("Enable (NAT + Proxy)"); ?></option>
- <option value="purenat" <?php if (!isset($config['system']['disablenatreflection']) && isset($config['system']['enablenatreflectionpurenat'])) echo "selected=\"selected\""; ?>><?=gettext("Enable (Pure NAT)"); ?></option>
- </select>
- <br />
- <strong><?=gettext("When enabled, this automatically creates additional NAT redirect rules for access to port forwards on your external IP addresses from within your internal networks.");?></strong>
- <br /><br />
- <?=gettext("The NAT + proxy mode uses a helper program to send packets to the target of the port forward. It is useful in setups where the interface and/or gateway IP used for communication with the target cannot be accurately determined at the time the rules are loaded. Reflection rules are not created for ranges larger than 500 ports and will not be used for more than 1000 ports total between all port forwards. Only TCP and UDP protocols are supported.");?>
- <br /><br />
- <?=gettext("The pure NAT mode uses a set of NAT rules to direct packets to the target of the port forward. It has better scalability, but it must be possible to accurately determine the interface and gateway IP used for communication with the target at the time the rules are loaded. There are no inherent limits to the number of ports other than the limits of the protocols. All protocols available for port forwards are supported.");?>
- <br /><br />
- <?=gettext("Individual rules may be configured to override this system setting on a per-rule basis.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Reflection Timeout");?></td>
- <td width="78%" class="vtable">
- <input name="reflectiontimeout" id="reflectiontimeout" value="<?php echo $config['system']['reflectiontimeout']; ?>" /><br />
- <strong><?=gettext("Enter value for Reflection timeout in seconds.");?></strong>
- <br /><br />
- <?=gettext("Note: Only applies to Reflection on port forwards in NAT + proxy mode.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Enable NAT Reflection for 1:1 NAT");?></td>
- <td width="78%" class="vtable">
- <input name="enablebinatreflection" type="checkbox" id="enablebinatreflection" value="yes" <?php if (isset($config['system']['enablebinatreflection'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enables the automatic creation of additional NAT redirect rules for access to 1:1 mappings of your external IP addresses from within your internal networks.");?></strong>
- <br /><br />
- <?=gettext("Note: Reflection on 1:1 mappings is only for the inbound component of the 1:1 mappings. This functions the same as the pure NAT mode for port forwards. For more details, refer to the pure NAT mode description above.");?>
- <br /><br />
- <?=gettext("Individual rules may be configured to override this system setting on a per-rule basis.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Enable automatic outbound NAT for Reflection");?></td>
- <td width="78%" class="vtable">
- <input name="enablenatreflectionhelper" type="checkbox" id="enablenatreflectionhelper" value="yes" <?php if (isset($config['system']['enablenatreflectionhelper'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Automatically create outbound NAT rules which assist inbound NAT rules that direct traffic back out to the same subnet it originated from.");?></strong>
- <br />
- <?=gettext("Required for full functionality of the pure NAT mode of NAT Reflection for port forwards or NAT Reflection for 1:1 NAT.");?>
- <br /><br />
- <?=gettext("Note: This only works for assigned interfaces. Other interfaces require manually creating the outbound NAT rules that direct the reply packets back through the router.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("TFTP Proxy");?></td>
- <td width="78%" class="vtable">
- <select name="tftpinterface[]" multiple="multiple" class="formselect" size="3">
-<?php
- $ifdescs = get_configured_interface_with_descr();
- $rowIndex = 0;
- foreach ($ifdescs as $ifent => $ifdesc):
- $rowIndex++;
-?>
- <option value="<?=$ifent;?>" <?php if (in_array($ifent, $pconfig['tftpinterface'])) echo "selected=\"selected\""; ?>><?=gettext($ifdesc);?></option>
-<?php endforeach;
- if ($rowIndex == 0) {
- echo "<option></option>";
- }
- ?>
- </select>
- <br/><strong><?=gettext("Choose the interfaces where you want TFTP proxy helper to be enabled.");?></strong>
- </td>
- </tr>
-<?php
- endif;
-?>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("State Timeouts");?></td>
- </tr>
- <tr>
- <td colspan="2">
- <strong><?=gettext("NOTE: The options below should usually be left at their defaults, as chosen by Firewall Optimization Options above. Click the Help link on this page for information.");?>&nbsp;</strong>
- </td>
- <br />
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("TCP Timeouts");?></td>
- <td width="78%" class="vtable">
- <strong><?=gettext("TCP First: ");?></strong><input name="tcpfirsttimeout" id="tcpfirsttimeout" value="<?php echo $config['system']['tcpfirsttimeout']; ?>" /> <br/>
- <?=gettext("Enter value for TCP first timeout in seconds. Leave blank for default (recommended).");?>
- <br/><br/>
- <strong><?=gettext("TCP Opening: ");?></strong><input name="tcpopeningtimeout" id="tcpopeningtimeout" value="<?php echo $config['system']['tcpopeningtimeout']; ?>" /><br />
- <?=gettext("Enter value for TCP opening timeout in seconds. Leave blank for default (recommended).");?>
- <br/><br/>
- <strong><?=gettext("TCP Established: ");?></strong><input name="tcpestablishedtimeout" id="tcpestablishedtimeout" value="<?php echo $config['system']['tcpestablishedtimeout']; ?>" /><br />
- <?=gettext("Enter value for TCP established timeout in seconds. Leave blank for default (recommended).");?>
- <br/><br/>
- <strong><?=gettext("TCP Closing: ");?></strong><input name="tcpclosingtimeout" id="tcpclosingtimeout" value="<?php echo $config['system']['tcpclosingtimeout']; ?>" /><br />
- <?=gettext("Enter value for TCP closing timeout in seconds. Leave blank for default (recommended).");?>
- <br/><br/>
- <strong><?=gettext("TCP FIN Wait: ");?></strong><input name="tcpfinwaittimeout" id="tcpfinwaittimeout" value="<?php echo $config['system']['tcpfinwaittimeout']; ?>" /><br />
- <?=gettext("Enter value for TCP FIN wait timeout in seconds. Leave blank for default (recommended).");?>
- <br/><br/>
- <strong><?=gettext("TCP Closed: ");?></strong><input name="tcpclosedtimeout" id="tcpclosedtimeout" value="<?php echo $config['system']['tcpclosedtimeout']; ?>" /><br />
- <?=gettext("Enter value for TCP closed timeout in seconds. Leave blank for default (recommended).");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("UDP Timeouts");?></td>
- <td width="78%" class="vtable">
- <strong><?=gettext("UDP First: ");?></strong><input name="udpfirsttimeout" id="udpfirsttimeout" value="<?php echo $config['system']['udpfirsttimeout']; ?>" /><br />
- <?=gettext("Enter value for UDP first timeout in seconds. Leave blank for default (recommended).");?>
- <br /><br />
- <strong><?=gettext("UDP Single: ");?></strong><input name="udpsingletimeout" id="udpsingletimeout" value="<?php echo $config['system']['udpsingletimeout']; ?>" /><br />
- <?=gettext("Enter value for UDP single timeout in seconds. Leave blank for default (recommended).");?>
- <br /><br />
- <strong><?=gettext("UDP Multiple: ");?></strong><input name="udpmultipletimeout" id="udpmultipletimeout" value="<?php echo $config['system']['udpmultipletimeout']; ?>" /><br />
- <?=gettext("Enter value for UDP multiple timeout in seconds. Leave blank for default (recommended).");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("ICMP Timeouts");?></td>
- <td width="78%" class="vtable">
- <strong><?=gettext("ICMP First: ");?></strong><input name="icmpfirsttimeout" id="icmpfirsttimeout" value="<?php echo $config['system']['icmpfirsttimeout']; ?>" /><br />
- <?=gettext("Enter value for ICMP first timeout in seconds. Leave blank for default (recommended).");?>
- <br /><br />
- <strong><?=gettext("ICMP Error: ");?></strong><input name="icmperrortimeout" id="icmperrortimeout" value="<?php echo $config['system']['icmperrortimeout']; ?>" /><br />
- <?=gettext("Enter value for ICMP error timeout in seconds. Leave blank for default (recommended).");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Other Timeouts");?></td>
- <td width="78%" class="vtable">
- <strong><?=gettext("Other First: ");?></strong><input name="otherfirsttimeout" id="otherfirsttimeout" value="<?php echo $config['system']['otherfirsttimeout']; ?>" /><br />
- <?=gettext("Enter value for Other first timeout in seconds. Leave blank for default (recommended).");?>
- <br /><br />
- <strong><?=gettext("Other Single: ");?></strong><input name="othersingletimeout" id="othersingletimeout" value="<?php echo $config['system']['othersingletimeout']; ?>" /><br />
- <?=gettext("Enter value for Other single timeout in seconds. Leave blank for default (recommended).");?>
- <br /><br />
- <strong><?=gettext("Other Multiple: ");?></strong><input name="othermultipletimeout" id="othermultipletimeout" value="<?php echo $config['system']['othermultipletimeout']; ?>" /><br />
- <?=gettext("Enter value for Other multiple timeout in seconds. Leave blank for default (recommended).");?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%"><input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" /></td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- </table>
- </form>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+print $form;
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_advanced_misc.php b/src/usr/local/www/system_advanced_misc.php
index 72f4833..17676a8 100644
--- a/src/usr/local/www/system_advanced_misc.php
+++ b/src/usr/local/www/system_advanced_misc.php
@@ -169,8 +169,8 @@ if ($_POST) {
$config['system']['lb_use_sticky'] = true;
$need_relayd_restart = true;
}
- if ($config['system']['srctrack'] != $_POST['srctrack']) {
- $config['system']['srctrack'] = $_POST['srctrack'];
+ if ($config['system']['srctrack'] != $_POST['source-tracking-timeout']) {
+ $config['system']['srctrack'] = $_POST['source-tracking-timeout'];
$need_relayd_restart = true;
}
} else {
@@ -204,9 +204,9 @@ if ($_POST) {
unset($config['system']['powerd_enable']);
}
- $config['system']['powerd_ac_mode'] = $_POST['powerd_ac_mode'];
- $config['system']['powerd_battery_mode'] = $_POST['powerd_battery_mode'];
- $config['system']['powerd_normal_mode'] = $_POST['powerd_normal_mode'];
+ $config['system']['powerd_ac_mode'] = $_POST['ac-power'];
+ $config['system']['powerd_battery_mode'] = $_POST['battery-power'];
+ $config['system']['powerd_normal_mode'] = $_POST['unknown-power'];
if ($_POST['crypto_hardware']) {
$config['system']['crypto_hardware'] = $_POST['crypto_hardware'];
@@ -257,15 +257,15 @@ if ($_POST) {
unset($config['system']['use_mfs_tmpvar']);
}
- $config['system']['use_mfs_tmp_size'] = $_POST['use_mfs_tmp_size'];
- $config['system']['use_mfs_var_size'] = $_POST['use_mfs_var_size'];
+ $config['system']['use_mfs_tmp_size'] = $_POST['-tmp-ram-disk-size'];
+ $config['system']['use_mfs_var_size'] = $_POST['-var-ram-disk-size'];
- if (isset($_POST['rrdbackup'])) {
- $config['system']['rrdbackup'] = $_POST['rrdbackup'];
+ if (isset($_POST['periodic-rrd-backup'])) {
+ $config['system']['rrdbackup'] = $_POST['periodic-rrd-backup'];
install_cron_job("/etc/rc.backup_rrd.sh", ($config['system']['rrdbackup'] > 0), $minute="0", "*/{$config['system']['rrdbackup']}");
}
- if (isset($_POST['dhcpbackup'])) {
- $config['system']['dhcpbackup'] = $_POST['dhcpbackup'];
+ if (isset($_POST['periodic-dhcp-leases-backup'])) {
+ $config['system']['dhcpbackup'] = $_POST['periodic-dhcp-leases-backup'];
install_cron_job("/etc/rc.backup_dhcpleases.sh", ($config['system']['dhcpbackup'] > 0), $minute="0", "*/{$config['system']['dhcpbackup']}");
}
@@ -295,444 +295,280 @@ if ($_POST) {
$pgtitle = array(gettext("System"), gettext("Advanced: Miscellaneous"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php
- include("fbegin.inc");
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
-?>
-<script type="text/javascript">
-//<![CDATA[
-function sticky_checked(obj) {
- if (obj.checked) {
- jQuery('#srctrack').attr('disabled', false);
- } else {
- jQuery('#srctrack').attr('disabled', 'true');
- }
-}
-function tmpvar_checked(obj) {
- if (obj.checked) {
- jQuery('#use_mfs_tmp_size').attr('disabled', false);
- jQuery('#use_mfs_var_size').attr('disabled', false);
- jQuery('#rrdbackup').attr('disabled', false);
- jQuery('#dhcpbackup').attr('disabled', false);
- } else {
- jQuery('#use_mfs_tmp_size').attr('disabled', 'true');
- jQuery('#use_mfs_var_size').attr('disabled', 'true');
- jQuery('#rrdbackup').attr('disabled', 'true');
- jQuery('#dhcpbackup').attr('disabled', 'true');
- }
-}
-//]]>
-</script>
- <form action="system_advanced_misc.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system advanced misc">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), true, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <span class="vexpl">
- <span class="red">
- <strong><?=gettext("NOTE:"); ?>&nbsp;</strong>
- </span>
- <?=gettext("The options on this page are intended for use by advanced users only."); ?>
- <br />
- </span>
- <br />
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Proxy support"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Proxy URL"); ?></td>
- <td width="78%" class="vtable">
- <input name="proxyurl" id="proxyurl" value="<?php if ($pconfig['proxyurl'] <> "") echo htmlspecialchars($pconfig['proxyurl']); ?>" class="formfld unknown" />
- <br />
- <?php printf(gettext("Hostname or IP address of proxy server this system will use for its outbound Internet access.")); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Proxy Port"); ?></td>
- <td width="78%" class="vtable">
- <input name="proxyport" id="proxyport" value="<?php if ($pconfig['proxyport'] <> "") echo htmlspecialchars($pconfig['proxyport']); ?>" class="formfld unknown" />
- <br />
- <?php printf(gettext("Port where proxy server is listening.")); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Proxy Username"); ?></td>
- <td width="78%" class="vtable">
- <input name="proxyuser" id="proxyuser" value="<?php if ($pconfig['proxyuser'] <> "") echo htmlspecialchars($pconfig['proxyuser']); ?>" class="formfld unknown" />
- <br />
- <?php printf(gettext("Username for authentication to proxy server. Optional, leave blank to not use authentication.")); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Proxy Password"); ?></td>
- <td width="78%" class="vtable">
- <input type="password" name="proxypass" id="proxypass" value="<?php if ($pconfig['proxypass'] <> "") echo htmlspecialchars($pconfig['proxypass']); ?>" class="formfld unknown" />
- <br />
- <?php printf(gettext("Password for authentication to proxy server.")); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Load Balancing"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Load Balancing"); ?></td>
- <td width="78%" class="vtable">
- <input name="lb_use_sticky" type="checkbox" id="lb_use_sticky" value="yes" <?php if ($pconfig['lb_use_sticky']) echo "checked=\"checked\""; ?> onclick="sticky_checked(this)" />
- <strong><?=gettext("Use sticky connections"); ?></strong><br />
- <?=gettext("Successive connections will be redirected to the servers " .
- "in a round-robin manner with connections from the same " .
- "source being sent to the same web server. This 'sticky " .
- "connection' will exist as long as there are states that " .
- "refer to this connection. Once the states expire, so will " .
- "the sticky connection. Further connections from that host " .
- "will be redirected to the next web server in the round " .
- "robin. Changing this option will restart the Load Balancing service."); ?>
- <br />
- <input name="srctrack" id="srctrack" value="<?php if ($pconfig['srctrack'] <> "") echo htmlspecialchars($pconfig['srctrack']); else "1400"; ?>" class="formfld unknown" <?php if ($pconfig['lb_use_sticky'] == false) echo "disabled=\"disabled\""; ?> />
- <br />
- <?=gettext("Set the source tracking timeout for sticky connections. " .
- "By default this is 0, so source tracking is removed as soon as the state expires. " .
- "Setting this timeout higher will cause the source/destination relationship to persist for longer periods of time."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Load Balancing"); ?></td>
- <td width="78%" class="vtable">
- <input name="gw_switch_default" type="checkbox" id="gw_switch_default" value="yes" <?php if ($pconfig['gw_switch_default']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable default gateway switching"); ?></strong><br />
- <?=gettext("If the default gateway goes down, switch the default gateway to another available one. This is not enabled by default, as it's unnecessary in most all scenarios, which instead use gateway groups."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Power savings"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("PowerD"); ?></td>
- <td width="78%" class="vtable">
- <input name="powerd_enable" type="checkbox" id="powerd_enable" value="yes" <?php if ($pconfig['powerd_enable']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Use PowerD"); ?></strong><br />
- <br />
- <table border="0" cellspacing="0" cellpadding="2" summary="powerd">
- <tr>
- <td><?=gettext("On AC Power Mode:");?> &nbsp;</td>
- <td>
- <select name="powerd_ac_mode" id="powerd_ac_mode">
- <option value="hadp"<?php if ($pconfig['powerd_ac_mode'] == "hadp") echo " selected=\"selected\""; ?>><?=gettext("Hiadaptive");?></option>
- <option value="adp"<?php if ($pconfig['powerd_ac_mode'] == "adp") echo " selected=\"selected\""; ?>><?=gettext("Adaptive");?></option>
- <option value="min"<?php if ($pconfig['powerd_ac_mode'] == "min") echo " selected=\"selected\""; ?>><?=gettext("Minimum");?></option>
- <option value="max"<?php if ($pconfig['powerd_ac_mode'] == "max") echo " selected=\"selected\""; ?>><?=gettext("Maximum");?></option>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("On Battery Power Mode:");?> &nbsp;</td>
- <td>
- <select name="powerd_battery_mode" id="powerd_battery_mode">
- <option value="hadp"<?php if ($pconfig['powerd_battery_mode'] == "hadp") echo " selected=\"selected\""; ?>><?=gettext("Hiadaptive");?></option>
- <option value="adp"<?php if ($pconfig['powerd_battery_mode'] == "adp") echo " selected=\"selected\""; ?>><?=gettext("Adaptive");?></option>
- <option value="min"<?php if ($pconfig['powerd_battery_mode'] == "min") echo " selected=\"selected\""; ?>><?=gettext("Minimum");?></option>
- <option value="max"<?php if ($pconfig['powerd_battery_mode'] == "max") echo " selected=\"selected\""; ?>><?=gettext("Maximum");?></option>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("On Unknown Power Mode:");?> &nbsp;</td>
- <td>
- <select name="powerd_normal_mode" id="powerd_normal_mode">
- <option value="hadp"<?php if ($pconfig['powerd_normal_mode'] == "hadp") echo " selected=\"selected\""; ?>><?=gettext("Hiadaptive");?></option>
- <option value="adp"<?php if ($pconfig['powerd_normal_mode'] == "adp") echo " selected=\"selected\""; ?>><?=gettext("Adaptive");?></option>
- <option value="min"<?php if ($pconfig['powerd_normal_mode'] == "min") echo " selected=\"selected\""; ?>><?=gettext("Minimum");?></option>
- <option value="max"<?php if ($pconfig['powerd_normal_mode'] == "max") echo " selected=\"selected\""; ?>><?=gettext("Maximum");?></option>
- </select>
- </td>
- </tr>
- </table>
- <br />
- <?=gettext("The powerd utility monitors the system state and sets various power control " .
- "options accordingly. It offers four modes (maximum, minimum, adaptive " .
- "and hiadaptive) that can be individually selected while on AC power or batteries. " .
- "The modes maximum, minimum, adaptive and hiadaptive may be abbreviated max, " .
- "min, adp, hadp. Maximum mode chooses the highest performance values. Minimum " .
- "mode selects the lowest performance values to get the most power savings. " .
- "Adaptive mode attempts to strike a balance by degrading performance when " .
- "the system appears idle and increasing it when the system is busy. It " .
- "offers a good balance between a small performance loss for greatly " .
- "increased power savings. Hiadaptive mode is alike adaptive mode, but " .
- "tuned for systems where performance and interactivity are more important " .
- "than power consumption. It raises frequency faster, drops slower and " .
- "keeps twice lower CPU load."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Cryptographic Hardware Acceleration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Cryptographic Hardware"); ?></td>
- <td width="78%" class="vtable">
- <select name="crypto_hardware" id="crypto_hardware">
- <option value=""><?php echo gettext("None"); ?></option>
- <?php foreach ($crypto_modules as $cryptomod_name => $cryptomod_descr): ?>
- <option value="<?php echo $cryptomod_name; ?>" <?php if ($pconfig['crypto_hardware'] == $cryptomod_name) echo " selected=\"selected\""; ?>><?php echo "{$cryptomod_descr} ({$cryptomod_name})"; ?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <?=gettext("A cryptographic accelerator module will use hardware support to speed up some " .
- "cryptographic functions on systems which have the chip. Do not enable this " .
- "option if you have a Hifn cryptographic acceleration card, as this will take " .
- "precedence and the Hifn card will not be used. Acceleration should be automatic " .
- "for IPsec when using a cipher supported by your chip, such as AES-128. OpenVPN " .
- "should be set for AES-128-CBC and have cryptodev enabled for hardware " .
- "acceleration."); ?>
- <br /><br />
- <?=gettext("If you do not have a crypto chip in your system, this option will have no " .
- "effect. To unload the selected module, set this option to 'none' and then reboot."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Thermal Sensors"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Thermal Sensors"); ?></td>
- <td width="78%" class="vtable">
- <select name="thermal_hardware" id="thermal_hardware">
- <option value=""><?php echo gettext("None/ACPI"); ?></option>
- <?php foreach ($thermal_hardware_modules as $themalmod_name => $themalmod_descr): ?>
- <option value="<?php echo $themalmod_name; ?>" <?php if ($pconfig['thermal_hardware'] == $themalmod_name) echo " selected=\"selected\""; ?>><?php echo "{$themalmod_descr} ({$themalmod_name})"; ?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <?=gettext("If you have a supported CPU, selecting a themal sensor will load the appropriate " .
- "driver to read its temperature. Setting this to 'None' will attempt to read the " .
- "temperature from an ACPI-compliant motherboard sensor instead, if one is present."); ?>
- <br /><br />
- <?=gettext("If you do not have a supported thermal sensor chip in your system, this option will have no " .
- "effect. To unload the selected module, set this option to 'none' and then reboot."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("IP Security"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell">&nbsp;</td>
- <td width="78%" class="vtable">
- <?=gettext("These settings have moved to <a href=\"vpn_ipsec_settings.php\">VPN &gt; IPsec on the Advanced Settings tab</a>."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Schedules"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Schedule States"); ?></td>
- <td width="78%" class="vtable">
- <input name="schedule_states" type="checkbox" id="schedule_states" value="yes" <?php if ($pconfig['schedule_states']) echo "checked=\"checked\""; ?> />
- <br />
- <?=gettext("By default, when a schedule expires, connections permitted by that schedule are killed. ".
- "This option overrides that behavior by not clearing states for existing connections."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Gateway Monitoring"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("State Killing on Gateway Failure"); ?></td>
- <td width="78%" class="vtable">
- <input name="kill_states" type="checkbox" id="kill_states" value="yes" <?php if ($pconfig['kill_states']) echo "checked=\"checked\""; ?> />
- <br />
- <?=gettext("The monitoring process will flush states for a gateway that goes down if this box is not checked. Check this box to disable this behavior."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Skip rules when gateway is down"); ?></td>
- <td width="78%" class="vtable">
- <input name="skip_rules_gw_down" type="checkbox" id="skip_rules_gw_down" value="yes" <?php if ($pconfig['skip_rules_gw_down']) echo "checked=\"checked\""; ?> />
- <br />
- <?=gettext("By default, when a rule has a gateway specified and this gateway is down, ".
- "the rule is created omitting the gateway. This option overrides that behavior by omitting ".
- "the entire rule instead."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Enable gateway monitoring debug logging"); ?></td>
- <td width="78%" class="vtable">
- <input name="apinger_debug" type="checkbox" id="apinger_debug" value="yes" <?php if ($pconfig['apinger_debug']) echo "checked=\"checked\""; ?> />
- <br />
- <?=gettext("Enable this setting to log debug information from the gateway monitoring process to the system logs."); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("RAM Disk Settings (Reboot to Apply Changes)"); ?></td>
- </tr>
- <?php if ($g['platform'] == "pfSense"): ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Use RAM Disks"); ?></td>
- <td width="78%" class="vtable">
- <input name="use_mfs_tmpvar" type="checkbox" id="use_mfs_tmpvar" value="yes" <?php if ($pconfig['use_mfs_tmpvar']) echo "checked=\"checked\""; ?> onclick="tmpvar_checked(this)" />
- <strong><?=gettext("Use memory file system for /tmp and /var"); ?></strong><br />
- <?=gettext("Set this if you wish to use /tmp and /var as RAM disks (memory file system disks) on a full install " .
- "rather than use the hard disk. Setting this will cause the data in /tmp and /var to be lost at reboot, including log data. RRD and DHCP Leases will be retained."); ?>
- </td>
- </tr>
- <?php endif; ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("/tmp RAM Disk Size"); ?></td>
- <td width="78%" class="vtable">
- <input name="use_mfs_tmp_size" id="use_mfs_tmp_size" value="<?php if ($pconfig['use_mfs_tmp_size'] <> "") echo htmlspecialchars($pconfig['use_mfs_tmp_size']); ?>" class="formfld unknown" <?php if (($g['platform'] == "pfSense") && ($pconfig['use_mfs_tmpvar'] == false)) echo "disabled=\"disabled\""; ?> /> MB
- <br />
- <?=gettext("Set the size, in MB, for the /tmp RAM disk. " .
- "Leave blank for 40MB. Do not set lower than 40."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("/var RAM Disk Size"); ?></td>
- <td width="78%" class="vtable">
- <input name="use_mfs_var_size" id="use_mfs_var_size" value="<?php if ($pconfig['use_mfs_var_size'] <> "") echo htmlspecialchars($pconfig['use_mfs_var_size']); ?>" class="formfld unknown" <?php if (($g['platform'] == "pfSense") && ($pconfig['use_mfs_tmpvar'] == false)) echo "disabled=\"disabled\""; ?> /> MB
- <br />
- <?=gettext("Set the size, in MB, for the /var RAM disk. " .
- "Leave blank for 60MB. Do not set lower than 60."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Periodic RRD Backup");?></td>
- <td width="78%" class="vtable">
- <?=gettext("Frequency:");?>
- <select name="rrdbackup" id="rrdbackup" <?php if (($g['platform'] == "pfSense") && ($pconfig['use_mfs_tmpvar'] == false)) echo "disabled=\"disabled\""; ?> >
- <option value='0' <?php if (!isset($config['system']['rrdbackup']) || ($config['system']['rrdbackup'] == 0)) echo "selected='selected'"; ?>><?=gettext("Disable"); ?></option>
- <?php for ($x=1; $x<=24; $x++) { ?>
- <option value='<?= $x ?>' <?php if ($config['system']['rrdbackup'] == $x) echo "selected='selected'"; ?>><?= $x ?> <?=gettext("hour"); ?><?php if ($x>1) echo "s"; ?></option>
- <?php } ?>
- </select>
- <br />
- <?=gettext("This will periodically backup the RRD data so it can be restored automatically on the next boot. Keep in mind that the more frequent the backup, the more writes will happen to your media.");?>
- <br />
- <br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Periodic DHCP Leases Backup");?></td>
- <td width="78%" class="vtable">
- <?=gettext("Frequency:");?>
- <select name="dhcpbackup" id="dhcpbackup" <?php if (($g['platform'] == "pfSense") && ($pconfig['use_mfs_tmpvar'] == false)) echo "disabled=\"disabled\""; ?> >
- <option value='0' <?php if (!isset($config['system']['dhcpbackup']) || ($config['system']['dhcpbackup'] == 0)) echo "selected='selected'"; ?>><?=gettext("Disable"); ?></option>
- <?php for ($x=1; $x<=24; $x++) { ?>
- <option value='<?= $x ?>' <?php if ($config['system']['dhcpbackup'] == $x) echo "selected='selected'"; ?>><?= $x ?> <?=gettext("hour"); ?><?php if ($x>1) echo "s"; ?></option>
- <?php } ?>
- </select>
- <br />
- <?=gettext("This will periodically backup the DHCP leases data so it can be restored automatically on the next boot. Keep in mind that the more frequent the backup, the more writes will happen to your media.");?>
- <br />
- <br />
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <?php if ($g['platform'] == "pfSenseDISABLED"): ?>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Hardware Settings"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Hard disk standby time "); ?></td>
- <td width="78%" class="vtable">
- <select name="harddiskstandby" class="formselect">
- <?php
- ## Values from ATA-2 http://www.t13.org/project/d0948r3-ATA-2.pdf (Page 66)
- $sbvals = explode(" ", "0.5,6 1,12 2,24 3,36 4,48 5,60 7.5,90 10,120 15,180 20,240 30,241 60,242");
- ?>
- <option value="" <?php if (!$pconfig['harddiskstandby']) echo('selected="selected"');?>><?=gettext("Always on"); ?></option>
- <?php
- foreach ($sbvals as $sbval):
- list($min, $val) = explode(",", $sbval);
- ?>
- <option value="<?=$val;?>" <?php if ($pconfig['harddiskstandby'] == $val) echo('selected="selected"');?>><?=$min;?> <?=gettext("minutes"); ?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <?=gettext("Puts the hard disk into standby mode when the selected amount of time after the last ".
- "access has elapsed."); ?> <em><?=gettext("Do not set this for CF cards."); ?></em>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <?php endif; ?>
-
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Package settings"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Package signature"); ?></td>
- <td width="78%" class="vtable">
- <input name="pkg_nochecksig" type="checkbox" id="pkg_nochecksig" value="yes" <?php if ($pconfig['pkg_nochecksig']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Do NOT check package signature"); ?></strong><br />
- <?=gettext("Enable this option to allow pfSense to install any package without checking its signature."); ?>
- </td>
- </tr>
-
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Installation Feedback"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Host UUID"); ?></td>
- <td width="78%" class="vtable">
- <input name="host_uuid" type="checkbox" id="host_uuid" value="yes" <?php if ($pconfig['host_uuid']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Do NOT send HOST UUID with user agent"); ?></strong><br />
- <?=gettext("Enable this option to not send HOST UUID to pfSense as part of User-Agent header."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- </table>
- </form>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
+$tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+$tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+$tab_array[] = array(gettext("Miscellaneous"), true, "system_advanced_misc.php");
+$tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+$tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+display_top_tabs($tab_array);
+
+?><div id="container"><?php
+
+require('classes/Form.class.php');
+$form = new Form;
+$section = new Form_Section('Proxy support');
+
+$section->addInput(new Form_Input(
+ 'proxy-url',
+ 'Proxy URL',
+ 'text',
+ $pconfig['proxyurl']
+))->setHelp('Hostname or IP address of proxy server this system will '.
+ 'use for its outbound Internet access.');
+
+$section->addInput(new Form_Input(
+ 'proxy-port',
+ 'Proxy Port',
+ 'text',
+ $pconfig['proxyport']
+))->setHelp('Port where proxy server is listening.');
+
+$section->addInput(new Form_Input(
+ 'proxy-username',
+ 'Proxy Username',
+ 'text',
+ $pconfig['proxyuser']
+))->setHelp('Username for authentication to proxy server. Optional, '.
+ 'leave blank to not use authentication.');
+
+$section->addInput(new Form_Input(
+ 'proxy-password',
+ 'Proxy Password',
+ 'text',
+ $pconfig['proxypass']
+))->setHelp('Password for authentication to proxy server.');
+
+$form->add($section);
+$section = new Form_Section('Load Balancing');
+
+$group = new Form_Group('Load Balancing');
+
+$group->add(new Form_Checkbox(
+ 'use-sticky-connections',
+ 'Use sticky connections',
+ 'Use sticky connections',
+ $pconfig['lb_use_sticky']
+))->setHelp('Successive connections will be redirected to the servers in a '.
+ 'round-robin manner with connections from the same source being sent to the '.
+ 'same web server. This "sticky connection" will exist as long as there are '.
+ 'states that refer to this connection. Once the states expire, so will the '.
+ 'sticky connection. Further connections from that host will be redirected '.
+ 'to the next web server in the round robin. Changing this option will '.
+ 'restart the Load Balancing service.');
+
+$group->add(new Form_Input(
+ 'source-tracking-timeout',
+ 'Source tracking timeout',
+ 'number',
+ $pconfig['srctrack'],
+ ['placeholder' => 1400]
+))->setHelp('Set the source tracking timeout for sticky connections. By default '.
+ 'this is 0, so source tracking is removed as soon as the state expires. '.
+ 'Setting this timeout higher will cause the source/destination relationship '.
+ 'to persist for longer periods of time.');
+
+$section->add($group);
+
+$section->addInput(new Form_Checkbox(
+ 'default-gateway-switching',
+ 'Default gateway switching',
+ 'Enable default gateway switching',
+ $pconfig['gw_switch_default']
+))->setHelp('If the default gateway goes down, switch the default gateway to '.
+ 'another available one. This is not enabled by default, as it"s unnecessary in '.
+ 'most all scenarios, which instead use gateway groups.');
+
+$form->add($section);
+$section = new Form_Section('Power savings');
+
+$section->addInput(new Form_Checkbox(
+ 'powerd',
+ 'PowerD',
+ 'Enable PowerD',
+ $pconfig['powerd_enable']
+))->setHelp('The powerd utility monitors '.
+ 'the system state and sets various power control options accordingly. It offers '.
+ 'four modes (maximum, minimum, adaptive and hiadaptive) that can be individually '.
+ 'selected while on AC power or batteries. The modes maximum, minimum, adaptive '.
+ 'and hiadaptive may be abbreviated max, min, adp, hadp. Maximum mode chooses the '.
+ 'highest performance values. Minimum mode selects the lowest performance values '.
+ 'to get the most power savings. Adaptive mode attempts to strike a balance by '.
+ 'degrading performance when the system appears idle and increasing it when the '.
+ 'system is busy. It offers a good balance between a small performance loss for '.
+ 'greatly increased power savings. Hiadaptive mode is alike adaptive mode, but '.
+ 'tuned for systems where performance and interactivity are more important than '.
+ 'power consumption. It raises frequency faster, drops slower and keeps twice '.
+ 'lower CPU load.');
+
+$modes = array(
+ 'hadp' => 'Hiadaptive',
+ 'adp' => 'Adaptive',
+ 'min' => 'Minimum',
+ 'max' => 'Maximum',
+);
+
+$section->addInput(new Form_Select(
+ 'ac-power',
+ 'AC Power',
+ $pconfig['powerd_ac_mode'],
+ $modes
+));
+
+$section->addInput(new Form_Select(
+ 'battery-power',
+ 'Battery Power',
+ $pconfig['powerd_battery_mode'],
+ $modes
+));
+
+$section->addInput(new Form_Select(
+ 'unknown-power',
+ 'Unknown Power',
+ $pconfig['powerd_normal_mode'],
+ $modes
+));
+
+$form->add($section);
+$section = new Form_Section('Cryptographic & Thermal Hardware');
+
+$section->addInput(new Form_Select(
+ 'cryptographic-hardware',
+ 'Cryptographic Hardware',
+ $pconfig['crypto_hardware'],
+ $crypto_modules
+))->setHelp('A cryptographic '.
+ 'accelerator module will use hardware support to speed up some cryptographic '.
+ 'functions on systems which have the chip. Do not enable this option if you have '.
+ 'a Hifn cryptographic acceleration card, as this will take precedence and the '.
+ 'Hifn card will not be used. Acceleration should be automatic for IPsec when '.
+ 'using a cipher supported by your chip, such as AES-128. OpenVPN should be set '.
+ 'for AES-128-CBC and have cryptodev enabled for hardware acceleration.If you do '.
+ 'not have a crypto chip in your system, this option will have no effect. To '.
+ 'unload the selected module, set this option to "none" and then reboot.');
+
+$section->addInput(new Form_Select(
+ 'thermal-sensors',
+ 'Thermal Sensors',
+ $pconfig['thermal_hardware'],
+ array('' => 'None/ACPI') + $thermal_hardware_modules
+))->setHelp('If you have a '.
+ 'supported CPU, selecting a themal sensor will load the appropriate driver to '.
+ 'read its temperature. Setting this to "None" will attempt to read the '.
+ 'temperature from an ACPI-compliant motherboard sensor instead, if one is '.
+ 'present.If you do not have a supported thermal sensor chip in your system, this '.
+ 'option will have no effect. To unload the selected module, set this option to '.
+ '"none" and then reboot.');
+
+$form->add($section);
+$section = new Form_Section('Schedules');
+
+$section->addInput(new Form_Checkbox(
+ 'schedule-states',
+ 'Schedule States',
+ 'Do not kill connections when schedule expires',
+ $pconfig['schedule_states']
+))->setHelp('By default, when a schedule expires, connections permitted by that '.
+ 'schedule are killed. This option overrides that behavior by not clearing states '.
+ 'for existing connections.');
+
+$form->add($section);
+$section = new Form_Section('Gateway Monitoring');
+
+$section->addInput(new Form_Checkbox(
+ 'state-killing-on-gateway-failure',
+ 'State Killing on Gateway Failure',
+ 'Flush states for a gateway that goes down',
+ $pconfig['kill_states']
+))->setHelp('The monitoring process will flush states for a gateway that goes down '.
+ 'if this box is not checked. Check this box to disable this behavior.');
+
+$section->addInput(new Form_Checkbox(
+ 'skip-rules-when-gateway-is-down',
+ 'Skip rules when gateway is down',
+ 'Do not create rules when gateway is down',
+ $pconfig['skip_rules_gw_down']
+))->setHelp('By default, when a rule has a gateway specified and this gateway is '.
+ 'down, the rule is created omitting the gateway. This option overrides that '.
+ 'behavior by omitting the entire rule instead.');
+
+$section->addInput(new Form_Checkbox(
+ 'gateway-monitoring-logging',
+ 'Gateway monitoring logging',
+ 'Enable debug logging',
+ $pconfig['apinger_debug']
+))->setHelp('Enable this setting to log debug information from the gateway '.
+ 'monitoring process to the system logs.');
+
+$form->add($section);
+$section = new Form_Section('RAM Disk Settings (Reboot to Apply Changes)');
+
+$section->addInput(new Form_Checkbox(
+ 'use-ram-disks',
+ 'Use RAM Disks',
+ 'Use memory file system for /tmp and /var',
+ ($pconfig['use_mfs_tmpvar'] || $g['platform'] != "pfSense")
+))->setHelp('Set this if you wish to use /tmp and /var as RAM disks (memory file '.
+ 'system disks) on a full install rather than use the hard disk. Setting this will '.
+ 'cause the data in /tmp and /var to be lost at reboot, including log data. RRD '.
+ 'and DHCP Leases will be retained.');
+
+$section->addInput(new Form_Input(
+ '-tmp-ram-disk-size',
+ '/tmp RAM Disk Size',
+ 'number',
+ $pconfig['use_mfs_tmp_size'],
+ ['placeholder' => 40]
+))->setHelp('Set the size, in MB, for the /tmp '.
+ 'RAM disk. Leave blank for 40MB. Do not set lower than 40.');
+
+$section->addInput(new Form_Input(
+ '-var-ram-disk-size',
+ '/var RAM Disk Size',
+ 'number',
+ $pconfig['use_mfs_var_size'],
+ ['placeholder' => 60]
+))->setHelp('Set the size, in MB, for the /var '.
+ 'RAM disk. Leave blank for 60MB. Do not set lower than 60.');
+
+$section->addInput(new Form_Input(
+ 'periodic-rrd-backup',
+ 'Periodic RRD Backup',
+ 'number',
+ $config['system']['rrdbackup'],
+ ['min' => 1, 'max' => 24, 'placeholder' => 'frequency between 1 and 24 hours']
+))->setHelp('This will periodically backup the RRD data so '.
+ 'it can be restored automatically on the next boot. Keep in mind that the more '.
+ 'frequent the backup, the more writes will happen to your media.');
+
+$section->addInput(new Form_Input(
+ 'periodic-dhcp-leases-backup',
+ 'Periodic DHCP Leases Backup',
+ 'number',
+ $config['system']['rrdbackup'],
+ ['min' => 1, 'max' => 24, 'placeholder' => 'frequency between 1 and 24 hours']
+))->setHelp('This will periodically backup the DHCP leases so '.
+ 'it can be restored automatically on the next boot. Keep in mind that the more '.
+ 'frequent the backup, the more writes will happen to your media.');
+
+$form->add($section);
+$section = new Form_Section('Package settings');
+
+$section->addInput(new Form_Checkbox(
+ 'package-signature',
+ 'Package signature',
+ 'Disable check package signature',
+ $pconfig['pkg_nochecksig']
+))->setHelp('Enable this option to allow pfSense to install any package without '.
+ 'checking its signature.');
+
+$form->add($section);
+print $form;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_advanced_network.php b/src/usr/local/www/system_advanced_network.php
index 4b3b7ce..c770603 100644
--- a/src/usr/local/www/system_advanced_network.php
+++ b/src/usr/local/www/system_advanced_network.php
@@ -73,7 +73,7 @@ if ($_POST) {
if ($_POST['ipv6nat_enable'] == "yes") {
$config['diag']['ipv6nat']['enable'] = true;
- $config['diag']['ipv6nat']['ipaddr'] = $_POST['ipv6nat_ipaddr'];
+ $config['diag']['ipv6nat']['ipaddr'] = $_POST['ip-address'];
} else {
if ($config['diag']) {
if ($config['diag']['ipv6nat']) {
@@ -149,172 +149,129 @@ if ($_POST) {
$pgtitle = array(gettext("System"), gettext("Advanced: Networking"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-
-<script type="text/javascript">
-//<![CDATA[
-
-function enable_change(enable_over) {
- if (document.iform.ipv6nat_enable.checked || enable_over) {
- document.iform.ipv6nat_ipaddr.disabled = 0;
- } else {
- document.iform.ipv6nat_ipaddr.disabled = 1;
- }
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
+$tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+$tab_array[] = array(gettext("Networking"), true, "system_advanced_network.php");
+$tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+$tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+$tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+display_top_tabs($tab_array);
+
+?><div id="container"><?php
+
+require('classes/Form.class.php');
+$form = new Form;
+$section = new Form_Section('IPv6 Options');
+
+$section->addInput(new Form_Checkbox(
+ 'allow-ipv6',
+ 'Allow IPv6',
+ 'All IPv6 traffic will be blocked by the firewall unless this box is checked',
+ $pconfig['ipv6allow']
+))->setHelp('NOTE: This does not disable any IPv6 features on the firewall, it only '.
+ 'blocks traffic.');
+
+$group = new Form_Group('IPv6 over IPv4 Tunneling');
+$group->add(new Form_Checkbox(
+ 'ipv6-over-ipv4-tunneling',
+ 'IPv6 over IPv4 Tunneling',
+ 'Enable IPv4 NAT encapsulation of IPv6 packets',
+ $pconfig['ipv6allow']
+))->setHelp('NOTE: This does not disable any IPv6 features on the firewall, it only '.
+ 'blocks traffic.');
+
+$group->add(new Form_Input(
+ 'ip-address',
+ 'IP address',
+ 'text',
+ $pconfig['ipv6nat_ipaddr']
+))->setHelp('Enable IPv4 NAT encapsulation of IPv6 packets. <br/>This provides an '.
+ 'RFC 2893 compatibility mechanism that can be used to tunneling IPv6 packets over '.
+ 'IPv4 routing infrastructures. If enabled, don"t forget to add a firewall rule to '.
+ 'permit IPv6 packets.');
+
+$section->add($group);
+
+$section->addInput(new Form_Checkbox(
+ 'prefer-ipv4-over-ipv6',
+ 'Prefer IPv4 over IPv6',
+ 'Prefer to use IPv4 even if IPv6 is available',
+ $pconfig['prefer_ipv4']
+))->setHelp('By default, if a hostname resolves IPv6 and IPv4 addresses IPv6 will '.
+ 'be used, if you check this option, IPv4 will be used instead of IPv6.');
+
+$form->add($section);
+$section = new Form_Section('Network Interfaces');
+
+$section->addInput(new Form_Checkbox(
+ 'device-polling',
+ 'Device polling',
+ 'Enable device polling',
+ $pconfig['polling_enable']
+))->setHelp('Device polling is a technique that lets the system periodically poll '.
+ 'network devices for new data instead of relying on interrupts. This prevents '.
+ 'your webConfigurator, SSH, etc. from being inaccessible due to interrupt floods '.
+ 'when under extreme load. Generally this is not recommended. Not all NICs support '.
+ 'polling; see the %s homepage for a list of supported cards', [$g["product_name"]]);
+
+
+$section->addInput(new Form_Checkbox(
+ 'hardware-checksum-offloading',
+ 'Hardware Checksum Offloading',
+ 'Disable hardware checksum offload',
+ isset($config['system']['disablechecksumoffloading'])
+))->setHelp('Checking this option will disable hardware checksum offloading.<br/>'.
+ 'Checksum offloading is broken in some hardware, particularly some Realtek cards. '.
+ 'Rarely, drivers may have problems with checksum offloading and some specific '.
+ 'NICs.This will take effect after you reboot the machine or re-configure each '.
+ 'interface.');
+
+$section->addInput(new Form_Checkbox(
+ 'hardware-tcp-segmentation-offloading',
+ 'Hardware TCP Segmentation Offloading',
+ 'Disable hardware TCP segmentation offload',
+ isset($config['system']['disablesegmentationoffloading'])
+))->setHelp('Checking this option will disable hardware TCP segmentation '.
+ 'offloading (TSO, TSO4, TSO6). This offloading is broken in some hardware '.
+ 'drivers, and may impact performance with some specific NICs.This will take '.
+ 'effect after you reboot the machine or re-configure each interface.');
+
+$section->addInput(new Form_Checkbox(
+ 'hardware-large-receive-offloading',
+ 'Hardware Large Receive Offloading',
+ 'Disable hardware large receive offload',
+ isset($config['system']['disablelargereceiveoffloading'])
+))->setHelp('Checking this option will disable hardware large receive offloading '.
+ '(LRO). This offloading is broken in some hardware drivers, and may impact '.
+ 'performance with some specific NICs.This will take effect after you reboot the '.
+ 'machine or re-configure each interface.');
+
+$section->addInput(new Form_Checkbox(
+ 'arp-handling',
+ 'ARP Handling',
+ 'Suppress ARP messages',
+ isset($pconfig['sharednet'])
+))->setHelp('This option will suppress ARP log messages when multiple interfaces '.
+ 'reside on the same broadcast domain');
+
+if (get_freebsd_version() == 8)
+{
+ $section->addInput(new Form_Checkbox(
+ 'Enable Flowtable',
+ 'Enable flowtable support',
+ $pconfig['flowtable']
+ ))->setHelp('Enables infrastructure for caching flows as a means of accelerating '.
+ 'L3 and L2 lookupsas well as providing stateful load balancing when used with '.
+ 'RADIX_MPATH.');
}
-//]]>
-</script>
+$form->add($section);
+print $form;
-
-<?
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
-?>
- <form action="system_advanced_network.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system advanced newtwork">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), true, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <span class="vexpl">
- <span class="red">
- <strong><?=gettext("NOTE:"); ?>&nbsp;</strong>
- </span>
- <?=gettext("The options on this page are intended for use by advanced users only."); ?>
- <br />
- </span>
- <br />
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("IPv6 Options"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Allow IPv6"); ?></td>
- <td width="78%" class="vtable">
- <input name="ipv6allow" type="checkbox" id="ipv6allow" value="yes" <?php if ($pconfig['ipv6allow']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
- <strong><?=gettext("Allow IPv6"); ?></strong><br />
- <?=gettext("All IPv6 traffic will be blocked by the firewall unless this box is checked."); ?><br />
- <?=gettext("NOTE: This does not disable any IPv6 features on the firewall, it only blocks traffic."); ?><br />
- <br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 over IPv4 Tunneling"); ?></td>
- <td width="78%" class="vtable">
- <input name="ipv6nat_enable" type="checkbox" id="ipv6nat_enable" value="yes" <?php if ($pconfig['ipv6nat_enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
- <strong><?=gettext("Enable IPv4 NAT encapsulation of IPv6 packets"); ?></strong><br />
- <?=gettext("This provides an RFC 2893 compatibility mechanism ".
- "that can be used to tunnel IPv6 packets over IPv4 ".
- "routing infrastructures. If enabled, don't forget to ".
- "add a firewall rule to permit IPv6 packets."); ?><br />
- <br />
- <?=gettext("IP address"); ?>&nbsp;:&nbsp;
- <input name="ipv6nat_ipaddr" type="text" class="formfld unknown" id="ipv6nat_ipaddr" size="20" value="<?=htmlspecialchars($pconfig['ipv6nat_ipaddr']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Prefer IPv4 over IPv6"); ?></td>
- <td width="78%" class="vtable">
- <input name="prefer_ipv4" type="checkbox" id="prefer_ipv4" value="yes" <?php if ($pconfig['prefer_ipv4']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Prefer to use IPv4 even if IPv6 is available"); ?></strong><br />
- <?=gettext("By default, if a hostname resolves IPv6 and IPv4 addresses IPv6 will be used. " .
- "If you check this option, IPv4 will be used instead of IPv6."); ?><br />
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Network Interfaces"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Device polling"); ?></td>
- <td width="78%" class="vtable">
- <input name="polling_enable" type="checkbox" id="polling_enable" value="yes" <?php if ($pconfig['polling_enable']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable device polling"); ?></strong><br />
- <?php printf(gettext("Device polling is a technique that lets the system periodically poll network devices for new data instead of relying on interrupts. This prevents your webConfigurator, SSH, etc. from being inaccessible due to interrupt floods when under extreme load. Generally this is not recommended. Not all NICs support polling; see the %s homepage for a list of supported cards."), $g['product_name']); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Hardware Checksum Offloading"); ?></td>
- <td width="78%" class="vtable">
- <input name="disablechecksumoffloading" type="checkbox" id="disablechecksumoffloading" value="yes" <?php if (isset($config['system']['disablechecksumoffloading'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable hardware checksum offload"); ?></strong><br />
- <?=gettext("Checking this option will disable hardware checksum offloading. Checksum offloading is broken in some hardware, particularly some Realtek cards. Rarely, drivers may have problems with checksum offloading and some specific NICs."); ?>
- <br />
- <span class="red"><strong><?=gettext("Note:");?>&nbsp;</strong></span>
- <?=gettext("This will take effect after you reboot the machine or re-configure each interface.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Hardware TCP Segmentation Offloading"); ?></td>
- <td width="78%" class="vtable">
- <input name="disablesegmentationoffloading" type="checkbox" id="disablesegmentationoffloading" value="yes" <?php if (isset($config['system']['disablesegmentationoffloading'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable hardware TCP segmentation offload"); ?></strong><br />
- <?=gettext("Checking this option will disable hardware TCP segmentation offloading (TSO, TSO4, TSO6). This offloading is broken in some hardware drivers, and may impact performance with some specific NICs."); ?>
- <br />
- <span class="red"><strong><?=gettext("Note:");?>&nbsp;</strong></span>
- <?=gettext("This will take effect after you reboot the machine or re-configure each interface.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Hardware Large Receive Offloading"); ?></td>
- <td width="78%" class="vtable">
- <input name="disablelargereceiveoffloading" type="checkbox" id="disablelargereceiveoffloading" value="yes" <?php if (isset($config['system']['disablelargereceiveoffloading'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable hardware large receive offload"); ?></strong><br />
- <?=gettext("Checking this option will disable hardware large receive offloading (LRO). This offloading is broken in some hardware drivers, and may impact performance with some specific NICs."); ?>
- <br />
- <span class="red"><strong><?=gettext("Note:");?>&nbsp;</strong></span>
- <?=gettext("This will take effect after you reboot the machine or re-configure each interface.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("ARP Handling"); ?></td>
- <td width="78%" class="vtable">
- <input name="sharednet" type="checkbox" id="sharednet" value="yes" <?php if (isset($pconfig['sharednet'])) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Suppress ARP messages"); ?></strong><br />
- <?=gettext("This option will suppress ARP log messages when multiple interfaces reside on the same broadcast domain"); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%"><input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" /></td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- </table>
- </form>
- <script type="text/javascript">
- //<![CDATA[
- enable_change(false);
- //]]>
- </script>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_advanced_notifications.php b/src/usr/local/www/system_advanced_notifications.php
index 45ac501..91a3f70 100644
--- a/src/usr/local/www/system_advanced_notifications.php
+++ b/src/usr/local/www/system_advanced_notifications.php
@@ -101,26 +101,13 @@ if ($_POST) {
unset($input_errors);
$pconfig = $_POST;
- /* if this is an AJAX caller then handle via JSON */
- if (isAjax() && is_array($input_errors)) {
- input_errors2Ajax($input_errors);
- exit;
- }
-
- if ($_POST['apply']) {
- $retval = 0;
- system_setup_sysctl();
- $savemsg = get_std_save_message($retval);
- }
-
- if ($_POST['Submit'] == gettext("Save")) {
- $tunableent = array();
+ if (isset($_POST['save'])) {
// Growl
- $config['notifications']['growl']['ipaddress'] = $_POST['ipaddress'];
+ $config['notifications']['growl']['ipaddress'] = $_POST['ip-address'];
$config['notifications']['growl']['password'] = $_POST['password'];
- $config['notifications']['growl']['name'] = $_POST['name'];
- $config['notifications']['growl']['notification_name'] = $_POST['notification_name'];
+ $config['notifications']['growl']['name'] = $_POST['registration-name'];
+ $config['notifications']['growl']['notification_name'] = $_POST['notification-name'];
if ($_POST['disable_growl'] == "yes") {
$config['notifications']['growl']['disable'] = true;
@@ -136,11 +123,13 @@ if ($_POST) {
} else {
unset($config['notifications']['smtp']['ssl']);
}
+
if (isset($_POST['smtptls'])) {
$config['notifications']['smtp']['tls'] = true;
} else {
unset($config['notifications']['smtp']['tls']);
}
+
$config['notifications']['smtp']['notifyemailaddress'] = $_POST['smtpnotifyemailaddress'];
$config['notifications']['smtp']['username'] = $_POST['smtpusername'];
$config['notifications']['smtp']['password'] = $_POST['smtppassword'];
@@ -165,7 +154,8 @@ if ($_POST) {
return;
}
- if ($_POST['test_growl'] == gettext("Test Growl")) {
+
+ if (isset($_POST['test-growl'])) {
// Send test message via growl
if ($config['notifications']['growl']['ipaddress'] &&
$config['notifications']['growl']['password'] = $_POST['password']) {
@@ -174,7 +164,8 @@ if ($_POST) {
notify_via_growl(sprintf(gettext("This is a test message from %s. It is safe to ignore this message."), $g['product_name']), true);
}
}
- if ($_POST['test_smtp'] == gettext("Test SMTP")) {
+
+ if (isset($_POST['test-smtp'])) {
// Send test message via smtp
if (file_exists("/var/db/notices_lastmsg.txt")) {
unlink("/var/db/notices_lastmsg.txt");
@@ -186,228 +177,165 @@ if ($_POST) {
$pgtitle = array(gettext("System"), gettext("Advanced: Notifications"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
- <form action="system_advanced_notifications.php" method="post">
- <?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
- ?>
- </form>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system advanced notifications">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), true, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <form action="system_advanced_notifications.php" method="post" name="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <!-- GROWL -->
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Growl"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Disable Growl Notifications"); ?></td>
- <td width="78%" class="vtable">
- <input type='checkbox' name='disable_growl' value="yes" <?php if ($pconfig['disable_growl']) {?>checked="checked"<?php } ?> /><br />
- <?=gettext("Check this option to disable growl notifications but preserve the settings below."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Registration Name"); ?></td>
- <td width="78%" class="vtable">
- <input name='name' value='<?php echo htmlspecialchars($pconfig['name'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
- <?=gettext("Enter the name to register with the Growl server (default: PHP-Growl)."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Notification Name"); ?></td>
- <td width="78%" class="vtable">
- <input name='notification_name' value='<?php echo htmlspecialchars($pconfig['notification_name'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
- <?=sprintf(gettext("Enter a name for the Growl notifications (default: %s growl alert)."), $g['product_name']); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IP Address"); ?></td>
- <td width="78%" class="vtable">
- <input name='ipaddress' value='<?php echo htmlspecialchars($pconfig['ipaddress'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
- <?=gettext("This is the IP address that you would like to send growl notifications to."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Password"); ?></td>
- <td width="78%" class="vtable">
- <input name='password' type='password' value='<?php echo htmlspecialchars($pconfig['password'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
- <?=gettext("Enter the password of the remote growl notification device."); ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="">
- &nbsp;
- </td>
- <td>
- <input type='submit' id='test_growl' name='test_growl' value='<?=gettext("Test Growl"); ?>' />
- <br /><?= gettext("NOTE: A test notification will be sent even if the service is marked as disabled.") ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <!-- SMTP -->
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("SMTP E-Mail"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Disable SMTP Notifications"); ?></td>
- <td width="78%" class="vtable">
- <input type='checkbox' name='disable_smtp' value="yes" <?php if ($pconfig['disable_smtp']) {?>checked="checked"<?php } ?> /><br />
- <?=gettext("Check this option to disable SMTP notifications but preserve the settings below. Some other mechanisms, such as packages, may need these settings in place to function."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("E-Mail server"); ?></td>
- <td width="78%" class="vtable">
- <input name='smtpipaddress' value='<?php echo htmlspecialchars($pconfig['smtpipaddress'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
- <?=gettext("This is the FQDN or IP address of the SMTP E-Mail server to which notifications will be sent."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("SMTP Port of E-Mail server"); ?></td>
- <td width="78%" class="vtable">
- <input name='smtpport' value='<?php echo htmlspecialchars($pconfig['smtpport'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
- <?=gettext("This is the port of the SMTP E-Mail server, typically 25, 587 (submission) or 465 (smtps)"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Secure SMTP Connection"); ?></td>
- <td width="78%" class="vtable">
- <input type='checkbox' id='smtpssl' name='smtpssl' <?php if (isset($pconfig['smtpssl'])) echo "checked=\"checked\""; ?> />Enable SMTP over SSL/TLS<br />
- <input type='checkbox' id='smtptls' name='smtptls' <?php if (isset($pconfig['smtptls'])) echo "checked=\"checked\""; ?> />Enable STARTTLS<br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("From e-mail address"); ?></td>
- <td width="78%" class="vtable">
- <input name='smtpfromaddress' type='text' value='<?php echo htmlspecialchars($pconfig['smtpfromaddress'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
- <?=gettext("This is the e-mail address that will appear in the from field."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Notification E-Mail address"); ?></td>
- <td width="78%" class="vtable">
- <input name='smtpnotifyemailaddress' type='text' value='<?php echo htmlspecialchars($pconfig['smtpnotifyemailaddress'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
- <?=gettext("Enter the e-mail address that you would like email notifications sent to."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Notification E-Mail auth username (optional)"); ?></td>
- <td width="78%" class="vtable">
- <input name='smtpusername' type='text' value='<?php echo htmlspecialchars($pconfig['smtpusername'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
- <?=gettext("Enter the e-mail address username for SMTP authentication."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Notification E-Mail auth password"); ?></td>
- <td width="78%" class="vtable">
- <input name='smtppassword' type='password' value='<?php echo htmlspecialchars($pconfig['smtppassword'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
- <?=gettext("Enter the e-mail address password for SMTP authentication."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Notification E-Mail auth mechanism"); ?></td>
- <td width="78%" class="vtable">
- <select name='smtpauthmech' id='smtpauthmech' class="formselect">
- <?php
- foreach ($smtp_authentication_mechanisms as $name => $desc):
- $selected = "";
- if ($pconfig['smtpauthmech'] == $name) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$name;?>" <?=$selected;?>><?=$desc;?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <?=gettext("Select the authentication mechanism used by the SMTP server. Most work with PLAIN, some servers like Exchange or Office365 might require LOGIN."); ?>
- </td>
- </tr>
- <tr>
- <td valign="top" class="">
- &nbsp;
- </td>
- <td>
- <input type='submit' id='test_smtp' name='test_smtp' value='<?=gettext("Test SMTP"); ?>' />
- <br /><?= gettext("NOTE: A test message will be sent even if the service is marked as disabled.") ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <!-- System Sounds -->
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("System Sounds"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Startup/Shutdown Sound"); ?></td>
- <td width="78%" class="vtable">
- <input name="disablebeep" type="checkbox" id="disablebeep" value="yes" <?php if ($pconfig['disablebeep']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable the startup/shutdown beep"); ?></strong>
- <br />
- <span class="vexpl"><?=gettext("When this is checked, startup and shutdown sounds will no longer play."); ?></span>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td valign="top" class="">
- &nbsp;
- </td>
- <td>
- <input type='submit' id='Submit' name='Submit' value='<?=gettext("Save"); ?>' />
- </td>
- </tr>
- </table>
- </form>
- </div>
- </td>
- </tr>
- </table>
-<script type="text/javascript">
-//<![CDATA[
- jQuery(document).ready(function() {
- if (jQuery('#smtpssl').is(':checked')) {
- jQuery('#smtptls').prop('disabled', true);
- } else if (jQuery('#smtptls').is(':checked')) {
- jQuery('#smtpssl').prop('disabled', true);
- }
- });
- jQuery('#smtpssl').change( function() {
- jQuery('#smtptls').prop('disabled', this.checked);
- });
- jQuery('#smtptls').change( function() {
- jQuery('#smtpssl').prop('disabled', this.checked);
- });
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
+$tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+$tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+$tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+$tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+$tab_array[] = array(gettext("Notifications"), true, "system_advanced_notifications.php");
+display_top_tabs($tab_array);
+
+?><div id="container"><?php
+
+require('classes/Form.class.php');
+$form = new Form;
+$section = new Form_Section('Growl');
+
+$section->addInput(new Form_Checkbox(
+ 'disable-growl',
+ 'Disable Growl',
+ 'Disable Growl Notifications',
+ $pconfig['disable_growl']
+))->setHelp('Check this option to disable growl notifications but preserve the '.
+ 'settings below.');
+
+$section->addInput(new Form_Input(
+ 'registration-name',
+ 'Registration Name',
+ 'text',
+ $pconfig['name'],
+ ['placeholder' => 'PHP-Growl']
+))->setHelp('Enter the name to register with the Growl server.');
+
+$section->addInput(new Form_Input(
+ 'notification-name',
+ 'Notification Name',
+ 'text',
+ $pconfig['notification_name'],
+ ['placeholder' => $g["product_name"].' growl alert']
+
+))->setHelp('Enter a name for the Growl notifications');
+
+$section->addInput(new Form_Input(
+ 'ip-address',
+ 'IP Address',
+ 'text',
+ $pconfig['ipaddress']
+))->setHelp('This is the IP address that you would like to send growl '.
+ 'notifications to.');
+
+$section->addInput(new Form_Input(
+ 'password',
+ 'Password',
+ 'text',
+ $pconfig['password']
+))->setHelp('Enter the password of the remote growl notification device.');
+
+$section->addInput(new Form_Input(
+ 'test-growl',
+ 'Test Growl',
+ 'submit',
+ 'Test Growl settings'
+))->setHelp('A test notification will be sent even if the service is '.
+ 'marked as disabled.');
+
+$form->add($section);
+$section = new Form_Section('E-Mail');
+
+$section->addInput(new Form_Checkbox(
+ 'disable-smtp',
+ 'Disable SMTP',
+ 'Disable SMTP Notifications',
+ $pconfig['disable_smtp']
+))->setHelp('Check this option to disable SMTP notifications but preserve the '.
+ 'settings below. Some other mechanisms, such as packages, may need these settings '.
+ 'in place to function.');
+
+$section->addInput(new Form_Input(
+ 'e-mail-server',
+ 'E-Mail server',
+ 'text',
+ $pconfig['smtpipaddress']
+))->setHelp('This is the FQDN or IP address of the SMTP E-Mail server to '.
+ 'which notifications will be sent.');
+
+$section->addInput(new Form_Input(
+ 'smtp-port-of-e-mail-server',
+ 'SMTP Port of E-Mail server',
+ 'number',
+ $pconfig['smtpport']
+))->setHelp('This is the port of the SMTP E-Mail server, typically 25, 587 '.
+ '(submission) or 465 (smtps)');
+
+$group = new Form_Group('Secure SMTP Connection');
+$group->add(new Form_Checkbox(
+ 'enable-ssl-tls',
+ 'Enable SSL/TLS',
+ 'Enable SMTP over SSL/TLS',
+ isset($pconfig['smtpssl'])
+));
+
+$group->add(new Form_Checkbox(
+ 'secure-starttls',
+ 'Secure STARTTLS',
+ 'Enable STARTTLS',
+ isset($pconfig['smtptls'])
+));
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'from-e-mail-address',
+ 'From e-mail address',
+ 'text',
+ $pconfig['smtpfromaddress']
+))->setHelp('This is the e-mail address that will appear in the from field.');
+
+$section->addInput(new Form_Input(
+ 'notification-e-mail-address',
+ 'Notification E-Mail address',
+ 'text',
+ $pconfig['smtpnotifyemailaddress']
+))->setHelp('Enter the e-mail address that you would like email '.
+ 'notifications sent to.');
+
+$section->addInput(new Form_Input(
+ 'notification-e-mail-auth-username-optional-',
+ 'Notification E-Mail auth username (optional)',
+ 'text',
+ $pconfig['smtpusername']
+))->setHelp('Enter the e-mail address username for SMTP authentication.');
+
+$section->addInput(new Form_Input(
+ 'notification-e-mail-auth-password',
+ 'Notification E-Mail auth password',
+ 'password',
+ $pconfig['smtppassword']
+))->setHelp('Enter the e-mail address password for SMTP authentication.');
+
+$section->addInput(new Form_Input(
+ 'test-smtp',
+ 'Test SMTP',
+ 'submit',
+ 'Test SMTP settings'
+))->setHelp('A test notification will be sent even if the service is '.
+ 'marked as disabled.');
+
+$section->addInput(new Form_Checkbox(
+ 'startup-shutdown-sound',
+ 'Startup/Shutdown Sound',
+ 'Disable the startup/shutdown beep',
+ $pconfig['disablebeep']
+))->setHelp('When this is checked, startup and shutdown sounds will no longer '.
+ 'play.');
+
+$form->add($section);
+print $form;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_advanced_sysctl.php b/src/usr/local/www/system_advanced_sysctl.php
index 1992cc1..9e7da14 100644
--- a/src/usr/local/www/system_advanced_sysctl.php
+++ b/src/usr/local/www/system_advanced_sysctl.php
@@ -17,9 +17,9 @@
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
- 2. 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.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
@@ -45,12 +45,6 @@
require("guiconfig.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/system_advanced_sysctl.php');
-}
-
if (!is_array($config['sysctl'])) {
$config['sysctl'] = array();
}
@@ -84,7 +78,6 @@ if ($act == "edit") {
$pconfig['descr'] = $tunables[$id]['descr'];
}
}
-
if ($act == "del") {
if ($a_tunable[$id]) {
/* if this is an AJAX caller then handle via JSON */
@@ -103,7 +96,6 @@ if ($act == "del") {
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -134,9 +126,7 @@ if ($_POST) {
}
mark_subsystem_dirty('sysctl');
-
write_config();
-
pfSenseHeader("system_advanced_sysctl.php");
exit;
}
@@ -145,161 +135,104 @@ if ($_POST) {
$pgtitle = array(gettext("System"), gettext("Advanced: System Tunables"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
- <form action="system_advanced_sysctl.php" method="post">
- <?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
- if (is_subsystem_dirty('sysctl') && ($act != "edit")) {
- print_info_box_np(gettext("The firewall tunables have changed. You must apply the configuration to take affect."));
- }
- ?>
- </form>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system advanced tunables">
- <tr>
- <td>
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+if (is_subsystem_dirty('sysctl') && ($act != "edit" ))
+ print_info_box_np(gettext("The firewall tunables have changed. You must apply the configuration to take affect."));
+
+$tab_array = array();
+$tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
+$tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+$tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+$tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+$tab_array[] = array(gettext("System Tunables"), true, "system_advanced_sysctl.php");
+$tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+display_top_tabs($tab_array);
+
+if ($act != "edit" ): ?>
+<div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title"><?=gettext('System Tunables'); ?></h2>
+ </div>
+ <div class="panel-body">
+ <div class="form-group">
+ <table class="table table-responsive table-hover table-condensed">
+ <caption><strong><?=gettext('NOTE: '); ?></strong><?=gettext('The options on this page are intended for use by advanced users only.'); ?></caption>
+ <thead>
+ <tr>
+ <th class="col-sm-3"><?=gettext("Tunable Name"); ?></th>
+ <th><?=gettext("Description"); ?></th>
+ <th class="col-sm-1"><?=gettext("Value"); ?></th>
+ <th><a class="btn btn-xs btn-primary" href="system_advanced_sysctl.php?act=edit"><?=gettext('New'); ?></a></th>
+ </tr>
+ </thead>
+ <?php foreach ($tunables as $i => $tunable):
+ if (!isset($tunable['modified']))
+ $i = $tunable['tunable']; ?>
+ <tr>
+ <td><?=$tunable['tunable']; ?></td>
+ <td><?=$tunable['descr']; ?></td>
+ <td><?=$tunable['value']; ?>
+ <?php if($tunable['value'] == "default")
+ echo "(" . get_default_sysctl_value($tunable['tunable']) . ")"; ?>
+ </td>
+ <td>
+ <a class="btn btn-xs btn-primary" href="system_advanced_sysctl.php?act=edit&amp;id=<?=$i;?>"><?=gettext('Edit'); ?></a>
+ <?php if (isset($tunable['modified'])): ?>
+ <a class="btn btn-xs btn-danger" href="system_advanced_sysctl.php?act=del&amp;id=<?=$i;?>"><?=gettext('Delete/Reset'); ?></a>
+ <?php endif; ?>
+ </td>
+ </tr>
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), true, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
+ endforeach;
+ unset($tunables);
?>
- </td>
- </tr>
- <?php if ($act != "edit"): ?>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <span class="vexpl">
- <span class="red">
- <strong><?=gettext("NOTE:"); ?>&nbsp;</strong>
- </span>
- <?=gettext("The options on this page are intended for use by advanced users only."); ?>
- <br />
- </span>
- <br />
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Tunable Name"); ?></td>
- <td width="60%" class="listhdrr"><?=gettext("Description"); ?></td>
- <td width="20%" class="listhdrr"><?=gettext("Value"); ?></td>
- </tr>
- <?php foreach ($tunables as $i => $tunable):
-
- if (!isset($tunable['modified'])) {
- $i = urlencode($tunable['tunable']);
- }
- ?>
- <tr>
- <td class="listlr" ondblclick="document.location='system_advanced_sysctl.php?act=edit&amp;id=<?=$i;?>';">
- <?php echo htmlspecialchars($tunable['tunable']); ?>
- </td>
- <td class="listr" align="left" ondblclick="document.location='system_advanced_sysctl.php?act=edit&amp;id=<?=$i;?>';">
- <?php echo htmlspecialchars($tunable['descr']); ?>
- </td>
- <td class="listr" align="left" ondblclick="document.location='system_advanced_sysctl.php?act=edit&amp;id=<?=$i;?>';">
- <?php echo htmlspecialchars($tunable['value']); ?>
- <?php
- if ($tunable['value'] == "default") {
- echo "(" . get_default_sysctl_value($tunable['tunable']) . ")";
- }
- ?>
- </td>
- <td class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit delete">
- <tr>
- <td valign="middle">
- <a href="system_advanced_sysctl.php?act=edit&amp;id=<?=$i;?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="" />
- </a>
- </td>
- <?php if (isset($tunable['modified'])): ?>
- <td valign="middle">
- <a href="system_advanced_sysctl.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this entry?"); ?>')">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="" />
- </a>
- </td>
- <?php endif; ?>
- </tr>
- </table>
- </td>
- </tr>
- <?php endforeach; unset($tunables); ?>
- <tr>
- <td class="list" colspan="3">
- </td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tr>
- <td valign="middle">
- <a href="system_advanced_sysctl.php?act=edit">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- <?php else: ?>
- <tr>
- <td>
- <div id="mainarea">
- <form action="system_advanced_sysctl.php" method="post" name="iform" id="iform">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="edit system tunable">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit system tunable"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Tunable"); ?></td>
- <td width="78%" class="vtable">
- <input size="65" name="tunable" value="<?php echo htmlspecialchars($pconfig['tunable']); ?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <textarea rows="7" cols="50" name="descr"><?php echo htmlspecialchars($pconfig['descr']); ?></textarea>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Value"); ?></td>
- <td width="78%" class="vtable">
- <input size="65" name="value" value="<?php echo htmlspecialchars($pconfig['value']); ?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_tunable[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </form>
- </div>
- </td>
- </tr>
- <?php endif; ?>
- </table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </table>
+ </div>
+ </div>
+</div>
+
+<?php else:
+ require('classes/Form.class.php');
+ $form = new Form;
+ $section = new Form_Section('Edit Tunable');
+
+ $section->addInput(new Form_Input(
+ 'tunable',
+ 'Tunable',
+ 'text',
+ $pconfig['tunable']
+ ))->setWidth(4);
+
+ $section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+ ))->setWidth(4);
+
+ $section->addInput(new Form_Input(
+ 'value',
+ 'Value',
+ 'text',
+ $pconfig['value']
+ ))->setWidth(4);
+
+ if (isset($id) && $a_tunable[$id]) {
+ $form->addGlobal(new Form_Input(
+ 'id',
+ 'id',
+ 'hidden',
+ $id
+ ));
+ }
+
+ $form->add($section);
+
+ print $form;
+
+endif;
+
+include("fend.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_authservers.php b/src/usr/local/www/system_authservers.php
index 0b7c81d..52e9715 100644
--- a/src/usr/local/www/system_authservers.php
+++ b/src/usr/local/www/system_authservers.php
@@ -328,585 +328,330 @@ if ($_POST) {
}
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
-
-function server_typechange(typ) {
-
- var idx = 0;
- if (!typ) {
- idx = document.getElementById("type").selectedIndex;
- typ = document.getElementById("type").options[idx].value;
- }
-
- switch (typ) {
- case "ldap":
- document.getElementById("ldap").style.display="";
- document.getElementById("radius").style.display="none";
- break;
- case "radius":
- document.getElementById("ldap").style.display="none";
- document.getElementById("radius").style.display="";
- break;
- }
-}
-
-function ldap_urlchange() {
- switch (document.getElementById("ldap_urltype").selectedIndex) {
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
+$tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
+$tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
+$tab_array[] = array(gettext("Servers"), true, "system_authservers.php");
+display_top_tabs($tab_array);
+
+if (!($act == "new" || $act == "edit" || $input_errors))
+{
+ ?>
+ <div class="table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><?=gettext("Server Name")?></th>
+ <th><?=gettext("Type")?></th>
+ <th><?=gettext("Host Name")?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach($a_server as $i => $server): ?>
+ <tr>
+ <td><?=htmlspecialchars($server['name'])?></td>
+ <td><?=htmlspecialchars($auth_server_types[$server['type']])?></td>
+ <td><?=htmlspecialchars($server['host'])?></td>
+ <td>
+ <?php if ($i < (count($a_server) - 1)): ?>
+ <a href="system_authservers.php?act=edit&amp;id=<?=$i?>" class="btn btn-xs btn-primary">edit</a>
+ <a href="system_authservers.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger">delete</a>
+ <?php endif?>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+ </div>
+
+ <nav class="action-buttons">
+ <a href="?act=new" class="btn btn-success">add new</a>
+ </nav>
<?php
- $index = 0;
- foreach ($ldap_urltypes as $urltype => $urlport):
-?>
- case <?=$index;?>:
- document.getElementById("ldap_port").value = "<?=$urlport;?>";
- break;
-<?php
- $index++;
- endforeach;
-?>
- }
+ include("foot.inc");
+ exit;
}
-function ldap_bindchange() {
-
- if (document.getElementById("ldap_anon").checked) {
- document.getElementById("ldap_bind").style.display="none";
- } else {
- document.getElementById("ldap_bind").style.display="";
- }
+require('classes/Form.class.php');
+$form = new Form;
+$form->setAction('system_authservers.php?act=edit');
+$form->addGlobal(new Form_Input(
+ 'userid',
+ null,
+ 'hidden',
+ $id
+));
+
+$section = new Form_Section('Server settings');
+
+$section->addInput($input = new Form_Input(
+ 'name',
+ 'Descriptive name',
+ 'text',
+ $pconfig['name']
+));
+
+if ($act == 'edit')
+ $input->setReadonly();
+
+$section->addInput($input = new Form_Select(
+ 'type',
+ 'Type',
+ $pconfig['type'],
+ $auth_server_types
+))->toggles();
+
+if ($act == 'edit')
+ $input->setDisabled();
+
+$form->add($section);
+$section = new Form_Section('LDAP Server Settings');
+$section->addClass('toggle-ldap collapse');
+
+if (!isset($pconfig['type']) || $pconfig['type'] == 'ldap')
+ $section->addClass('in');
+
+$section->addInput(new Form_Input(
+ 'ldap_host',
+ 'Hostname or IP address',
+ 'text',
+ $pconfig['ldap_host']
+))->setHelp('NOTE: When using SSL, this hostname MUST match the Common Name '.
+ '(CN) of the LDAP server"s SSL Certificate.');
+
+$section->addInput(new Form_Input(
+ 'ldap_port',
+ 'Port value',
+ 'number',
+ $pconfig['ldap_port']
+));
+
+$section->addInput(new Form_Select(
+ 'ldap_urltype',
+ 'Transport',
+ $pconfig['ldap_urltype'],
+ array_combine(array_keys($ldap_urltypes), array_keys($ldap_urltypes))
+));
+
+if (empty($a_ca))
+{
+ $section->addInput(new Form_StaticText(
+ 'Peer Certificate Authority',
+ 'No Certificate Authorities defined.<br/>Create one under <a href="system_camanager.php">System &gt; Cert Manager</a>.'
+ ));
}
-
-function ldap_tmplchange() {
- switch (document.getElementById("ldap_tmpltype").selectedIndex) {
-<?php
- $index = 0;
- foreach ($ldap_templates as $tmpldata):
-?>
- case <?=$index;?>:
- document.getElementById("ldap_attr_user").value = "<?=$tmpldata['attr_user'];?>";
- document.getElementById("ldap_attr_group").value = "<?=$tmpldata['attr_group'];?>";
- document.getElementById("ldap_attr_member").value = "<?=$tmpldata['attr_member'];?>";
- break;
-<?php
- $index++;
- endforeach;
-?>
- }
+else
+{
+ $ldapCaRef = [];
+ foreach ($a_ca as $ca)
+ $ldapCaRef[ $ca['refid'] ] = $ca['descr'];
+
+ $section->addInput(new Form_Select(
+ 'ldap_caref',
+ 'Peer Certificate Authority',
+ $pconfig['ldap_caref'],
+ $ldapCaRef
+ ))->setHelp('This option is used if \'SSL Encrypted\' option is choosen. '.
+ 'It must match with the CA in the AD otherwise problems will arise.');
}
-function radius_srvcschange() {
- switch (document.getElementById("radius_srvcs").selectedIndex) {
- case 0: // both
- document.getElementById("radius_auth").style.display="";
- document.getElementById("radius_acct").style.display="";
- break;
- case 1: // authentication
- document.getElementById("radius_auth").style.display="";
- document.getElementById("radius_acct").style.display="none";
- break;
- case 2: // accounting
- document.getElementById("radius_auth").style.display="none";
- document.getElementById("radius_acct").style.display="";
- break;
- }
+$section->addInput(new Form_Select(
+ 'ldap_protver',
+ 'Protocol version',
+ $pconfig['ldap_protver'],
+ array_combine($ldap_protvers, $ldap_protvers)
+));
+
+$group = new Form_Group('Search scope');
+$group->add(new Form_Select(
+ 'ldap_scope',
+ 'Level',
+ $pconfig['ldap_scope'],
+ $ldap_scopes
+));
+$group->add(new Form_Input(
+ 'ldap_basedn',
+ 'Base DN',
+ 'text',
+ $pconfig['ldap_basedn']
+));
+$section->add($group);
+
+$group = new Form_Group('Authentication containers');
+$group->add(new Form_Input(
+ 'ldapauthcontainers',
+ 'Containers',
+ 'text',
+ $pconfig['ldap_authcn']
+))->setHelp('Note: Semi-Colon separated. This will be prepended to the search '.
+ 'base dn above or you can specify full container path containing a dc= '.
+ 'component.<br/>Example: CN=Users;DC=example,DC=com or OU=Staff;OU=Freelancers');
+#FIXME
+$group->add(new Form_Button(
+ 'Select',
+ 'Select a container',
+ '/system_usermanager_settings_ldapacpicker.php?port=389&host=192.168.1.1&scope=one&basedn=CN=pfsense&binddn=&bindpw=&urltype=TCP%20-%20Standard&proto=3&authcn=OU=Staff&cert='
+));
+$section->add($group);
+
+$section->addInput(new Form_Checkbox(
+ 'ldap_extended_enabled',
+ 'Extended query',
+ 'Enable extended query',
+ $pconfig['ldap_extended_enabled']
+))->toggles('.toggle-extended');
+
+$group = new Form_Group('Query');
+$group->addClass('toggle-extended collapse');
+$group->add(new Form_Input(
+ 'ldap_extended_query',
+ 'Query',
+ 'text',
+ $pconfig['ldap_extended_query']
+))->setHelp('Example: &amp;(objectClass=inetOrgPerson)(mail=*@example.com)');
+
+$section->add($group);
+
+$section->addInput(new Form_Checkbox(
+ 'ldap_anon',
+ 'Bind anonymous',
+ 'Use anonymous binds to resolve distinguished names',
+ $pconfig['ldap_anon']
+))->toggles('.toggle-anon');
+
+$group = new Form_Group('Bind credentials');
+$group->addClass('toggle-anon collapse');
+$group->add(new Form_Input(
+ 'ldap_binddn',
+ 'User DN:',
+ 'text',
+ $pconfig['ldap_binddn']
+));
+$group->add(new Form_Input(
+ 'ldap_bindpw',
+ 'Password',
+ 'text',
+ $pconfig['ldap_bindpw']
+));
+$section->add($group);
+
+if ($act == 'add')
+{
+ $ldap_templates = array_map($ldap_templates, function($t){ return $t['desc']; });
+
+ $section->addInput(new Form_Select(
+ 'ldap_tmpltype',
+ 'Initial Template',
+ $pconfig['ldap_template'],
+ $ldap_templates
+ ));
}
-function select_clicked() {
- if (document.getElementById("ldap_port").value == '' ||
- document.getElementById("ldap_host").value == '' ||
- document.getElementById("ldap_scope").value == '' ||
- document.getElementById("ldap_basedn").value == '' ||
- document.getElementById("ldapauthcontainers").value == '') {
- alert("<?=gettext("Please fill the required values.");?>");
- return;
- }
- if (!document.getElementById("ldap_anon").checked) {
- if (document.getElementById("ldap_binddn").value == '' ||
- document.getElementById("ldap_bindpw").value == '') {
- alert("<?=gettext("Please fill the bind username/password.");?>");
- return;
- }
- }
- var url = 'system_usermanager_settings_ldapacpicker.php?';
- url += 'port=' + document.getElementById("ldap_port").value;
- url += '&host=' + document.getElementById("ldap_host").value;
- url += '&scope=' + document.getElementById("ldap_scope").value;
- url += '&basedn=' + document.getElementById("ldap_basedn").value;
- url += '&binddn=' + document.getElementById("ldap_binddn").value;
- url += '&bindpw=' + document.getElementById("ldap_bindpw").value;
- url += '&urltype=' + document.getElementById("ldap_urltype").value;
- url += '&proto=' + document.getElementById("ldap_protver").value;
- url += '&authcn=' + document.getElementById("ldapauthcontainers").value;
- <?php if (count($a_ca) > 0): ?>
- url += '&cert=' + document.getElementById("ldap_caref").value;
- <?php else: ?>
- url += '&cert=';
- <?php endif; ?>
-
- var oWin = window.open(url, "pfSensePop", "width=620,height=400,top=150,left=150");
- if (oWin == null || typeof(oWin) == "undefined") {
- alert("<?=gettext('Popup blocker detected. Action aborted.');?>");
- }
+$section->addInput(new Form_Input(
+ 'ldap_attr_user',
+ 'User naming attribute',
+ 'text',
+ $pconfig['ldap_attr_user']
+));
+
+$section->addInput(new Form_Input(
+ 'ldap_attr_group',
+ 'Group naming attribute',
+ 'text',
+ $pconfig['ldap_attr_group']
+));
+
+$section->addInput(new Form_Input(
+ 'ldap_attr_member',
+ 'Group member attribute',
+ 'text',
+ $pconfig['ldap_attr_member']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'ldap_utf8',
+ 'UTF8 Encode',
+ 'UTF8 encode LDAP parameters before sending them to the server.',
+ $pconfig['ldap_utf8']
+))->setHelp('Required to support international characters, but may not be '.
+ 'supported by every LDAP server.');
+
+$section->addInput(new Form_Checkbox(
+ 'ldap_nostrip_at',
+ 'Username Alterations',
+ 'Do not strip away parts of the username after the @ symbol',
+ $pconfig['ldap_nostrip_at']
+))->setHelp('e.g. user@host becomes user when unchecked.');
+
+$form->add($section);
+$section = new Form_Section('Radius Server Settings');
+$section->addClass('toggle-radius collapse');
+
+$section->addInput(new Form_Input(
+ 'radius_host',
+ 'Hostname or IP address',
+ 'text',
+ $pconfig['radius_host']
+));
+
+$section->addInput(new Form_Input(
+ 'radius_secret',
+ 'Shared Secret',
+ 'text',
+ $pconfig['radius_secret']
+));
+
+$section->addInput(new Form_Select(
+ 'radius_srvcs',
+ 'Services offered',
+ $pconfig['radius_srvcs'],
+ $radius_srvcs
+));
+
+$section->addInput(new Form_Input(
+ 'radius_auth_port',
+ 'Authentication port value',
+ 'number',
+ $pconfig['radius_secret']
+));
+
+$section->addInput(new Form_Input(
+ 'radius_acct_port',
+ 'Authentication Timeout',
+ 'number',
+ $pconfig['radius_acct_port']
+));
+
+$section->addInput(new Form_Input(
+ 'radius_timeout',
+ 'Authentication Timeout',
+ 'number',
+ $pconfig['radius_timeout']
+))->setHelp('This value controls how long, in seconds, that the RADIUS '.
+ 'server may take to respond to an authentication request. If left blank, the '.
+ 'default value is 5 seconds. NOTE: If you are using an interactive two-factor '.
+ 'authentication system, increase this timeout to account for how long it will '.
+ 'take the user to receive and enter a token.');
+
+if (isset($id) && $a_server[$id])
+{
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
}
-//]]>
-</script>
-<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="auth servers">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
- $tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
- $tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
- $tab_array[] = array(gettext("Servers"), true, "system_authservers.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
-
- <?php if ($act == "new" || $act == "edit" || $input_errors): ?>
-
- <form action="system_authservers.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
- <td width="78%" class="vtable">
- <?php if (!isset($id)): ?>
- <input name="name" type="text" class="formfld unknown" id="name" size="20" value="<?=htmlspecialchars($pconfig['name']);?>"/>
- <?php else: ?>
- <strong><?=htmlspecialchars($pconfig['name']);?></strong>
- <input name='name' type='hidden' id='name' value="<?=htmlspecialchars($pconfig['name']);?>"/>
- <?php endif; ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Type");?></td>
- <td width="78%" class="vtable">
- <?php if (!isset($id)): ?>
- <select name='type' id='type' class="formselect" onchange='server_typechange()'>
- <?php
- foreach ($auth_server_types as $typename => $typedesc):
- $selected = "";
- if ($pconfig['type'] == $typename) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$typename;?>" <?=$selected;?>><?=$typedesc;?></option>
- <?php endforeach; ?>
- </select>
- <?php else: ?>
- <strong><?=$auth_server_types[$pconfig['type']];?></strong>
- <input name='type' type='hidden' id='type' value="<?=htmlspecialchars($pconfig['type']);?>"/>
- <?php endif; ?>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="ldap" style="display:none" summary="">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("LDAP Server Settings");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname or IP address");?></td>
- <td width="78%" class="vtable">
- <input name="ldap_host" type="text" class="formfld unknown" id="ldap_host" size="20" value="<?=htmlspecialchars($pconfig['ldap_host']);?>"/>
- <br /><?= gettext("NOTE: When using SSL, this hostname MUST match the Common Name (CN) of the LDAP server's SSL Certificate."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Port value");?></td>
- <td width="78%" class="vtable">
- <input name="ldap_port" type="text" class="formfld unknown" id="ldap_port" size="5" value="<?=htmlspecialchars($pconfig['ldap_port']);?>"/>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Transport");?></td>
- <td width="78%" class="vtable">
- <select name='ldap_urltype' id='ldap_urltype' class="formselect" onchange='ldap_urlchange()'>
- <?php
- foreach ($ldap_urltypes as $urltype => $urlport):
- $selected = "";
- if ($pconfig['ldap_urltype'] == $urltype) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$urltype;?>" <?=$selected;?>><?=$urltype;?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr id="tls_ca">
- <td width="22%" valign="top" class="vncell"><?=gettext("Peer Certificate Authority"); ?></td>
- <td width="78%" class="vtable">
- <?php if (count($a_ca)): ?>
- <select id='ldap_caref' name='ldap_caref' class="formselect">
- <?php
- foreach ($a_ca as $ca):
- $selected = "";
- if ($pconfig['ldap_caref'] == $ca['refid']) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$ca['refid'];?>" <?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
- <?php endforeach; ?>
- </select>
- <br /><span><?=gettext("This option is used if 'SSL Encrypted' option is chosen.");?> <br />
- <?=gettext("It must match with the CA in the AD otherwise problems will arise.");?></span>
- <?php else: ?>
- <b>No Certificate Authorities defined.</b> <br />Create one under <a href="system_camanager.php">System &gt; Cert Manager</a>.
- <?php endif; ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol version");?></td>
- <td width="78%" class="vtable">
- <select name='ldap_protver' id='ldap_protver' class="formselect">
- <?php
- foreach ($ldap_protvers as $version):
- $selected = "";
- if ($pconfig['ldap_protver'] == $version) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$version;?>" <?=$selected;?>><?=$version;?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Search scope");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="2" summary="search scope">
- <tr>
- <td><?=gettext("Level:");?> &nbsp;</td>
- <td>
- <select name='ldap_scope' id='ldap_scope' class="formselect">
- <?php
- foreach ($ldap_scopes as $scopename => $scopedesc):
- $selected = "";
- if ($pconfig['ldap_scope'] == $scopename) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$scopename;?>" <?=$selected;?>><?=$scopedesc;?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Base DN:");?> &nbsp;</td>
- <td>
- <input name="ldap_basedn" type="text" class="formfld unknown" id="ldap_basedn" size="40" value="<?=htmlspecialchars($pconfig['ldap_basedn']);?>"/>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Authentication containers");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="2" summary="auth containers">
- <tr>
- <td><?=gettext("Containers:");?> &nbsp;</td>
- <td>
- <input name="ldapauthcontainers" type="text" class="formfld unknown" id="ldapauthcontainers" size="40" value="<?=htmlspecialchars($pconfig['ldap_authcn']);?>"/>
- <input type="button" onclick="select_clicked();" value="<?=gettext("Select");?>" />
- <br /><?=gettext("Note: Semi-Colon separated. This will be prepended to the search base dn above or you can specify full container path containing a dc= component.");?>
- <br /><?=gettext("Example:");?> CN=Users;DC=example,DC=com
- <br /><?=gettext("Example:");?> OU=Staff;OU=Freelancers
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Extended Query");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="2" summary="query">
- <tr>
- <td>
- <input name="ldap_extended_enabled" type="checkbox" id="ldap_extended_enabled" value="no" <?php if ($pconfig['ldap_extended_enabled']) echo "checked=\"checked\""; ?> />
- </td>
- <td>
-
- <input name="ldap_extended_query" type="text" class="formfld unknown" id="ldap_extended_query" size="40" value="<?=htmlspecialchars($pconfig['ldap_extended_query']);?>"/>
- <br /><?=gettext("Example:");?> &amp;(objectClass=inetOrgPerson)(mail=*@example.com)
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Bind credentials");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="2" summary="bind credentials">
- <tr>
- <td>
- <input name="ldap_anon" type="checkbox" id="ldap_anon" value="yes" <?php if ($pconfig['ldap_anon']) echo "checked=\"checked\""; ?> onclick="ldap_bindchange()" />
- </td>
- <td>
- <?=gettext("Use anonymous binds to resolve distinguished names");?>
- </td>
- </tr>
- </table>
- <table border="0" cellspacing="0" cellpadding="2" id="ldap_bind" summary="bind">
- <tr>
- <td colspan="2"></td>
- </tr>
- <tr>
- <td><?=gettext("User DN:");?> &nbsp;</td>
- <td>
- <input name="ldap_binddn" type="text" class="formfld unknown" id="ldap_binddn" size="40" value="<?=htmlspecialchars($pconfig['ldap_binddn']);?>"/><br />
- </td>
- </tr>
- <tr>
- <td><?=gettext("Password:");?> &nbsp;</td>
- <td>
- <input name="ldap_bindpw" type="password" class="formfld pwd" id="ldap_bindpw" size="20" value="<?=htmlspecialchars($pconfig['ldap_bindpw']);?>"/><br />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <?php if (!isset($id)): ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Initial Template");?></td>
- <td width="78%" class="vtable">
- <select name='ldap_tmpltype' id='ldap_tmpltype' class="formselect" onchange='ldap_tmplchange()'>
- <?php
- foreach ($ldap_templates as $tmplname => $tmpldata):
- $selected = "";
- if ($pconfig['ldap_template'] == $tmplname) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$tmplname;?>" <?=$selected;?>><?=$tmpldata['desc'];?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <?php endif; ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("User naming attribute");?></td>
- <td width="78%" class="vtable">
- <input name="ldap_attr_user" type="text" class="formfld unknown" id="ldap_attr_user" size="20" value="<?=htmlspecialchars($pconfig['ldap_attr_user']);?>"/>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Group naming attribute");?></td>
- <td width="78%" class="vtable">
- <input name="ldap_attr_group" type="text" class="formfld unknown" id="ldap_attr_group" size="20" value="<?=htmlspecialchars($pconfig['ldap_attr_group']);?>"/>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Group member attribute");?></td>
- <td width="78%" class="vtable">
- <input name="ldap_attr_member" type="text" class="formfld unknown" id="ldap_attr_member" size="20" value="<?=htmlspecialchars($pconfig['ldap_attr_member']);?>"/>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("UTF8 Encode");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="2" summary="utf8 encoding">
- <tr>
- <td>
- <input name="ldap_utf8" type="checkbox" id="ldap_utf8" value="yes" <?php if ($pconfig['ldap_utf8']) echo "checked=\"checked\""; ?> />
- </td>
- <td>
- <?=gettext("UTF8 encode LDAP parameters before sending them to the server. Required to support international characters, but may not be supported by every LDAP server.");?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Username Alterations");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="2" summary="username alterations">
- <tr>
- <td>
- <input name="ldap_nostrip_at" type="checkbox" id="ldap_nostrip_at" value="yes" <?php if ($pconfig['ldap_nostrip_at']) echo "checked=\"checked\""; ?> />
- </td>
- <td>
- <?=gettext("Do not strip away parts of the username after the @ symbol, e.g. user@host becomes user when unchecked.");?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="radius" style="display:none" summary="">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Radius Server Settings");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname or IP address");?></td>
- <td width="78%" class="vtable">
- <input name="radius_host" type="text" class="formfld unknown" id="radius_host" size="20" value="<?=htmlspecialchars($pconfig['radius_host']);?>"/>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Shared Secret");?></td>
- <td width="78%" class="vtable">
- <input name="radius_secret" type="password" class="formfld pwd" id="radius_secret" size="20" value="<?=htmlspecialchars($pconfig['radius_secret']);?>"/>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Services offered");?></td>
- <td width="78%" class="vtable">
- <select name='radius_srvcs' id='radius_srvcs' class="formselect" onchange='radius_srvcschange()'>
- <?php
- foreach ($radius_srvcs as $srvcname => $srvcdesc):
- $selected = "";
- if ($pconfig['radius_srvcs'] == $srvcname) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$srvcname;?>" <?=$selected;?>><?=$srvcdesc;?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr id="radius_auth">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Authentication port value");?></td>
- <td width="78%" class="vtable">
- <input name="radius_auth_port" type="text" class="formfld unknown" id="radius_auth_port" size="5" value="<?=htmlspecialchars($pconfig['radius_auth_port']);?>"/>
- </td>
- </tr>
- <tr id="radius_acct">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Accounting port value");?></td>
- <td width="78%" class="vtable">
- <input name="radius_acct_port" type="text" class="formfld unknown" id="radius_acct_port" size="5" value="<?=htmlspecialchars($pconfig['radius_acct_port']);?>"/>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Authentication Timeout");?></td>
- <td width="78%" class="vtable">
- <input name="radius_timeout" type="text" class="formfld unknown" id="radius_timeout" size="20" value="<?=htmlspecialchars($pconfig['radius_timeout']);?>"/>
- <br /><?= gettext("This value controls how long, in seconds, that the RADIUS server may take to respond to an authentication request.") ?>
- <br /><?= gettext("If left blank, the default value is 5 seconds.") ?>
- <br /><br /><?= gettext("NOTE: If you are using an interactive two-factor authentication system, increase this timeout to account for how long it will take the user to receive and enter a token.") ?>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="">
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <?php if (isset($id) && $a_server[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif;?>
- </td>
- </tr>
- </table>
- </form>
-
- <?php else: ?>
-
- <table class="sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
- <thead>
- <tr>
- <th width="25%" class="listhdrr"><?=gettext("Server Name");?></th>
- <th width="25%" class="listhdrr"><?=gettext("Type");?></th>
- <th width="35%" class="listhdrr"><?=gettext("Host Name");?></th>
- <th width="10%" class="list"></th>
- </tr>
- </thead>
- <tfoot>
- <tr>
- <td class="list" colspan="3"></td>
- <td class="list">
- <a href="system_authservers.php?act=new">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add server");?>" alt="<?=gettext("add server");?>" width="17" height="17" border="0" />
- </a>
- </td>
- </tr>
- <tr>
- <td colspan="3">
- <p>
- <?=gettext("Additional authentication servers can be added here.");?>
- </p>
- </td>
- </tr>
- </tfoot>
- <tbody>
- <?php
- $i = 0;
- foreach ($a_server as $server):
- $name = htmlspecialchars($server['name']);
- $type = htmlspecialchars($auth_server_types[$server['type']]);
- $host = htmlspecialchars($server['host']);
- ?>
- <tr <?php if ($i < (count($a_server) - 1)): ?> ondblclick="document.location='system_authservers.php?act=edit&amp;id=<?=$i;?>'" <?php endif; ?>>
- <td class="listlr"><?=$name?>&nbsp;</td>
- <td class="listr"><?=$type;?>&nbsp;</td>
- <td class="listr"><?=$host;?>&nbsp;</td>
- <td valign="middle" class="list nowrap">
- <?php if ($i < (count($a_server) - 1)): ?>
- <a href="system_authservers.php?act=edit&amp;id=<?=$i;?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit server");?>" alt="<?=gettext("edit server");?>" width="17" height="17" border="0" />
- </a>
- &nbsp;
- <a href="system_authservers.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this Server?");?>')">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete server");?>" alt="<?=gettext("delete server");?>" width="17" height="17" border="0" />
- </a>
- <?php endif; ?>
- </td>
- </tr>
- <?php
- $i++;
- endforeach;
- ?>
- </tbody>
- </table>
-
- <?php endif; ?>
-
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
-server_typechange('<?=htmlspecialchars($pconfig['type']);?>');
-<?php if (!isset($id) || $pconfig['type'] == "ldap"): ?>
-ldap_bindchange();
-if (document.getElementById("ldap_port").value == "") {
- ldap_urlchange();
-}
-<?php if (!isset($id)): ?>
-ldap_tmplchange();
-<?php endif; ?>
-<?php endif; ?>
-<?php if (!isset($id) || $pconfig['type'] == "radius"): ?>
-radius_srvcschange();
-<?php endif; ?>
-//]]>
-</script>
-</body>
-</html>
+
+$form->add($section);
+print $form;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_camanager.php b/src/usr/local/www/system_camanager.php
index 368b30c..f2bb3e5 100644
--- a/src/usr/local/www/system_camanager.php
+++ b/src/usr/local/www/system_camanager.php
@@ -269,7 +269,7 @@ if ($_POST) {
$ca['descr'] = $pconfig['descr'];
- if ($_POST['edit'] == "edit") {
+ if ($act == "edit") {
$ca['descr'] = $pconfig['descr'];
$ca['refid'] = $pconfig['refid'];
$ca['serial'] = $pconfig['serial'];
@@ -329,442 +329,277 @@ if ($_POST) {
}
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
-
-function method_change() {
-
- method = document.iform.method.selectedIndex;
-
- switch (method) {
- case 0:
- document.getElementById("existing").style.display="";
- document.getElementById("internal").style.display="none";
- document.getElementById("intermediate").style.display="none";
- break;
- case 1:
- document.getElementById("existing").style.display="none";
- document.getElementById("internal").style.display="";
- document.getElementById("intermediate").style.display="none";
- break;
- case 2:
- document.getElementById("existing").style.display="none";
- document.getElementById("internal").style.display="";
- document.getElementById("intermediate").style.display="";
- break;
- }
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+
+// Load valid country codes
+$dn_cc = array();
+if (file_exists("/etc/ca_countries")){
+ $dn_cc_file=file("/etc/ca_countries");
+ foreach($dn_cc_file as $line)
+ if (preg_match('/^(\S*)\s(.*)$/', $line, $matches))
+ array_push($dn_cc, $matches[1]);
}
-//]]>
-</script>
-<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
+$tab_array = array();
+$tab_array[] = array(gettext("CAs"), true, "system_camanager.php");
+$tab_array[] = array(gettext("Certificates"), false, "system_certmanager.php");
+$tab_array[] = array(gettext("Certificate Revocation"), false, "system_crlmanager.php");
+display_top_tabs($tab_array);
- // Load valid country codes
- $dn_cc = array();
- if (file_exists("/etc/ca_countries")) {
- $dn_cc_file=file("/etc/ca_countries");
- foreach ($dn_cc_file as $line) {
- if (preg_match('/^(\S*)\s(.*)$/', $line, $matches)) {
- array_push($dn_cc, $matches[1]);
- }
- }
- }
+if (!($act == "new" || $act == "edit" || $act == gettext("Save") || $input_errors))
+{
+?>
+<div class="table-responsive">
+<table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><?=gettext("Name")?></th>
+ <th><?=gettext("Internal")?></th>
+ <th><?=gettext("Issuer")?></th>
+ <th><?=gettext("Certificates")?></th>
+ <th><?=gettext("Distinguished Name")?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+foreach ($a_ca as $i => $ca):
+ $name = htmlspecialchars($ca['descr']);
+ $subj = cert_get_subject($ca['crt']);
+ $issuer = cert_get_issuer($ca['crt']);
+ list($startdate, $enddate) = cert_get_dates($ca['crt']);
+ if ($subj == $issuer)
+ $issuer_name = gettext("self-signed");
+ else
+ $issuer_name = gettext("external");
+ $subj = htmlspecialchars($subj);
+ $issuer = htmlspecialchars($issuer);
+ $certcount = 0;
+
+ $issuer_ca = lookup_ca($ca['caref']);
+ if ($issuer_ca)
+ $issuer_name = $issuer_ca['descr'];
+
+ // TODO : Need gray certificate icon
+ $internal = (!!$ca['prv']);
+
+ foreach ($a_cert as $cert)
+ if ($cert['caref'] == $ca['refid'])
+ $certcount++;
+
+ foreach ($a_ca as $cert)
+ if ($cert['caref'] == $ca['refid'])
+ $certcount++;
?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="CA manager">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("CAs"), true, "system_camanager.php");
- $tab_array[] = array(gettext("Certificates"), false, "system_certmanager.php");
- $tab_array[] = array(gettext("Certificate Revocation"), false, "system_crlmanager.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
-
- <?php if ($act == "new" || $act == "edit" || $act == gettext("Save") || $input_errors): ?>
-
- <form action="system_camanager.php" method="post" name="iform" id="iform">
- <?php if ($act == "edit"): ?>
- <input type="hidden" name="edit" value="edit" id="edit" />
- <input type="hidden" name="id" value="<?php echo htmlspecialchars($id); ?>" id="id" />
- <input type="hidden" name="refid" value="<?php echo $pconfig['refid']; ?>" id="refid" />
- <?php endif; ?>
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>"/>
- </td>
- </tr>
- <?php if (!isset($id) || $act == "edit"): ?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Method");?></td>
- <td width="78%" class="vtable">
- <select name='method' id='method' class="formselect" onchange='method_change()'>
- <?php
- foreach ($ca_methods as $method => $desc):
- $selected = "";
- if ($pconfig['method'] == $method) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$method;?>"<?=$selected;?>><?=$desc;?></option>
- <?php
- endforeach;
- ?>
- </select>
- </td>
- </tr>
- <?php endif; ?>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="existing" summary="existing">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Existing Certificate Authority");?></td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate data");?></td>
- <td width="78%" class="vtable">
- <textarea name="cert" id="cert" cols="65" rows="7" class="formfld_cert"><?=htmlspecialchars($pconfig['cert']);?></textarea>
- <br />
- <?=gettext("Paste a certificate in X.509 PEM format here.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate Private Key");?><br /><?=gettext("(optional)");?></td>
- <td width="78%" class="vtable">
- <textarea name="key" id="key" cols="65" rows="7" class="formfld_cert"><?=htmlspecialchars($pconfig['key']);?></textarea>
- <br />
- <?=gettext("Paste the private key for the above certificate here. This is optional in most cases, but required if you need to generate a Certificate Revocation List (CRL).");?>
- </td>
- </tr>
-
- <?php if (!isset($id) || $act == "edit"): ?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Serial for next certificate");?></td>
- <td width="78%" class="vtable">
- <input name="serial" type="text" class="formfld unknown" id="serial" size="20" value="<?=htmlspecialchars($pconfig['serial']);?>"/>
- <br /><?=gettext("Enter a decimal number to be used as the serial number for the next certificate to be created using this CA.");?>
- </td>
- </tr>
- <?php endif; ?>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="internal" summary="internal">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Internal Certificate Authority");?></td>
- </tr>
- <tr id='intermediate'>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Signing Certificate Authority");?></td>
- <td width="78%" class="vtable">
- <select name='caref' id='caref' class="formselect" onchange='internalca_change()'>
- <?php
- foreach ($a_ca as $ca):
- if (!$ca['prv']) {
- continue;
- }
- $selected = "";
- if ($pconfig['caref'] == $ca['refid']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$ca['refid'];?>"<?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
- <?php
- endforeach;
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Key length");?></td>
- <td width="78%" class="vtable">
- <select name='keylen' id='keylen' class="formselect">
- <?php
- foreach ($ca_keylens as $len):
- $selected = "";
- if ($pconfig['keylen'] == $len) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$len;?>"<?=$selected;?>><?=$len;?></option>
- <?php
- endforeach;
- ?>
- </select>
- <?=gettext("bits");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Digest Algorithm");?></td>
- <td width="78%" class="vtable">
- <select name='digest_alg' id='digest_alg' class="formselect">
- <?php
- foreach ($openssl_digest_algs as $digest_alg):
- $selected = "";
- if ($pconfig['digest_alg'] == $digest_alg) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$digest_alg;?>"<?=$selected;?>><?=strtoupper($digest_alg);?></option>
- <?php
- endforeach;
- ?>
- </select>
- <br /><?= gettext("NOTE: It is recommended to use an algorithm stronger than SHA1 when possible.") ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Lifetime");?></td>
- <td width="78%" class="vtable">
- <input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="5" value="<?=htmlspecialchars($pconfig['lifetime']);?>"/>
- <?=gettext("days");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Distinguished name");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="2" summary="name">
- <tr>
- <td align="right"><?=gettext("Country Code");?> : &nbsp;</td>
- <td align="left">
- <select name='dn_country' class="formselect">
- <?php
- foreach ($dn_cc as $cc) {
- $selected = "";
- if ($pconfig['dn_country'] == $cc) {
- $selected = " selected=\"selected\"";
- }
- print "<option value=\"$cc\"$selected>$cc</option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("State or Province");?> : &nbsp;</td>
- <td align="left">
- <input name="dn_state" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['dn_state']);?>"/>
- &nbsp;
- <em><?=gettext("ex:");?></em>
- &nbsp;
- <?=gettext("Texas");?>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("City");?> : &nbsp;</td>
- <td align="left">
- <input name="dn_city" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['dn_city']);?>"/>
- &nbsp;
- <em><?=gettext("ex:");?></em>
- &nbsp;
- <?=gettext("Austin");?>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("Organization");?> : &nbsp;</td>
- <td align="left">
- <input name="dn_organization" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['dn_organization']);?>"/>
- &nbsp;
- <em><?=gettext("ex:");?></em>
- &nbsp;
- <?=gettext("My Company Inc.");?>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("Email Address");?> : &nbsp;</td>
- <td align="left">
- <input name="dn_email" type="text" class="formfld unknown" size="25" value="<?=htmlspecialchars($pconfig['dn_email']);?>"/>
- &nbsp;
- <em><?=gettext("ex:");?></em>
- &nbsp;
- <?=gettext("admin@mycompany.com");?>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("Common Name");?> : &nbsp;</td>
- <td align="left">
- <input name="dn_commonname" type="text" class="formfld unknown" size="25" value="<?=htmlspecialchars($pconfig['dn_commonname']);?>"/>
- &nbsp;
- <em><?=gettext("ex:");?></em>
- &nbsp;
- <?=gettext("internal-ca");?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="save">
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <?php if (isset($id) && $a_ca[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif;?>
- </td>
- </tr>
- </table>
- </form>
-
- <?php else: ?>
-
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Name");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Internal");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Issuer");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Certificates");?></td>
- <td width="40%" class="listhdrr"><?=gettext("Distinguished Name");?></td>
- <td width="10%" class="list"></td>
- </tr>
- <?php
- $i = 0;
- foreach ($a_ca as $ca):
- $name = htmlspecialchars($ca['descr']);
- $subj = cert_get_subject($ca['crt']);
- $issuer = cert_get_issuer($ca['crt']);
- list($startdate, $enddate) = cert_get_dates($ca['crt']);
- if ($subj == $issuer) {
- $issuer_name = "<em>" . gettext("self-signed") . "</em>";
- } else {
- $issuer_name = "<em>" . gettext("external") . "</em>";
- }
- $subj = htmlspecialchars($subj);
- $issuer = htmlspecialchars($issuer);
- $certcount = 0;
-
- $issuer_ca = lookup_ca($ca['caref']);
- if ($issuer_ca) {
- $issuer_name = htmlspecialchars($issuer_ca['descr']);
- }
-
- // TODO : Need gray certificate icon
-
- if ($ca['prv']) {
- $caimg = "/themes/{$g['theme']}/images/icons/icon_frmfld_cert.png";
- $internal = "YES";
-
- } else {
- $caimg = "/themes/{$g['theme']}/images/icons/icon_frmfld_cert.png";
- $internal = "NO";
- }
- foreach ($a_cert as $cert) {
- if ($cert['caref'] == $ca['refid']) {
- $certcount++;
- }
- }
- foreach ($a_ca as $cert) {
- if ($cert['caref'] == $ca['refid']) {
- $certcount++;
- }
- }
- ?>
- <tr>
- <td class="listlr">
- <table border="0" cellpadding="0" cellspacing="0" summary="icon">
- <tr>
- <td align="left" valign="middle">
- <img src="<?=$caimg;?>" alt="CA" title="CA" border="0" height="16" width="16" />
- </td>
- <td align="left" valign="middle">
- <?=$name;?>
- </td>
- </tr>
- </table>
- </td>
- <td class="listr"><?=$internal;?>&nbsp;</td>
- <td class="listr"><?=$issuer_name;?>&nbsp;</td>
- <td class="listr"><?=$certcount;?>&nbsp;</td>
- <td class="listr"><?=$subj;?><br />
- <table width="100%" style="font-size: 9px" summary="valid">
- <tr>
- <td width="10%">&nbsp;</td>
- <td width="20%"><?=gettext("Valid From")?>:</td>
- <td width="70%"><?= $startdate ?></td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td><?=gettext("Valid Until")?>:</td>
- <td><?= $enddate ?></td>
- </tr>
- </table>
- </td>
- <td valign="middle" class="list nowrap">
- <a href="system_camanager.php?act=edit&amp;id=<?=$i;?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit CA");?>" alt="<?=gettext("edit CA");?>" width="17" height="17" border="0" />
- </a>
- <a href="system_camanager.php?act=exp&amp;id=<?=$i;?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("export CA cert");?>" alt="<?=gettext("export CA cert");?>" width="17" height="17" border="0" />
- </a>
- <?php if ($ca['prv']): ?>
- <a href="system_camanager.php?act=expkey&amp;id=<?=$i;?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("export CA private key");?>" alt="<?=gettext("export CA private key");?>" width="17" height="17" border="0" />
- </a>
- <?php endif; ?>
- <a href="system_camanager.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this Certificate Authority and its CRLs, and unreference any associated certificates?");?>')">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete ca");?>" alt="<?=gettext("delete ca"); ?>" width="17" height="17" border="0" />
- </a>
- </td>
- </tr>
- <?php
- $i++;
- endforeach;
- ?>
- <tr>
- <td class="list" colspan="5"></td>
- <td class="list">
- <a href="system_camanager.php?act=new">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add or import ca");?>" alt="<?=gettext("add ca");?>" width="17" height="17" border="0" />
- </a>
- </td>
- </tr>
- <tr>
- <td colspan="5">
- <p>
- <?=gettext("Additional trusted Certificate Authorities can be added here.");?>
- </p>
- </td>
- </tr>
- </table>
-
- <?php endif; ?>
-
- </div>
- </td>
- </tr>
+ <tr>
+ <td><?=$name?></td>
+ <td><?=$internal?></td>
+ <td><i><?=$issuer_name?></i></td>
+ <td><?=$certcount?></td>
+ <td>
+ <?=$subj?>
+ <br />
+ <small>
+ <?=gettext("Valid From")?>: <b><?=$startdate ?></b>, <?=gettext("Valid Until")?>: <b><?=$enddate ?></b>
+ </small>
+ </td>
+ <td>
+ <a href="system_camanager.php?act=edit&amp;id=<?=$i?>" class="btn btn-xs btn-primary">
+ <?=gettext("edit")?>
+ </a>
+ <a href="system_camanager.php?act=exp&amp;id=<?=$i?>" class="btn btn-xs btn-default">
+ <?=gettext("export cert")?>
+ </a>
+ <?php if ($ca['prv']): ?>
+ <a href="system_camanager.php?act=expkey&amp;id=<?=$i?>" class="btn btn-xs btn-default">
+ <?=gettext("export private key")?>
+ </a>
+ <?php endif?>
+ <a href="system_camanager.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger">
+ <?=gettext("delete")?>
+ </a>
+ </td>
+ </tr>
+<?php endforeach; ?>
+ </tbody>
</table>
-<?php include("fend.inc");?>
-<script type="text/javascript">
-//<![CDATA[
-method_change();
+<nav class="action-buttons">
+ <a href="?act=new" class="btn btn-success">add new</a>
+</nav>
+<?
+ include("foot.inc");
+ exit;
+}
-//]]>
-</script>
+require('classes/Form.class.php');
+$form = new Form;
+$form->setAction('system_camanager.php?act=edit');
+if (isset($id) && $a_ca[$id])
+{
+ $form->addGlobal(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+if ($act == "edit")
+{
+ $form->addGlobal(new Form_Input(
+ 'refid',
+ null,
+ 'hidden',
+ $pconfig['refid']
+ ));
+}
+
+$section = new Form_Section('Create / edit CA');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Descriptive name',
+ 'text',
+ $pconfig['descr']
+));
+
+if (!isset($id) || $act == "edit")
+{
+ $section->addInput(new Form_Select(
+ 'method',
+ 'Method',
+ $pconfig['method'],
+ $ca_methods
+ ))->toggles();
+}
+
+$form->add($section);
+
+$section = new Form_Section('Existing Certificate Authority');
+$section->addClass('toggle-existing collapse');
+
+$section->addInput(new Form_Textarea(
+ 'cert',
+ 'Certificate data',
+ $pconfig['cert']
+))->setHelp('Paste a certificate in X.509 PEM format here.');
+
+$section->addInput(new Form_Textarea(
+ 'key',
+ 'Certificate Private Key (optional)',
+ $pconfig['key']
+))->setHelp('Paste the private key for the above certificate here. This is '.
+ 'optional in most cases, but required if you need to generate a '.
+ 'Certificate Revocation List (CRL).');
+
+$section->addInput(new Form_Input(
+ 'serial',
+ 'Serial for next certificate',
+ 'number',
+ $pconfig['serial']
+))->setHelp('Enter a decimal number to be used as the serial number for the next '.
+ 'certificate to be created using this CA.');
+
+$form->add($section);
+
+$section = new Form_Section('Internal Certificate Authority');
+$section->addClass('toggle-internal', 'toggle-intermediate', 'collapse');
+
+$allCas = array();
+foreach ($a_ca as $ca)
+{
+ if (!$ca['prv'])
+ continue;
+
+ $allCas[ $ca['refid'] ] = $ca['descr'];
+}
-</body>
-</html>
+$group = new Form_Group('Signing Certificate Authority');
+$group->addClass('toggle-intermediate');
+$group->add(new Form_Select(
+ 'caref',
+ null,
+ $pconfig['caref'],
+ $allCas
+));
+$section->add($group);
+
+$section->addInput(new Form_Select(
+ 'keylen',
+ 'Key length (bits)',
+ $pconfig['keylen'],
+ array_combine($ca_keylens, $ca_keylens)
+));
+
+$section->addInput(new Form_Select(
+ 'digest_alg',
+ 'Digest Algorithm',
+ $pconfig['digest_alg'],
+ array_combine($openssl_digest_algs, $openssl_digest_algs)
+))->setHelp('NOTE: It is recommended to use an algorithm stronger than SHA1 '.
+ 'when possible.');
+
+$section->addInput(new Form_Input(
+ 'lifetime',
+ 'Lifetime (days)',
+ 'number',
+ $pconfig['lifetime']
+));
+
+$section->addInput(new Form_Select(
+ 'dn_country',
+ 'Country Code',
+ $pconfig['dn_country'],
+ $dn_cc
+));
+
+$section->addInput(new Form_Input(
+ 'dn_state',
+ 'State or Province',
+ 'text',
+ $pconfig['dn_state'],
+ ['placeholder' => 'e.g. Texas']
+));
+
+$section->addInput(new Form_Input(
+ 'dn_city',
+ 'City',
+ 'text',
+ $pconfig['dn_city'],
+ ['placeholder' => 'e.g. Austin']
+));
+
+$section->addInput(new Form_Input(
+ 'dn_organization',
+ 'Organization',
+ 'text',
+ $pconfig['dn_organization'],
+ ['placeholder' => 'e.g. My Company Inc.']
+));
+
+$section->addInput(new Form_Input(
+ 'dn_email',
+ 'Email Address',
+ 'email',
+ $pconfig['dn_email'],
+ ['placeholder' => 'e.g. admin@mycompany.com']
+));
+
+$section->addInput(new Form_Input(
+ 'dn_commonname',
+ 'Common Name',
+ 'text',
+ $pconfig['dn_commonname'],
+ ['placeholder' => 'e.g. internal-ca']
+));
+
+$form->add($section);
+
+print $form;
+
+include('foot.inc'); \ No newline at end of file
diff --git a/src/usr/local/www/system_certmanager.php b/src/usr/local/www/system_certmanager.php
index cd553e6..b26d857 100644
--- a/src/usr/local/www/system_certmanager.php
+++ b/src/usr/local/www/system_certmanager.php
@@ -100,6 +100,7 @@ foreach ($a_ca as $ca) {
}
$act = $_GET['act'];
+
if ($_POST['act']) {
$act = $_POST['act'];
}
@@ -118,6 +119,7 @@ if ($act == "del") {
exit;
}
+
if ($act == "new") {
$pconfig['method'] = $_GET['method'];
$pconfig['keylen'] = "2048";
@@ -264,19 +266,14 @@ if ($_POST) {
do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
if ($pconfig['method'] != "import" && $pconfig['method'] != "existing") {
/* subjectAltNames */
- foreach ($_POST as $key => $value) {
- $entry = '';
- if (!substr_compare('altname_type', $key, 0, 12)) {
- $entry = substr($key, 12);
- $field = 'type';
- }
- elseif (!substr_compare('altname_value', $key, 0, 13)) {
- $entry = substr($key, 13);
- $field = 'value';
- }
- if (ctype_digit($entry)) {
- $altnames[$entry][$field] = $value;
- }
+ foreach ($_POST['altname_value'] as $idx => $value) {
+ if (empty($value))
+ continue;
+
+ $altnames[$idx] = array(
+ 'type' => $_POST['altname_type'][$idx],
+ 'value' => $value
+ );
}
$pconfig['altnames']['item'] = $altnames;
@@ -506,844 +503,490 @@ if ($_POST) {
}
include("head.inc");
+
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+
+$tab_array = array();
+$tab_array[] = array(gettext("CAs"), false, "system_camanager.php");
+$tab_array[] = array(gettext("Certificates"), true, "system_certmanager.php");
+$tab_array[] = array(gettext("Certificate Revocation"), false, "system_crlmanager.php");
+display_top_tabs($tab_array);
+
+// Load valid country codes
+$dn_cc = array();
+if (file_exists("/etc/ca_countries")){
+ $dn_cc_file=file("/etc/ca_countries");
+ foreach($dn_cc_file as $line)
+ if (preg_match('/^(\S*)\s(.*)$/', $line, $matches))
+ array_push($dn_cc, $matches[1]);
+}
+
+if (!($act == "new" || (($_POST['save'] == gettext("Save")) && $input_errors)))
+{
?>
+<div class="table-responsive">
+<table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><?=gettext("Name")?></th>
+ <th><?=gettext("Issuer")?></th>
+ <th><?=gettext("Distinguished Name")?></th>
+ <th><?=gettext("In Use")?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+foreach($a_cert as $i => $cert):
+ $name = htmlspecialchars($cert['descr']);
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
+ if ($cert['crt']) {
+ $subj = cert_get_subject($cert['crt']);
+ $issuer = cert_get_issuer($cert['crt']);
+ $purpose = cert_get_purpose($cert['crt']);
+ list($startdate, $enddate) = cert_get_dates($cert['crt']);
-function method_change() {
+ if ($subj==$issuer)
+ $caname = '<i>'. gettext("self-signed") .'</i>';
+ else
+ $caname = '<i>'. gettext("external").'</i>';
-<?php
- if ($internal_ca_count) {
- $submit_style = "";
- } else {
- $submit_style = "none";
+ $subj = htmlspecialchars($subj);
}
+
+ if ($cert['csr']) {
+ $subj = htmlspecialchars(csr_get_subject($cert['csr']));
+ $caname = "<em>" . gettext("external - signature pending") . "</em>";
+ }
+
+ $ca = lookup_ca($cert['caref']);
+ if ($ca)
+ $caname = $ca['descr'];
?>
+ <tr>
+ <td>
+ <?=$name?>
+ <?php if ($cert['type']): ?>
+ <i><?=$cert_types[$cert['type']]?></i>
+ <?php endif?>
+ <?php if (is_array($purpose)): ?>
+ CA: <b><?=$purpose['ca']?></b>, Server: <b><?=$purpose['server']?></b>
+ <?php endif?>
+ </td>
+ <td><?=$caname?></td>
+ <td>
+ <?=$subj?>
+ <br />
+ <small>
+ <?=gettext("Valid From")?>: <b><?=$startdate ?></b>, <?=gettext("Valid Until")?>: <b><?=$enddate ?></b>
+ </small>
+ </td>
+ <td>
+ <?php if (is_cert_revoked($cert)): ?>
+ <i>Revoked </i>
+ <?php endif?>
+ <?php if (is_webgui_cert($cert['refid'])): ?>
+ webConfigurator
+ <?php endif?>
+ <?php if (is_user_cert($cert['refid'])): ?>
+ User Cert
+ <?php endif?>
+ <?php if (is_openvpn_server_cert($cert['refid'])): ?>
+ OpenVPN Server
+ <?php endif?>
+ <?php if (is_openvpn_client_cert($cert['refid'])): ?>
+ OpenVPN Client
+ <?php endif?>
+ <?php if (is_ipsec_cert($cert['refid'])): ?>
+ IPsec Tunnel
+ <?php endif?>
+ <?php if (is_captiveportal_cert($cert['refid'])): ?>
+ Captive Portal
+ <?php endif?>
+ </td>
+ <td>
+ <a href="system_certmanager.php?act=exp&amp;id=<?=$i?>" class="btn btn-xs btn-default">
+ <?=gettext("export")?>
+ </a>
+ <a href="system_certmanager.php?act=key&amp;id=<?=$i?>" class="btn btn-xs btn-default">
+ <?=gettext("export key")?>
+ </a>
+ <a href="system_certmanager.php?act=p12&amp;id=<?=$i?>" class="btn btn-xs btn-default">
+ <?=gettext("export p12")?>
+ </a>
+ <?php if (!cert_in_use($cert['refid'])): ?>
+ <a href="system_certmanager.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger">
+ <?=gettext("delete")?>
+ </a>
+ <?php endif?>
+ <?php if ($cert['csr']): ?>
+ <a href="system_certmanager.php?act=csr&amp;id=<?=$i?>" class="btn btn-xs btn-default">
+ <?=gettext("update csr")?>
+ </a>
+ <?php endif?>
+ </td>
+ </tr>
+<?php endforeach; ?>
+ </tbody>
+</table>
+</div>
+
+<nav class="action-buttons">
+ <a href="?act=new" class="btn btn-success">add new</a>
+</nav>
+<?
+ include("foot.inc");
+ exit;
+}
+
+require('classes/Form.class.php');
+$form = new Form;
+
+if ($act == "csr" || (($_POST['save'] == gettext("Update")) && $input_errors))
+{
+ $form->setAction('system_certmanager.php?act=csr');
- method = document.iform.method.selectedIndex;
-
- switch (method) {
- case 0:
- document.getElementById("import").style.display="";
- document.getElementById("internal").style.display="none";
- document.getElementById("external").style.display="none";
- document.getElementById("existing").style.display="none";
- document.getElementById("descriptivename").style.display="";
- document.getElementById("submit").style.display="";
- break;
- case 1:
- document.getElementById("import").style.display="none";
- document.getElementById("internal").style.display="";
- document.getElementById("external").style.display="none";
- document.getElementById("existing").style.display="none";
- document.getElementById("descriptivename").style.display="";
- document.getElementById("submit").style.display="<?=$submit_style;?>";
- break;
- case 2:
- document.getElementById("import").style.display="none";
- document.getElementById("internal").style.display="none";
- document.getElementById("external").style.display="";
- document.getElementById("existing").style.display="none";
- document.getElementById("descriptivename").style.display="";
- document.getElementById("submit").style.display="";
- break;
- case 3:
- document.getElementById("import").style.display="none";
- document.getElementById("internal").style.display="none";
- document.getElementById("external").style.display="none";
- document.getElementById("existing").style.display="";
- document.getElementById("descriptivename").style.display="none";
- document.getElementById("submit").style.display="";
- break;
+ $section = new Form_Section('Complete Signing Request');
+
+ if (isset($id) && $a_cert[$id])
+ {
+ $form->addGlobal(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
}
+
+ $section->addInput(new Form_Input(
+ 'descr',
+ 'Descriptive name',
+ 'text',
+ $pconfig['descr']
+ ));
+
+ $section->addInput(new Form_Textarea(
+ 'csr',
+ 'Signing request data',
+ $pconfig['csr']
+ ))->setReadonly()->setHelp('Copy the certificate signing data from here and '.
+ 'forward it to your certificate authority for signing.');
+
+ $section->addInput(new Form_Textarea(
+ 'cert',
+ 'Final certificate data',
+ $pconfig["cert"]
+ ))->setHelp('Paste the certificate received from your certificate authority here.');
+
+ $form->add($section);
+ print $form;
+
+ include("foot.inc");
+ exit;
}
-<?php if ($internal_ca_count): ?>
-function internalca_change() {
+$form->setAction('system_certmanager.php?act=edit');
- index = document.iform.caref.selectedIndex;
- caref = document.iform.caref[index].value;
+if (isset($userid) && $a_user)
+{
+ $form->addGlobal(new Form_Input(
+ 'userid',
+ null,
+ 'hidden',
+ $userid
+ ));
+}
- switch (caref) {
-<?php
- foreach ($a_ca as $ca):
- if (!$ca['prv']) {
+if (isset($id) && $a_cert[$id])
+{
+ $form->addGlobal(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$section = new Form_Section('Add a new certificate');
+
+if (!isset($id))
+{
+ $section->addInput(new Form_Select(
+ 'method',
+ 'Method',
+ $pconfig['method'],
+ $cert_methods
+ ))->toggles();
+}
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Descriptive name',
+ 'text',
+ ($a_user && empty($pconfig['descr'])) ? $a_user[$userid]['name'] : $pconfig['descr']
+))->addClass('toggle-existing');
+
+$form->add($section);
+$section = new Form_Section('Import Certificate');
+$section->addClass('toggle-import collapse');
+
+$section->addInput(new Form_Textarea(
+ 'cert',
+ 'Certificate data',
+ $pconfig['cert']
+))->setHelp('Paste a certificate in X.509 PEM format here.');
+
+$section->addInput(new Form_Textarea(
+ 'key',
+ 'Private key data',
+ $pconfig['key']
+))->setHelp('Paste a private key in X.509 PEM format here.');
+
+$form->add($section);
+$section = new Form_Section('Internal Certificate');
+$section->addClass('toggle-internal collapse');
+
+if (!$internal_ca_count)
+{
+ $section->addInput(new Form_StaticText(
+ 'Certificate authority',
+ gettext('No internal Certificate Authorities have been defined. You must ').
+ '<a href="system_camanager.php?act=new&amp;method=internal"> '. gettext(" create") .'</a>'.
+ gettext(' an internal CA before creating an internal certificate.')
+ ));
+}
+else
+{
+ $allCas = array();
+ foreach ($a_ca as $ca)
+ {
+ if (!$ca['prv'])
continue;
- }
- $subject = cert_get_subject_array($ca['crt']);
-?>
- case "<?=$ca['refid'];?>":
- document.iform.dn_country.value = "<?=$subject[0]['v'];?>";
- document.iform.dn_state.value = "<?=$subject[1]['v'];?>";
- document.iform.dn_city.value = "<?=$subject[2]['v'];?>";
- document.iform.dn_organization.value = "<?=$subject[3]['v'];?>";
- document.iform.dn_email.value = "<?=$subject[4]['v'];?>";
- break;
-<?php
- endforeach;
-?>
+
+ $allCas[ $ca['refid'] ] = $ca['descr'];
}
+
+ $section->addInput(new Form_Select(
+ 'caref',
+ 'Certificate authority',
+ $pconfig['caref'],
+ $allCas
+ ));
}
-<?php endif; ?>
-
-//]]>
-</script>
-<script type="text/javascript" src="/javascript/row_helper_dynamic.js"></script>
-<input type='hidden' name='altname_value_type' value='select' />
-<input type='hidden' name='altname_type_type' value='textbox' />
-<script type="text/javascript">
-//<![CDATA[
- rowname[0] = "altname_type";
- rowtype[0] = "textbox";
- rowsize[0] = "10";
- rowname[1] = "altname_value";
- rowtype[1] = "textbox";
- rowsize[1] = "30";
-//]]>
-</script>
-<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
- // Load valid country codes
- $dn_cc = array();
- if (file_exists("/etc/ca_countries")) {
- $dn_cc_file=file("/etc/ca_countries");
- foreach ($dn_cc_file as $line) {
- if (preg_match('/^(\S*)\s(.*)$/', $line, $matches)) {
- array_push($dn_cc, $matches[1]);
- }
- }
- }
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="cert manager">
- <tr>
- <td class="tabnavtbl">
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("CAs"), false, "system_camanager.php");
- $tab_array[] = array(gettext("Certificates"), true, "system_certmanager.php");
- $tab_array[] = array(gettext("Certificate Revocation"), false, "system_crlmanager.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
-
- <?php if ($act == "new" || (($_POST['save'] == gettext("Save")) && $input_errors)): ?>
-
- <form action="system_certmanager.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <?php if (!isset($id)): ?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Method");?></td>
- <td width="78%" class="vtable">
- <select name='method' id='method' class="formselect" onchange='method_change()'>
- <?php
- foreach ($cert_methods as $method => $desc):
- $selected = "";
- if ($pconfig['method'] == $method) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$method;?>"<?=$selected;?>><?=$desc;?></option>
- <?php
- endforeach;
- ?>
- </select>
- </td>
- </tr>
- <?php endif; ?>
- <tr id="descriptivename">
- <?php
- if ($a_user && empty($pconfig['descr'])) {
- $pconfig['descr'] = $a_user[$userid]['name'];
- }
- ?>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>"/>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="import" summary="import">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Import Certificate");?></td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate data");?></td>
- <td width="78%" class="vtable">
- <textarea name="cert" id="cert" cols="65" rows="7" class="formfld_cert"><?=htmlspecialchars($pconfig['cert']);?></textarea>
- <br />
- <?=gettext("Paste a certificate in X.509 PEM format here.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Private key data");?></td>
- <td width="78%" class="vtable">
- <textarea name="key" id="key" cols="65" rows="7" class="formfld_cert"><?=htmlspecialchars($pconfig['key']);?></textarea>
- <br />
- <?=gettext("Paste a private key in X.509 PEM format here.");?>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="internal" summary="internal">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Internal Certificate");?></td>
- </tr>
-
- <?php if (!$internal_ca_count): ?>
-
- <tr>
- <td colspan="2" align="center" class="vtable">
- <?=gettext("No internal Certificate Authorities have been defined. You must");?>
- <a href="system_camanager.php?act=new&amp;method=internal"><?=gettext("create");?></a>
- <?=gettext("an internal CA before creating an internal certificate.");?>
- </td>
- </tr>
-
- <?php else: ?>
-
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate authority");?></td>
- <td width="78%" class="vtable">
- <select name='caref' id='caref' class="formselect" onchange='internalca_change()'>
- <?php
- foreach ($a_ca as $ca):
- if (!$ca['prv']) {
- continue;
- }
- $selected = "";
- if ($pconfig['caref'] == $ca['refid']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$ca['refid'];?>"<?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
- <?php
- endforeach;
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Key length");?></td>
- <td width="78%" class="vtable">
- <select name='keylen' class="formselect">
- <?php
- foreach ($cert_keylens as $len):
- $selected = "";
- if ($pconfig['keylen'] == $len) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$len;?>"<?=$selected;?>><?=$len;?></option>
- <?php
- endforeach;
- ?>
- </select>
- <?=gettext("bits");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Digest Algorithm");?></td>
- <td width="78%" class="vtable">
- <select name='digest_alg' id='digest_alg' class="formselect">
- <?php
- foreach ($openssl_digest_algs as $digest_alg):
- $selected = "";
- if ($pconfig['digest_alg'] == $digest_alg) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$digest_alg;?>"<?=$selected;?>><?=strtoupper($digest_alg);?></option>
- <?php
- endforeach;
- ?>
- </select>
- <br /><?= gettext("NOTE: It is recommended to use an algorithm stronger than SHA1 when possible.") ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate Type");?></td>
- <td width="78%" class="vtable">
- <select name='type' class="formselect">
- <?php
- foreach ($cert_types as $ct => $ctdesc):
- $selected = "";
- if ($pconfig['type'] == $ct) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$ct;?>"<?=$selected;?>><?=$ctdesc;?></option>
- <?php
- endforeach;
- ?>
- </select>
- <br />
- <?=gettext("Type of certificate to generate. Used for placing restrictions on the usage of the generated certificate.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Lifetime");?></td>
- <td width="78%" class="vtable">
- <input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="5" value="<?=htmlspecialchars($pconfig['lifetime']);?>"/>
- <?=gettext("days");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Distinguished name");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="2" summary="name">
- <tr>
- <td align="right"><?=gettext("Country Code");?> : &nbsp;</td>
- <td align="left">
- <input name="dn_country" type="text" class="formfld unknown" maxlength="2" size="2" value="<?=htmlspecialchars($pconfig['dn_country']);?>"/>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("State or Province");?> : &nbsp;</td>
- <td align="left">
- <input name="dn_state" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['dn_state']);?>"/>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("City");?> : &nbsp;</td>
- <td align="left">
- <input name="dn_city" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['dn_city']);?>"/>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("Organization");?> : &nbsp;</td>
- <td align="left">
- <input name="dn_organization" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['dn_organization']);?>"/>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("Email Address");?> : &nbsp;</td>
- <td align="left">
- <input name="dn_email" type="text" class="formfld unknown" size="25" value="<?=htmlspecialchars($pconfig['dn_email']);?>"/>
- &nbsp;
- <em>ex:</em>
- &nbsp;
- <?=gettext("webadmin@mycompany.com");?>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("Common Name");?> : &nbsp;</td>
- <td align="left">
- <?php
- if ($a_user && empty($pconfig['dn_commonname'])) {
- $pconfig['dn_commonname'] = $a_user[$userid]['name'];
- }
- ?>
- <input name="dn_commonname" type="text" class="formfld unknown" size="25" value="<?=htmlspecialchars($pconfig['dn_commonname']);?>"/>
- &nbsp;
- <em>ex:</em>
- &nbsp;
- <?=gettext("www.example.com");?>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("Alternative Names");?> : &nbsp;</td>
- <td align="left">
- <table id="altNametable">
- <thead>
- <tr>
- <th><div id="onecolumn"><?=gettext("Type");?></div></th>
- <th><div id="twocolumn"><?=gettext("Value");?></div></th>
- </tr>
- </thead>
- <tbody>
- <?php
- $counter = 0;
- if ($pconfig['altnames']['item']):
- foreach ($pconfig['altnames']['item'] as $item):
- $type = $item['type'];
- $value = $item['value'];
- ?>
- <tr>
- <td>
- <input autocomplete="off" name="altname_type<?php echo $counter; ?>" type="text" class="formfld unknown" id="altname_type<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($type);?>" />
- </td>
- <td>
- <input autocomplete="off" name="altname_value<?php echo $counter; ?>" type="text" class="formfld unknown" id="altname_value<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($value);?>" />
- </td>
- <td>
- <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="" title="<?=gettext("remove this entry"); ?>" /></a>
- </td>
- </tr>
- <?php
- $counter++;
- endforeach;
- endif;
- ?>
- <tr><td>&nbsp;</td></tr>
- </tbody>
- </table>
- <a onclick="javascript:addRowTo('altNametable', 'formfldalias'); return false;" href="#">
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
- </a>
- <script type="text/javascript">
- //<![CDATA[
- field_counter_js = 3;
- rows = 1;
- totalrows = <?php echo $counter; ?>;
- loaded = <?php echo $counter; ?>;
- //]]>
- </script>
- <br />NOTE: Type must be one of DNS (FQDN or Hostname), IP (IP address), URI, or email.
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <?php endif; ?>
-
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="external" summary="external">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("External Signing Request");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Key length");?></td>
- <td width="78%" class="vtable">
- <select name='csr_keylen' class="formselect">
- <?php
- if (!isset($pconfig['csr_keylen']) && isset($pconfig['csr_keylen'])) {
- $pconfig['csr_keylen'] = $pconfig['csr_keylen'];
- }
- foreach ($cert_keylens as $len):
- $selected = "";
- if ($pconfig['csr_keylen'] == $len) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$len;?>"<?=$selected;?>><?=$len;?></option>
- <?php
- endforeach;
- ?>
- </select>
- bits
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Digest Algorithm");?></td>
- <td width="78%" class="vtable">
- <select name='csr_digest_alg' id='csr_digest_alg' class="formselect">
- <?php
- foreach ($openssl_digest_algs as $csr_digest_alg):
- $selected = "";
- if ($pconfig['csr_digest_alg'] == $csr_digest_alg) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$csr_digest_alg;?>"<?=$selected;?>><?=strtoupper($csr_digest_alg);?></option>
- <?php
- endforeach;
- ?>
- </select>
- <br /><?= gettext("NOTE: It is recommended to use an algorithm stronger than SHA1 when possible.") ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Distinguished name");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="2" summary="name">
- <tr>
- <td align="right"><?=gettext("Country Code");?> : &nbsp;</td>
- <td align="left">
- <select name='csr_dn_country' class="formselect">
- <?php
- foreach ($dn_cc as $cc) {
- $selected = "";
- if ($pconfig['csr_dn_country'] == $cc) {
- $selected = " selected=\"selected\"";
- }
- print "<option value=\"$cc\"$selected>$cc</option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("State or Province");?> : &nbsp;</td>
- <td align="left">
- <input name="csr_dn_state" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['csr_dn_state']);?>" />
- &nbsp;
- <em>ex:</em>
- &nbsp;
- <?=gettext("Texas");?>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("City");?> : &nbsp;</td>
- <td align="left">
- <input name="csr_dn_city" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['csr_dn_city']);?>" />
- &nbsp;
- <em>ex:</em>
- &nbsp;
- <?=gettext("Austin");?>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("Organization");?> : &nbsp;</td>
- <td align="left">
- <input name="csr_dn_organization" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['csr_dn_organization']);?>" />
- &nbsp;
- <em>ex:</em>
- &nbsp;
- <?=gettext("My Company Inc.");?>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("Email Address");?> : &nbsp;</td>
- <td align="left">
- <input name="csr_dn_email" type="text" class="formfld unknown" size="25" value="<?=htmlspecialchars($pconfig['csr_dn_email']);?>"/>
- &nbsp;
- <em>ex:</em>
- &nbsp;
- <?=gettext("webadmin@mycompany.com");?>
- </td>
- </tr>
- <tr>
- <td align="right"><?=gettext("Common Name");?> : &nbsp;</td>
- <td align="left">
- <input name="csr_dn_commonname" type="text" class="formfld unknown" size="25" value="<?=htmlspecialchars($pconfig['csr_dn_commonname']);?>"/>
- &nbsp;
- <em>ex:</em>
- &nbsp;
- <?=gettext("www.example.com");?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="existing" summary="existing">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Choose an Existing Certificate");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Existing Certificates");?></td>
- <td width="78%" class="vtable">
- <?php if (isset($userid) && $a_user): ?>
- <input name="userid" type="hidden" value="<?=htmlspecialchars($userid);?>" />
- <?php endif;?>
- <select name='certref' class="formselect">
- <?php
- foreach ($config['cert'] as $cert):
- $selected = "";
- $caname = "";
- $inuse = "";
- $revoked = "";
- if (isset($userid) && in_array($cert['refid'], $config['system']['user'][$userid]['cert'])) {
- continue;
- }
- $ca = lookup_ca($cert['caref']);
- if ($ca) {
- $caname = " (CA: " . htmlspecialchars($ca['descr']) . ")";
- }
- if ($pconfig['certref'] == $cert['refid']) {
- $selected = " selected=\"selected\"";
- }
- if (cert_in_use($cert['refid'])) {
- $inuse = " *In Use";
- }
- if (is_cert_revoked($cert)) {
- $revoked = " *Revoked";
- }
- ?>
- <option value="<?=$cert['refid'];?>"<?=$selected;?>><?=htmlspecialchars($cert['descr']) . $caname . $inuse . $revoked;?></option>
- <?php
- endforeach;
- ?>
- </select>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="save">
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <?php if (isset($id) && $a_cert[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif;?>
- </td>
- </tr>
- </table>
- </form>
-
- <?php elseif ($act == "csr" || (($_POST['save'] == gettext("Update")) && $input_errors)):?>
-
- <form action="system_certmanager.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="name">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>"/>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Complete Signing Request");?></td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Signing request data");?></td>
- <td width="78%" class="vtable">
- <textarea name="csr" id="csr" cols="65" rows="7" class="formfld_cert" readonly="readonly"><?=htmlspecialchars($pconfig['csr']);?></textarea>
- <br />
- <?=gettext("Copy the certificate signing data from here and forward it to your certificate authority for signing.");?></td>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Final certificate data");?></td>
- <td width="78%" class="vtable">
- <textarea name="cert" id="cert" cols="65" rows="7" class="formfld_cert"><?=htmlspecialchars($pconfig['cert']);?></textarea>
- <br />
- <?=gettext("Paste the certificate received from your certificate authority here.");?></td>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <?php /* if (isset($subject_mismatch) && $subject_mismatch === true): ?>
- <input id="ignoresubjectmismatch" name="ignoresubjectmismatch" type="checkbox" class="formbtn" value="yes" />
- <label for="ignoresubjectmismatch"><strong><?=gettext("Ignore certificate subject mismatch"); ?></strong></label><br />
- <?php echo gettext("Warning: Using this option may create an " .
- "invalid certificate. Check this box to disable the request -> " .
- "response subject verification. ");
- ?><br />
- <?php endif; */ ?>
- <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Update");?>" />
- <?php if (isset($id) && $a_cert[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <input name="act" type="hidden" value="csr" />
- <?php endif;?>
- </td>
- </tr>
- </table>
- </form>
-
- <?php else:?>
-
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="details">
- <tr>
- <td width="15%" class="listhdrr"><?=gettext("Name");?></td>
- <td width="15%" class="listhdrr"><?=gettext("Issuer");?></td>
- <td width="40%" class="listhdrr"><?=gettext("Distinguished Name");?></td>
- <td width="10%" class="listhdrr"><?=gettext("In Use");?></td>
- <td width="10%" class="list"></td>
- </tr>
- <?php
- $pluginparams = array();
- $pluginparams['type'] = 'certificates';
- $pluginparams['event'] = 'used_certificates';
- $certificates_used_by_packages = pkg_call_plugins('plugin_certificates', $pluginparams);
- $i = 0;
- foreach ($a_cert as $cert):
- $name = htmlspecialchars($cert['descr']);
-
- if ($cert['crt']) {
- $subj = cert_get_subject($cert['crt']);
- $issuer = cert_get_issuer($cert['crt']);
- $purpose = cert_get_purpose($cert['crt']);
- list($startdate, $enddate) = cert_get_dates($cert['crt']);
- if ($subj == $issuer) {
- $caname = "<em>" . gettext("self-signed") . "</em>";
- } else {
- $caname = "<em>" . gettext("external"). "</em>";
- }
- $subj = htmlspecialchars($subj);
- }
-
- if ($cert['csr']) {
- $subj = htmlspecialchars(csr_get_subject($cert['csr']));
- $caname = "<em>" . gettext("external - signature pending") . "</em>";
- }
-
- $ca = lookup_ca($cert['caref']);
- if ($ca) {
- $caname = htmlspecialchars($ca['descr']);
- }
-
- if ($cert['prv']) {
- $certimg = "/themes/{$g['theme']}/images/icons/icon_frmfld_cert.png";
- } else {
- $certimg = "/themes/{$g['theme']}/images/icons/icon_frmfld_cert.png";
- }
- ?>
- <tr>
- <td class="listlr">
- <table border="0" cellpadding="0" cellspacing="0" summary="icon">
- <tr>
- <td align="left" valign="middle">
- <img src="<?=$certimg;?>" alt="CA" title="CA" border="0" height="16" width="16" />
- </td>
- <td align="left" valign="middle">
- <?=$name;?>
- </td>
- </tr>
- <tr><td>&nbsp;</td></tr>
- <?php if ($cert['type']): ?>
- <tr>
- <td colspan="2"><em><?php echo $cert_types[$cert['type']]; ?></em></td>
- </tr>
- <?php endif; ?>
- <?php if (is_array($purpose)): ?>
- <tr>
- <td colspan="2">
- CA: <?php echo $purpose['ca']; ?>,
- Server: <?php echo $purpose['server']; ?>
- </td>
- </tr>
- <?php endif; ?>
- </table>
- </td>
- <td class="listr"><?=$caname;?>&nbsp;</td>
- <td class="listr"><?=$subj;?>&nbsp;<br />
- <table width="100%" style="font-size: 9px" summary="valid">
- <tr>
- <td width="10%">&nbsp;</td>
- <td width="20%"><?=gettext("Valid From")?>:</td>
- <td width="70%"><?= $startdate ?></td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td><?=gettext("Valid Until")?>:</td>
- <td><?= $enddate ?></td>
- </tr>
- </table>
- </td>
- <td class="listr">
- <?php if (is_cert_revoked($cert)): ?>
- <b>Revoked</b><br />
- <?php endif; ?>
- <?php if (is_webgui_cert($cert['refid'])): ?>
- webConfigurator<br />
- <?php endif; ?>
- <?php if (is_user_cert($cert['refid'])): ?>
- User Cert<br />
- <?php endif; ?>
- <?php if (is_openvpn_server_cert($cert['refid'])): ?>
- OpenVPN Server<br />
- <?php endif; ?>
- <?php if (is_openvpn_client_cert($cert['refid'])): ?>
- OpenVPN Client<br />
- <?php endif; ?>
- <?php if (is_ipsec_cert($cert['refid'])): ?>
- IPsec Tunnel<br />
- <?php endif; ?>
- <?php if (is_captiveportal_cert($cert['refid'])): ?>
- Captive Portal<br />
- <?php endif; ?>
- <?
- $refid = $cert['refid'];
- if (is_array($certificates_used_by_packages)) {
- foreach ($certificates_used_by_packages as $name => $package) {
- if (isset($package['certificatelist'][$refid])) {
- $hint = "" ;
- if (is_array($package['certificatelist'][$refid])) {
- foreach ($package['certificatelist'][$refid] as $cert_used) {
- $hint = $hint . $cert_used['usedby']."\n";
- }
- }
- $count = count($package['certificatelist'][$refid]);
- echo "<div title='".htmlspecialchars($hint)."'>";
- echo htmlspecialchars($package['pkgname'])." ($count)<br />";
- echo "</div>";
- }
- }
- }
- ?>
- </td>
- <td valign="middle" class="list nowrap">
- <a href="system_certmanager.php?act=exp&amp;id=<?=$i;?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("export cert");?>" alt="<?=gettext("export ca");?>" width="17" height="17" border="0" />
- </a>
- <a href="system_certmanager.php?act=key&amp;id=<?=$i;?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("export key");?>" alt="<?=gettext("export ca");?>" width="17" height="17" border="0" />
- </a>
- <a href="system_certmanager.php?act=p12&amp;id=<?=$i;?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("export ca cert+user cert+user cert key in .p12 format");?>" alt="<?=gettext("export ca cert+user cert+user cert key in .p12 format");?>" width="17" height="17" border="0" />
- </a>
- <?php if (!cert_in_use($cert['refid'])): ?>
- <a href="system_certmanager.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this Certificate?");?>')">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete cert");?>" alt="<?=gettext("delete cert");?>" width="17" height="17" border="0" />
- </a>
- <?php endif; ?>
- <?php if ($cert['csr']): ?>
- &nbsp;
- <a href="system_certmanager.php?act=csr&amp;id=<?=$i;?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("update csr");?>" alt="<?=gettext("update csr");?>" width="17" height="17" border="0" />
- </a>
- <?php endif; ?>
- </td>
- </tr>
- <?php
- $i++;
- endforeach;
- ?>
- <tr>
- <td class="list" colspan="4"></td>
- <td class="list">
- <a href="system_certmanager.php?act=new">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add or import certificate");?>" alt="<?=gettext("add certificate");?>" width="17" height="17" border="0" />
- </a>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td colspan="3"><?=gettext("Note: You can only delete a certificate if it is not currently in use.");?></td>
- </tr>
- </table>
-
- <?php endif; ?>
-
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc");?>
-<script type="text/javascript">
-//<![CDATA[
+print('<br />keylen = ' . $pconfig['keylen'] . '<br />');
+
+$section->addInput(new Form_Select(
+ 'keylen',
+ 'Key length',
+ $pconfig['keylen'],
+ array_combine($cert_keylens, $cert_keylens)
+));
+
+$section->addInput(new Form_Select(
+ 'digest_alg',
+ 'Digest Algorithm',
+ $pconfig['digest_alg'],
+ array_combine($openssl_digest_algs, $openssl_digest_algs)
+))->setHelp('NOTE: It is recommended to use an algorithm stronger than '.
+ 'SHA1 when possible.');
+
+$section->addInput(new Form_Select(
+ 'type',
+ 'Certificate Type',
+ $pconfig['type'],
+ $cert_types
+))->setHelp('Type of certificate to generate. Used for placing '.
+ 'restrictions on the usage of the generated certificate.');
+
+$section->addInput(new Form_Input(
+ 'lifetime',
+ 'Lifetime (days)',
+ 'number',
+ $pconfig['lifetime']
+));
+
+$section->addInput(new Form_Select(
+ 'dn_country',
+ 'Country Code',
+ $pconfig['dn_country'],
+ $dn_cc
+));
+
+$section->addInput(new Form_Input(
+ 'dn_state',
+ 'State or Province',
+ 'text',
+ $pconfig['dn_state'],
+ ['placeholder' => 'e.g. Texas']
+));
+
+$section->addInput(new Form_Input(
+ 'dn_city',
+ 'City',
+ 'text',
+ $pconfig['dn_city'],
+ ['placeholder' => 'e.g. Austin']
+));
+
+$section->addInput(new Form_Input(
+ 'dn_organization',
+ 'Organization',
+ 'text',
+ $pconfig['dn_organization'],
+ ['placeholder' => 'e.g. My Company Inc.']
+));
+
+$section->addInput(new Form_Input(
+ 'dn_email',
+ 'Email Address',
+ 'email',
+ $pconfig['dn_email'],
+ ['placeholder' => 'e.g. admin@mycompany.com']
+));
+
+$section->addInput(new Form_Input(
+ 'dn_commonname',
+ 'Common Name',
+ 'text',
+ $pconfig['dn_commonname'],
+ ['placeholder' => 'e.g. internal-ca']
+));
+
+$group = new Form_Group('Alternative Names');
+
+if (empty($pconfig['altnames']['item']))
+{
+ $pconfig['altnames']['item'] = array(
+ array('type' => null, 'value' => null)
+ );
+}
+
+foreach ($pconfig['altnames']['item'] as $item)
+{
+ $group->add(new Form_Select(
+ 'altname_type',
+ 'Type',
+ $item['type'],
+ array(
+ 'DNS' => 'FQDN or Hostname',
+ 'IP' => 'IP address',
+ 'URI' => 'URI',
+ 'email' => 'email address',
+ )
+ ));
+
+ $group->add(new Form_Input(
+ 'altname_value',
+ 'Type',
+ 'text',
+ $item['value']
+ ));
+
+ $group->enableDuplication();
+}
+
+$section->add($group);
+
+$form->add($section);
+$section = new Form_Section('External Signing Request');
+$section->addClass('toggle-external collapse');
+
+$section->addInput(new Form_Select(
+ 'csr_keylen',
+ 'Key length',
+ $pconfig['csr_keylen'],
+ $cert_keylens
+));
+
+$section->addInput(new Form_Select(
+ 'csr_digest_alg',
+ 'Digest Algorithm',
+ $pconfig['csr_digest_alg'],
+ $openssl_digest_algs
+))->setHelp('NOTE: It is recommended to use an algorithm stronger than '.
+ 'SHA1 when possible');
+
+$section->addInput(new Form_Select(
+ 'dn_country',
+ 'Country Code',
+ $pconfig['dn_country'],
+ $dn_cc
+));
+
+$section->addInput(new Form_Input(
+ 'csr_dn_state',
+ 'State or Province',
+ 'text',
+ $pconfig['csr_dn_state'],
+ ['placeholder' => 'e.g. Texas']
+));
+
+$section->addInput(new Form_Input(
+ 'csr_dn_city',
+ 'City',
+ 'text',
+ $pconfig['csr_dn_city'],
+ ['placeholder' => 'e.g. Austin']
+));
+
+$section->addInput(new Form_Input(
+ 'csr_dn_organization',
+ 'Organization',
+ 'text',
+ $pconfig['csr_dn_organization'],
+ ['placeholder' => 'e.g. My Company Inc.']
+));
+
+$section->addInput(new Form_Input(
+ 'csr_dn_email',
+ 'Email Address',
+ 'email',
+ $pconfig['csr_dn_email'],
+ ['placeholder' => 'e.g. admin@mycompany.com']
+));
+
+$section->addInput(new Form_Input(
+ 'csr_dn_commonname',
+ 'Common Name',
+ 'text',
+ $pconfig['csr_dn_commonname'],
+ ['placeholder' => 'e.g. internal-ca']
+));
+
+$form->add($section);
+$section = new Form_Section('Choose an Existing Certificate');
+$section->addClass('toggle-existing collapse');
+
+$existCerts = array();
+foreach ($config['cert'] as $cert)
+{
+ if (isset($userid) && in_array($cert['refid'], $config['system']['user'][$userid]['cert']))
+ continue;
+
+ $ca = lookup_ca($cert['caref']);
+ if ($ca)
+ $cert['descr'] .= " (CA: {$ca['descr']})";
+
+ if (cert_in_use($cert['refid']))
+ $cert['descr'] .= " <i>In Use</i>";
+ if (is_cert_revoked($cert))
+ $cert['descr'] .= " <b>Revoked</b>";
+
+ $existCerts[ $cert['refid'] ] = $cert['descr'];
+}
-method_change();
-internalca_change();
+$section->addInput(new Form_Select(
+ 'certref',
+ 'Existing Certificates',
+ $pconfig['certref'],
+ $existCerts
+));
-//]]>
-</script>
+$form->add($section);
+print $form;
-</body>
-</html>
+include('foot.inc'); \ No newline at end of file
diff --git a/src/usr/local/www/system_crlmanager.php b/src/usr/local/www/system_crlmanager.php
index ff70e9b..868d383 100644
--- a/src/usr/local/www/system_crlmanager.php
+++ b/src/usr/local/www/system_crlmanager.php
@@ -96,7 +96,7 @@ if (!$thiscrl && (($act != "") && ($act != "new"))) {
pfSenseHeader("system_crlmanager.php");
$act="";
$savemsg = gettext("Invalid CRL reference.");
-}
+}
if ($act == "del") {
$name = htmlspecialchars($thiscrl['descr']);
@@ -273,8 +273,6 @@ if ($_POST) {
include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
<script type="text/javascript">
//<![CDATA[
@@ -296,427 +294,408 @@ function method_change() {
//]]>
</script>
-<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="CRL manager">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("CAs"), false, "system_camanager.php");
- $tab_array[] = array(gettext("Certificates"), false, "system_certmanager.php");
- $tab_array[] = array(gettext("Certificate Revocation"), true, "system_crlmanager.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
<?php
- if ($act == "new" || $act == gettext("Save") || $input_errors):
-?>
- <form action="system_crlmanager.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <?php if (!isset($id)): ?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Method");?></td>
- <td width="78%" class="vtable">
- <select name='method' id='method' class="formselect" onchange='method_change()'>
- <?php
- $rowIndex = 0;
- foreach ($crl_methods as $method => $desc):
- if (($_GET['importonly'] == "yes") && ($method != "existing")) {
- continue;
- }
- $selected = "";
- if ($pconfig['method'] == $method) {
- $selected = "selected=\"selected\"";
- }
- $rowIndex++;
- ?>
- <option value="<?=$method;?>" <?=$selected;?>><?=$desc;?></option>
- <?php
- endforeach;
- if ($rowIndex == 0) {
- echo "<option></option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <?php endif; ?>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>"/>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate Authority");?></td>
- <td width="78%" class="vtable">
- <select name='caref' id='caref' class="formselect">
- <?php
- $rowIndex = 0;
- foreach ($a_ca as $ca):
- $selected = "";
- if ($pconfig['caref'] == $ca['refid']) {
- $selected = "selected=\"selected\"";
- }
- $rowIndex++;
- ?>
- <option value="<?=$ca['refid'];?>" <?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
- <?php
- endforeach;
- if ($rowIndex == 0) {
- echo "<option></option>";
- }
- ?>
- </select>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="existing" summary="existing">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Existing Certificate Revocation List");?></td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("CRL data");?></td>
- <td width="78%" class="vtable">
- <textarea name="crltext" id="crltext" cols="65" rows="7" class="formfld_crl"><?=$pconfig['crltext'];?></textarea>
- <br />
- <?=gettext("Paste a Certificate Revocation List in X.509 CRL format here.");?>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="internal" summary="internal">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Internal Certificate Revocation List");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Lifetime");?></td>
- <td width="78%" class="vtable">
- <input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="5" value="<?=htmlspecialchars($pconfig['lifetime']);?>"/>
- <?=gettext("days");?><br />
- <?=gettext("Default: 9999");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Serial");?></td>
- <td width="78%" class="vtable">
- <input name="serial" type="text" class="formfld unknown" id="serial" size="5" value="<?=htmlspecialchars($pconfig['serial']);?>"/>
- <br />
- <?=gettext("Default: 0");?>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="save">
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <?php if (isset($id) && $thiscrl): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif;?>
- </td>
- </tr>
- </table>
- </form>
-<?php
- elseif ($act == "editimported"):
- $crl = $thiscrl;
-?>
- <form action="system_crlmanager.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="editimported" summary="import">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Imported Certificate Revocation List");?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($crl['descr']);?>"/>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("CRL data");?></td>
- <td width="78%" class="vtable">
- <textarea name="crltext" id="crltext" cols="65" rows="7" class="formfld_crl"><?=base64_decode($crl['text']);?></textarea>
- <br />
- <?=gettext("Paste a Certificate Revocation List in X.509 CRL format here.");?></td>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <input name="act" type="hidden" value="editimported" />
- </td>
- </tr>
- </table>
- </form>
+function build_method_list() {
+ global $_GET, $crl_methods;
+
+ $list = array();
+
+ foreach($crl_methods as $method => $desc) {
+ if (($_GET['importonly'] == "yes") && ($method != "existing"))
+ continue;
+
+ $list[$method] = $desc;
+ }
+
+ return($list);
+}
-<?php
- elseif ($act == "edit"):
- $crl = $thiscrl;
+function build_ca_list() {
+ global $a_ca;
+
+ $list = array();
+
+ foreach($a_ca as $ca)
+ $list[$ca['refid']] = $ca['descr'];
+
+ return($list);
+}
+
+function build_cacert_list() {
+ global $ca_certs;
+
+ $list = array();
+
+ foreach($ca_certs as $cert)
+ $list[$cert['refid']] = $cert['descr'];
+
+ return($list);
+}
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'sucess');
+
+$tab_array = array();
+$tab_array[] = array(gettext("CAs"), false, "system_camanager.php");
+$tab_array[] = array(gettext("Certificates"), false, "system_certmanager.php");
+$tab_array[] = array(gettext("Certificate Revocation"), true, "system_crlmanager.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+if ($act == "new" || $act == gettext("Save") || $input_errors) {
+ if (!isset($id)) {
+ $form = new Form();
+
+ $section = new Form_Section('Create new revocation list');
+
+ $section->addInput(new Form_Select(
+ 'method',
+ 'Method',
+ $pconfig['method'],
+ build_method_list()
+ ));
+
+ }
+
+ $section->addInput(new Form_Input(
+ 'descr',
+ 'Descriptive name',
+ 'text',
+ $pconfig['descr']
+ ));
+
+ $section->addInput(new Form_Select(
+ 'caref',
+ 'Certificate Authority',
+ $pconfig['caref'],
+ build_ca_list()
+ ));
+
+ $form->add($section);
+
+ $section = new Form_Section('Existing Certificate Revocation List');
+ $section->addClass('existing');
+
+ $section->addInput(new Form_Textarea(
+ 'crltext',
+ 'CRL data',
+ $pconfig['crltext']
+ ))->setHelp('Paste a Certificate Revocation List in X.509 CRL format here.');
+
+ $form->add($section);
+
+ $section = new Form_Section('Internal Certificate Revocation List');
+ $section->addClass('internal');
+
+ $section->addInput(new Form_Input(
+ 'lifetime',
+ 'Lifetime (Days)',
+ 'number',
+ $pconfig['lifetime'],
+ [max => '9999']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'serial',
+ 'Serial',
+ 'number',
+ $pconfig['serial'],
+ [max => '9999']
+ ));
+
+ $form->add($section);
+
+ if (isset($id) && $thiscrl) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+ }
+
+ print($form);
+
+} elseif ($act == "editimported") {
+
+ $form = new Form();
+
+ $section = new Form_Section('Edit Imported Certificate Revocation List');
+
+ $section->addInput(new Form_Input(
+ 'descr',
+ 'Descriptive name',
+ 'text',
+ $pconfig['descr']
+ ));
+
+ $section->addInput(new Form_Textarea(
+ 'crltext',
+ 'CRL data',
+ $pconfig['crltext']
+ ))->setHelp('Paste a Certificate Revocation List in X.509 CRL format here.');
+
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+
+ $section->addInput(new Form_Input(
+ 'act',
+ null,
+ 'hidden',
+ 'editimported'
+ ));
+
+ $form->add($section);
+
+ print($form);
+
+} elseif ($act == "edit") {
+ $crl = $thiscrl;
+
+ $form = new Form(false);
?>
- <form action="system_crlmanager.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="revoke">
- <thead>
- <tr>
- <th width="90%" class="listhdrr" colspan="3"><b><?php echo gettext("Currently Revoked Certificates for CRL") . ': ' . htmlspecialchars($crl['descr']); ?></b></th>
- <th width="10%" class="list"></th>
- </tr>
- <tr>
- <th width="30%" class="listhdrr"><b><?php echo gettext("Certificate Name")?></b></th>
- <th width="30%" class="listhdrr"><b><?php echo gettext("Revocation Reason")?></b></th>
- <th width="30%" class="listhdrr"><b><?php echo gettext("Revoked At")?></b></th>
- <th width="10%" class="list"></th>
- </tr>
- </thead>
- <tbody>
- <?php /* List Certs on CRL */
- if (!is_array($crl['cert']) || (count($crl['cert']) == 0)):
- ?>
+
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Currently Revoked Certificates for CRL") . ': ' . $crl['descr']?></h2></div>
+ <div class="panel-body table-responsive">
+<?php
+ if (!is_array($crl['cert']) || (count($crl['cert']) == 0))
+ print_info_box(gettext("No Certificates Found for this CRL."), 'danger');
+ else {
+?>
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td class="listlr" colspan="3">
- &nbsp;&nbsp;&nbsp;&nbsp;<?php echo gettext("No Certificates Found for this CRL."); ?>
- </td>
- <td class="list">&nbsp;</td>
+ <th><?=gettext("Certificate Name")?></th>
+ <th><?=gettext("Revocation Reason")?></th>
+ <th><?=gettext("Revoked At")?></th>
+ <th></th>
</tr>
- <?php
- else:
- foreach ($crl['cert'] as $i => $cert):
- $name = htmlspecialchars($cert['descr']);
- ?>
+ </thead>
+ <tbody>
+<?php
+ foreach($crl['cert'] as $i => $cert):
+ $name = htmlspecialchars($cert['descr']);
+?>
<tr>
<td class="listlr">
- <?php echo $name; ?>
+ <?=$name; ?>
</td>
<td class="listlr">
- <?php echo $openssl_crl_status[$cert["reason"]]; ?>
+ <?=$openssl_crl_status[$cert["reason"]]; ?>
</td>
<td class="listlr">
- <?php echo date("D M j G:i:s T Y", $cert["revoke_time"]); ?>
+ <?=date("D M j G:i:s T Y", $cert["revoke_time"]); ?>
</td>
<td class="list">
- <a href="system_crlmanager.php?act=delcert&amp;id=<?php echo $crl['refid']; ?>&amp;certref=<?php echo $cert['refid']; ?>" onclick="return confirm('<?=gettext("Do you really want to delete this Certificate from the CRL?");?>')">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("Delete this certificate from the CRL ");?>" alt="<?=gettext("Delete this certificate from the CRL ");?>" width="17" height="17" border="0" />
+ <a href="system_crlmanager.php?act=delcert&amp;id=<?=$crl['refid']; ?>&amp;certref=<?=$cert['refid']; ?>" onclick="return confirm('<?=gettext("Do you really want to delete this Certificate from the CRL?")?>')">
+ <img src="/themes/<?= $g['theme']?>/images/icons/icon_x.gif" title="<?=gettext("Delete this certificate from the CRL ")?>" alt="<?=gettext("Delete this certificate from the CRL ")?>" />
</a>
</td>
</tr>
- <?php
- endforeach;
- endif;
- ?>
- <?php /* Drop-down with other certs from this CA. */
- // Map Certs to CAs in one pass
- $ca_certs = array();
- foreach ($a_cert as $cert) {
- if ($cert['caref'] == $crl['caref']) {
- $ca_certs[] = $cert;
- }
- }
- if (count($ca_certs) == 0): ?>
- <tr>
- <td class="listlr" colspan="3">
- &nbsp;&nbsp;&nbsp;&nbsp;<?php echo gettext("No Certificates Found for this CA."); ?>
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- <?php
- else:
- ?>
- <tr>
- <td class="listlr" colspan="3" align="center">
- <b><?php echo gettext("Choose a Certificate to Revoke"); ?></b>:
- <select name='certref' id='certref' class="formselect">
- <?php $rowIndex = 0;
- foreach ($ca_certs as $cert):
- $rowIndex++;
- ?>
- <option value="<?=$cert['refid'];?>"><?=htmlspecialchars($cert['descr'])?></option>
- <?php
- endforeach;
- if ($rowIndex == 0) {
- echo "<option></option>";
- }
- ?>
- </select>
- <b><?php echo gettext("Reason");?></b>:
- <select name='crlreason' id='crlreason' class="formselect">
- <?php $rowIndex = 0;
- foreach ($openssl_crl_status as $code => $reason):
- $rowIndex++;
- ?>
- <option value="<?= $code ?>"><?= htmlspecialchars($reason) ?></option>
- <?php
- endforeach;
- if ($rowIndex == 0) {
- echo "<option></option>";
- }
- ?>
- </select>
- <input name="act" type="hidden" value="addcert" />
- <input name="crlref" type="hidden" value="<?=$crl['refid'];?>" />
- <input name="id" type="hidden" value="<?=$crl['refid'];?>" />
- <input id="submit" name="add" type="submit" class="formbtn" value="<?=gettext("Add"); ?>" />
- </td>
- <td class="list">&nbsp;</td>
- </tr>
- <?php
- endif;
- ?>
- </tbody>
- </table>
- </form>
<?php
- else:
+ endforeach;
?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="ocpms">
- <thead>
- <tr>
- <td width="35%" class="listhdrr"><?=gettext("Name");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Internal");?></td>
- <td width="35%" class="listhdrr"><?=gettext("Certificates");?></td>
- <td width="10%" class="listhdrr"><?=gettext("In Use");?></td>
- <td width="10%" class="list"></td>
- </tr>
- </thead>
- <tfoot>
+ </tbody>
+ </table>
+<?php } ?>
+ </div>
+ </div>
+<?php
+
+ $ca_certs = array();
+ foreach($a_cert as $cert)
+ if ($cert['caref'] == $crl['caref'])
+ $ca_certs[] = $cert;
+
+ if (count($ca_certs) == 0)
+ print_info_box(gettext("No Certificates Found for this CA."), 'danger');
+ else
+
+ $section = new Form_Section('Choose a certificate to revoke');
+ $group = new Form_Group(null);
+
+ $group->add(new Form_Select(
+ 'certref',
+ null,
+ $pconfig['certref'],
+ build_cacert_list()
+ ))->setWidth(4)->setHelp('Certificate');
+
+ $group->add(new Form_Select(
+ 'crlreason',
+ null,
+ -1,
+ $openssl_crl_status
+ ))->setHelp('Reason');
+
+ $group->add(new Form_Button(
+ 'submit',
+ 'Add'
+ ))->removeClass('btn-primary')->addClass('btn-success btn-sm');
+
+ $section->add($group);
+
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $crl['refid']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'act',
+ null,
+ 'hidden',
+ 'addcert'
+ ));
+
+ $section->addInput(new Form_Input(
+ 'crlref',
+ null,
+ 'hidden',
+ $crl['refid']
+ ));
+
+ $form->add($section);
+ print($form);
+} else {
+?>
+
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext("Additional Certificate Revocation Lists")?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td colspan="5">
- <p>
- <?=gettext("Additional Certificate Revocation Lists can be added here.");?>
- </p>
- </td>
+ <th><?=gettext("Name")?></th>
+ <th><?=gettext("Internal")?></th>
+ <th><?=gettext("Certificates")?></th>
+ <th><?=gettext("In Use")?></th>
+ <th></th>
</tr>
- </tfoot>
- <tbody>
- <?php
- $caimg = "/themes/{$g['theme']}/images/icons/icon_frmfld_cert.png";
- // Map CRLs to CAs in one pass
- $ca_crl_map = array();
- foreach ($a_crl as $crl) {
- $ca_crl_map[$crl['caref']][] = $crl['refid'];
- }
-
- $i = 0;
- foreach ($a_ca as $ca):
- $name = htmlspecialchars($ca['descr']);
-
- if ($ca['prv']) {
- $cainternal = "YES";
- } else {
- $cainternal = "NO";
- }
- ?>
+ </thead>
+ <tbody>
+<?php
+ $caimg = "/themes/{$g['theme']}/images/icons/icon_frmfld_cert.png";
+ // Map CRLs to CAs in one pass
+ $ca_crl_map = array();
+ foreach($a_crl as $crl)
+ $ca_crl_map[$crl['caref']][] = $crl['refid'];
+
+ $i = 0;
+ foreach($a_ca as $ca):
+ $name = htmlspecialchars($ca['descr']);
+
+ if($ca['prv']) {
+ $cainternal = "YES";
+ } else
+ $cainternal = "NO";
+?>
<tr>
- <td class="listlr" colspan="4">
- <table border="0" cellpadding="0" cellspacing="0" summary="icon">
- <tr>
- <td align="left" valign="middle">
- <img src="<?=$caimg;?>" alt="CA" title="CA" border="0" height="16" width="16" />
- </td>
- <td align="left" valign="middle">
- <?=$name;?>
- </td>
- </tr>
- </table>
+ <td colspan="4">
+ <?=$name?>
</td>
- <td class="list">
- <?php if ($cainternal == "YES"): ?>
- <a href="system_crlmanager.php?act=new&amp;caref=<?php echo $ca['refid']; ?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="<?php printf(gettext("Add or Import CRL for %s"), htmlspecialchars($ca['descr']));?>" alt="<?=gettext("add crl");?>" width="17" height="17" border="0" />
- </a>
- <?php else: ?>
- <a href="system_crlmanager.php?act=new&amp;caref=<?php echo $ca['refid']; ?>&amp;importonly=yes">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="<?php printf(gettext("Import CRL for %s"), htmlspecialchars($ca['descr']));?>" alt="<?=gettext("add crl");?>" width="17" height="17" border="0" />
+ <td>
+<?php
+ if ($cainternal == "YES"): ?>
+ <a href="system_crlmanager.php?act=new&amp;caref=<?=$ca['refid']; ?>" class="btn btn-xs btn-success">
+ <?=gettext("Add or Import CRLl")?>
</a>
- <?php endif; ?>
+<?php
+ else: ?>
+ <a href="system_crlmanager.php?act=new&amp;caref=<?=$ca['refid']; ?>&amp;importonly=yes" class="btn btn-xs btn-success">
+ <?=gettext("Add or Import CRLl")?>
+ </a>
+<?php
+ endif; ?>
</td>
</tr>
- <?php
- if (is_array($ca_crl_map[$ca['refid']])):
- foreach ($ca_crl_map[$ca['refid']] as $crl):
- $tmpcrl = lookup_crl($crl);
- $internal = is_crl_internal($tmpcrl);
- $inuse = crl_in_use($tmpcrl['refid']);
- ?>
+<?php
+ if (is_array($ca_crl_map[$ca['refid']])):
+ foreach($ca_crl_map[$ca['refid']] as $crl):
+ $tmpcrl = lookup_crl($crl);
+ $internal = is_crl_internal($tmpcrl);
+ $inuse = crl_in_use($tmpcrl['refid']);
+?>
<tr>
- <td class="listlr"><?php echo htmlspecialchars($tmpcrl['descr']); ?></td>
- <td class="listr"><?php echo ($internal) ? "YES" : "NO"; ?></td>
- <td class="listr"><?php echo ($internal) ? count($tmpcrl['cert']) : "Unknown (imported)"; ?></td>
- <td class="listr"><?php echo ($inuse) ? "YES" : "NO"; ?></td>
- <td valign="middle" class="list nowrap">
- <a href="system_crlmanager.php?act=exp&amp;id=<?=$tmpcrl['refid'];?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("Export CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" alt="<?=gettext("Export CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" width="17" height="17" border="0" />
+ <td><?=$tmpcrl['descr']; ?></td>
+ <td><?=($internal) ? "YES" : "NO"; ?></td>
+ <td><?=($internal) ? count($tmpcrl['cert']) : "Unknown (imported)"; ?></td>
+ <td><?=($inuse) ? "YES" : "NO"; ?></td>
+ <td>
+ <a href="system_crlmanager.php?act=exp&amp;id=<?=$tmpcrl['refid']?>" class="btn btn-xs btn-success">
+ <?=gettext("Export CRL")?>"
</a>
- <?php if ($internal): ?>
- <a href="system_crlmanager.php?act=edit&amp;id=<?=$tmpcrl['refid'];?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("Edit CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" alt="<?=gettext("Edit CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" width="17" height="17" border="0" />
+<?php
+ if ($internal): ?>
+ <a href="system_crlmanager.php?act=edit&amp;id=<?=$tmpcrl['refid']?>" class="btn btn-xs btn-info">
+ <?=gettext("Edit CRL")?>
</a>
- <?php else: ?>
- <a href="system_crlmanager.php?act=editimported&amp;id=<?=$tmpcrl['refid'];?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("Edit CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" alt="<?=gettext("Edit CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" width="17" height="17" border="0" />
+<?php
+ else: ?>
+ <a href="system_crlmanager.php?act=editimported&amp;id=<?=$tmpcrl['refid']?>" class="btn btn-xs btn-info">
+ <?=gettext("Edit CRL")?>
</a>
- <?php endif; ?>
- <?php if (!$inuse): ?>
- <a href="system_crlmanager.php?act=del&amp;id=<?=$tmpcrl['refid'];?>" onclick="return confirm('<?=gettext("Do you really want to delete this Certificate Revocation List?") . ' (' . htmlspecialchars($tmpcrl['descr']) . ')';?>')">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("Delete CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" alt="<?=gettext("Delete CRL") . " " . htmlspecialchars($tmpcrl['descr']); ?>" width="17" height="17" border="0" />
+<?php endif;
+ if (!$inuse): ?>
+ <a href="system_crlmanager.php?act=del&amp;id=<?=$tmpcrl['refid']?>" class="btn btn-xs btn-danger">
+ <?=gettext("Delete CRL")?>
</a>
- <?php endif; ?>
+<?php
+ endif; ?>
</td>
</tr>
- <?php
- $i++;
- endforeach;
- endif;
- ?>
- <tr>
- <td colspan="5">&nbsp;</td>
- </tr>
- <?php
- $i++;
- endforeach;
- ?>
- </tbody>
- </table>
-
<?php
- endif;
+ $i++;
+ endforeach;
+ endif;
+ $i++;
+ endforeach;
+?>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+
+<?php
+}
?>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc");?>
-<script type="text/javascript">
-//<![CDATA[
-
-method_change();
-
-//]]>
+<script>
+//<![CDATA[
+events.push(function(){
+
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ // When the 'method" selector is changed, we show/hide certain sections
+ $('#method').on('change', function() {
+ hideClass('internal', ($('#method').val() == 'existing'));
+ hideClass('existing', ($('#method').val() == 'internal'));
+ });
+
+ hideClass('internal', ($('#method').val() == 'existing'));
+ hideClass('existing', ($('#method').val() == 'internal'));
+});
+//]]>
</script>
-</body>
-</html>
+<?php include("foot.inc");
+
diff --git a/src/usr/local/www/system_firmware.php b/src/usr/local/www/system_firmware.php
index d6d48ee..4a6cc5a 100644
--- a/src/usr/local/www/system_firmware.php
+++ b/src/usr/local/www/system_firmware.php
@@ -33,7 +33,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /usr/bin/tar
- pfSense_MODULE: firmware
+ pfSense_MODULE: firmware
*/
##|+PRIV
@@ -104,14 +104,9 @@ function file_upload_error_message($error_code) {
if (is_subsystem_dirty('firmwarelock')) {
$pgtitle = array(gettext("System"), gettext("Firmware"), gettext("Manual Update"));
include("head.inc");
- echo "<body link=\"#0000CC\" vlink=\"#0000CC\" alink=\"#0000CC\">\n";
include("fbegin.inc");
- echo "<div>\n";
- print_info_box(gettext("An upgrade is currently in progress.<p>The firewall will reboot when the operation is complete.") . "</p><p><img src='/themes/{$g['theme']}/images/icons/icon_fw-update.gif' alt='update' /></p>");
- echo "</div>\n";
- include("fend.inc");
- echo "</body>";
- echo "</html>";
+ print_info_box(gettext("An upgrade is currently in progress. The firewall will reboot when the operation is complete.") . "<p><img src='/themes/{$g['theme']}/images/icons/icon_fw-update.gif' alt='update' /></p>");
+ include("foot.inc");
exit;
}
@@ -208,136 +203,129 @@ if ($_POST && !is_subsystem_dirty('firmwarelock')) {
$pgtitle = array(gettext("System"), gettext("Firmware"));
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg);
+
+if ($fwinfo != "")
+ print_info_box($fwinfo);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Manual Update"), true, "system_firmware.php");
+$tab_array[] = array(gettext("Auto Update"), false, "system_firmware_check.php");
+$tab_array[] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
+if($g['hidedownloadbackup'] == false)
+ $tab_array[] = array(gettext("Restore Full Backup"), false, "system_firmware_restorefullbackup.php");
+
+display_top_tabs($tab_array);
+
+// For a simple yes/no we can use an HTML form
+if ($sig_warning && !$input_errors) {
+ $sig_warning = gettext("The image you uploaded " .
+ "is not an official/supported image and may lead to unexpected behavior or security " .
+ "compromises. Only install images that come from sources that you trust, and make sure ".
+ "that the image has not been tampered with.") . "<br /><br />".
+ gettext("Do you want to install this image anyway (on your own risk)?");
+
+ print_info_box($sig_warning);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<form action="system_firmware.php" method="post" enctype="multipart/form-data">
-<?php
- /* Construct an upload_id for this session */
- if (!session_id()) {
- $upload_id = uniqid();
- } else {
- $upload_id = session_id();
- }
-?>
-<input type="hidden" name="UPLOAD_IDENTIFIER" value="<?php echo $upload_id;?>" />
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if ($fwinfo <> "") print_info_box($fwinfo); ?>
-<?php
- if ($sig_warning && !$input_errors):
- $sig_warning = "<strong>" . $sig_warning . "</strong><br />" . gettext("This means that the image you uploaded " .
- "is not an official/supported image and may lead to unexpected behavior or security " .
- "compromises. Only install images that come from sources that you trust, and make sure " .
- "that the image has not been tampered with.") . "<br /><br />" .
- gettext("Do you want to install this image anyway (on your own risk)?");
- print_info_box($sig_warning);
- if (stristr($_FILES['ulfile']['name'], "nanobsd")) {
- echo "<input type='hidden' name='isnano' id='isnano' value='yes' />\n";
- }
-?>
-<input name="sig_override" type="submit" class="formbtn" id="sig_override" value=" <?=gettext("Yes");?> " />
-<input name="sig_no" type="submit" class="formbtn" id="sig_no" value=" <?=gettext("No"); ?> " />
-<?php
- else:
- if (!is_subsystem_dirty('firmwarelock')):
-?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firmware">
- <tr>
- <td>
+ <form action="system_firmware.php" method="post" enctype="multipart/form-data">
+ <input name="sig_override" type="submit" class="btn btn-danger" id="sig_override" value=" <?=gettext("Yes");?> " />
+ <input name="sig_no" type="submit" class="btn btn-default" id="sig_no" value=" <?=gettext("No"); ?> " />
+ </form>
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Manual Update"), true, "system_firmware.php");
- $tab_array[] = array(gettext("Auto Update"), false, "system_firmware_check.php");
- $tab_array[] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
- if ($g['hidedownloadbackup'] == false) {
- $tab_array[] = array(gettext("Restore Full Backup"), false, "system_firmware_restorefullbackup.php");
+
+} else {
+ // This is where the work gets done so Forms.classes will be used from this point
+ if (!is_subsystem_dirty('firmwarelock')) {
+ require('classes/Form.class.php');
+
+ if (!is_subsystem_dirty('rebootreq')) {
+ // Provide a button to enable firmware upgrades. Upgrades should be disabled on initial page load
+ if (!is_subsystem_dirty('firmware') || !$_POST || $_POST['save']) {
+ $enablebtn = new Form_Button(
+ 'Submit',
+ 'Enable firmware upload'
+ );
+
+ $enablebtn->addClass('btn-warning');
+ $form = new Form($enablebtn);
+ $section = new Form_Section('Invoke ' . $g['product_name'] .' Manual Upgrade');
+ $section->addInput(new Form_StaticText('Enable', 'Click the "Enable firmware upload" button below to begin.'));
}
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic"><?=gettext("Invoke") ." ". $g['product_name'] . " " . gettext("Manual Upgrade"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="baseline" class="vncell">&nbsp;</td>
- <td width="78%" class="vtable">
-<?php
- if (!is_subsystem_dirty('rebootreq')):
- if (!is_subsystem_dirty('firmware')):
-?>
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Enable firmware upload");?>" />
- <br />
- <?php printf(gettext('Click "Enable firmware upload" to begin.'), $g['firmware_update_text']);?>
- <br />
-<?php
- else:
-?>
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Disable firmware upload");?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="baseline" class="vncell">&nbsp;</td>
- <td width="78%" class="vtable">
- <?php
- if ($g['platform'] == "nanobsd") {
- $type = "*.img.gz";
- } else {
- $type = "*.tgz";
- }
- ?>
- <strong><?=gettext("Firmware image file ($type):");?> </strong>
- <input name="ulfile" type="file" class="formfld" />
- <br />
- <?php if ($g['hidebackupbeforeupgrade'] === false): ?>
- <input type="checkbox" name='backupbeforeupgrade' id='backupbeforeupgrade' /> <?=gettext("Perform full backup prior to upgrade");?>
- <br />
- <?php endif; ?>
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Upgrade firmware");?>" />
- <?=gettext('Click "Upgrade firmware" to start the upgrade process.');?>
-<?php
- endif;
- else:
-?>
- <strong><?=gettext("You must reboot the system before you can upgrade the firmware.");?></strong>
-<?php
- endif;
-?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <?php if (is_subsystem_dirty('firmware')): ?>
- <span class="vexpl">
- <span class="red">
- <strong>
- <?=gettext("Warning:");?><br />
- </strong>
- </span>
- <?=gettext("DO NOT abort the firmware upgrade once it " .
- "has started. The firewall will reboot automatically after " .
- "storing the new firmware. The configuration will be maintained.");?>
- </span>
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- </table>
+ else {
+ // Upgrades are now enabled
+ $form = new Form('Disable firmware upload');
-<?php
- endif;
- endif;
-?>
-<?php include("fend.inc"); ?>
-</form>
-</body>
-</html>
+ $form->setMultipartEncoding();
+
+ $section = new Form_Section('Perform ' . $g['product_name'] .' Manual Upgrade');
+
+ if (!session_id())
+ $upload_id = uniqid();
+ else
+ $upload_id = session_id();
+
+ $section->addInput(new Form_Input(
+ 'UPLOAD_IDENTIFIER',
+ '',
+ 'hidden',
+ $upload_id
+ ));
+
+ if(stristr($_FILES['ulfile']['name'],"nanobsd")) {
+ $section->addInput(new Form_Input(
+ 'isnano',
+ '',
+ 'hidden',
+ 'yes'
+ ));
+ }
+
+ if ($g['platform'] == "nanobsd")
+ $type = "*.img.gz";
+ else
+ $type = "*.tgz";
+
+ $filepicker = new Form_Input(
+ 'ulfile',
+ 'File to upload (' . $type . ')',
+ 'file',
+ ''
+ );
+
+ $section->addInput($filepicker)->setHelp('Choose the file you wish to upload');
+
+ if ($g['hidebackupbeforeupgrade'] === false) {
+ $section->addInput(new Form_Checkbox(
+ 'backupbeforeupgrade',
+ Backup,
+ 'Perform a full backup prior to upgrade"',
+ false
+ ));
+ }
+
+ $section->addInput(new Form_Button(
+ 'submit',
+ 'Upgrade firmware'
+ ))->addClass('btn-danger btn-sm')->setHelp('Click the "Upgrade firmware" button below to start the upgrade process');
+ }
+
+ $form->add($section);
+ print($form);
+ }
+ }
+ else {
+ print_info_box('<strong>' . gettext("You must reboot the system before you can upgrade the firmware.") . '</strong>');
+ }
+
+ if (is_subsystem_dirty('firmware') && !is_subsystem_dirty('firmwarelock')) {
+ print_info_box('<strong>' . gettext("DO NOT ") . '</strong>' . gettext('abort the firmware upgrade once it ' .
+ 'has started. The firewall will reboot automatically after ' .
+ 'storing the new firmware. The configuration will be maintained.'));
+ }
+}
+
+include("foot.inc"); ?> \ No newline at end of file
diff --git a/src/usr/local/www/system_firmware_auto.php b/src/usr/local/www/system_firmware_auto.php
index e2970fa..d57d8d0 100755
--- a/src/usr/local/www/system_firmware_auto.php
+++ b/src/usr/local/www/system_firmware_auto.php
@@ -33,7 +33,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /usr/bin/tar /usr/bin/nohup /bin/cat /sbin/sha256
- pfSense_MODULE: firmware
+ pfSense_MODULE: firmware
*/
##|+PRIV
@@ -64,85 +64,31 @@ $closehead = false;
$pgtitle = array(gettext("Diagnostics"), gettext("Firmware"), gettext("Auto Update"));
include("head.inc");
+$tab_array = array();
+$tab_array[] = array(gettext("Manual Update"), false, "system_firmware.php");
+$tab_array[] = array(gettext("Auto Update"), true, "system_firmware_check.php");
+$tab_array[] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
+if($g['hidedownloadbackup'] == false)
+ $tab_array[] = array(gettext("Restore Full Backup"), false, "system_firmware_restorefullbackup.php");
+
+display_top_tabs($tab_array);
?>
-<meta http-equiv="Content-Type" content="text/html; charset=<?=system_get_language_codeset();?>" />
-<link href="gui.css" rel="stylesheet" type="text/css" />
-</head>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-
-<?php include("fbegin.inc"); ?>
-
-<form action="system_firmware_auto.php" method="post">
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firmware auto-check">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Manual Update"), false, "system_firmware.php");
- $tab_array[] = array(gettext("Auto Update"), true, "system_firmware_check.php");
- $tab_array[] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
- if ($g['hidedownloadbackup'] == false) {
- $tab_array[] = array(gettext("Restore Full Backup"), false, "system_firmware_restorefullbackup.php");
- }
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="outer">
- <tr>
- <td class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="inner">
- <tr>
- <td align="center">
- <table style="height:15;colspacing:0" width="420" border="0" cellpadding="0" cellspacing="0" summary="images">
- <tr>
- <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_left.gif')" height="15" width="5"> </td>
- <td>
- <table id="progholder" style="height:15;colspacing:0" width="410" border="0" cellpadding="0" cellspacing="0" summary="">
- <tr>
- <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_gray.gif')" valign="top" align="left">
- <img src="./themes/<?=$g['theme'];?>/images/misc/bar_blue.gif" width="0" height="15" name="progressbar" id="progressbar" alt="" />
- </td>
- </tr>
- </table>
- </td>
- <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_right.gif')" height="15" width="5"></td>
- </tr>
- </table>
- <br />
- <script type="text/javascript">
- //<![CDATA[
- window.onload=function() {
- document.getElementById("status").wrap='hard';
- document.getElementById("output").wrap='hard';
- }
- //]]>
- </script>
- <!-- status box -->
- <textarea cols="90" rows="1" name="status" id="status"><?=gettext("Beginning firmware upgrade"); ?>.</textarea>
- <br />
- <!-- command output box -->
- <textarea cols="90" rows="25" name="output" id="output"></textarea>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
-</form>
-
-<?php include("fend.inc"); ?>
+
+<div id="statusheading" name="statusheading" class="panel panel-default">
+ <div class="panel-heading" id="status" name="status"><?=gettext("Beginning firmware upgrade")?></div>
+ <div id='output' name='output' class="panel-body"></div>
+</div>
+
+
+<?php
+include("foot.inc"); ?>
<?php
-update_status(gettext("Downloading current version information") . "...");
+panel_heading_text(gettext("Downloading current version information") . "...");
+panel_heading_class('info');
+
$nanosize = "";
if ($g['platform'] == "nanobsd") {
if (file_exists("/etc/nano_use_vga.txt")) {
@@ -159,32 +105,39 @@ download_file_with_progress_bar("{$updater_url}/version{$nanosize}", "/tmp/{$g['
$latest_version = str_replace("\n", "", @file_get_contents("/tmp/{$g['product_name']}_version"));
if (!$latest_version) {
update_output_window(gettext("Unable to check for updates."));
- require("fend.inc");
+ require("foot.inc");
exit;
} else {
$current_installed_buildtime = trim(file_get_contents("/etc/version.buildtime"));
$latest_version = trim(@file_get_contents("/tmp/{$g['product_name']}_version"));
$latest_version_pfsense = strtotime($latest_version);
- if (!$latest_version) {
+ if(!$latest_version) {
+ panel_heading_class('danger');
+ panel_heading_text(gettext('Version check'));
update_output_window(gettext("Unable to check for updates."));
- require("fend.inc");
+ require("foot.inc");
exit;
} else {
- if (pfs_version_compare($current_installed_buildtime, $g['product_version'], $latest_version) == -1) {
- update_status(gettext("Downloading updates") . "...");
+ if (pfs_version_compare($current_installed_buildtime, $current_installed_version, $latest_version) == -1) {
+ panel_heading_text(gettext("Downloading updates") . '...');
+ panel_heading_class('info');
+
conf_mount_rw();
if ($g['platform'] == "nanobsd") {
$update_filename = "latest{$nanosize}.img.gz";
} else {
$update_filename = "latest.tgz";
}
+
$status = download_file_with_progress_bar("{$updater_url}/{$update_filename}", "{$g['upload_path']}/latest.tgz", "read_body_firmware");
$status = download_file_with_progress_bar("{$updater_url}/{$update_filename}.sha256", "{$g['upload_path']}/latest.tgz.sha256");
conf_mount_ro();
update_output_window("{$g['product_name']} " . gettext("download complete."));
} else {
+ panel_heading_class('success');
+ panel_heading_text(gettext('Version check complete'));
update_output_window(gettext("You are on the latest version."));
- require("fend.inc");
+ require("foot.inc");
exit;
}
}
@@ -225,37 +178,40 @@ if ($sigchk == 1) {
}
if ($exitstatus) {
- update_status($sig_warning);
+ panel_heading_text($sig_warning);
+ panel_heading_class('danger');
+
update_output_window(gettext("Update cannot continue. You can disable this check on the Updater Settings tab."));
- require("fend.inc");
+ require("foot.inc");
exit;
} else if ($sigchk == 2) {
- update_status("Upgrade in progress...");
+ panel_heading_text(gettext('Upgrade in progress...'));
+ panel_heading_class('info');
+
update_output_window("\n" . gettext("Upgrade Image does not contain a signature but the system has been configured to allow unsigned images. One moment please...") . "\n");
}
if (!verify_gzip_file("{$g['upload_path']}/latest.tgz")) {
- update_status(gettext("The image file is corrupt."));
+ panel_heading_text(gettext("The image file is corrupt."));
+ panel_heading_class('danger');
+
update_output_window(gettext("Update cannot continue"));
if (file_exists("{$g['upload_path']}/latest.tgz")) {
conf_mount_rw();
unlink("{$g['upload_path']}/latest.tgz");
conf_mount_ro();
}
- require("fend.inc");
+ require("foot.inc");
exit;
}
-if ($downloaded_latest_tgz_sha256 <> $upgrade_latest_tgz_sha256) {
- update_status(gettext("Downloading complete but sha256 does not match."));
+if($downloaded_latest_tgz_sha256 <> $upgrade_latest_tgz_sha256) {
+ panel_heading_text(gettext("Downloading complete but sha256 does not match."));
+ panel_heading_class('danger');
+
update_output_window(gettext("Auto upgrade aborted.") . " \n\n" . gettext("Downloaded SHA256") . ": " . $downloaded_latest_tgz_sha256 . "\n\n" . gettext("Needed SHA256") . ": " . $upgrade_latest_tgz_sha256);
} else {
update_output_window($g['product_name'] . " " . gettext("is now upgrading.") . "\\n\\n" . gettext("The firewall will reboot once the operation is completed."));
- echo "\n<script type=\"text/javascript\">";
- echo "\n//<![CDATA[";
- echo "\ndocument.progressbar.style.visibility='hidden';";
- echo "\n//]]>";
- echo "\n</script>";
mwexec_bg($external_upgrade_helper_text);
}
@@ -272,7 +228,7 @@ function read_body_firmware($ch, $string) {
$a = $file_size;
$b = $downloaded;
$c = $downloadProgress;
- $text = " " . gettext("Auto Update Download Status") . "\\n";
+ $text = " " . gettext("Auto Update Download Status") . "\\n";
$text .= "----------------------------------------------------\\n";
$text .= " " . gettext("Current Version") . " : {$g['product_version']}\\n";
$text .= " " . gettext("Latest Version") . " : {$latest_version}\\n";
@@ -290,7 +246,28 @@ function read_body_firmware($ch, $string) {
return $length;
}
+// Update the text in the panel-heading
+function panel_heading_text($text) {
+?>
+ <script>
+ events.push(function(){
+ $('#status').html('<?=$text?>');
+ });
+ </script>
+<?php
+}
+
+// Update the class of the message panel so that it's color changes
+// Use danger, success, info, warning, default etc
+function panel_heading_class($newclass = 'default') {
+?>
+ <script>
+ events.push(function(){
+ $('#statusheading').removeClass().addClass('panel panel-' + '<?=$newclass?>');
+ });
+ </script>
+<?php
+}
+
?>
-</body>
-</html>
diff --git a/src/usr/local/www/system_firmware_check.php b/src/usr/local/www/system_firmware_check.php
index 2e56943..c2cc9a1 100644
--- a/src/usr/local/www/system_firmware_check.php
+++ b/src/usr/local/www/system_firmware_check.php
@@ -32,7 +32,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: firmware
+ pfSense_MODULE: firmware
*/
##|+PRIV
@@ -50,74 +50,28 @@ $curcfg = $config['system']['firmware'];
$pgtitle = array(gettext("System"), gettext("Firmware"), gettext("Auto Update"));
include("head.inc");
+$tab_array = array();
+$tab_array[] = array(gettext("Manual Update"), false, "system_firmware.php");
+$tab_array[] = array(gettext("Auto Update"), true, "system_firmware_check.php");
+$tab_array[] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
+if($g['hidedownloadbackup'] == false)
+ $tab_array[] = array(gettext("Restore Full Backup"), false, "system_firmware_restorefullbackup.php");
+display_top_tabs($tab_array);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-
-<?php include("fbegin.inc"); ?>
-
<form action="system_firmware_auto.php" method="post">
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firmware check">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Manual Update"), false, "system_firmware.php");
- $tab_array[] = array(gettext("Auto Update"), true, "system_firmware_check.php");
- $tab_array[] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
- if ($g['hidedownloadbackup'] == false) {
- $tab_array[] = array(gettext("Restore Full Backup"), false, "system_firmware_restorefullbackup.php");
- }
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="">
- <tr>
- <td align="center">
- <!-- progress bar -->
- <table style="height:15;colspacing:0" width="420" border="0" cellpadding="0" cellspacing="0" summary="images">
-
- <tr>
- <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_left.gif')" height="15" width="5"></td>
- <td>
- <table id="progholder" style="height:15;colspacing:0" width="410" border="0" cellpadding="0" cellspacing="0" summary="">
- <tr>
- <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_gray.gif')" valign="top" align="left">
- <img src="./themes/<?=$g['theme'];?>/images/misc/bar_blue.gif" width="0" height="15" name="progressbar" id="progressbar" alt="" />
- </td>
- </tr>
- </table>
- </td>
- <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_right.gif')" height="15" width="5"></td>
- </tr>
- </table>
- <br />
- <!-- command output box -->
- <script type="text/javascript">
- //<![CDATA[
- window.onload=function() {
- document.getElementById("output").wrap='hard';
- }
- //]]>
- </script>
- <textarea style="border:1;bordercolordark:#000000;bordercolorlight:#000000" cols="90" rows="9" name="output" id="output"></textarea>
- <div id="backupdiv" style="visibility:hidden">
- <?php if ($g['hidebackupbeforeupgrade'] === false): ?>
- <br /><input type="checkbox" name="backupbeforeupgrade" id="backupbeforeupgrade" /><?=gettext("Perform full backup prior to upgrade");?>
- <?php endif; ?>
- </div>
- <input id='invokeupgrade' style='visibility:hidden' type="submit" value="<?=gettext("Invoke Auto Upgrade"); ?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
-
-<p>
+ <div id="statusheading" class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Update progress')?></h2></div>
+ <div class="panel-body" name="output" id="output"></div>
+ </div>
+
+ <div id="backupdiv" style="visibility:hidden">
+ <?php if ($g['hidebackupbeforeupgrade'] === false): ?>
+ <br /><input type="checkbox" name="backupbeforeupgrade" id="backupbeforeupgrade" /><?=gettext("Perform full backup prior to upgrade")?>
+ <?php endif; ?>
+ </div>
+ <br />
+ <input id='invokeupgrade' class="btn btn-warning" style='visibility:hidden' type="submit" value="<?=gettext("Invoke Auto Upgrade"); ?>" />
<?php
@@ -154,53 +108,74 @@ if (!$remote_version) {
}
} else {
$static_text .= gettext("Obtaining current version information...");
- update_output_window($static_text);
+ panel_text($static_text);
$current_installed_buildtime = trim(file_get_contents("/etc/version.buildtime"));
- $static_text .= "done\\n";
- update_output_window($static_text);
+ $static_text .= "done<br />";
+ panel_text($static_text);
if (pfs_version_compare($current_installed_buildtime, $g['product_version'], $remote_version) == -1) {
$needs_system_upgrade = true;
} else {
- $static_text .= "\\n" . gettext("You are on the latest version.") . "\\n";
+ $static_text .= "<br />" . gettext("You are on the latest version.") . "<br />";
+ panel_text($static_text);
+ panel_heading_class('success');
}
}
update_output_window($static_text);
if ($needs_system_upgrade == false) {
- echo "</p>";
- echo "</form>";
- require("fend.inc");
- echo "</body>";
- echo "</html>";
+ print("</form>");
+ require("foot.inc");
+
exit;
}
+?>
+<script>
+ events.push(function(){
+ $('#invokeupgrade').css('visibility','visible');
+ $('#backupdiv').css('visibility','visible');
+ });
+</script>
+<?php
-echo "\n<script type=\"text/javascript\">\n";
-echo "//<![CDATA[\n";
-echo "jQuery('#invokeupgrade').css('visibility','visible');\n";
-echo "//]]>\n";
-echo "</script>\n";
-echo "\n<script type=\"text/javascript\">\n";
-echo "//<![CDATA[\n";
-echo "jQuery('#backupdiv').css('visibility','visible');\n";
-echo "//]]>\n";
-echo "</script>\n";
-
-$txt = gettext("A new version is now available") . "\\n\\n";
-$txt .= gettext("Current version") . ": " . $g['product_version'] . "\\n";
+$txt = gettext("A new version is now available") . "<br />";
+$txt .= gettext("Current version") .": ". $current_installed_version . "<br />";
if ($g['platform'] == "nanobsd") {
- $txt .= " " . gettext("NanoBSD Size") . " : " . trim(file_get_contents("/etc/nanosize.txt")) . "\\n";
+ $txt .= " " . gettext("NanoBSD Size") . " : " . trim(file_get_contents("/etc/nanosize.txt")) . "<br />";
}
-$txt .= " " . gettext("Built On") . ": " . $current_installed_buildtime . "\\n";
-$txt .= " " . gettext("New version") . ": " . htmlspecialchars($remote_version, ENT_QUOTES | ENT_HTML401). "\\n\\n";
-$txt .= " " . gettext("Update source") . ": " . $updater_url . "\\n";
-update_output_window($txt);
+$txt .= " " . gettext("Built On") .": ". $current_installed_buildtime . "<br />";
+$txt .= " " . gettext("New version") .": ". htmlspecialchars($remote_version, ENT_QUOTES | ENT_HTML401). "<br /><br />";
+$txt .= " " . gettext("Update source") .": ". $updater_url . "<br />";
+panel_text($txt);
+panel_heading_class('info');
?>
-</p>
+
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php
+
+// Update the class of the message panel so that it's color changes
+// Use danger, success, info, warning, default etc
+function panel_heading_class($newclass = 'default') {
+?>
+ <script>
+ events.push(function(){
+ $('#statusheading').removeClass().addClass('panel panel-' + '<?=$newclass?>');
+ });
+ </script>
+<?php
+}
+
+// Update the text in the panel-heading
+function panel_text($text) {
+?>
+ <script>
+ events.push(function(){
+ $('#output').html('<?=$text?>');
+ });
+ </script>
+<?php
+}
+
+include("foot.inc");
diff --git a/src/usr/local/www/system_firmware_restorefullbackup.php b/src/usr/local/www/system_firmware_restorefullbackup.php
index 3cf3f83..54ba297 100644
--- a/src/usr/local/www/system_firmware_restorefullbackup.php
+++ b/src/usr/local/www/system_firmware_restorefullbackup.php
@@ -34,7 +34,7 @@
/*
pfSense_BUILDER_BINARIES: /etc/rc.restore_full_backup
- pfSense_MODULE: backup
+ pfSense_MODULE: backup
*/
##|+PRIV
@@ -44,6 +44,9 @@
##|*MATCH=system_firmware_restorefullbackup.php
##|-PRIV
+// Don't really restore or reboot while testing. Should be 'false' for production of course
+define(DEBUG, false);
+
/* Allow additional execution time 0 = no limit. */
ini_set('max_execution_time', '0');
ini_set('max_input_time', '0');
@@ -61,144 +64,153 @@ if ($_GET['backupnow']) {
mwexec_bg("/etc/rc.create_full_backup");
}
-if ($_GET['downloadbackup']) {
- $filename = basename($_GET['downloadbackup']);
- $path = "/root/{$filename}";
- if (file_exists($path)) {
- session_write_close();
- ob_end_clean();
- session_cache_limiter('public');
- //$fd = fopen("/root/{$filename}", "rb");
- $filesize = filesize("/root/{$filename}");
- header("Cache-Control: ");
- header("Pragma: ");
- header("Content-Type: application/octet-stream");
- header("Content-Length: " .(string)(filesize($path)));
- header('Content-Disposition: attachment; filename="'.$filename.'"');
- header("Content-Transfer-Encoding: binary\n");
- if ($file = fopen("/root/{$filename}", 'rb')) {
- while ((!feof($file)) && (connection_status() == 0)) {
- print(fread($file, 1024*8));
- flush();
+if($_POST['downloadbackup']) {
+ $filename = basename($_POST['downloadbackup']);
+
+ if(DEBUG)
+ print_info_box('DEBUG: Simulating download of ' . htmlspecialchars($filename));
+ else {
+ $path = "/root/{$filename}";
+ if(file_exists($path)) {
+ session_write_close();
+ ob_end_clean();
+ session_cache_limiter('public');
+ //$fd = fopen("/root/{$filename}", "rb");
+ $filesize = filesize("/root/{$filename}");
+ header("Cache-Control: ");
+ header("Pragma: ");
+ header("Content-Type: application/octet-stream");
+ header("Content-Length: " .(string)(filesize($path)) );
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ header("Content-Transfer-Encoding: binary\n");
+ if($file = fopen("/root/{$filename}", 'rb')){
+ while( (!feof($file)) && (connection_status()==0) ){
+ print(fread($file, 1024*8));
+ flush();
+ }
+ fclose($file);
}
- fclose($file);
- }
- exit;
+ exit;
+ }
}
}
-
-if ($_GET['deletefile']) {
- $filename = basename($_GET['deletefile']);
- if (file_exists("/root/{$filename}") && (preg_match("/pfSense-full-backup-\d+-\d+\.tgz/", $filename) == 1)) {
- unlink("/root/" . $filename);
- $savemsg = htmlspecialchars($filename) . " " . gettext("has been deleted.");
- } else {
- $savemsg = htmlspecialchars($filename) . " " . gettext("has not been been deleted (invalid backup file or file does not exist).");
+else if ($_POST['deletefile']) {
+ $filename = basename($_POST['deletefile']);
+ if(DEBUG)
+ print_info_box('DEBUG: Simulating deletion of ' . htmlspecialchars($filename));
+ else {
+ if(file_exists("/root/{$filename}") && (preg_match("/pfSense-full-backup-\d+-\d+\.tgz/", $filename) == 1)) {
+ unlink("/root/" . $filename);
+ $savemsg = htmlspecialchars($filename) . " " . gettext("has been deleted.");
+ } else {
+ $savemsg = htmlspecialchars($filename) . " " . gettext("has not been been deleted (invalid backup file or file does not exist).");
+ }
}
}
-
-if ($_POST['restorefile']) {
+else if ($_POST['restorefile']) {
$filename = basename($_POST['restorefile']);
- if (file_exists("/root/{$filename}") && (preg_match("/pfSense-full-backup-\d+-\d+\.tgz/", $filename) == 1)) {
- mwexec_bg("/etc/rc.restore_full_backup /root/" . escapeshellcmd($filename));
- $savemsg = gettext("The firewall is currently restoring") . " " . htmlspecialchars($filename);
- } else {
- $savemsg = htmlspecialchars($filename) . " " . gettext("has not been been restored (invalid backup file or file does not exist).");
+ if(DEBUG)
+ print_info_box('DEBUG: Restoration of ' . $filename . ' simulated');
+ else {
+ if(file_exists("/root/{$filename}") && (preg_match("/pfSense-full-backup-\d+-\d+\.tgz/", $filename) == 1)) {
+ mwexec_bg("/etc/rc.restore_full_backup /root/" . escapeshellcmd($filename));
+ $savemsg = gettext("The firewall is currently restoring") . " " . htmlspecialchars($filename);
+ } else {
+ $savemsg = htmlspecialchars($filename) . " " . gettext("has not been been restored (invalid backup file or file does not exist).");
+ }
}
}
$pgtitle = array(gettext("Diagnostics"), gettext("Restore full backup"));
include("head.inc");
-?>
+if ($input_errors)
+ print_input_errors($input_errors);
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('restore')): ?>
-<p>
+if ($savemsg)
+ print_info_box($savemsg);
+
+if (is_subsystem_dirty('restore')) {
+ ?>
<form action="reboot.php" method="post">
<input name="Submit" type="hidden" value="Yes" />
- <?php print_info_box(gettext("The firewall configuration has been changed.") . "<br />" . gettext("The firewall is now rebooting."));?><br />
+<?php print_info_box(gettext("The firewall configuration has been changed. The firewall is now rebooting.")) ?>
</form>
-</p>
-<?php endif; ?>
+<?php
+}
+?>
+
+<?php
+$tab_array = array();
+$tab_array[] = array(gettext("Manual Update"), false, "system_firmware.php");
+$tab_array[] = array(gettext("Auto Update"), false, "system_firmware_check.php");
+$tab_array[] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
+if($g['hidedownloadbackup'] == false)
+ $tab_array[] = array(gettext("Restore Full Backup"), true, "system_firmware_restorefullbackup.php");
+
+display_top_tabs($tab_array);
+?>
+
<form action="system_firmware_restorefullbackup.php" method="post">
-<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="restore full backup">
- <tr>
- <td>
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Available backup files')?></h2></div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table-hover table-striped table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("File to restore")?></th>
+ <th><?=gettext("Date") ?></th>
+ <th><?=gettext("Size") ?></th>
+ <th><?=gettext("Action")?></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Manual Update"), false, "system_firmware.php");
- $tab_array[] = array(gettext("Auto Update"), false, "system_firmware_check.php");
- $tab_array[] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
- if ($g['hidedownloadbackup'] == false) {
- $tab_array[] = array(gettext("Restore Full Backup"), true, "system_firmware_restorefullbackup.php");
- }
- display_top_tabs($tab_array);
+ $home = getcwd();
+ chdir("/root");
+ $available_restore_files = glob("pfSense-full-backup-*");
+ $counter = 0;
+ foreach($available_restore_files as $arf) {
+ $counter++;
+ $size = exec("gzip -l /root/$arf | grep -v compressed | awk '{ print $2 }'");
?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="1" class="listtopic"><?=gettext("Filename"); ?></td>
- <td colspan="1" class="listtopic"><?=gettext("Date"); ?></td>
- <td colspan="1" class="listtopic"><?=gettext("Size"); ?></td>
- <td colspan="1" class="listtopic"></td>
- </tr>
+ <tr>
+ <td>
+ <input type="radio" class="radio-inline" name="restorefile" value="<?=$arf?>" /> <?=$arf?>
+ </td>
+ <td>
+ <?=date ("F d Y H:i:s", filemtime($arf))?>
+ </td>
+ <td>
+ <?=format_bytes($size)?>
+ </td>
+ <td>
+ <button class="btn btn-xs btn-danger" type="submit" name="deletefile" value="<?=$arf?>" title="Delete backup file">Delete</button>
+ <button class="btn btn-xs btn-default" type="submit" name="downloadbackup" value="<?=$arf?>" title="Download backup file">Download</button>
+ </td>
+ </tr>
<?php
- chdir("/root");
- $available_restore_files = glob("pfSense-full-backup-*");
- $counter = 0;
- foreach ($available_restore_files as $arf) {
- $counter++;
- $size = exec("gzip -l /root/$arf | grep -v compressed | awk '{ print $2 }'");
- echo "<tr>";
- echo "<td class='listlr' width='50%' colspan='1'>";
- echo "<input type='radio' name='restorefile' value='$arf' /> $arf";
- echo "</td>";
- echo "<td class='listr' width='30%' colspan='1'>";
- echo date ("F d Y H:i:s", filemtime($arf));
- echo "</td>";
- echo "<td class='listr' width='40%' colspan='1'>";
- echo format_bytes($size);
- echo "</td>";
- echo "<td class='listr nowrap' width='20%' colspan='1'>";
- echo "<a onclick=\"return confirm('" . gettext("Do you really want to delete this backup?") . "')\" href='system_firmware_restorefullbackup.php?deletefile=" . htmlspecialchars($arf) . "'>";
- echo gettext("Delete");
- echo "</a> | ";
- echo "<a href='system_firmware_restorefullbackup.php?downloadbackup=" . htmlspecialchars($arf) . "'>";
- echo gettext("Download");
- echo "</a>";
- echo "</td>";
- echo "</tr>";
- }
- if ($counter == 0) {
- echo "<tr>";
- echo "<td class='listlr' width='100%' colspan='4' align='center'>";
- echo gettext("Could not locate any previous backups.");
- echo "</td>";
- echo "</tr>";
- }
+ } // e-o-foreach backup file
+
+ chdir($home); // Je me souvien
?>
- <tr>
- <td width="78%" colspan="3">
- &nbsp;<br />
- <input type="checkbox" name="overwriteconfigxml" id="overwriteconfigxml" checked="checked" /> <?=gettext("do not restore config.xml."); ?>
- <br />
- <input name="Restore" type="submit" class="formbtn" id="restore" value="<?=gettext("Restore"); ?>" />
- </td>
- </tr>
- </table>
+ </tbody>
+ </table>
</div>
- </td>
- </tr>
-</table>
+ </div>
+ </div>
+<?php
+ if($counter == 0)
+ print_info_box(gettext("Could not locate any previous backups."));
+ else {
+?>
+ <p><input type="checkbox" name="overwriteconfigxml" id="overwriteconfigxml" checked="checked"/> <?=gettext(" When checked, DO NOT restore the config.xml file."); ?></p>
+ <p><button name="Restore" type="submit" class="btn btn-danger" id="restore" value="<?=gettext("Restore")?>"><?=gettext("Restore")?></button></p>
+<?php
+ }
+?>
</form>
<script type="text/javascript">
@@ -208,13 +220,10 @@ decrypt_change();
//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
<?php
if (is_subsystem_dirty('restore')) {
system_reboot();
}
-?>
+include("foot.inc");?> \ No newline at end of file
diff --git a/src/usr/local/www/system_firmware_settings.php b/src/usr/local/www/system_firmware_settings.php
index 9f6c5e0..e43ca1c 100644
--- a/src/usr/local/www/system_firmware_settings.php
+++ b/src/usr/local/www/system_firmware_settings.php
@@ -30,7 +30,7 @@
*/
/*
pfSense_BUILDER_BINARIES: /usr/bin/fetch
- pfSense_MODULE: firmware
+ pfSense_MODULE: firmware
*/
##|+PRIV
@@ -89,230 +89,172 @@ $gitcfg = $config['system']['gitsync'];
$pgtitle = array(gettext("System"), gettext("Firmware"), gettext("Settings"));
$closehead = false;
-include("head.inc");
exec("/usr/bin/fetch -q -o {$g['tmp_path']}/manifest \"{$g['update_manifest']}\"");
if (file_exists("{$g['tmp_path']}/manifest")) {
$preset_urls_split = explode("\n", file_get_contents("{$g['tmp_path']}/manifest"));
}
-?>
-<script type="text/javascript">
-//<![CDATA[
+include("head.inc");
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+$tab_array = array();
+$tab_array[] = array(gettext("Manual Update"), false, "system_firmware.php");
+$tab_array[] = array(gettext("Auto Update"), false, "system_firmware_check.php");
+$tab_array[] = array(gettext("Updater Settings"), true, "system_firmware_settings.php");
+
+if($g['hidedownloadbackup'] == false)
+ $tab_array[] = array(gettext("Restore Full Backup"), false, "system_firmware_restorefullbackup.php");
+
+display_top_tabs($tab_array);
+require('classes/Form.class.php');
-function enable_altfirmwareurl(enable_over) {
- if (document.iform.alturlenable.checked || enable_over) {
- document.iform.firmwareurl.disabled = 0;
- } else {
- document.iform.firmwareurl.disabled = 1;
- document.iform.firmwareurl.value = '';
+$form = new Form();
+
+$section = new Form_Section('Firmware Branch');
+
+if(is_array($preset_urls_split)) {
+ $urllist = array();
+
+ foreach($preset_urls_split as $pus) {
+ $pus_text = explode("\t", $pus);
+ if (empty($pus_text[0]))
+ continue;
+ if (stristr($pus_text[0], php_uname("m")) !== false) {
+ $yourarch = " (Current architecture)";
+ $choice = $pus_text[1];
+ } else {
+ $yourarch = "";
+ }
+
+ $urllist[$pus_text[1]] = $pus_text[0] . $yourarch;
}
+
+ $section->addInput(new Form_Select(
+ 'preseturls',
+ 'Default Auto Update URLs',
+ $choice,
+ $urllist
+ ))->setHelp('Entries denoted by "Current architecture" match the architecture of your current installation, ' .
+ 'such as %s. Changing architectures during an upgrade is not recommended, and may require a manual reboot after the update completes.', [php_uname("m")]);
+
+ $form->add($section);
}
-//]]>
-</script>
-</head>
+$section = new Form_Section('Firmware Auto Update URL');
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc");?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
+$section->addInput(new Form_Checkbox(
+ 'alturlenable',
+ 'Unofficial',
+ 'Allow the use of an "unofficial" server for firmware upgrades',
+ isset($curcfg['alturl']['enable'])
+ ));
-<form action="system_firmware_settings.php" method="post" name="iform" id="iform">
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firmware settings">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Manual Update"), false, "system_firmware.php");
- $tab_array[] = array(gettext("Auto Update"), false, "system_firmware_check.php");
- $tab_array[] = array(gettext("Updater Settings"), true, "system_firmware_settings.php");
- if ($g['hidedownloadbackup'] == false) {
- $tab_array[] = array(gettext("Restore Full Backup"), false, "system_firmware_restorefullbackup.php");
+$section->addInput(new Form_Input(
+ 'firmwareurl',
+ 'Base URL',
+ 'text'
+ ))->setHelp('This is where %s will check for newer firmware versions when the <a href="system_firmware_check.php">' .
+ 'System: Firmware: Auto Update</a> page is viewed', [$g['product_name']]);
+
+$form->add($section);
+
+$section = new Form_Section('Updates');
+
+$section->addInput(new Form_Checkbox(
+ 'allowinvalidsig',
+ 'Unsigned images',
+ 'Allow auto-update firmware images with a missing or invalid digital signature to be used',
+ isset($curcfg['allowinvalidsig'])
+ ));
+
+$section->addInput(new Form_Checkbox(
+ 'disablecheck',
+ 'Dashboard check',
+ 'Disable the automatic dashboard auto-update check',
+ isset($curcfg['disablecheck'])
+ ));
+
+$form->add($section);
+
+if(file_exists("/usr/local/bin/git") && $g['platform'] == "pfSense") {
+ $section = new Form_Section('GitSync');
+
+ $section->addInput(new Form_Checkbox(
+ 'synconupgrade',
+ 'Auto sync on update',
+ 'After updating, sync with the following repository/branch before reboot',
+ isset($gitcfg['synconupgrade'])
+ ))->setHelp('After updating, sync with the following repository/branch before reboot');
+
+ if(is_dir("/root/pfsense/pfSenseGITREPO/pfSenseGITREPO")) {
+ exec("cd /root/pfsense/pfSenseGITREPO/pfSenseGITREPO && git config remote.origin.url", $output_str);
+ if(is_array($output_str) && !empty($output_str[0]))
+ $lastrepositoryurl = $output_str[0];
+ unset($output_str);
}
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Firmware Branch"); ?></td>
- </tr>
-<?php if (is_array($preset_urls_split)): ?>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Default Auto Update URLs"); ?></td>
- <td class="vtable">
- <select name='preseturls' id='preseturls' onchange="firmwareurl.value = preseturls.value; document.iform.firmwareurl.disabled = 0; alturlenable.checked=true; jQuery('#preseturls').parent().effect('highlight');">
- <option></option>
- <?php
- foreach ($preset_urls_split as $pus) {
- $pus_text = explode("\t", $pus);
- if (empty($pus_text[0])) {
- continue;
- }
- if (stristr($pus_text[0], php_uname("m")) !== false) {
- $style = " style=\"font-weight: bold\"";
- $yourarch = " (Current architecture)";
- } else {
- $style = "";
- $yourarch = "";
- }
- echo "<option value='{$pus_text[1]}'{$style}>{$pus_text[0]}{$yourarch}</option>";
- }
- ?>
- </select>
- <br /><br /><?php echo sprintf(gettext("Entries denoted by \"Current architecture\" match the architecture of your current installation, such as %s. Changing architectures during an upgrade is not recommended, and may require a manual reboot after the update completes."), php_uname("m")); ?>
- </td>
- </tr>
-<?php endif; ?>
- <tr>
- <td valign="top" class="vncell"><?=gettext("Firmware Auto Update URL"); ?></td>
- <td class="vtable">
- <input name="alturlenable" type="checkbox" id="alturlenable" value="yes" onclick="enable_altfirmwareurl()" <?php if (isset($curcfg['alturl']['enable'])) echo "checked=\"checked\""; ?> /> <?=gettext("Use an unofficial server for firmware upgrades") ?><br />
- <table summary="alternative Base URL">
- <tr>
- <td>
- <?=gettext("Base URL:"); ?>
- </td>
- <td>
- <input name="firmwareurl" type="text" class="formfld url" id="firmwareurl" size="64" value="<?php if ($curcfg['alturl']['firmwareurl']) echo htmlspecialchars($curcfg['alturl']['firmwareurl']); else echo $g['']; ?>" />
- </td>
- </tr>
- </table>
- <span class="vexpl">
- <?=gettext("This is where"); ?> <?php echo $g['product_name'] ?> <?=gettext("will check for newer firmware versions when the"); ?> <a href="system_firmware_check.php"><?=gettext("System: Firmware: Auto Update"); ?></a> <?=gettext("page is viewed."); ?>
- <br />
- <b><?=gettext("NOTE:"); ?></b> <?php printf(gettext("When a custom URL is configured, the system will not verify the image has an official digital signature")); ?>
- </span>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Updates"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Unsigned images"); ?></td>
- <td width="78%" class="vtable">
- <input name="allowinvalidsig" type="checkbox" id="allowinvalidsig" value="yes" <?php if (isset($curcfg['allowinvalidsig'])) echo "checked=\"checked\""; ?> />
- <br />
- <?=gettext("Allow auto-update firmware images with a missing or invalid digital signature to be used."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Dashboard check"); ?></td>
- <td width="78%" class="vtable">
- <input name="disablecheck" type="checkbox" id="disablecheck" value="yes" <?php if (isset($curcfg['disablecheck'])) echo "checked=\"checked\""; ?> />
- <br />
- <?=gettext("Disable the automatic dashboard auto-update check."); ?>
- </td>
- </tr>
-<?php
- if (file_exists("/usr/local/bin/git") && $g['platform'] == "pfSense"):
-?>
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Gitsync"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Auto sync on update"); ?></td>
- <td width="78%" class="vtable">
- <input name="synconupgrade" type="checkbox" id="synconupgrade" value="yes" <?php if (isset($gitcfg['synconupgrade'])) echo "checked=\"checked\""; ?> />
- <br />
- <?=gettext("After updating, sync with the following repository/branch before reboot."); ?>
- </td>
- </tr>
-<?php
- if (is_dir("/root/pfsense/pfSenseGITREPO/pfSenseGITREPO")) {
- exec("cd /root/pfsense/pfSenseGITREPO/pfSenseGITREPO && git config remote.origin.url", $output_str);
- if (is_array($output_str) && !empty($output_str[0])) {
- $lastrepositoryurl = $output_str[0];
- }
- unset($output_str);
- }
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Repository URL"); ?></td>
- <td width="78%" class="vtable">
- <input name="repositoryurl" type="text" class="formfld url" id="repositoryurl" size="64" value="<?php if ($gitcfg['repositoryurl']) echo htmlspecialchars($gitcfg['repositoryurl']); ?>" />
-<?php
- if ($lastrepositoryurl):
-?>
- <br />
- <?=sprintf(gettext("The most recently used repository was %s"), $lastrepositoryurl); ?>
- <br />
- <?=gettext("This will be used if the field is left blank."); ?>
-<?php
- endif;
-?>
- </td>
- </tr>
-<?php
- if (is_dir("/root/pfsense/pfSenseGITREPO/pfSenseGITREPO")) {
- exec("cd /root/pfsense/pfSenseGITREPO/pfSenseGITREPO && git branch", $output_str);
- if (is_array($output_str)) {
- foreach ($output_str as $output_line) {
- if (strstr($output_line, '* ')) {
- $lastbranch = substr($output_line, 2);
- break;
- }
+
+ $section->addInput(new Form_Input(
+ 'repositoryurl',
+ 'Repository URL',
+ 'text',
+ ($gitcfg['repositoryurl'] ? $gitcfg['repositoryurl'] : '')
+ ))->setHelp('The most recently used repository was %s. This repository will be used if the field is left blank.', [$lastrepositoryurl]);
+
+ if(is_dir("/root/pfsense/pfSenseGITREPO/pfSenseGITREPO")) {
+ exec("cd /root/pfsense/pfSenseGITREPO/pfSenseGITREPO && git branch", $output_str);
+ if(is_array($output_str)) {
+ foreach($output_str as $output_line) {
+ if(strstr($output_line, '* ')) {
+ $lastbranch = substr($output_line, 2);
+ break;
}
}
unset($output_str);
}
+ unset($output_str);
+ }
+
+ $section->addInput(new Form_Input(
+ 'branch',
+ 'Branch name',
+ 'text',
+ ($gitcfg['branch'] ? $gitcfg['branch'] : '')
+ ))->setHelp('The most recently used branch was "%s". (Usually the branch name is master)' .
+ '<br />Note: Sync will not be performed if a branch is not specified', [$lastbranch]);
+
+ $form->add($section);
+} // e-o-if(file_exista()
+
+print($form);
?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Branch name"); ?></td>
- <td width="78%" class="vtable">
- <input name="branch" type="text" class="formfld unknown" id="branch" size="64" value="<?php if ($gitcfg['branch']) echo htmlspecialchars($gitcfg['branch']); ?>" />
-<?php
- if ($lastbranch):
-?>
- <br />
- <?=sprintf(gettext("The most recently used branch was %s"), $lastbranch); ?>
-<?php
- else:
-?>
- <br />
- <?=gettext("Usually the branch name is master"); ?>
-<?php
- endif;
-?>
- <br />
- <?=gettext("Note: Sync will not be performed if a branch is not specified."); ?>
- </td>
- </tr>
+
+<script>
+// Update firmwareurl from preseturls
+function update_firmwareurl() {
+ var pre = document.getElementById("preseturls");
+ var preVal = pre.options[pre.selectedIndex].value;
+ var firm = document.getElementById("firmwareurl");
+ firm.value = preVal;
+}
+
+// Call it when preseturls changes
+events.push(function(){
+ $('#preseturls').on('change', function(){
+ update_firmwareurl();
+ })
+});
+
+// And call it on page load
+update_firmwareurl();
+
+</script>
<?php
- endif;
-?>
- <tr>
- <td>
- <script type="text/javascript">
- //<![CDATA[
- enable_altfirmwareurl();
- //]]>
- </script>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_gateway_groups.php b/src/usr/local/www/system_gateway_groups.php
index aeb0bad..7abe04c 100644
--- a/src/usr/local/www/system_gateway_groups.php
+++ b/src/usr/local/www/system_gateway_groups.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -91,6 +91,7 @@ if ($_GET['act'] == "del") {
unset($config['filter']['rule'][$idx]['gateway']);
}
}
+
unset($a_gateway_groups[$_GET['id']]);
write_config($changedesc);
mark_subsystem_dirty('staticroutes');
@@ -104,132 +105,79 @@ $shortcut_section = "gateway-groups";
include("head.inc");
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('staticroutes'))
+ print_info_box_np(sprintf(gettext("The gateway configuration has been changed.%sYou must apply the changes in order for them to take effect."), "<br />"));
+
+$tab_array = array();
+$tab_array[] = array(gettext("Gateways"), false, "system_gateways.php");
+$tab_array[] = array(gettext("Routes"), false, "system_routes.php");
+$tab_array[] = array(gettext("Groups"), true, "system_gateway_groups.php");
+display_top_tabs($tab_array);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="system_gateway_groups.php" method="post">
-<input type="hidden" name="y1" value="1" />
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('staticroutes')): ?><br/>
-<?php print_info_box_np(sprintf(gettext("The gateway configuration has been changed.%sYou must apply the changes in order for them to take effect."), "<br />"));?><br /><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system groups">
- <tr>
- <td>
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Group Name")?></th>
+ <th><?=gettext("Gateways")?></th>
+ <th><?=gettext("Priority")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><!-- Action Buttons --></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Gateways"), false, "system_gateways.php");
- $tab_array[1] = array(gettext("Routes"), false, "system_routes.php");
- $tab_array[2] = array(gettext("Groups"), true, "system_gateway_groups.php");
- display_top_tabs($tab_array);
+$i = 0;
+foreach ($a_gateway_groups as $gateway_group):
?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <thead>
- <tr>
- <td width="15%" class="listhdrr"><?=gettext("Group Name");?></td>
- <td width="15%" class="listhdrr"><?=gettext("Gateways");?></td>
- <td width="20%" class="listhdrr"><?=gettext("Priority");?></td>
- <td width="30%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
- <tr>
- <td width="17"></td>
- <td>
- <a href="system_gateway_groups_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="edit" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </thead>
- <tfoot>
- <tr>
- <td class="list" colspan="4"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tr>
- <td width="17"></td>
- <td>
- <a href="system_gateway_groups_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="edit" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </tfoot>
- <tbody>
+ <tr>
+ <td>
+ <?=$gateway_group['name']?>
+ </td>
+ <td>
<?php
- $i = 0;
- foreach ($a_gateway_groups as $gateway_group):
+ foreach($gateway_group['item'] as $item) {
+ $itemsplit = explode("|", $item);
+ print(htmlspecialchars(strtoupper($itemsplit[0])) . "<br />\n");
+ }
?>
- <tr>
- <td class="listlr" ondblclick="document.location='system_gateway_groups_edit.php?id=<?=$i;?>';">
- <?php
- echo $gateway_group['name'];
- ?>
- </td>
- <td class="listr" ondblclick="document.location='system_gateway_groups_edit.php?id=<?=$i;?>';">
- <?php
- foreach ($gateway_group['item'] as $item) {
- $itemsplit = explode("|", $item);
- echo htmlspecialchars(strtoupper($itemsplit[0])) . "<br />\n";
- }
- ?>
- </td>
- <td class="listr" ondblclick="document.location='system_gateway_groups_edit.php?id=<?=$i;?>';">
- <?php
- foreach ($gateway_group['item'] as $item) {
- $itemsplit = explode("|", $item);
- echo "Tier ". htmlspecialchars($itemsplit[1]) . "<br />\n";
- }
- ?>
- </td>
- <td class="listbg" ondblclick="document.location='system_gateway_groups_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($gateway_group['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tr>
- <td>
- <a href="system_gateway_groups_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
- </td>
- <td>
- <a href="system_gateway_groups.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this gateway group?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
- <tr>
- <td width="17"></td>
- <td>
- <a href="system_gateway_groups_edit.php?dup=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="duplicate" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
+ </td>
+ <td>
<?php
- $i++;
- endforeach;
+ foreach($gateway_group['item'] as $item) {
+ $itemsplit = explode("|", $item);
+ print("Tier ". htmlspecialchars($itemsplit[1]) . "<br />\n");
+ }
?>
- <tr style="display:none;">
- <td></td>
- </tr>
- </tbody>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<p>
- <b><?=gettext("Note:");?></b>
- <?=gettext("Remember to use these Gateway Groups in firewall rules in order to enable load balancing, failover, or policy-based routing. Without rules directing traffic into the Gateway Groups, they will not be used.");?>
-</p>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </td>
+ <td>
+ <?=htmlspecialchars($gateway_group['descr'])?>
+ </td>
+ <td>
+ <a href="system_gateway_groups_edit.php?id=<?=$i?>" class="btn btn-xs btn-success"><?=gettext('Edit')?></a>
+ <a href="system_gateway_groups_edit.php?dup=<?=$i?>" class="btn btn-xs btn-info"><?=gettext('Duplicate')?></a>
+ <a href="system_gateway_groups.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger" ><?=gettext('Delete')?></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+endforeach;
+?>
+ </tbody>
+ </table>
+</div>
+
+<nav class="action-buttons">
+ <a href="system_gateway_groups_edit.php" class="btn btn-default"><?=gettext('Add')?></a>
+</nav>
+
+<?php
+ print_info_box(gettext('Remember to use these Gateway Groups in firewall rules in order to enable load balancing, failover, ' .
+ 'or policy-based routing.' . '<br />' .
+ 'Without rules directing traffic into the Gateway Groups, they will not be used.'));
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_gateway_groups_edit.php b/src/usr/local/www/system_gateway_groups_edit.php
index c5fcc3b..70d46e8 100644
--- a/src/usr/local/www/system_gateway_groups_edit.php
+++ b/src/usr/local/www/system_gateway_groups_edit.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -44,15 +44,8 @@ require("guiconfig.inc");
require_once("ipsec.inc");
require_once("vpn.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/system_gateway_groups.php');
-}
-
-if (!is_array($config['gateways']['gateway_group'])) {
+if (!is_array($config['gateways']['gateway_group']))
$config['gateways']['gateway_group'] = array();
-}
$a_gateway_groups = &$config['gateways']['gateway_group'];
$a_gateways = return_gateways_array();
@@ -86,7 +79,6 @@ if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
}
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -171,208 +163,194 @@ function build_gateway_protocol_map (&$a_gateways) {
foreach ($a_gateways as $gwname => $gateway) {
$result[$gwname] = $gateway['ipprotocol'];
}
+
return $result;
}
-include("head.inc");
+function build_carp_list() {
+ global $carplist;
-?>
+ $list = array('address' => gettext('Interface Address'));
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+ foreach($carplist as $vip => $address) {
+ if(($gateway['ipprotocol'] == "inet") && (!is_ipaddrv4($address)))
+ continue;
+ if(($gateway['ipprotocol'] == "inet6") && (!is_ipaddrv6($address)))
+ continue;
+
+ $list[$vip] = "$vip - $address";
+ }
+
+ return($list);
+}
+
+include("head.inc");
-<?php
$gateway_protocol = build_gateway_protocol_map($a_gateways);
-$gateway_array = array_keys($a_gateways);
-$protocol_array = array_values($gateway_protocol);
-$protocol_array = array_values(array_unique($gateway_protocol));
+$gateway_array = array_keys($a_gateways);
+$protocol_array = array_values($gateway_protocol);
+$protocol_array = array_values(array_unique($gateway_protocol));
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Edit gateway group entry');
+
+$section->addInput(new Form_Input(
+ 'nentries',
+ 'Group Name',
+ 'text'
+));
+
+
+$carplist = get_configured_carp_interface_list($interface);
+$row == 0;
+$numrows = count($a_gateways) - 1;
+
+foreach($a_gateways as $gwname => $gateway) {
+ if(!empty($pconfig['item'])) {
+ $af = explode("|", $pconfig['item'][0]);
+ $family = $a_gateways[$af[0]]['ipprotocol'];
+ if($gateway['ipprotocol'] != $family) {
+ $rows++;
+ continue;
+ }
+ }
+
+ $interface = $gateway['friendlyiface'];
+ $selected = array();
+
+ foreach((array)$pconfig['item'] as $item) {
+ $itemsplit = explode("|", $item);
+ if($itemsplit[0] == $gwname) {
+ $selected[$itemsplit[1]] = "selected=\"selected\"";
+ break;
+ } else {
+ $selected[0] = "selected=\"selected\"";
+ }
+ }
+
+ $group = new Form_Group($row == 0 ? 'Gateway Priority':null);
+ $group->addClass($gateway['ipprotocol']);
+
+ $group->add(new Form_Input(
+ 'gwname' . $row,
+ 'Group Name',
+ 'text',
+ $gateway['name']
+ ))->setHelp($row == $numrows ? 'Gateway':null);
+
+ $group->add(new Form_Select(
+ $gwname,
+ 'Tier',
+ isset($pconfig['filterdescriptions']) ? $pconfig['filterdescriptions']:'0',
+ array(
+ '0' => 'Never',
+ '1' => 'Tier 1',
+ '2' => 'Tier 2',
+ '3' => 'Tier 3',
+ '4' => 'Tier 4',
+ '5' => 'Tier 5'
+ )
+ ))->setHelp($row == $numrows ? 'Tier':null)->addClass('row')->addClass($gateway['ipprotocol']);
+
+ $group->add(new Form_Select(
+ $gwname . '_vip',
+ 'Virtual IP',
+ !isset($pconfig['filterdescriptions']) ? '0':$pconfig['filterdescriptions'],
+ build_carp_list()
+ ))->setHelp($row == $numrows ? 'Virtual IP':null);
+
+ $group->add(new Form_Input(
+ 'nentries',
+ 'Group Name',
+ 'text',
+ $gateway['descr']
+ ))->setWidth(3)->setHelp($row == $numrows ? 'Description':null);
+
+ $section->add($group);
+
+ $row++;
+} // e-o-forwach
+
+$section->addInput(new Form_StaticText(
+ 'Link Priority',
+ 'The priority selected here defines in what order failover and balancing of links will be done. ' .
+ 'Multiple links of the same priority will balance connections until all links in the priority will be exhausted. ' .
+ 'If all links in a priority level are exhausted we will use the next available link(s) in the next priority level.'
+));
+
+$section->addInput(new Form_StaticText(
+ 'Virtual IP',
+ 'The virtual IP field selects which (virtual) IP should be used when this group applies to a local Dynamic DNS, IPsec or OpenVPN endpoint.'
+));
+
+$section->addInput(new Form_Select(
+ 'trigger',
+ 'Trigger Level',
+ $pconfig['trigger'],
+ array(
+ '0' => 'Member down',
+ '1' => 'Packet Loss',
+ '2' => 'High Latency',
+ '3' => 'Packet Loss or High latency'
+ )
+))->setHelp('When to trigger exclusion of a member');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+if (isset($id) && $a_gateway_groups[$id]){
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+
+print($form);
?>
+
<script type="text/javascript">
//<![CDATA[
-jQuery(function ($) {
- var gateway_protocol = <?= json_encode($gateway_protocol) ?>;
- var gateways = <?= json_encode($gateway_array) ?>;
- var protocols = <?= json_encode($protocol_array) ?>;
- if (protocols.length <= 1) { return; }
-
- var update_gateway_visibilities = function () {
- var which_protocol_to_show = undefined;
- $.each(gateways, function (i, gateway) {
- var $select = $("#" + gateway);
- var value = $select.val();
- var protocol = gateway_protocol[gateway];
- if (value !== '0' /* i.e., an option is selected */) {
- if (which_protocol_to_show === undefined) {
- which_protocol_to_show = protocol;
- } else if (which_protocol_to_show !== protocol) {
- which_protocol_to_show = 'ALL OF THEM'; // this shouldn't happen
- }
- }
- });
- if (which_protocol_to_show !== undefined && which_protocol_to_show !== 'ALL OF THEM') {
- $.each(gateways, function (i, gateway) {
- var protocol = gateway_protocol[gateway];
- var $row = $("tr.gateway_row#" + gateway + "_row");
- if (protocol === which_protocol_to_show) {
- if ($row.is(":hidden")) {
- $row.fadeIn('slow');
- }
- } else {
- if (!$row.is(":hidden")) {
- $row.fadeOut('slow');
- }
- }
- });
- } else {
- $("tr.gateway_row").each(function () {
- if ($(this).is(":hidden")) {
- $(this).fadeIn('slow');
- }
- });
+events.push(function(){
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ // On changing a Tier selector on any row, find which protocol it uses (class)
+ // and disable the opposite
+ $('.row').on('change', function() {
+ // If user selects 'Never', unhide all rows
+ if($(this).find(":selected").index() == 0) {
+ hideClass('inet', false);
+ hideClass('inet6', false);
+ }
+ else { // Otherwise hide the rows that are ont of 'this' protocol
+ if($(this).hasClass('inet6'))
+ hideClass('inet', true);
+ else
+ hideClass('inet6', true);
}
- };
- $("select.gateway_tier_selector").change(update_gateway_visibilities);
- update_gateway_visibilities();
+ });
});
//]]>
</script>
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="system_gateway_groups_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="system groups edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit gateway group entry"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Group Name"); ?></td>
- <td width="78%" class="vtable">
- <input name="name" type="text" class="formfld unknown" id="name" size="20" value="<?=htmlspecialchars($pconfig['name']);?>" />
- <br /> <span class="vexpl"><?=gettext("Group Name"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Gateway Priority"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="6" cellspacing="0" summary="gateway priority">
- <tr>
- <td class="listhdrr">Gateway</td>
- <td class="listhdrr">Tier</td>
- <td class="listhdrr">Virtual IP</td>
- <td class="listhdrr">Description</td>
- </tr>
- <?php
- $carplist = get_configured_carp_interface_list($interface);
- foreach ($a_gateways as $gwname => $gateway) {
- if (!empty($pconfig['item'])) {
- $af = explode("|", $pconfig['item'][0]);
- $family = $a_gateways[$af[0]]['ipprotocol'];
- if ($gateway['ipprotocol'] != $family) {
- continue;
- }
- }
- $interface = $gateway['friendlyiface'];
- $selected = array();
- foreach ((array)$pconfig['item'] as $item) {
- $itemsplit = explode("|", $item);
- if ($itemsplit[0] == $gwname) {
- $selected[$itemsplit[1]] = "selected=\"selected\"";
- break;
- } else {
- $selected[0] = "selected=\"selected\"";
- }
- }
- $tr_id = $gwname . "_row";
- echo "<tr class='gateway_row' id='{$tr_id}'>\n";
- echo "<td class='listlr'>";
- echo "<strong>{$gateway['name']} </strong>";
- echo "</td><td class='listr'>";
- echo "<select name='{$gwname}' class='gateway_tier_selector formfldselect' id='{$gwname}'>\n";
- echo "<option value='0' $selected[0] >" . gettext("Never") . "</option>\n";
- echo "<option value='1' $selected[1] >" . gettext("Tier 1") . "</option>\n";
- echo "<option value='2' $selected[2] >" . gettext("Tier 2") . "</option>\n";
- echo "<option value='3' $selected[3] >" . gettext("Tier 3") . "</option>\n";
- echo "<option value='4' $selected[4] >" . gettext("Tier 4") . "</option>\n";
- echo "<option value='5' $selected[5] >" . gettext("Tier 5") . "</option>\n";
- echo "</select>\n";
- echo "</td>";
-
- $selected = array();
- foreach ((array)$pconfig['item'] as $item) {
- $itemsplit = explode("|", $item);
- if ($itemsplit[0] == $gwname) {
- $selected[$itemsplit[2]] = "selected=\"selected\"";
- break;
- } else {
- $selected['address'] = "selected=\"selected\"";
- }
- }
- echo "<td class='listr'>";
- echo "<select name='{$gwname}_vip' class='gateway_vip_selector formfldselect' id='{$gwname}_vip'>\n";
- echo "<option value='address' {$selected['address']} >" . gettext("Interface Address") . "</option>\n";
- foreach ($carplist as $vip => $address) {
- echo "<!-- $vip - $address - $interface -->\n";
- if (($gateway['ipprotocol'] == "inet") && (!is_ipaddrv4($address))) {
- continue;
- }
- if (($gateway['ipprotocol'] == "inet6") && (!is_ipaddrv6($address))) {
- continue;
- }
- echo "<option value='{$vip}' $selected[$vip] >$vip - $address</option>\n";
- }
- echo "</select></td>";
- echo "<td class='listr'><strong>{$gateway['descr']}&nbsp;</strong>";
- echo "</td></tr>";
- }
- ?>
- </table>
- <br /><span class="vexpl">
- <strong><?=gettext("Link Priority"); ?></strong> <br />
- <?=gettext("The priority selected here defines in what order failover and balancing of links will be done. " .
- "Multiple links of the same priority will balance connections until all links in the priority will be exhausted. " .
- "If all links in a priority level are exhausted we will use the next available link(s) in the next priority level.") ?>
- <br />
- <strong><?=gettext("Virtual IP"); ?></strong> <br />
- <?=gettext("The virtual IP field selects what (virtual) IP should be used when this group applies to a local Dynamic DNS, IPsec or OpenVPN endpoint") ?>
- </span><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Trigger Level"); ?></td>
- <td width="78%" class="vtable">
- <select name='trigger' class='formfldselect trigger_level_selector' id='trigger'>
- <?php
- foreach ($categories as $category => $categoryd) {
- echo "<option value=\"$category\"";
- if ($category == $pconfig['trigger']) {
- echo " selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($categoryd) . "</option>\n";
- }
- ?>
- </select>
- <br /> <span class="vexpl"><?=gettext("When to trigger exclusion of a member"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br /> <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_gateway_groups[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_gateways.php b/src/usr/local/www/system_gateways.php
index 850c5ba..86786a4 100644
--- a/src/usr/local/www/system_gateways.php
+++ b/src/usr/local/www/system_gateways.php
@@ -214,223 +214,94 @@ $shortcut_section = "gateways";
include("head.inc");
-?>
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+if (is_subsystem_dirty('staticroutes'))
+ print_info_box_np(gettext("The gateway configuration has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."));
+
+$tab_array = array();
+$tab_array[0] = array(gettext("Gateways"), true, "system_gateways.php");
+$tab_array[1] = array(gettext("Routes"), false, "system_routes.php");
+$tab_array[2] = array(gettext("Groups"), false, "system_gateway_groups.php");
+display_top_tabs($tab_array);
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="system_gateways.php" method="post">
-<script type="text/javascript" src="/javascript/row_toggle.js"></script>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('staticroutes')): ?><p>
-<?php print_info_box_np(gettext("The gateway configuration has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."));?><br /></p>
-<?php endif; ?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system gatewyas">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Gateways"), true, "system_gateways.php");
- $tab_array[1] = array(gettext("Routes"), false, "system_routes.php");
- $tab_array[2] = array(gettext("Groups"), false, "system_gateway_groups.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr id="frheader">
- <td width="2%" class="list">&nbsp;</td>
- <td width="2%" class="list">&nbsp;</td>
- <td width="15%" class="listhdrr"><?=gettext("Name"); ?></td>
- <td width="10%" class="listhdrr"><?=gettext("Interface"); ?></td>
- <td width="15%" class="listhdrr"><?=gettext("Gateway"); ?></td>
- <td width="15%" class="listhdrr"><?=gettext("Monitor IP"); ?></td>
- <td width="31%" class="listhdr"><?=gettext("Description"); ?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td width="17"></td>
- <td>
- <a href="system_gateways_edit.php">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-<?php
- $textse = "</span>";
- $i = 0;
- foreach ($a_gateways as $gateway):
- if (isset($gateway['disabled']) || isset($gateway['inactive'])) {
- $textss = "<span class=\"gray\">";
- $iconfn = "pass_d";
- } else {
- $textss = "<span>";
- $iconfn = "pass";
- }
-?>
- <tr valign="top" id="fr<?=$i;?>">
- <td class="listt">
-<?php
- if (is_numeric($gateway['attribute'])):
-?>
- <input type="checkbox" id="frc<?=$i;?>" name="rule[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
-<?php
- else:
-?>
- &nbsp;
-<?php
- endif;
-?>
- </td>
- <td class="listt" align="center">
-<?php
- if (isset($gateway['inactive'])):
-?>
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_reject_d.gif" width="11" height="11" border="0"
- title="<?=gettext("This gateway is inactive because interface is missing");?>" alt="icon" />
-<?php
- elseif (is_numeric($gateway['attribute'])):
-?>
- <a href="?act=toggle&amp;id=<?=$i;?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0"
- title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" />
- </a>
-<?php
- else:
-?>
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0"
- title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" />
-<?php
- endif;
-?>
- </td>
- <td class="listlr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
-<?php
- echo $textss;
- echo $gateway['name'];
- if (isset($gateway['defaultgw'])) {
- echo " <strong>(default)</strong>";
- }
- echo $textse;
?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
+<table class="table">
+<thead>
+ <tr>
+ <th></th>
+ <th><?=gettext("Name")?></th>
+ <th><?=gettext("Interface")?></th>
+ <th><?=gettext("Gateway")?></th>
+ <th><?=gettext("Monitor IP")?></th>
+ <th><?=gettext("Description")?></th>
+ <th></th>
+ </tr>
+</thead>
+<tbody>
<?php
- echo $textss;
- echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($gateway['friendlyiface']));
- echo $textse;
+foreach ($a_gateways as $i => $gateway):
+ if (isset($gateway['inactive']))
+ $icon = 'icon-remove-circle';
+ elseif (isset($gateway['disabled']))
+ $icon = 'icon-ban-circle';
+ else
+ $icon = 'icon-ok-circle';
+
+ if (isset($gateway['inactive']))
+ $title = gettext("This gateway is inactive because interface is missing");
+ else
+ $title = '';
?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
+ <tr<?=($icon != 'icon-ok-circle')? ' class="disabled"' : ''?>>
+ <td title="<?=$title?>"><i class="icon <?=$icon?>"></i></td>
+ <td>
+ <?=$gateway['name']?>
<?php
- echo $textss;
- echo $gateway['gateway'] . " ";
- echo $textse;
+ if (isset($gateway['defaultgw']))
+ echo " <strong>(default)</strong>";
?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
+ </td>
+ <td>
+ <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($gateway['friendlyiface']))?>
+ </td>
+ <td>
+ <?=$gateway['gateway']?>
+ </td>
+ <td>
+ <?=htmlspecialchars($gateway['monitor'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($gateway['descr'])?>
+ </td>
+ <td>
+ <a class="btn btn-xs btn-primary" href="system_gateways_edit.php?id=<?=$i?>">
+ edit
+ </a>
+ <a class="btn btn-xs btn-default" href="system_gateways_edit.php?dup=<?=$i?>">
+ copy
+ </a>
+<? if (is_numeric($gateway['attribute'])): ?>
+ <a class="btn btn-xs btn-danger" href="system_gateways.php?act=del&amp;id=<?=$i?>">
+ delete
+ </a>
+ <a class="btn btn-xs btn-default" href="?act=toggle&amp;id=<?=$i?>">
+ toggle
+ </a>
+<? endif?>
+ </td>
+ </tr>
+<? endforeach?>
+</tbody>
+</table>
+
+<nav class="action-buttons">
+ <a href="system_gateways_edit.php" role="button" class="btn btn-success">
+ <?=gettext("edit default");?>
+ </a>
+</nav>
<?php
- echo $textss;
- echo htmlspecialchars($gateway['monitor']) . " ";
- echo $textse;
-?>
- </td>
-<?php
- if (is_numeric($gateway['attribute'])):
-?>
- <td class="listbg" onclick="fr_toggle(<?=$i;?>)" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
-<?php
- else:
-?>
- <td class="listbgns" onclick="fr_toggle(<?=$i;?>)" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
-<?php
- endif;
- echo $textss;
- echo htmlspecialchars($gateway['descr']) . "&nbsp;";
- echo $textse;
-?>
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
- <tr>
- <td>
- <a href="system_gateways_edit.php?id=<?=$i;?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" />
- </a>
- </td>
-<?php
- if (is_numeric($gateway['attribute'])):
-?>
- <td>
- <a href="system_gateways.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this gateway?"); ?>')">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" />
- </a>
- </td>
-<?php
- else:
-?>
- <td width='17'></td>
-<?php
- endif;
-?>
- </tr>
- <tr>
- <td width="17"></td>
- <td>
- <a href="system_gateways_edit.php?dup=<?=$i;?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-<?php
- $i++;
- endforeach;
-?>
- <tr>
- <td class="list" colspan="7"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tr>
- <td>
-<?php
- if ($i == 0):
-?>
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17"
- title="<?=gettext("delete selected items");?>" border="0" alt="delete" />
-<?php
- else:
-?>
- <input name="del" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif"
- style="width:17;height:17" title="<?=gettext("delete selected items");?>"
- onclick="return confirm('<?=gettext("Do you really want to delete the selected gateway items?");?>')" />
-<?php
- endif;
-?>
- </td>
- <td>
- <a href="system_gateways_edit.php">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="edit" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_gateways_edit.php b/src/usr/local/www/system_gateways_edit.php
index af5e7cb..abc0870 100644
--- a/src/usr/local/www/system_gateways_edit.php
+++ b/src/usr/local/www/system_gateways_edit.php
@@ -236,7 +236,7 @@ if ($_POST) {
}
}
}
- if (($_POST['monitor'] <> "") && !is_ipaddr($_POST['monitor']) && $_POST['monitor'] != "dynamic") {
+ if (($_POST['monitor'] != "") && !is_ipaddr($_POST['monitor']) && $_POST['monitor'] != "dynamic") {
$input_errors[] = gettext("A valid monitor IP address must be specified.");
}
/* only allow correct IPv4 and IPv6 gateway addresses */
@@ -589,362 +589,333 @@ $shortcut_section = "gateways";
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
?>
+<script>
+var systemGatewaysEditRecalculate = function(){
+ var interval = $('#interval')[0].value;
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
-function show_advanced_gateway() {
- document.getElementById("showadvgatewaybox").innerHTML='';
- aodiv = document.getElementById('showgatewayadv');
- aodiv.style.display = "block";
-}
-function monitor_change() {
- document.iform.monitor.disabled = document.iform.monitor_disable.checked;
-}
+ $('input[name$=_calculated]').each(function (idx, c){
+ c = $(c);
+ i = $(c.parents('.form-group').find('input[type=number]')[0]);
-function interval_change(interval_obj) {
- valid_value(interval_obj, 1, 86400);
- calculate_state_change();
+ c.prop('disabled', interval==0);
- calculated_change(document.iform.avg_delay_samples_calculated, document.iform.avg_delay_samples);
- calculated_change(document.iform.avg_loss_samples_calculated, document.iform.avg_loss_samples);
- calculated_change(document.iform.avg_loss_delay_samples_calculated, document.iform.avg_loss_delay_samples);
-}
+ if (interval==0)
+ c.prop('checked', false);
-function samples_change(calculated_obj, samples_obj) {
- calculated_change(calculated_obj, samples_obj);
-}
-
-function calculated_change(calculated_obj, samples_obj) {
- switch (samples_obj.name) {
+ if (!c.prop('checked'))
+ return i.prop('readonly', false);
- case 'avg_delay_samples':
- // How many replies should be used to compute average delay
- // for controlling "delay" alarms.
- // Calculate a reasonable value based on gateway probe interval and RRD 1 minute average graph step size (60).
- if (calculated_obj.checked && (document.iform.interval.value > 0)) {
- samples_obj.value = 60 * (1/6) / Math.pow(document.iform.interval.value, 0.333); // Calculate & Round to Integer
- }
- valid_value(samples_obj, 1, 100);
+ switch (i.attr('name'))
+ {
+ case 'avg_delay_samples':
+ // How many replies should be used to compute average delay
+ // for controlling "delay" alarms.
+ // Calculate a reasonable value based on gateway probe interval and RRD 1 minute average graph step size (60).
+ i.attr('value', Math.round(60 * (1/6) / Math.pow(interval, 0.333)));
break;
- case 'avg_loss_samples':
- // How many probes should be used to compute average loss.
- // Calculate a reasonable value based on gateway probe interval and RRD 1 minute average graph step size (60).
- if (calculated_obj.checked && (document.iform.interval.value > 0)) {
- samples_obj.value = 60 / document.iform.interval.value; // Calculate & Round to Integer
- }
- valid_value(samples_obj, 1, 1000);
+ case 'avg_loss_samples':
+ // How many probes should be used to compute average loss.
+ // Calculate a reasonable value based on gateway probe interval and RRD 1 minute average graph step size (60).
+ i.attr('value', Math.round(60 / interval));
break;
- case 'avg_loss_delay_samples':
- // The delay (in samples) after which loss is computed
- // without this delays larger than interval would be treated as loss.
- // Calculate a reasonable value based on gateway probe interval and RRD 1 minute average graph step size (60).
- if (calculated_obj.checked && (document.iform.interval.value > 0)) {
- samples_obj.value = 60 * (1/3) / document.iform.interval.value; // Calculate & Round to Integer
- }
- valid_value(samples_obj, 1, 200);
+ case 'avg_loss_delay_samples':
+ // The delay (in samples) after which loss is computed
+ // without this delays larger than interval would be treated as loss.
+ // Calculate a reasonable value based on gateway probe interval and RRD 1 minute average graph step size (60).
+ i.attr('value', Math.round(60 * (1/3) / interval));
break;
- default:
- }
+ }
- calculate_state_change();
-}
+ i.prop('readonly', true);
+ });
+};
-function valid_value(object, min, max) {
- if (object.value) {
- object.value = Math.round(object.value); // Round to integer
- if (object.value < min) object.value = min; // Min Value
- if (object.value > max) object.value = max; // Max Value
- if (isNaN(object.value)) object.value = ''; // Empty Value
- }
-}
+events.push(function(){
+ $('#interval').on('change', systemGatewaysEditRecalculate);
+ $('input[name$=_calculated]').on('change', systemGatewaysEditRecalculate);
-function calculate_state_change() {
- if (document.iform.interval.value > 0) {
- document.iform.avg_delay_samples_calculated.disabled = false;
- document.iform.avg_loss_samples_calculated.disabled = false;
- document.iform.avg_loss_delay_samples_calculated.disabled = false;
+ systemGatewaysEditRecalculate();
+});
+</script>
+<?php
- document.iform.avg_delay_samples.disabled = document.iform.avg_delay_samples_calculated.checked;
- document.iform.avg_loss_samples.disabled = document.iform.avg_loss_samples_calculated.checked;
- document.iform.avg_loss_delay_samples.disabled = document.iform.avg_loss_delay_samples_calculated.checked;
- } else {
- document.iform.avg_delay_samples_calculated.disabled = true;
- document.iform.avg_loss_samples_calculated.disabled = true;
- document.iform.avg_loss_delay_samples_calculated.disabled = true;
- document.iform.interval.value = '';
-
- document.iform.avg_delay_samples.disabled = false;
- document.iform.avg_loss_samples.disabled = false;
- document.iform.avg_loss_delay_samples.disabled = false;
-
- document.iform.avg_delay_samples_calculated.checked = false;
- document.iform.avg_loss_samples_calculated.checked = false;
- document.iform.avg_loss_delay_samples_calculated.checked = false;
- }
+require('classes/Form.class.php');
+$form = new Form;
+
+/* If this is a system gateway we need this var */
+if(($pconfig['attribute'] == "system") || is_numeric($pconfig['attribute'])) {
+ $form->addGlobal(new Form_Input(
+ 'attribute',
+ null,
+ 'hidden',
+ $pconfig['attribute']
+ ));
}
-function enable_change() {
- document.iform.avg_delay_samples.disabled = false;
- document.iform.avg_loss_samples.disabled = false;
- document.iform.avg_loss_delay_samples.disabled = false;
+if (isset($id) && $a_gateways[$id]) {
+ $form->addGlobal(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
}
-//]]>
-</script>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
- <form action="system_gateways_edit.php" method="post" name="iform" id="iform">
- <?php
- /* If this is a system gateway we need this var */
- if (($pconfig['attribute'] == "system") || is_numeric($pconfig['attribute'])) {
- echo "<input type='hidden' name='attribute' id='attribute' value=\"" . htmlspecialchars($pconfig['attribute']) . "\" />\n";
- }
- echo "<input type='hidden' name='friendlyiface' id='friendlyiface' value=\"" . htmlspecialchars($pconfig['friendlyiface']) . "\" />\n";
- ?>
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="system gateways edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit gateway"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled");?></td>
- <td width="78%" class="vtable">
- <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable this gateway");?></strong><br />
- <span class="vexpl"><?=gettext("Set this option to disable this gateway without removing it from the list.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
- <td width="78%" class="vtable">
- <select name='interface' class='formselect'>
- <?php
- $interfaces = get_configured_interface_with_descr(false, true);
- foreach ($interfaces as $iface => $ifacename) {
- echo "<option value=\"{$iface}\"";
- if ($iface == $pconfig['friendlyiface']) {
- echo " selected='selected'";
- }
- echo ">" . htmlspecialchars($ifacename) . "</option>";
- }
- ?>
- </select><br />
- <span class="vexpl"><?=gettext("Choose which interface this gateway applies to."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Address Family"); ?></td>
- <td width="78%" class="vtable">
- <select name='ipprotocol' class='formselect' >
- <?php
- $options = array("inet" => "IPv4", "inet6" => "IPv6");
- foreach ($options as $name => $string) {
- echo "<option value=\"{$name}\"";
- if ($name == $pconfig['ipprotocol']) {
- echo " selected='selected'";
- }
- echo ">" . htmlspecialchars($string) . "</option>\n";
- }
- ?>
- </select><br />
- <span class="vexpl"><?=gettext("Choose the Internet Protocol this gateway uses."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
- <td width="78%" class="vtable">
- <input name="name" type="text" class="formfld unknown" id="name" size="20" value="<?=htmlspecialchars($pconfig['name']);?>" />
- <br /><span class="vexpl"><?=gettext("Gateway name"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Gateway"); ?></td>
- <td width="78%" class="vtable">
- <input name="gateway" type="text" class="formfld host" id="gateway" size="28" value="<?php if ($pconfig['dynamic']) echo "dynamic"; else echo htmlspecialchars($pconfig['gateway']); ?>" />
- <br /><span class="vexpl"><?=gettext("Gateway IP address"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Default Gateway"); ?></td>
- <td width="78%" class="vtable">
- <input name="defaultgw" type="checkbox" id="defaultgw" value="yes" <?php if ($pconfig['defaultgw'] == true) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Default Gateway"); ?></strong><br />
- <?=gettext("This will select the above gateway as the default gateway"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Disable Gateway Monitoring"); ?></td>
- <td width="78%" class="vtable">
- <input name="monitor_disable" type="checkbox" id="monitor_disable" value="yes" <?php if ($pconfig['monitor_disable'] == true) echo "checked=\"checked\""; ?> onclick="monitor_change()" />
- <strong><?=gettext("Disable Gateway Monitoring"); ?></strong><br />
- <?=gettext("This will consider this gateway as always being up"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Monitor IP"); ?></td>
- <td width="78%" class="vtable">
- <?php
- if ($pconfig['gateway'] == $pconfig['monitor']) {
- $monitor = "";
- } else {
- $monitor = htmlspecialchars($pconfig['monitor']);
- }
- ?>
- <input name="monitor" type="text" id="monitor" value="<?php echo htmlspecialchars($monitor); ?>" size="28" />
- <strong><?=gettext("Alternative monitor IP"); ?></strong> <br />
- <?=gettext("Enter an alternative address here to be used to monitor the link. This is used for the " .
- "quality RRD graphs as well as the load balancer entries. Use this if the gateway does not respond " .
- "to ICMP echo requests (pings)"); ?>.
- <br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Mark Gateway as Down"); ?></td>
- <td width="78%" class="vtable">
- <input name="force_down" type="checkbox" id="force_down" value="yes" <?php if ($pconfig['force_down'] == true) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Mark Gateway as Down"); ?></strong><br />
- <?=gettext("This will force this gateway to be considered Down"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Advanced");?></td>
- <td width="78%" class="vtable">
- <?php $showbutton = (!empty($pconfig['latencylow']) || !empty($pconfig['latencyhigh']) || !empty($pconfig['losslow']) || !empty($pconfig['losshigh']) || (isset($pconfig['weight']) && $pconfig['weight'] > 1) || (isset($pconfig['interval']) && ($pconfig['interval'] > $apinger_default['interval'])) || (isset($pconfig['down']) && !($pconfig['down'] == $apinger_default['down']))); ?>
- <div id="showadvgatewaybox" <?php if ($showbutton) echo "style='display:none'"; ?>>
- <input type="button" onclick="show_advanced_gateway()" value="Advanced" /><?=gettext(" - Show advanced option"); ?>
- </div>
- <div id="showgatewayadv" <?php if (!$showbutton) echo "style='display:none'"; ?>>
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="6" summary="advanced options">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Weight");?></td>
- <td width="78%" class="vtable">
- <select name='weight' class='formfldselect' id='weight'>
- <?php
- for ($i = 1; $i < 6; $i++) {
- $selected = "";
- if ($pconfig['weight'] == $i) {
- $selected = "selected='selected'";
- }
- echo "<option value='{$i}' {$selected} >{$i}</option>";
- }
- ?>
- </select>
- <br /><?=gettext("Weight for this gateway when used in a Gateway Group.");?> <br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Latency thresholds");?></td>
- <td width="78%" class="vtable">
- <?=gettext("From");?>
- <input name="latencylow" type="text" class="formfld unknown" id="latencylow" size="2"
- value="<?=htmlspecialchars($pconfig['latencylow']);?>" />
- <?=gettext("To");?>
- <input name="latencyhigh" type="text" class="formfld unknown" id="latencyhigh" size="2"
- value="<?=htmlspecialchars($pconfig['latencyhigh']);?>" />
- <br /><span class="vexpl"><?=gettext(sprintf("Low and high thresholds for latency in milliseconds. Default is %d/%d.", $apinger_default['latencylow'], $apinger_default['latencyhigh']));?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Packet Loss thresholds");?></td>
- <td width="78%" class="vtable">
- <?=gettext("From");?>
- <input name="losslow" type="text" class="formfld unknown" id="losslow" size="2"
- value="<?=htmlspecialchars($pconfig['losslow']);?>" />
- <?=gettext("To");?>
- <input name="losshigh" type="text" class="formfld unknown" id="losshigh" size="2"
- value="<?=htmlspecialchars($pconfig['losshigh']);?>" />
- <br /><span class="vexpl"><?=gettext(sprintf("Low and high thresholds for packet loss in %%. Default is %d/%d.", $apinger_default['losslow'], $apinger_default['losshigh']));?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Probe Interval");?></td>
- <td width="78%" class="vtable">
- <input name="interval" type="text" class="formfld unknown" id="interval" size="2"
- value="<?=htmlspecialchars($pconfig['interval']);?>" onchange="interval_change(this)" />
- <br />
- <span class="vexpl">
- <?=gettext(sprintf("How often that an ICMP probe will be sent in seconds. Default is %d.", $apinger_default['interval']));?><br /><br />
- <?=gettext("NOTE: The quality graph is averaged over seconds, not intervals, so as the probe interval is increased the accuracy of the quality graph is decreased.");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Down");?></td>
- <td width="78%" class="vtable">
- <input name="down" type="text" class="formfld unknown" id="down" size="2"
- value="<?=htmlspecialchars($pconfig['down']);?>" />
- <br /><span class="vexpl"><?=gettext(sprintf("The number of seconds of failed probes before the alarm will fire. Default is %d.", $apinger_default['down']));?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Average Delay Replies Qty");?></td>
- <td width="78%" class="vtable">
- <input name="avg_delay_samples" type="text" class="formfld unknown" id="avg_delay_samples" size="2"
- value="<?=htmlspecialchars($pconfig['avg_delay_samples']);?>" onchange="samples_change(document.iform.avg_delay_samples_calculated, this)" />
- <input name="avg_delay_samples_calculated" type="checkbox" id="avg_delay_samples_calculated" value="yes" <?php if ($pconfig['avg_delay_samples_calculated'] == true) echo "checked=\"checked\""; ?> onclick="calculated_change(this, document.iform.avg_delay_samples)" />
- <?=gettext("Use calculated value."); ?>
- <br /><span class="vexpl"><?=gettext(sprintf("How many replies should be used to compute average delay for controlling \"delay\" alarms? Default is %d.", $apinger_default['avg_delay_samples']));?><br /><br /></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Average Packet Loss Probes Qty");?></td>
- <td width="78%" class="vtable">
- <input name="avg_loss_samples" type="text" class="formfld unknown" id="avg_loss_samples" size="2"
- value="<?=htmlspecialchars($pconfig['avg_loss_samples']);?>" onchange="samples_change(document.iform.avg_loss_samples_calculated, this)" />
- <input name="avg_loss_samples_calculated" type="checkbox" id="avg_loss_samples_calculated" value="yes" <?php if ($pconfig['avg_loss_samples_calculated'] == true) echo "checked=\"checked\""; ?> onclick="calculated_change(this, document.iform.avg_loss_samples)" />
- <?=gettext("Use calculated value."); ?>
- <br /><span class="vexpl"><?=gettext(sprintf("How many probes should be useds to compute average packet loss? Default is %d.", $apinger_default['avg_loss_samples']));?><br /><br /></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Lost Probe Delay");?></td>
- <td width="78%" class="vtable">
- <input name="avg_loss_delay_samples" type="text" class="formfld unknown" id="avg_loss_delay_samples" size="2"
- value="<?=htmlspecialchars($pconfig['avg_loss_delay_samples']);?>" onchange="samples_change(document.iform.avg_loss_delay_samples_calculated, this)" />
- <input name="avg_loss_delay_samples_calculated" type="checkbox" id="avg_loss_delay_samples_calculated" value="yes" <?php if ($pconfig['avg_loss_delay_samples_calculated'] == true) echo "checked=\"checked\""; ?> onclick="calculated_change(this, document.iform.avg_loss_delay_samples)" />
- <?=gettext("Use calculated value."); ?>
- <br /><span class="vexpl"><?=gettext(sprintf("The delay (in qty of probe samples) after which loss is computed. Without this, delays longer than the probe interval would be treated as packet loss. Default is %d.", $apinger_default['avg_loss_delay_samples']));?><br /><br /></span>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <?= gettext("The probe interval must be less than the down time, otherwise the gateway will seem to go down then come up again at the next probe."); ?><br /><br />
- <?= gettext("The down time defines the length of time before the gateway is marked as down, but the accuracy is controlled by the probe interval. For example, if your down time is 40 seconds but on a 30 second probe interval, only one probe would have to fail before the gateway is marked down at the 40 second mark. By default, the gateway is considered down after 10 seconds, and the probe interval is 1 second, so 10 probes would have to fail before the gateway is marked down."); ?><br />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br /><span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change()" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_gateways[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </form>
-<?php include("fend.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
-monitor_change();
-calculate_state_change();
-//]]>
-</script>
-</body>
-</html>
+$form->addGlobal(new Form_Input(
+ 'friendlyiface',
+ null,
+ 'hidden',
+ $pconfig['friendlyiface']
+));
+
+$section = new Form_Section('Edit gateway');
+
+$section->addInput(new Form_Checkbox(
+ 'disabled',
+ 'Disabled',
+ 'Disable this gateway',
+ $pconfig['disabled']
+))->setHelp('Set this option to disable this gateway without removing it from the '.
+ 'list.');
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ $pconfig['friendlyiface'],
+ get_configured_interface_with_descr(false, true)
+))->setHelp('Choose which interface this gateway applies to.');
+
+$section->addInput(new Form_Select(
+ 'ipprotocol',
+ 'Address Family',
+ $pconfig['ipprotocol'],
+ array(
+ "inet" => "IPv4",
+ "inet6" => "IPv6"
+ )
+))->setHelp('Choose the Internet Protocol this gateway uses.');
+
+$section->addInput(new Form_Input(
+ 'name',
+ 'Name',
+ 'text',
+ $pconfig['name']
+))->setHelp('Gateway name');
+
+$section->addInput(new Form_Input(
+ 'gateway',
+ 'Gateway',
+ 'text',
+ ($pconfig['dynamic'] ? 'dynamic' : $pconfig['gateway'])
+))->setHelp('Gateway IP address');
+
+$section->addInput(new Form_Checkbox(
+ 'defaultgw',
+ 'Default Gateway',
+ 'This will select the above gateway as the default gateway',
+ $pconfig['defaultgw']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'monitor_disable',
+ 'Gateway Monitoring',
+ 'Disable Gateway Monitoring',
+ $pconfig['monitor_disable']
+))->toggles('.toggle-monitor-ip')->setHelp('This will consider this gateway as always being up');
+
+$group = new Form_Group('Monitor IP');
+$group->addClass('toggle-monitor-ip', 'collapse');
+
+if (!$pconfig['monitor_disable'])
+ $group->addClass('in');
+
+$group->add(new Form_Input(
+ 'monitor',
+ null,
+ 'text',
+ ($pconfig['gateway'] == $pconfig['monitor'] ? '' : $pconfig['monitor'])
+))->setHelp('Enter an alternative address here to be '.
+ 'used to monitor the link. This is used for the quality RRD graphs as well as the '.
+ 'load balancer entries. Use this if the gateway does not respond to ICMP echo '.
+ 'requests (pings).');
+$section->add($group);
+
+$section->addInput(new Form_Checkbox(
+ 'force_down',
+ 'Force state',
+ 'Mark Gateway as Down',
+ $pconfig['force_down']
+))->setHelp('This will force this gateway to be considered Down');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$form->add($section);
+$section = new Form_Section('Advanced');
+
+$section->addInput(new Form_Select(
+ 'weight',
+ 'Weight',
+ $pconfig['weight'],
+ array_combine(range(1, 5), range(1, 5))
+))->setHelp('Weight for this gateway when used in a Gateway Group.');
+
+$group = new Form_Group('Latency thresholds');
+$group->add(new Form_Input(
+ 'latencylow',
+ 'From',
+ 'number',
+ $pconfig['latencylow'],
+ ['placeholder' => $apinger_default['latencylow']]
+));
+$group->add(new Form_Input(
+ 'latencyhigh',
+ 'To',
+ 'number',
+ $pconfig['latencyhigh'],
+ ['placeholder' => $apinger_default['latencyhigh']]
+));
+$group->setHelp('Low and high thresholds for latency in milliseconds.
+ Default is %d/%d.', [$apinger_default['latencylow'], $apinger_default['latencyhigh']]);
+
+$section->add($group);
+
+$group = new Form_Group('Packet Loss thresholds');
+$group->add(new Form_Input(
+ 'losslow',
+ 'From',
+ 'number',
+ $pconfig['losslow'],
+ ['placeholder' => $apinger_default['losslow']]
+));
+$group->add(new Form_Input(
+ 'losshigh',
+ 'To',
+ 'number',
+ $pconfig['losshigh'],
+ ['placeholder' => $apinger_default['losshigh']]
+));
+$group->setHelp('Low and high thresholds for packet loss in milliseconds.
+ Default is %d/%d.', [$apinger_default['losslow'], $apinger_default['losshigh']]);
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'interval',
+ 'Probe Interval',
+ 'number',
+ $pconfig['interval'],
+ [
+ 'placeholder' => $apinger_default['interval'],
+ 'max' => 86400
+ ]
+))->setHelp('How often an ICMP probe will be sent in seconds. Default is %d.'.
+ 'NOTE: The quality graph is averaged over seconds, not intervals, so as '.
+ 'the probe interval is increased the accuracy of the quality graph is '.
+ 'decreased.', [$apinger_default['interval']]);
+
+$section->addInput(new Form_Input(
+ 'down',
+ 'Down',
+ 'number',
+ $pconfig['down'],
+ ['placeholder' => $apinger_default['down']]
+))->setHelp('The number of seconds of failed probes before the alarm '.
+ 'will fire. Default is %d.', [$apinger_default['down']]);
+
+$group = new Form_Group('Avg. Delay Replies Qty');
+$group->add(new Form_Input(
+ 'avg_delay_samples',
+ null,
+ 'number',
+ $pconfig['avg_delay_samples'],
+ [
+ 'placeholder' => $apinger_default['avg_delay_samples'],
+ 'max' => 100
+ ]
+));
+$group->add(new Form_Checkbox(
+ 'avg_delay_samples_calculated',
+ null,
+ 'Use calculated value.',
+ $pconfig['avg_delay_samples_calculated']
+));
+$group->setHelp('How many replies should be used to compute average delay for '.
+ 'controlling "delay" alarms? Default is %d.',
+ [$apinger_default['avg_delay_samples']]);
+$section->add($group);
+
+$group = new Form_Group('Avg. Packet Loss Probes');
+$group->add(new Form_Input(
+ 'avg_loss_samples',
+ null,
+ 'number',
+ $pconfig['avg_loss_samples'],
+ [
+ 'placeholder' => $apinger_default['avg_loss_samples'],
+ 'max' => 1000
+ ]
+));
+$group->add(new Form_Checkbox(
+ 'avg_loss_samples_calculated',
+ null,
+ 'Use calculated value.',
+ $pconfig['avg_loss_samples_calculated']
+));
+$group->setHelp('How many probes should be useds to compute average packet loss? '.
+ 'Default is %d.',
+ [$apinger_default['avg_loss_samples']]);
+$section->add($group);
+
+$group = new Form_Group('Lost Probe Delay');
+$group->add(new Form_Input(
+ 'avg_loss_delay_samples',
+ null,
+ 'number',
+ $pconfig['avg_loss_delay_samples'],
+ [
+ 'placeholder' => $apinger_default['avg_loss_delay_samples'],
+ 'max' => 200
+ ]
+));
+$group->add(new Form_Checkbox(
+ 'avg_loss_delay_samples_calculated',
+ null,
+ 'Use calculated value.',
+ $pconfig['avg_loss_samples_calculated']
+));
+$group->setHelp('The delay (in qty of probe samples) after which loss is '.
+ 'computed. Without this, delays longer than the probe interval would be '.
+ 'treated as packet loss. Default is %d.',
+ [$apinger_default['avg_loss_delay_samples']]);
+$section->add($group);
+
+$section->addInput(new Form_StaticText(
+ 'Additional information',
+ '<span class="help-block">'.
+ gettext('The probe interval must be less than the down time, otherwise the '.
+ 'gateway will seem to go down then come up again at the next probe.').
+ '<br/><br/>'.
+ gettext('The down time defines the length of time before the gateway is marked '.
+ 'as down, but the accuracy is controlled by the probe interval. For example, '.
+ 'if your down time is 40 seconds but on a 30 second probe interval, only one '.
+ 'probe would have to fail before the gateway is marked down at the 40 second '.
+ 'mark. By default, the gateway is considered down after 10 seconds, and the '.
+ 'probe interval is 1 second, so 10 probes would have to fail before the gateway '.
+ 'is marked down.').
+ '</span>'
+));
+
+$form->add($section);
+
+print $form;
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_groupmanager.php b/src/usr/local/www/system_groupmanager.php
index 17b0f73..77384e3 100644
--- a/src/usr/local/www/system_groupmanager.php
+++ b/src/usr/local/www/system_groupmanager.php
@@ -137,7 +137,6 @@ if (isset($_POST['dellall_x'])) {
}
if (isset($_POST['save'])) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -210,398 +209,169 @@ if (isset($_POST['save'])) {
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
+$tab_array[] = array(gettext("Groups"), true, "system_groupmanager.php");
+$tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
+$tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
+display_top_tabs($tab_array);
+
+if (!($_GET['act'] == "new" || $_GET['act'] == "edit"))
+{
+?>
+ <div class="table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><?=gettext("Group name")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><?=gettext("Member Count")?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+ foreach($a_group as $i => $group):
+ if ($group["name"] == "all")
+ $groupcount = count($config['system']['user']);
+ else
+ $groupcount = count($group['member']);
+?>
+ <tr>
+ <td>
+ <?=htmlspecialchars($group['name'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($group['description'])?>
+ </td>
+ <td>
+ <?=$groupcount?>
+ </td>
+ <td>
+ <a href="?act=edit&amp;groupid=<?=$i?>" class="btn btn-xs btn-primary">edit</a>
+ <?php if($group['scope'] != "system"): ?>
+ <a href="?act=delgroup&amp;groupid=<?=$i?>&amp;groupname=<?=$group['name']?>" class="btn btn-xs btn-danger">delete</a>
+ <?php endif;?>
+ </td>
+ </tr>
+<?php
+ endforeach;
?>
+ </tbody>
+ </table>
+ </div>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript" src="/javascript/row_toggle.js"></script>
-<script type="text/javascript">
-//<![CDATA[
-
-function setall_selected(id) {
- selbox = document.getElementById(id);
- count = selbox.options.length;
- for (index = 0; index<count; index++) {
- selbox.options[index].selected = true;
- }
+ <nav class="action-buttons">
+ <a href="?act=new" class="btn btn-success">add new</a>
+ </nav>
+<?php
+ include('foot.inc');
+ exit;
}
-function delete_empty(id) {
- selbox = document.getElementById(id);
- count = selbox.options.length;
- for (index = 0; index<count; index++) {
- if (selbox.options[index].value == '') {
- selbox.remove(index);
- }
- }
+require('classes/Form.class.php');
+$form = new Form;
+$form->setAction('system_groupmanager.php?act=edit');
+$form->addGlobal(new Form_Input(
+ 'groupid',
+ null,
+ 'hidden',
+ $id
+));
+
+if (isset($id) && $a_group[$id]){
+ $form->addGlobal(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+
+ $form->addGlobal(new Form_Input(
+ 'gid',
+ null,
+ 'hidden',
+ $pconfig['gid']
+ ));
}
-function clear_selected(id) {
- selbox = document.getElementById(id);
- count = selbox.options.length;
- for (index = 0; index<count; index++) {
- selbox.options[index].selected = false;
- }
+$section = new Form_Section('Group properties');
+
+if ($_GET['act'] != "new")
+{
+ $section->addInput(new Form_StaticText(
+ 'Defined by',
+ strtoupper($pconfig['gtype'])
+ ));
}
-function remove_selected(id) {
- selbox = document.getElementById(id);
- index = selbox.options.length - 1;
- for (; index >= 0; index--) {
- if (selbox.options[index].selected) {
- selbox.remove(index);
- }
- }
+$section->addInput($input = new Form_Input(
+ 'groupname',
+ 'Group name',
+ 'text',
+ $pconfig['name']
+));
+
+if ($pconfig['gtype'] == "system")
+ $input->setReadonly();
+
+$section->addInput(new Form_Input(
+ 'description',
+ 'Description',
+ 'text',
+ $pconfig['description']
+))->setHelp('Group description, for your own information only');
+
+$form->add($section);
+if ($pconfig['gid'] != 1998) // all users group
+{
+ $section = new Form_Section('Group Memberships');
+
+ $allUsers = array_map(function($u){ return $u['name']; }, $config['system']['user']);
+ $section->addInput(new Form_Select(
+ 'members',
+ 'Members',
+ $pconfig['members'],
+ $allUsers,
+ true
+ ))->setHelp('Hold down CTRL (pc)/COMMAND (mac) key to select');
+
+ $form->add($section);
}
-function copy_selected(srcid, dstid) {
- src_selbox = document.getElementById(srcid);
- dst_selbox = document.getElementById(dstid);
- count = dst_selbox.options.length;
- for (index = count - 1; index >= 0; index--) {
- if (dst_selbox.options[index].value == '') {
- dst_selbox.remove(index);
- }
- }
- count = src_selbox.options.length;
- for (index = 0; index < count; index++) {
- if (src_selbox.options[index].selected) {
- option = document.createElement('option');
- option.text = src_selbox.options[index].text;
- option.value = src_selbox.options[index].value;
- dst_selbox.add(option, null);
- }
+if ($_GET['act'] != "new")
+{
+ $section = new Form_Section('Assigned Privileges');
+
+ foreach ((array)$pconfig['priv'] as $i => $priv)
+ {
+ // We reverse name and action for readability of longer names
+ $group = new Form_Group('Revoke privilege');
+
+ $group->add(new Form_Checkbox(
+ 'delpriv[]',
+ null,
+ $priv_list[ $priv ]['name'],
+ false,
+ $i
+ ));
+
+ $section->add($group);
}
-}
-function move_selected(srcid, dstid) {
- copy_selected(srcid, dstid);
- remove_selected(srcid);
-}
+ $section->addInput(new Form_StaticText(
+ null,
+ new Form_Button(null, 'grant more privileges', 'system_groupmanager_addprivs.php?groupid='. $id)
+ ));
-function presubmit() {
- delete_empty('members');
- delete_empty('notmembers');
- clear_selected('notmembers');
- setall_selected('members');
+ $form->add($section);
}
-//]]>
-</script>
-<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="group manager">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
- $tab_array[] = array(gettext("Groups"), true, "system_groupmanager.php");
- $tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
- $tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
+print $form;
-<?php
- if ($act == "new" || $act == "edit"):
-?>
- <form action="system_groupmanager.php" method="post" name="iform" id="iform" onsubmit="presubmit()">
- <input type="hidden" id="act" name="act" value="" />
- <input type="hidden" id="groupid" name="groupid" value="<?=(isset($id) ? $id : '');?>" />
- <input type="hidden" id="privid" name="privid" value="" />
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
-<?php
- $ro = "";
- if ($pconfig['gtype'] == "system") {
- $ro = "readonly=\"readonly\"";
- }
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Defined by");?></td>
- <td width="78%" class="vtable">
- <strong><?=strtoupper($pconfig['gtype']);?></strong>
- <input name="gtype" type="hidden" value="<?=htmlspecialchars($pconfig['gtype'])?>"/>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Group name");?></td>
- <td width="78%" class="vtable">
- <input name="groupname" type="text" class="formfld group" id="groupname" size="20" maxlength="16" value="<?=htmlspecialchars($pconfig['name']);?>" <?=$ro;?> />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" class="vtable">
- <input name="description" type="text" class="formfld unknown" id="description" size="20" value="<?=htmlspecialchars($pconfig['description']);?>" />
- <br />
- <?=gettext("Group description, for your own information only");?>
- </td>
- </tr>
-<?php
- if ($pconfig['gid'] != 1998): // all users group
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Group Memberships");?></td>
- <td width="78%" class="vtable" align="center">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="membership">
- <tr>
- <td align="center" width="50%">
- <strong><?=gettext("Not Members");?></strong><br />
- <br />
- <select size="10" style="width: 75%" name="notmembers[]" class="formselect" id="notmembers" onchange="clear_selected('members')" multiple="multiple">
-<?php
- $rowIndex = 0;
- foreach ($config['system']['user'] as $user):
- if (is_array($pconfig['members']) && in_array($user['uid'], $pconfig['members'])) {
- continue;
- }
- $rowIndex++;
-?>
- <option value="<?=$user['uid'];?>" <?=$selected;?>>
- <?=htmlspecialchars($user['name']);?>
- </option>
-<?php
- endforeach;
- if ($rowIndex == 0) {
- echo "<option></option>";
- }
-?>
- </select>
- <br />
- </td>
- <td>
- <br />
- <a href="javascript:move_selected('notmembers', 'members')">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_right.gif" title="<?=gettext("Add Members");?>" alt="<?=gettext("Add Members");?>" width="17" height="17" border="0" />
- </a>
- <br /><br />
- <a href="javascript:move_selected('members', 'notmembers')">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_left.gif" title="<?=gettext("Remove Members");?>" alt="<?=gettext("Remove Members");?>" width="17" height="17" border="0" />
- </a>
- </td>
- <td align="center" width="50%">
- <strong><?=gettext("Members");?></strong><br />
- <br />
- <select size="10" style="width: 75%" name="members[]" class="formselect" id="members" onchange="clear_selected('notmembers')" multiple="multiple">
-<?php
- $rowIndex = 0;
- foreach ($config['system']['user'] as $user):
- if (!(is_array($pconfig['members']) && in_array($user['uid'], $pconfig['members']))) {
- continue;
- }
- $rowIndex++;
-?>
- <option value="<?=$user['uid'];?>">
- <?=htmlspecialchars($user['name']);?>
- </option>
-<?php
- endforeach;
- if ($rowIndex == 0) {
- echo "<option></option>";
- }
-?>
- </select>
- <br />
- </td>
- </tr>
- </table>
- <?=gettext("Hold down CTRL (pc)/COMMAND (mac) key to select multiple items");?>
- </td>
- </tr>
-<?php
- endif;
- if ($act != "new"):
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Assigned Privileges");?></td>
- <td width="78%" class="vtable">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="privileges">
- <tr>
- <td width="40%" class="listhdrr"><?=gettext("Name");?></td>
- <td width="60%" class="listhdrr"><?=gettext("Description");?></td>
- <td class="list"></td>
- </tr>
-<?php
- if (is_array($pconfig['priv'])):
- $i = 0;
- foreach ($pconfig['priv'] as $priv):
-?>
- <tr>
- <td class="listr">
- <?=htmlspecialchars($priv_list[$priv]['name']);?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($priv_list[$priv]['descr']);?>
- </td>
- <td valign="middle" class="list nowrap">
- <input type="image" name="delpriv[]" width="17" height="17" border="0"
- src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif"
- onclick="document.getElementById('privid').value='<?=$i;?>';
- document.getElementById('groupid').value='<?=$id;?>';
- document.getElementById('act').value='<?php echo "delpriv";?>';
- return confirm('<?=gettext("Do you really want to delete this privilege?");?>');"
- title="<?=gettext("delete privilege");?>" />
- </td>
- </tr>
-<?php
- $i++;
- endforeach;
- endif;
-?>
- <tr>
- <td class="list" colspan="2"></td>
- <td class="list">
- <a href="system_groupmanager_addprivs.php?groupid=<?=htmlspecialchars($id)?>">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" />
- </a>
-
- </td>
- </tr>
- </table>
- </td>
- </tr>
-<?php
- endif;
-?>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='/system_groupmanager.php'" />
- <?php if (isset($id) && $a_group[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <input name="gid" type="hidden" value="<?=htmlspecialchars($pconfig['gid']);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </form>
-<?php
- else:
-?>
- <form action="system_groupmanager.php" method="post" name="iform2" id="iform2">
- <input type="hidden" id="act" name="act" value="" />
- <input type="hidden" id="groupid" name="groupid" value="<?=(isset($id) ? $id : '');?>" />
- <input type="hidden" id="groupname" name="groupname" value="" />
- <table class="sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
- <thead>
- <tr>
- <th width="5%" class="list">&nbsp;</th>
- <th width="25%" class="listhdrr"><?=gettext("Group name");?></th>
- <th width="25%" class="listhdrr"><?=gettext("Description");?></th>
- <th width="30%" class="listhdrr"><?=gettext("Member Count");?></th>
- <th width="10%" class="list"></th>
- </tr>
- </thead>
- <tfoot>
- <tr>
- <td class="list" colspan="4"></td>
- <td class="list">
- <input type="image" name="addcert" width="17" height="17" border="0"
- src="/themes/<?=$g['theme'];?>/images/icons/icon_plus.gif"
- onclick="document.getElementById('act').value='<?php echo "new";?>';"
- title="<?=gettext("add group");?>" />
- <input type="image" src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" name="dellall" title="<?=gettext('Delete selected groups')?>" onClick="return confirm('<?=gettext("Do you really want to delete selected groups?");?>')" />
- </td>
- </tr>
- <tr>
- <td colspan="4">
- <p>
- <?=gettext("Additional webConfigurator groups can be added here.
- Group permissions can be assigned which are inherited by users who are members of the group.
- An icon that appears grey indicates that it is a system defined object.
- Some system object properties can be modified but they cannot be deleted.");?>
- </p>
- </td>
- </tr>
- </tfoot>
- <tbody>
-<?php
- $i = 0;
- foreach ($a_group as $group):
- if ($group['scope'] == "system") {
- $grpimg = "/themes/{$g['theme']}/images/icons/icon_system-group-grey.png";
- } else {
- $grpimg = "/themes/{$g['theme']}/images/icons/icon_system-group.png";
- }
- $groupcount = count($group['member']);
- if ($group["name"] == "all") {
- $groupcount = count($config['system']['user']);
- }
-?>
- <tr ondblclick="document.getElementById('act').value='<?php echo "edit";?>';
- document.getElementById('groupid').value='<?=$i;?>';
- document.iform2.submit();" id="fr<?=$i?>">
- <td class="list" id="frd<?=$i?>">
- <?php if ($group['scope'] != "system") : ?>
- <input type="checkbox" id="frc<?=$i?>" onclick="fr_bgcolor(<?=$i?>)" name="delete_check[]" value="<?=$i?>" />
- <?php endif; ?>
- </td>
- <td class="listlr" id="frd<?=$i?>" onclick="fr_toggle(<?=$i?>)">
- <table border="0" cellpadding="0" cellspacing="0" summary="">
- <tr>
- <td align="left" valign="middle">
- <img src="<?=$grpimg;?>" alt="<?=gettext("User");?>" title="<?=gettext("User");?>" border="0" height="16" width="16" />
- </td>
- <td align="left" valign="middle">
- <?=htmlspecialchars($group['name']); ?>&nbsp;
- </td>
- </tr>
- </table>
- </td>
- <td class="listr" id="frd<?=$i?>" onclick="fr_toggle(<?=$i?>)">
- <?=htmlspecialchars($group['description']);?>&nbsp;
- </td>
- <td class="listbg" onclick="fr_toggle(<?=$i?>)">
- <?=$groupcount;?>
- </td>
- <td valign="middle" class="list nowrap">
- <input type="image" name="editgroup[]" width="17" height="17" border="0"
- src="/themes/<?=$g['theme'];?>/images/icons/icon_e.gif"
- onclick="document.getElementById('groupid').value='<?=$i;?>';
- document.getElementById('act').value='<?php echo "edit";?>';"
- title="<?=gettext("edit group");?>" />
- &nbsp;
-<?php
- if ($group['scope'] != "system"):
-?>
- <input type="image" name="delgroup[]" width="17" height="17" border="0"
- src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif"
- onclick="document.getElementById('groupid').value='<?=$i;?>';
- document.getElementById('groupname').value='<?=$group['name'];?>';
- document.getElementById('act').value='<?php echo "delgroup";?>';
- return confirm('<?=gettext("Do you really want to delete this group?");?>');"
- title="<?=gettext("delete group");?>" />
-<?php
- endif;
-?>
- </td>
- </tr>
-<?php
- $i++;
- endforeach;
-?>
- </tbody>
- </table>
- </form>
-<?php
- endif;
-?>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include('foot.inc'); \ No newline at end of file
diff --git a/src/usr/local/www/system_groupmanager_addprivs.php b/src/usr/local/www/system_groupmanager_addprivs.php
index 830d025..d9134bf 100644
--- a/src/usr/local/www/system_groupmanager_addprivs.php
+++ b/src/usr/local/www/system_groupmanager_addprivs.php
@@ -118,7 +118,7 @@ if ($_POST) {
$retval = write_config();
$savemsg = get_std_save_message($retval);
- pfSenseHeader("system_groupmanager.php?act=edit&amp;id={$groupid}");
+ pfSenseHeader("system_groupmanager.php?act=edit&groupid={$groupid}");
exit;
}
}
@@ -129,127 +129,46 @@ if (isAjax()) {
}
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
-
-<?php
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
+$tab_array[] = array(gettext("Groups"), true, "system_groupmanager.php");
+$tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
+$tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+$form = new Form;
+if (isset($groupid))
+{
+ $form->addGlobal(new Form_Input(
+ 'groupid',
+ null,
+ 'hidden',
+ $groupid
+ ));
+}
-if (is_array($priv_list)) {
- $id = 0;
+$section = new Form_Section('Add privileges for '. $a_group['name']);
- $jdescs = "var descs = new Array();\n";
- foreach ($priv_list as $pname => $pdata) {
- if (in_array($pname, $a_group['priv'])) {
- continue;
- }
- $desc = addslashes($pdata['descr']);
- $jdescs .= "descs[{$id}] = '{$desc}';\n";
- $id++;
- }
+$priv_list = array_map(function($p){ return $p['name']; }, $priv_list);
+asort($priv_list);
- echo $jdescs;
-}
+$section->addInput(new Form_Select(
+ 'sysprivs',
+ 'Assigned privileges',
+ $a_group['priv'],
+ $priv_list,
+ true
+))->setHelp('Hold down CTRL (pc)/COMMAND (mac) key to select');
-?>
+$form->add($section);
-function update_description() {
- var index = document.iform.sysprivs.selectedIndex;
- document.getElementById("pdesc").innerHTML = descs[index];
-}
+print $form;
-//]]>
-</script>
-<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="group manager add privileges">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
- $tab_array[] = array(gettext("Groups"), true, "system_groupmanager.php");
- $tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
- $tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <form action="system_groupmanager_addprivs.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("System Privileges");?></td>
- <td width="78%" class="vtable">
- <table>
- <tr>
- <td>
- <select name="sysprivs[]" id="sysprivs" class="formselect" onchange="update_description();" multiple="multiple" size="35">
- <?php
- foreach ($priv_list as $pname => $pdata):
- if (in_array($pname, $a_group['priv'])) {
- continue;
- }
- ?>
- <option value="<?=$pname;?>"><?=$pdata['name'];?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <?=gettext("Hold down CTRL (pc)/COMMAND (mac) key to select multiple items");?>
- </td>
- <td>
- <a href='#'onClick="selectAll();">Select all</a>
- <script type="text/javascript">
- //<![CDATA[
- function selectAll() {
- var options = jQuery('select#sysprivs option');
- var len = options.length;
- for (var i = 0; i < len; i++) {
- options[i].selected = true;
- }
- }
- selectAll();
- //]]>
- </script>
- <br />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr height="60">
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" valign="top" class="vtable" id="pdesc">
- <em><?=gettext("Select a privilege from the list above for a description");?></em>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submitt" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input id="cancelbutton" class="formbtn" type="button" value="<?=gettext("Cancel");?>" onclick="history.back()" />
- <?php if (isset($groupid)): ?>
- <input name="groupid" type="hidden" value="<?=htmlspecialchars($groupid);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </form>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include('foot.inc'); \ No newline at end of file
diff --git a/src/usr/local/www/system_hasync.php b/src/usr/local/www/system_hasync.php
index 8ebde1f..47f6ea6 100755
--- a/src/usr/local/www/system_hasync.php
+++ b/src/usr/local/www/system_hasync.php
@@ -30,7 +30,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: system
+ pfSense_MODULE: system
*/
##|+PRIV
@@ -42,15 +42,8 @@
require("guiconfig.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/system_hasync.php');
-}
-
-if (!is_array($config['hasync'])) {
+if (!is_array($config['hasync']))
$config['hasync'] = array();
-}
$a_hasync = &$config['hasync'];
@@ -81,11 +74,11 @@ if ($_POST) {
foreach ($checkbox_names as $name) {
$a_hasync[$name] = $pconfig[$name] ? $pconfig[$name] : false;
}
- $a_hasync['pfsyncpeerip'] = $pconfig['pfsyncpeerip'];
+ $a_hasync['pfsyncpeerip'] = $pconfig['pfsyncpeerip'];
$a_hasync['pfsyncinterface'] = $pconfig['pfsyncinterface'];
$a_hasync['synchronizetoip'] = $pconfig['synchronizetoip'];
- $a_hasync['username'] = $pconfig['username'];
- $a_hasync['password'] = $pconfig['passwordfld'];
+ $a_hasync['username'] = $pconfig['username'];
+ $a_hasync['password'] = $pconfig['passwordfld'];
write_config("Updated High Availability Sync configuration");
interfaces_sync_setup();
header("Location: system_hasync.php");
@@ -95,271 +88,249 @@ if ($_POST) {
foreach ($checkbox_names as $name) {
$pconfig[$name] = $a_hasync[$name];
}
-$pconfig['pfsyncpeerip'] = $a_hasync['pfsyncpeerip'];
+$pconfig['pfsyncpeerip'] = $a_hasync['pfsyncpeerip'];
$pconfig['pfsyncinterface'] = $a_hasync['pfsyncinterface'];
$pconfig['synchronizetoip'] = $a_hasync['synchronizetoip'];
-$pconfig['username'] = $a_hasync['username'];
-$pconfig['passwordfld'] = $a_hasync['password'];
+$pconfig['username'] = $a_hasync['username'];
+$pconfig['passwordfld'] = $a_hasync['password'];
$ifaces = get_configured_interface_with_descr();
$ifaces["lo0"] = "loopback";
$pgtitle = array(gettext("System"), gettext("High Availability Sync"));
$shortcut_section = "carp";
+
+// Build a list of available interfaces
+$iflist = array();
+foreach ($ifaces as $ifname => $iface) {
+ $iflist[$ifname] = $iface;
+}
+
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-
-<form action="system_hasync.php" method="post" name="iform" id="iform">
-<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="high availability sync">
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" class="listtopic">State Synchronization Settings (pfsync)</td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize States</td>
- <td class="vtable">
- <input id='pfsyncenabled' type='checkbox' name='pfsyncenabled' value='on' <?php if ($pconfig['pfsyncenabled'] === "on") echo "checked='checked'"; ?> />
- <br />
- pfsync transfers state insertion, update, and deletion messages between firewalls. Each firewall sends these messages out via multicast on a specified interface, using the PFSYNC protocol (IP Protocol 240). It also listens on that interface for similar messages from other firewalls, and imports them into the local state table.<p>This setting should be enabled on all members of a failover group.</p><p>NOTE: Clicking save will force a configuration sync if it is enabled! (see Configuration Synchronization Settings below)</p>
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize Interface</td>
- <td class="vtable">
- <select id='pfsyncinterface' name="pfsyncinterface">
- <?php foreach ($ifaces as $ifname => $iface) { ?>
- <?php $selected = ($pconfig['pfsyncinterface'] === $ifname) ? 'selected="selected"' : ''; ?>
- <option value="<?= htmlentities($ifname); ?>" <?= $selected ?>><?= htmlentities($iface); ?></option>
- <?php } ?>
- </select>
- <br />
- If Synchronize States is enabled, it will utilize this interface for communication.<br />
- <b>NOTE:</b> We recommend setting this to a interface other than LAN! A dedicated interface works the best.<br />
- <b>NOTE:</b> You must define a IP on each machine participating in this failover group.<br />
- <b>NOTE:</b> You must have an IP assigned to the interface on any participating sync nodes.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">pfsync Synchronize Peer IP</td>
- <td class="vtable">
- <input id='pfsyncpeerip' name='pfsyncpeerip' class='formfld unknown' value='<?= htmlentities($pconfig['pfsyncpeerip'], ENT_QUOTES | ENT_HTML401); ?>' />
- <br />
- Setting this option will force pfsync to synchronize its state table to this IP address. The default is directed multicast.
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td colspan="2" class="listtopic">Configuration Synchronization Settings (XMLRPC Sync)</td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize Config to IP</td>
- <td class="vtable">
- <input id='synchronizetoip' name='synchronizetoip' class='formfld unknown' value='<?= htmlentities($pconfig['synchronizetoip'], ENT_QUOTES | ENT_HTML401); ?>' />
- <br />
- Enter the IP address of the firewall to which the selected configuration sections should be synchronized.<br />
- <br />
- NOTE: XMLRPC sync is currently only supported over connections using the same protocol and port as this system - make sure the remote system's port and protocol are set accordingly!<br />
- <br />
- NOTE: <b>Do not use the Synchronize Config to IP and password option on backup cluster members!</b>
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Remote System Username</td>
- <td class="vtable">
- <input id='username' name='username' class='formfld unknown' value='<?= htmlentities($pconfig['username'], ENT_QUOTES | ENT_HTML401); ?>' />
- <br />
- Enter the webConfigurator username of the system entered above for synchronizing your configuration.<br />
- <br />
- NOTE: <b>Do not use the Synchronize Config to IP and username option on backup cluster members!</b>
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Remote System Password</td>
- <td class="vtable">
- <input id='passwordfld' type='password' name='passwordfld' class='formfld pwd' value='<?= htmlentities($pconfig['passwordfld'], ENT_QUOTES | ENT_HTML401); ?>' />
- <br />
- Enter the webConfigurator password of the system entered above for synchronizing your configuration.<br />
- <br />
- NOTE: <b>Do not use the Synchronize Config to IP and password option on backup cluster members!</b>
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize Users and Groups</td>
- <td class="vtable">
- <input id='synchronizeusers' type='checkbox' name='synchronizeusers' value='on' <?php if ($pconfig['synchronizeusers'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the users and groups over to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize Auth Servers</td>
- <td class="vtable">
- <input id='synchronizeauthservers' type='checkbox' name='synchronizeauthservers' value='on' <?php if ($pconfig['synchronizeauthservers'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the authentication servers (e.g. LDAP, RADIUS) over to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize Certificates</td>
- <td class="vtable">
- <input id='synchronizecerts' type='checkbox' name='synchronizecerts' value='on' <?php if ($pconfig['synchronizecerts'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the Certificate Authorities, Certificates, and Certificate Revocation Lists over to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize rules</td>
- <td class="vtable">
- <input id='synchronizerules' type='checkbox' name='synchronizerules' value='on' <?php if ($pconfig['synchronizerules'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the firewall rules to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize Firewall Schedules</td>
- <td class="vtable">
- <input id='synchronizeschedules' type='checkbox' name='synchronizeschedules' value='on' <?php if ($pconfig['synchronizeschedules'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the firewall schedules to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize aliases</td>
- <td class="vtable">
- <input id='synchronizealiases' type='checkbox' name='synchronizealiases' value='on' <?php if ($pconfig['synchronizealiases'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the aliases over to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize NAT</td>
- <td class="vtable">
- <input id='synchronizenat' type='checkbox' name='synchronizenat' value='on' <?php if ($pconfig['synchronizenat'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the NAT rules over to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize IPsec</td>
- <td class="vtable">
- <input id='synchronizeipsec' type='checkbox' name='synchronizeipsec' value='on' <?php if ($pconfig['synchronizeipsec'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the IPsec configuration to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize OpenVPN</td>
- <td class="vtable">
- <input id='synchronizeopenvpn' type='checkbox' name='synchronizeopenvpn' value='on' <?php if ($pconfig['synchronizeopenvpn'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the OpenVPN configuration to the other HA host when changes are made. Using this option implies "Synchronize Certificates" as they are required for OpenVPN.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize DHCPD</td>
- <td class="vtable">
- <input id='synchronizedhcpd' type='checkbox' name='synchronizedhcpd' value='on' <?php if ($pconfig['synchronizedhcpd'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the DHCP Server settings over to the other HA host when changes are made. This only applies to DHCP for IPv4.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize Wake on LAN</td>
- <td class="vtable">
- <input id='synchronizewol' type='checkbox' name='synchronizewol' value='on' <?php if ($pconfig['synchronizewol'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the WoL configuration to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize Static Routes</td>
- <td class="vtable">
- <input id='synchronizestaticroutes' type='checkbox' name='synchronizestaticroutes' value='on' <?php if ($pconfig['synchronizestaticroutes'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the Static Route configuration to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize Load Balancer</td>
- <td class="vtable">
- <input id='synchronizelb' type='checkbox' name='synchronizelb' value='on' <?php if ($pconfig['synchronizelb'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the Load Balancer configuration to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize Virtual IPs</td>
- <td class="vtable">
- <input id='synchronizevirtualip' type='checkbox' name='synchronizevirtualip' value='on' <?php if ($pconfig['synchronizevirtualip'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the CARP Virtual IPs to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize traffic shaper(queues)</td>
- <td class="vtable">
- <input id='synchronizetrafficshaper' type='checkbox' name='synchronizetrafficshaper' value='on' <?php if ($pconfig['synchronizetrafficshaper'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the traffic shaper configuration for queues to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize traffic shaper(limiter)</td>
- <td class="vtable">
- <input id='synchronizetrafficshaperlimiter' type='checkbox' name='synchronizetrafficshaperlimiter' value='on' <?php if ($pconfig['synchronizetrafficshaperlimiter'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the traffic shaper configuration for limiters to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize traffic shaper(layer7)</td>
- <td class="vtable">
- <input id='synchronizetrafficshaperlayer7' type='checkbox' name='synchronizetrafficshaperlayer7' value='on' <?php if ($pconfig['synchronizetrafficshaperlayer7'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the traffic shaper configuration for layer7 to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize DNS Forwarder / Resolver</td>
- <td class="vtable">
- <input id='synchronizednsforwarder' type='checkbox' name='synchronizednsforwarder' value='on' <?php if ($pconfig['synchronizednsforwarder'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the DNS Forwarder and DNS Resolver configuration to the other HA host when changes are made.
- </td>
- </tr>
- <tr valign="top">
- <td width="22%" class="vncell">Synchronize Captive Portal</td>
- <td class="vtable">
- <input id='synchronizecaptiveportal' type='checkbox' name='synchronizecaptiveportal' value='on' <?php if ($pconfig['synchronizecaptiveportal'] === "on") echo "checked='checked'"; ?> />
- <br />
- When this option is enabled, this system will automatically sync the Captive Portal configuration to the other HA host when changes are made.
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="id" type="hidden" value="0" />
- <input name="Submit" type="submit" class="formbtn" value="Save" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+require('classes/Form.class.php');
+
+$form = new Form;
+
+$section = new Form_Section('State Synchronization Settings (pfsync)');
+
+$section->addInput(new Form_Checkbox(
+ 'pfsyncenabled',
+ 'Synchronize states',
+ 'pfsync transfers state insertion, update, and deletion messages between firewalls.',
+ ($pconfig['pfsyncenabled'] === 'on'),
+ 'on'
+))->setHelp('Each firewall sends these messages out via multicast on a specified interface, using the PFSYNC protocol (IP Protocol 240).' .
+ ' It also listens on that interface for similar messages from other firewalls, and imports them into the local state table.<br />' .
+ 'This setting should be enabled on all members of a failover group.<br />' .
+ 'Clicking "Save" will force a configuration sync if it is enabled! (see Configuration Synchronization Settings below)');
+
+$section->addInput(new Form_Select(
+ 'pfsyncinterface',
+ 'Synchorize Interface',
+ $pconfig['pfsyncinterface'],
+ $iflist
+))->setHelp('If Synchronize States is enabled this interface will be used for communication.<br />' .
+ 'We recommend setting this to an interface other than LAN! A dedicated interface works the best.<br />' .
+ 'You must define a IP on each machine participating in this failover group.<br />' .
+ 'You must have an IP assigned to the interface on any participating sync nodes.');
+
+$section->addInput(new Form_Input(
+ 'pfsyncpeerip',
+ 'pfsync Synchronize Peer IP',
+ 'text',
+ $pconfig['pfsyncpeerip'],
+ ['placeholder' => 'IP Address']
+))->setHelp('Setting this option will force pfsync to synchronize its state table to this IP address. The default is directed multicast.');
+
+$form->add($section);
+
+$section = new Form_Section('Configuration Synchronization Settings (XMLRPC Sync)');
+
+$section->addInput(new Form_Input(
+ 'synchronizetoip',
+ 'Synchronize Config to IP',
+ 'text',
+ $pconfig['synchronizetoip'],
+ ['placeholder' => 'IP Address']
+))->setHelp('Enter the IP address of the firewall to which the selected configuration sections should be synchronized.<br /><br />' .
+ 'XMLRPC sync is currently only supported over connections using the same protocol and port as this system - make sure the remote system\'s port and protocol are set accordingly!<br />' .
+ 'Do not use the Synchronize Config to IP and password option on backup cluster members!');
+
+$section->addInput(new Form_Input(
+ 'username',
+ 'Remote System Username',
+ 'text',
+ $pconfig['username']
+))->setHelp('Enter the webConfigurator username of the system entered above for synchronizing your configuration.<br />' .
+ 'Do not use the Synchronize Config to IP and username option on backup cluster members!');
+
+$section->addInput(new Form_Input(
+ 'passwordfld',
+ 'Remote System Password',
+ 'password',
+ $pconfig['passwordfld']
+))->setHelp('Enter the webConfigurator password of the system entered above for synchronizing your configuration.<br />' .
+ 'Do not use the Synchronize Config to IP and password option on backup cluster members!');
+
+$group = new Form_MultiCheckboxGroup('Select options to sync');
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizeusers',
+ 'Synchronize Users and Groups',
+ 'Sync the users and groups over ',
+ ($pconfig['synchronizeusers'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizeauthservers',
+ 'Synchronize Auth Servers',
+ 'Sync the authentication servers (e.g. LDAP, RADIUS) over ',
+ ($pconfig['synchronizeauthservers'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizecerts',
+ 'Synchronize Certificates',
+ 'Sync the Certificate Authorities, Certificates, and Certificate Revocation Lists over ',
+ ($pconfig['synchronizecerts'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizerules',
+ 'Synchronize Rules',
+ 'Sync the firewall rules ',
+ ($pconfig['synchronizerules'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizeschedules',
+ 'Synchronize Firewall schedules',
+ 'Sync the firewall schedules ',
+ ($pconfig['synchronizeschedules'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizealiases',
+ 'Synchronize Firewall aliasas',
+ 'Sync the firewall aliasas ',
+ ($pconfig['synchronizealiasas'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizenat',
+ 'Synchronize NAT',
+ 'Sync NAT rules ',
+ ($pconfig['synchronizenat'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizeipsec',
+ 'Synchronize IPsec',
+ 'Automatically IPsec configuration ',
+ ($pconfig['synchronizeipsec'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizeopenvpn',
+ 'Synchronize OpenVPN',
+ 'Automatically OpenVPN configuration ',
+ ($pconfig['synchronizeopenvpn'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizedhcpd',
+ 'Synchronize DHCPD',
+ 'Sync DHCP Server settings ',
+ ($pconfig['synchronizedhcpd'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizewol',
+ 'Synchronize Wake on LAN',
+ 'Sync WoL Server settings ',
+ ($pconfig['synchronizewol'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizestaticroutes',
+ 'Synchronize Static Routes',
+ 'Sync Static Route configuration ',
+ ($pconfig['synchronizestaticroutes'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizelb',
+ 'Synchronize Load Balancer',
+ 'Sync Load Balancer configuration ',
+ ($pconfig['synchronizelb'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizevirtualip',
+ 'Synchronize Virtual IPs',
+ 'Sync Virtual IPs ',
+ ($pconfig['synchronizevirtualip'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizetrafficshaper',
+ 'Synchronize traffic shaper (queues)',
+ 'Sync the Traffic Shaper configuration ',
+ ($pconfig['synchronizetrafficshaper'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizetrafficshaperlimiter',
+ 'Synchronize traffic shaper (limiter)',
+ 'Sync the Traffic Shaper configuration for limiters ',
+ ($pconfig['synchronizetrafficshaperlimiter'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizetrafficshaperlayer7',
+ 'Synchronize traffic shaper (layer 7)',
+ 'Sync the Traffic Shaper configuration for layer 7 ',
+ ($pconfig['synchronizetrafficshaperlayer7'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizednsforwarder',
+ 'Synchronize traffic shaper (Forwarder/Resolver)',
+ 'Sync the DNS Forwarder and DNS Resolver configurations ',
+ ($pconfig['synchronizednsforwarder'] === 'on'),
+ 'on'
+));
+
+$group->add(new Form_MultiCheckbox(
+ 'synchronizecaptiveportal',
+ 'Synchronize Captive Portal)',
+ 'Sync the Captive Portal configurations ',
+ ($pconfig['synchronizecaptiveportal'] === 'on'),
+ 'on'
+));
+
+$section->add($group);
+
+$form->add($section);
+
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_routes.php b/src/usr/local/www/system_routes.php
index 9443d40..600d872 100644
--- a/src/usr/local/www/system_routes.php
+++ b/src/usr/local/www/system_routes.php
@@ -225,183 +225,79 @@ $shortcut_section = "routing";
include("head.inc");
-?>
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+if (is_subsystem_dirty('staticroutes'))
+ print_info_box_np(gettext("The static route configuration has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."));
+
+$tab_array = array();
+$tab_array[0] = array(gettext("Gateways"), false, "system_gateways.php");
+$tab_array[1] = array(gettext("Routes"), true, "system_routes.php");
+$tab_array[2] = array(gettext("Groups"), false, "system_gateway_groups.php");
+display_top_tabs($tab_array);
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="system_routes.php" method="post">
-<script type="text/javascript" src="/javascript/row_toggle.js"></script>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('staticroutes')): ?><p>
-<?php print_info_box_np(sprintf(gettext("The static route configuration has been changed.%sYou must apply the changes in order for them to take effect."), "<br />"));?><br /></p>
-<?php endif; ?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system routes">
+?>
+<table class="table">
+<thead>
<tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Gateways"), false, "system_gateways.php");
- $tab_array[1] = array(gettext("Routes"), true, "system_routes.php");
- $tab_array[2] = array(gettext("Groups"), false, "system_gateway_groups.php");
- display_top_tabs($tab_array);
- ?>
- </td>
+ <th></th>
+ <th><?=gettext("Network")?></th>
+ <th><?=gettext("Gateway")?></th>
+ <th><?=gettext("Interface")?></th>
+ <th><?=gettext("Description")?></th>
+ <th></th>
</tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr id="frheader">
- <td width="2%" class="list">&nbsp;</td>
- <td width="2%" class="list">&nbsp;</td>
- <td width="22%" class="listhdrr"><?=gettext("Network");?></td>
- <td width="20%" class="listhdrr"><?=gettext("Gateway");?></td>
- <td width="15%" class="listhdrr"><?=gettext("Interface");?></td>
- <td width="29%" class="listhdr"><?=gettext("Description");?></td>
- <td width="10%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td width="17"></td>
- <td><a href="system_routes_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <?php
- $i = 0;
- foreach ($a_routes as $route):
- ?>
- <tr valign="top" id="fr<?=$i;?>">
- <?php
- $iconfn = "pass";
- if (isset($route['disabled'])) {
- $textss = "<span class=\"gray\">";
- $textse = "</span>";
- $iconfn .= "_d";
- } else {
- $textss = $textse = "";
- }
- ?>
- <td class="listt">
- <input type="checkbox" id="frc<?=$i;?>" name="route[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
- </td>
- <td class="listt" align="center">
- <a href="?act=toggle&amp;id=<?=$i;?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0"
- title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" />
- </a>
- </td>
- <td class="listlr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_routes_edit.php?id=<?=$i;?>';">
- <?=$textss;?><?=strtolower($route['network']);?><?=$textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_routes_edit.php?id=<?=$i;?>';">
- <?=$textss;?>
- <?php
- echo htmlentities($a_gateways[$route['gateway']]['name']) . " - " . htmlentities($a_gateways[$route['gateway']]['gateway']);
- ?>
- <?=$textse;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_routes_edit.php?id=<?=$i;?>';">
- <?=$textss;?>
- <?php
- echo convert_friendly_interface_to_friendly_descr($a_gateways[$route['gateway']]['friendlyiface']) . " ";
- ?>
- <?=$textse;?>
- </td>
- <td class="listbg" onclick="fr_toggle(<?=$i;?>)" ondblclick="document.location='system_routes_edit.php?id=<?=$i;?>';">
- <?=$textss;?><?=htmlspecialchars($route['descr']);?>&nbsp;<?=$textse;?>
- </td>
- <td class="list nowrap" valign="middle">
- <table border="0" cellspacing="0" cellpadding="1" summary="move">
- <tr>
- <td>
- <input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)" name="move_<?=$i;?>"
- src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif"
- title="<?=gettext("move selected routes before this route");?>"
- type="image" style="height:17;width:17;border:0" />
- </td>
- <td>
- <a href="system_routes_edit.php?id=<?=$i;?>">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit route");?>" alt="edit" />
- </a>
- </td>
- </tr>
- <tr>
- <td align="center" valign="middle">
- <a href="system_routes.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this route?");?>')">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete route");?>" alt="delete" />
- </a>
- </td>
- <td>
- <a href="system_routes_edit.php?dup=<?=$i;?>">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new route based on this one");?>" width="17" height="17" border="0" alt="duplicate" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <?php
- $i++;
- endforeach;
- ?>
- <tr>
- <td class="list" colspan="6"></td>
- <td class="list nowrap" valign="middle">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tr>
- <td>
-<?php
- if ($i == 0):
-?>
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17"
- title="<?=gettext("move selected routes to end");?>" border="0" alt="move" />
-<?php
- else:
-?>
- <input name="move_<?=$i;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif"
- style="width:17;height:17;border:0" title="<?=gettext("move selected routes to end");?>" />
-<?php
- endif;
-?>
- </td>
- <td>
- <a href="system_routes_edit.php">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0"
- title="<?=gettext("add new route");?>" alt="add" />
- </a>
- </td>
- </tr>
- <tr>
- <td>
-<?php
- if ($i == 0):
-?>
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17"
- title="<?=gettext("delete selected routes");?>" border="0" alt="delete" />
-<?php
- else:
-?>
- <input name="del" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif"
- style="width:17;height:17" title="<?=gettext("delete selected routes");?>"
- onclick="return confirm('<?=gettext("Do you really want to delete the selected routes?");?>')" />
+</thead>
+<tbody>
<?php
- endif;
+foreach ($a_routes as $i => $route):
+ if (isset($route['disabled']))
+ $icon = 'icon-ban-circle';
+ else
+ $icon = 'icon-ok-circle';
?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </div>
+ <tr<?=($icon != 'icon-ok-circle')? ' class="disabled"' : ''?>>
+ <td><i class="icon <?=$icon?>"></i></td>
+ <td>
+ <?=strtolower($route['network'])?>
+ </td>
+ <td>
+ <?=htmlentities($a_gateways[$route['gateway']]['name']) . " - " . htmlentities($a_gateways[$route['gateway']]['gateway'])?>
+ </td>
+ <td>
+ <?=convert_friendly_interface_to_friendly_descr($a_gateways[$route['gateway']]['friendlyiface'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($route['descr'])?>
</td>
+ <td>
+ <a class="btn btn-xs btn-primary" href="system_routes_edit.php?id=<?=$i?>">
+ edit
+ </a>
+
+ <a class="btn btn-xs btn-default" href="system_routes_edit.php?dup=<?=$i?>">
+ copy
+ </a>
+
+ <a class="btn btn-xs btn-danger" href="system_routes.php?act=del&amp;id=<?=$i?>">
+ delete
+ </a>
+
+ <a class="btn btn-xs btn-default" href="?act=toggle&amp;id=<?=$i?>">
+ toggle
+ </a>
+ </td>
+<? endforeach?>
</tr>
</table>
-</form>
-<p><b><?=gettext("Note:");?></b> <?=gettext("Do not enter static routes for networks assigned on any interface of this firewall. Static routes are only used for networks reachable via a different router, and not reachable via your default gateway.");?></p>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<nav class="action-buttons">
+ <a href="system_routes_edit.php" role="button" class="btn btn-success">
+ <?=gettext("add new route")?>
+ </a>
+</nav>
+<?php
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_routes_edit.php b/src/usr/local/www/system_routes_edit.php
index a64580b..1a8974f 100644
--- a/src/usr/local/www/system_routes_edit.php
+++ b/src/usr/local/www/system_routes_edit.php
@@ -45,11 +45,7 @@ require_once("filter.inc");
require_once("util.inc");
require_once("gwlb.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/system_routes.php');
-}
+$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/system_routes.php');
if (!is_array($config['staticroutes']['route'])) {
$config['staticroutes']['route'] = array();
@@ -238,208 +234,59 @@ if ($_POST) {
$pgtitle = array(gettext("System"), gettext("Static Routes"), gettext("Edit route"));
$shortcut_section = "routing";
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
-<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
-<script type="text/javascript" src="/javascript/suggestions.js"></script>
-<?php include("fbegin.inc");?>
-<?php if ($input_errors) print_input_errors($input_errors); ?>
- <form action="system_routes_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="system routes edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit route entry"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination network"); ?></td>
- <td width="78%" class="vtable">
- <input name="network" type="text" class="formfldalias ipv4v6" id="network" size="20" value="<?=htmlspecialchars($pconfig['network']);?>" />
- /
- <select name="network_subnet" class="formselect ipv4v6" id="network_subnet">
- <?php for ($i = 128; $i >= 1; $i--): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['network_subnet']) echo "selected=\"selected\""; ?>>
- <?=$i;?>
- </option>
- <?php endfor; ?>
- </select>
- <br /><span class="vexpl"><?=gettext("Destination network for this static route"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Gateway"); ?></td>
- <td width="78%" class="vtable">
- <select name="gateway" id="gateway" class="formselect">
- <?php
- foreach ($a_gateways as $gateway) {
- echo "<option value='{$gateway['name']}' ";
- if ($gateway['name'] == $pconfig['gateway']) {
- echo "selected=\"selected\"";
- }
- echo ">" . htmlspecialchars($gateway['name']) . " - " . htmlspecialchars($gateway['gateway']) . "</option>\n";
- }
- ?>
- </select> <br />
- <div id='addgwbox'>
- <?=gettext("Choose which gateway this route applies to or"); ?> <a onclick="show_add_gateway();" href="#"><?=gettext("add a new one.");?></a>
- </div>
- <div id='notebox'>
- </div>
- <div style="display:none" id="status">
- </div>
- <div style="display:none" id="addgateway">
- <table border="1" style="background:#990000; border-style: none none none none; width:225px;" summary="add gateway">
- <tr>
- <td>
- <table bgcolor="#990000" cellpadding="1" cellspacing="1" summary="add">
- <tr><td>&nbsp;</td></tr>
- <tr>
- <td colspan="2" align="center"><b><font color="white"><?=gettext("Add new gateway:"); ?></font></b></td>
- </tr>
- <tr><td>&nbsp;</td></tr>
- <tr>
- <td width="45%" align="right"><font color="white"><?=gettext("Default gateway:"); ?></font></td><td><input type="checkbox" id="defaultgw" name="defaultgw" /></td>
- </tr>
- <tr>
- <td width="45%" align="right"><font color="white"><?=gettext("Interface:"); ?></font></td>
- <td>
- <select name="addinterfacegw" id="addinterfacegw">
- <?php $gwifs = get_configured_interface_with_descr();
- foreach ($gwifs as $fif => $dif) {
- echo "<option value=\"{$fif}\">{$dif}</option>\n";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td align="right"><font color="white"><?=gettext("Gateway Name:"); ?></font></td><td><input id="name" name="name" value="GW" /></td>
- </tr>
- <tr>
- <td align="right"><font color="white"><?=gettext("Gateway IP:"); ?></font></td><td><input id="gatewayip" name="gatewayip" /></td>
- </tr>
- <tr>
- <td align="right"><font color="white"><?=gettext("Description:"); ?></font></td><td><input id="gatewaydescr" name="gatewaydescr" /></td>
- </tr>
- <tr><td>&nbsp;</td></tr>
- <tr>
- <td colspan="2" align="center">
- <div id='savebuttondiv'>
- <input type="hidden" name="addrtype" id="addrtype" value="IPv4" />
- <input id="gwsave" type="button" value="<?=gettext("Save Gateway"); ?>" onclick='hide_add_gatewaysave();' />
- <input id="gwcancel" type="button" value="<?=gettext("Cancel"); ?>" onclick='hide_add_gateway();' />
- </div>
- </td>
- </tr>
- <tr><td>&nbsp;</td></tr>
- </table>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Disabled");?></td>
- <td width="78%" class="vtable">
- <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable this static route");?></strong><br />
- <span class="vexpl"><?=gettext("Set this option to disable this static route without removing it from the list.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br /><span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)."); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="save" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <?php if (isset($id) && $a_routes[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- </td>
- </tr>
- </table>
- </form>
-<script type="text/javascript">
-//<![CDATA[
- var gatewayip;
- var name;
- function show_add_gateway() {
- document.getElementById("addgateway").style.display = '';
- document.getElementById("addgwbox").style.display = 'none';
- document.getElementById("gateway").style.display = 'none';
- document.getElementById("save").style.display = 'none';
- document.getElementById("cancel").style.display = 'none';
- document.getElementById("gwsave").style.display = '';
- document.getElementById("gwcancel").style.display = '';
- jQuery('#notebox').html("");
- }
- function hide_add_gateway() {
- document.getElementById("addgateway").style.display = 'none';
- document.getElementById("addgwbox").style.display = '';
- document.getElementById("gateway").style.display = '';
- document.getElementById("save").style.display = '';
- document.getElementById("cancel").style.display = '';
- document.getElementById("gwsave").style.display = '';
- document.getElementById("gwcancel").style.display = '';
- }
- function hide_add_gatewaysave() {
- document.getElementById("addgateway").style.display = 'none';
- jQuery('#status').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif"> One moment please...');
- var iface = jQuery('#addinterfacegw').val();
- name = jQuery('#name').val();
- var descr = jQuery('#gatewaydescr').val();
- gatewayip = jQuery('#gatewayip').val();
- addrtype = jQuery('#addrtype').val();
- var defaultgw = '';
- if (jQuery('#defaultgw').checked) {
- defaultgw = 'yes';
- }
- var url = "system_gateways_edit.php";
- var pars = 'isAjax=true&defaultgw=' + escape(defaultgw) + '&interface=' + escape(iface) + '&name=' + escape(name) + '&descr=' + escape(descr) + '&gateway=' + escape(gatewayip) + '&type=' + escape(addrtype);
- jQuery.ajax(
- url,
- {
- type: 'post',
- data: pars,
- error: report_failure,
- complete: save_callback
- });
- }
- function addOption(selectbox, text, value) {
- var optn = document.createElement("OPTION");
- optn.text = text;
- optn.value = value;
- selectbox.append(optn);
- selectbox.prop('selectedIndex', selectbox.children('option').length-1);
- jQuery('#notebox').html("<p><strong><?=gettext("NOTE:");?><\/strong> <?php printf(gettext("You can manage Gateways %shere%s."), "<a target='_blank' href='system_gateways.php'>", "<\/a>");?> <\/strong><\/p>");
- }
- function report_failure() {
- alert("<?=gettext("Sorry, we could not create your gateway at this time."); ?>");
- hide_add_gateway();
- }
- function save_callback(transport) {
- var response = transport.responseText;
- if (response) {
- document.getElementById("addgateway").style.display = 'none';
- hide_add_gateway();
- jQuery('#status').html('');
- addOption(jQuery('#gateway'), name, name);
- } else {
- report_failure();
- }
- }
- var addressarray = <?= json_encode(get_alias_list(array("host", "network"))) ?>;
- var oTextbox1 = new AutoSuggestControl(document.getElementById("network"), new StateSuggestions(addressarray));
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require('classes/Form.class.php');
+$form = new Form;
+
+if (isset($id) && $a_routes[$id]) {
+ $form->addGlobal(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$section = new Form_Section('Edit route entry');
+
+$section->addInput(new Form_IpAddress(
+ 'network_subnet',
+ 'Destination network',
+ $pconfig['network']
+))->addMask('network_subnet', $pconfig['network_subnet'])->setHelp('Destination network for this static route');
+
+$allGateways = array_combine(
+ array_map(function($g){ return $g['name']; }, $a_gateways),
+ array_map(function($g){ return $g['name'] .' - '. $g['gateway']; }, $a_gateways)
+);
+$section->addInput(new Form_Select(
+ 'gateway',
+ 'Gateway',
+ $pconfig['gateway'],
+ $allGateways
+))->setHelp('Choose which gateway this route applies to or <a href="'.
+ '/system_gateways_edit.php">add a new one first</a>');
+
+$section->addInput(new Form_Checkbox(
+ 'disabled',
+ 'Disabled',
+ 'Disable this static route',
+ $pconfig['disabled']
+))->setHelp('Set this option to disable this static route without removing it from '.
+ 'the list.');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ htmlspecialchars($pconfig['descr'])
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$form->add($section);
+
+print $form;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_usermanager.php b/src/usr/local/www/system_usermanager.php
index f08ce7c..4a3802b 100644
--- a/src/usr/local/www/system_usermanager.php
+++ b/src/usr/local/www/system_usermanager.php
@@ -98,70 +98,10 @@ if ($_POST['act'] == "deluser") {
$userdeleted = $a_user[$id]['name'];
unset($a_user[$id]);
write_config();
- $savemsg = gettext("User") . " {$userdeleted} " . gettext("successfully deleted") . "<br />";
-} else if ($_POST['act'] == "delpriv") {
-
- if (!$a_user[$id]) {
- pfSenseHeader("system_usermanager.php");
- exit;
- }
-
- $privdeleted = $priv_list[$a_user[$id]['priv'][$_POST['privid']]]['name'];
- unset($a_user[$id]['priv'][$_POST['privid']]);
- local_user_set($a_user[$id]);
- write_config();
- $_POST['act'] = "edit";
- $savemsg = gettext("Privilege") . " {$privdeleted} " . gettext("successfully deleted"). "<br />";
-} else if ($_POST['act'] == "expcert") {
-
- if (!$a_user[$id]) {
- pfSenseHeader("system_usermanager.php");
- exit;
- }
-
- $cert =& lookup_cert($a_user[$id]['cert'][$_POST['certid']]);
-
- $exp_name = urlencode("{$a_user[$id]['name']}-{$cert['descr']}.crt");
- $exp_data = base64_decode($cert['crt']);
- $exp_size = strlen($exp_data);
-
- header("Content-Type: application/octet-stream");
- header("Content-Disposition: attachment; filename={$exp_name}");
- header("Content-Length: $exp_size");
- echo $exp_data;
- exit;
-} else if ($_POST['act'] == "expckey") {
-
- if (!$a_user[$id]) {
- pfSenseHeader("system_usermanager.php");
- exit;
- }
-
- $cert =& lookup_cert($a_user[$id]['cert'][$_POST['certid']]);
-
- $exp_name = urlencode("{$a_user[$id]['name']}-{$cert['descr']}.key");
- $exp_data = base64_decode($cert['prv']);
- $exp_size = strlen($exp_data);
-
- header("Content-Type: application/octet-stream");
- header("Content-Disposition: attachment; filename={$exp_name}");
- header("Content-Length: $exp_size");
- echo $exp_data;
- exit;
-} else if ($_POST['act'] == "delcert") {
-
- if (!$a_user[$id]) {
- pfSenseHeader("system_usermanager.php");
- exit;
- }
-
- $certdeleted = lookup_cert($a_user[$id]['cert'][$_POST['certid']]);
- $certdeleted = $certdeleted['descr'];
- unset($a_user[$id]['cert'][$_POST['certid']]);
- write_config();
- $_POST['act'] = "edit";
- $savemsg = gettext("Certificate") . " {$certdeleted} " . gettext("association removed.") . "<br />";
-} else if ($_POST['act'] == "new") {
+ $savemsg = gettext("User")." {$userdeleted} ".
+ gettext("successfully deleted")."<br />";
+}
+else if ($_GET['act'] == "new") {
/*
* set this value cause the text field is read only
* and the user should not be able to mess with this
@@ -291,6 +231,22 @@ if ($_POST['save']) {
}
if (!$input_errors) {
+ // This used to be a separate act=delpriv
+ if ($a_user[$id] && !empty($_POST['privid'])) {
+ foreach ($_POST['privid'] as $i)
+ unset($a_user[$id]['priv'][$i]);
+ local_user_set($a_user[$id]);
+ write_config();
+ }
+
+ // This used to be a separate act=delcert
+ if ($a_user[$id] && !empty($_POST['certid'])) {
+ foreach ($_POST['certid'] as $i)
+ unset($a_user[$id]['cert'][$i]);
+
+ write_config();
+ }
+
conf_mount_rw();
$userent = array();
if (isset($id) && $a_user[$id]) {
@@ -382,659 +338,314 @@ if ($_POST['save']) {
$closehead = false;
include("head.inc");
-?>
-<link rel="stylesheet" type="text/css" href="/javascript/jquery-ui-timepicker-addon/css/jquery-ui-timepicker-addon.css" />
-<link rel="stylesheet" type="text/css" href="/javascript/jquery/jquery-ui-1.11.1.css" />
-
-<script type="text/javascript" src="/javascript/row_toggle.js"></script>
-<script type="text/javascript">
-//<![CDATA[
- jQuery(function() {
- jQuery( "#expires" ).datepicker( { dateFormat: 'mm/dd/yy', changeYear: true, yearRange: "+0:+100" } );
- });
-//]]>
-</script>
-</head>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-
-<script type="text/javascript">
-//<![CDATA[
-
-function setall_selected(id) {
- selbox = document.getElementById(id);
- count = selbox.options.length;
- for (index = 0; index<count; index++) {
- selbox.options[index].selected = true;
- }
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
+
+$tab_array = array();
+$tab_array[] = array(gettext("Users"), true, "system_usermanager.php");
+$tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
+$tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
+$tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
+display_top_tabs($tab_array);
+
+if (!($_GET['act'] == "new" || $_GET['act'] == "edit" || $input_errors))
+{
+?>
+
+<div class="table-responsive">
+<table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th>&nbsp;</th>
+ <th><?=gettext("Username")?></th>
+ <th><?=gettext("Full name")?></th>
+ <th><?=gettext("Disabled")?></th>
+ <th><?=gettext("Groups")?></th>
+ </tr>
+ </thead>
+ <tbody>
+ </tbody>
+ <tbody>
+<?php
+foreach($a_user as $i => $userent):
+ ?>
+ <tr>
+ <td>
+ <input type="checkbox" id="frc<?=$i?>" name="delete_check[]" value="<?=$i?>" <?=($userent['scope'] == "system" ? 'disabled="disabled"' : '')?>/>
+ </td>
+ <td>
+<?php
+ if($userent['scope'] != "user")
+ $usrimg = 'eye-open';
+ else
+ $usrimg = 'user';
+?>
+ <i class="icon icon-<?=$usrimg?>"></i>
+ <?=htmlspecialchars($userent['name'])?>
+ </td>
+ <td><?=htmlspecialchars($userent['descr'])?></td>
+ <td><?php if(isset($userent['disabled'])) echo "*"?></td>
+ <td><?=implode(",",local_user_get_groups($userent))?></td>
+ <td>
+ <a href="?act=edit&amp;userid=<?=$i?>" class="btn btn-xs btn-primary">edit</a>
+<?php if($userent['scope'] != "system"): ?>
+ <a href="?act=del&amp;userid=<?=$i?>" class="btn btn-xs btn-danger">delete</a>
+<?php endif; ?>
+ </td>
+ </tr>
+<?php endforeach; ?>
+ </tbody>
+</table>
+</div>
+<nav class="action-buttons">
+ <a href="?act=new" class="btn btn-success">add new</a>
+</nav>
+<p>
+ <?=gettext("Additional users can be added here. User permissions for accessing " .
+ "the webConfigurator can be assigned directly or inherited from group memberships. " .
+ "An icon that appears grey indicates that it is a system defined object. " .
+ "Some system object properties can be modified but they cannot be deleted.")?>
+ <br /><br />
+ <?=gettext("Accounts created here are also used for other parts of the system " .
+ "such as OpenVPN, IPsec, and Captive Portal.")?>
+</p>
+<?php
+ include("foot.inc");
+ exit;
}
-function delete_empty(id) {
- selbox = document.getElementById(id);
- count = selbox.options.length;
- for (index = 0; index<count; index++) {
- if (selbox.options[index].value == '') {
- selbox.remove(index);
+require('classes/Form.class.php');
+$form = new Form;
+$form->setAction('system_usermanager.php?act=edit');
+$form->addGlobal(new Form_Input(
+ 'userid',
+ null,
+ 'hidden',
+ $id
+));
+$form->addGlobal(new Form_Input(
+ 'utype',
+ null,
+ 'hidden',
+ $pconfig['utype']
+));
+$form->addGlobal(new Form_Input(
+ 'oldusername',
+ null,
+ 'hidden',
+ $pconfig['usernamefld']
+));
+
+$section = new Form_Section('User Properties');
+
+$section->addInput(new Form_StaticText(
+ 'Defined by',
+ strtoupper($pconfig['utype'])
+));
+
+?>
+<?php
+$ro = false;
+if ($pconfig['utype'] == "system")
+ $ro = true;
+
+$section->addInput(new Form_Checkbox(
+ 'disabled',
+ 'Disabled',
+ 'This user cannot login',
+ $pconfig['disabled']
+));
+
+$section->addInput($input = new Form_Input(
+ 'usernamefld',
+ 'Username',
+ 'text',
+ $pconfig['usernamefld']
+));
+
+if ($ro)
+ $input->setDisabled();
+
+$group = new Form_Group('Password');
+$group->add(new Form_Input(
+ 'passwordfld1',
+ 'Password',
+ 'password'
+));
+$group->add(new Form_Input(
+ 'passwordfld2',
+ 'Confirm Password',
+ 'password'
+));
+
+$section->add($group);
+
+$section->addInput($input = new Form_Input(
+ 'descr',
+ 'Full name',
+ 'text',
+ htmlspecialchars($pconfig['descr'])
+))->setHelp('User\'s full name, for your own information only');
+
+if ($ro)
+ $input->setDisabled();
+
+$section->addInput(new Form_Input(
+ 'expires',
+ 'Expiration date',
+ 'date',
+ $pconfig['expires']
+))->setHelp('Leave blank if the account shouldn\'t expire, otherwise enter '.
+ 'the expiration date');
+
+$systemGroups = array();
+foreach ($config['system']['group'] as $group)
+ $systemGroups[ $group['name'] ] = $group['name'];
+
+$section->addInput(new Form_Select(
+ 'groups',
+ 'Group Memberships',
+ array_combine((array)$pconfig['groups'], (array)$pconfig['groups']),
+ $systemGroups,
+ true
+))->setHelp('Hold down CTRL (pc)/COMMAND (mac) key to select multiple items');
+
+$form->add($section);
+
+if (isset($pconfig['uid']))
+{
+ $section = new Form_Section('Effective Privileges');
+
+ foreach (get_user_privdesc($a_user[$id]) as $i => $priv)
+ {
+ // We reverse name and action for readability of longer names
+ $input = new Form_Checkbox(
+ 'privid[]',
+ null,
+ $priv['name'],
+ false,
+ $i
+ );
+
+ if ($priv['group'])
+ {
+ $group = new Form_Group('Inherited from '. $priv['group']);
+ $input->setDisabled();
}
- }
-}
+ else
+ $group = new Form_Group('Revoke privilege');
-function clear_selected(id) {
- selbox = document.getElementById(id);
- count = selbox.options.length;
- for (index = 0; index<count; index++) {
- selbox.options[index].selected = false;
+ $group->add($input);
+ $section->add($group);
}
-}
-function remove_selected(id) {
- selbox = document.getElementById(id);
- index = selbox.options.length - 1;
- for (; index >= 0; index--) {
- if (selbox.options[index].selected) {
- selbox.remove(index);
- }
- }
-}
+ $section->addInput(new Form_StaticText(
+ null,
+ new Form_Button(null, 'grant more privileges', 'system_usermanager_addprivs.php?userid='. $id)
+ ));
-function copy_selected(srcid, dstid) {
- src_selbox = document.getElementById(srcid);
- dst_selbox = document.getElementById(dstid);
- count = dst_selbox.options.length;
- for (index = count - 1; index >= 0; index--) {
- if (dst_selbox.options[index].value == '') {
- dst_selbox.remove(index);
- }
- }
- count = src_selbox.options.length;
- for (index = 0; index < count; index++) {
- if (src_selbox.options[index].selected) {
- option = document.createElement('option');
- option.text = src_selbox.options[index].text;
- option.value = src_selbox.options[index].value;
- dst_selbox.add(option, null);
- }
- }
-}
+ $form->add($section);
-function move_selected(srcid, dstid) {
- copy_selected(srcid, dstid);
- remove_selected(srcid);
-}
+ $section = new Form_Section('User Certificates');
-function presubmit() {
- delete_empty('groups');
- delete_empty('notgroups');
- clear_selected('notgroups');
- setall_selected('groups');
-}
+ foreach ((array)$a_user[$id]['cert'] as $i => $certref)
+ {
+ $cert = lookup_cert($certref);
+ $ca = lookup_ca($cert['caref']);
-function usercertClicked(obj) {
- if (obj.checked) {
- document.getElementById("usercertchck").style.display="none";
- document.getElementById("usercert").style.display="";
- } else {
- document.getElementById("usercert").style.display="none";
- document.getElementById("usercertchck").style.display="";
+ // We reverse name and action for readability of longer names
+ $section->addInput(new Form_Checkbox(
+ 'certid[]',
+ 'Delete certificate',
+ $cert['descr']. (is_cert_revoked($cert) ? ' <b>revoked</b>' : ''),
+ false,
+ $i
+ ));
}
+
+ #FIXME; old ui supplied direct export links to each certificate
+
+ $section->addInput(new Form_StaticText(
+ null,
+ new Form_Button(null, 'add certificate', 'system_certmanager.php?act=new&userid='. $id).
+ new Form_Button(null, 'export certificates', 'system_certmanager.php')
+ ));
}
+else
+{
+ if (is_array($config['ca']) && count($config['ca']) > 0)
+ {
+ $section = new Form_Section('Create certificate for user');
+
+ $nonPrvCas = array();
+ foreach( $config['ca'] as $ca)
+ {
+ if (!$ca['prv'])
+ continue;
+
+ $nonPrvCas[ $ca['refid'] ] = $ca['descr'];
+ }
-function sshkeyClicked(obj) {
- if (obj.checked) {
- document.getElementById("sshkeychck").style.display="none";
- document.getElementById("sshkey").style.display="";
- } else {
- document.getElementById("sshkey").style.display="none";
- document.getElementById("sshkeychck").style.display="";
+ if (!empty($nonPrvCas))
+ {
+ $section->addInput(new Form_Input(
+ 'name',
+ 'Descriptive name',
+ 'text',
+ $pconfig['name']
+ ));
+
+ $section->addInput(new Form_Select(
+ 'caref',
+ 'Certificate authority',
+ null,
+ $nonPrvCas
+ ));
+
+ $section->addInput(new Form_Select(
+ 'keylen',
+ 'Key length',
+ 2048,
+ array(
+ 512 => '512 bits',
+ 1024 => '1024 bits',
+ 2048 => '2049 bits',
+ 4096 => '4096 bits',
+ )
+ ));
+
+ $section->addInput(new Form_Input(
+ 'lifetime',
+ 'Lifetime',
+ 'number',
+ $pconfig['lifetime']
+ ));
+ }
+
+ $form->add($section);
}
}
-//]]>
-</script>
-<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="user manager">
- <tr>
- <td>
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Users"), true, "system_usermanager.php");
- $tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
- $tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
- $tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
-<?php
- if ($_POST['act'] == "new" || $_POST['act'] == "edit" || $input_errors):
-?>
- <form action="system_usermanager.php" method="post" name="iform" id="iform" onsubmit="presubmit()">
- <input type="hidden" id="act" name="act" value="" />
- <input type="hidden" id="userid" name="userid" value="<?=(isset($id) ? $id : '');?>" />
- <input type="hidden" id="privid" name="privid" value="" />
- <input type="hidden" id="certid" name="certid" value="" />
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
-<?php
- $ro = "";
- if ($pconfig['utype'] == "system") {
- $ro = "readonly=\"readonly\"";
- }
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Defined by");?></td>
- <td width="78%" class="vtable">
- <strong><?=strtoupper(htmlspecialchars($pconfig['utype']));?></strong>
- <input name="utype" type="hidden" value="<?=htmlspecialchars($pconfig['utype'])?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Disabled");?></td>
- <td width="78%" class="vtable">
- <input name="disabled" type="checkbox" id="disabled" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Username");?></td>
- <td width="78%" class="vtable">
- <input name="usernamefld" type="text" class="formfld user" id="usernamefld" size="20" maxlength="16" value="<?=htmlspecialchars($pconfig['usernamefld']);?>" <?=$ro;?> />
- <input name="oldusername" type="hidden" id="oldusername" value="<?=htmlspecialchars($pconfig['usernamefld']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq" rowspan="2"><?=gettext("Password");?></td>
- <td width="78%" class="vtable">
- <input name="passwordfld1" type="password" class="formfld pwd" id="passwordfld1" size="20" value="" />
- </td>
- </tr>
- <tr>
- <td width="78%" class="vtable">
- <input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" value="" />&nbsp;<?= gettext("(confirmation)"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Full name");?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>" <?=$ro;?> />
- <br />
- <?=gettext("User's full name, for your own information only");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Expiration date"); ?></td>
- <td width="78%" class="vtable">
- <input name="expires" type="text" class="formfld unknown" id="expires" size="10" value="<?=htmlspecialchars($pconfig['expires']);?>" />
- <br />
- <span class="vexpl"><?=gettext("Leave blank if the account shouldn't expire, otherwise enter the expiration date in the following format: mm/dd/yyyy"); ?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Group Memberships");?></td>
- <td width="78%" class="vtable" align="center">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="group membership">
- <tr>
- <td align="center" width="50%">
- <strong><?=gettext("Not Member Of"); ?></strong><br />
- <br />
- <select size="10" style="width: 75%" name="notgroups[]" class="formselect" id="notgroups" onchange="clear_selected('groups')" multiple="multiple">
-<?php
- $rowIndex = 0;
- foreach ($config['system']['group'] as $group):
- if ($group['gid'] == 1998) { /* all users group */
- continue;
- }
- if (is_array($pconfig['groups']) && in_array($group['name'], $pconfig['groups'])) {
- continue;
- }
- $rowIndex++;
-?>
- <option value="<?=$group['name'];?>" <?=$selected;?>>
- <?=htmlspecialchars($group['name']);?>
- </option>
-<?php
- endforeach;
- if ($rowIndex == 0) {
- echo "<option></option>";
- }
-?>
- </select>
- <br />
- </td>
- <td>
- <br />
- <a href="javascript:move_selected('notgroups', 'groups')">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_right.gif" title="<?=gettext("Add Groups"); ?>" alt="<?=gettext("Add Groups"); ?>" width="17" height="17" border="0" />
- </a>
- <br /><br />
- <a href="javascript:move_selected('groups', 'notgroups')">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_left.gif" title="<?=gettext("Remove Groups"); ?>" alt="<?=gettext("Remove Groups"); ?>" width="17" height="17" border="0" />
- </a>
- </td>
- <td align="center" width="50%">
- <strong><?=gettext("Member Of"); ?></strong><br />
- <br />
- <select size="10" style="width: 75%" name="groups[]" class="formselect" id="groups" onchange="clear_selected('notgroups')" multiple="multiple">
-<?php
- $rowIndex = 0;
- if (is_array($pconfig['groups'])):
- foreach ($config['system']['group'] as $group):
- if ($group['gid'] == 1998) { /* all users group */
- continue;
- }
- if (!in_array($group['name'], $pconfig['groups'])) {
- continue;
- }
- $rowIndex++;
-?>
- <option value="<?=$group['name'];?>">
- <?=htmlspecialchars($group['name']);?>
- </option>
-<?php
- endforeach;
- endif;
- if ($rowIndex == 0) {
- echo "<option></option>";
- }
-?>
- </select>
- <br />
- </td>
- </tr>
- </table>
- <?=gettext("Hold down CTRL (pc)/COMMAND (mac) key to select multiple items");?>
- </td>
- </tr>
-<?php
- if (isset($pconfig['uid'])):
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Effective Privileges");?></td>
- <td width="78%" class="vtable">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="privileges">
- <tr>
- <td width="20%" class="listhdrr"><?=gettext("Inherited From");?></td>
- <td width="30%" class="listhdrr"><?=gettext("Name");?></td>
- <td width="40%" class="listhdrr"><?=gettext("Description");?></td>
- <td class="list"></td>
- </tr>
-<?php
- $privdesc = get_user_privdesc($a_user[$id]);
- if (is_array($privdesc)):
- $i = 0;
- foreach ($privdesc as $priv):
- $group = false;
- if ($priv['group']) {
- $group = $priv['group'];
- }
-?>
- <tr>
- <td class="listlr"><?=$group;?></td>
- <td class="listr">
- <?=htmlspecialchars($priv['name']);?>
- </td>
- <td class="listbg">
- <?=htmlspecialchars($priv['descr']);?>
- </td>
- <td valign="middle" class="list nowrap">
-<?php
- if (!$group):
-?>
- <input type="image" name="delpriv[]" width="17" height="17" border="0"
- src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif"
- onclick="document.getElementById('privid').value='<?=$i;?>';
- document.getElementById('userid').value='<?=$id;?>';
- document.getElementById('act').value='<?php echo "delpriv";?>';
- return confirm('<?=gettext("Do you really want to delete this privilege?");?>');"
- title="<?=gettext("delete privilege");?>" />
-<?php
- endif;
-?>
- </td>
- </tr>
-<?php
- /* can only delete user priv indexes */
- if (!$group) {
- $i++;
- }
- endforeach;
- endif;
-?>
- <tr>
- <td class="list" colspan="3"></td>
- <td class="list">
- <a href="system_usermanager_addprivs.php?userid=<?=$id?>">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("User Certificates");?></td>
- <td width="78%" class="vtable">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="certificates">
- <tr>
- <td width="45%" class="listhdrr"><?=gettext("Name");?></td>
- <td width="45%" class="listhdrr"><?=gettext("CA");?></td>
- <td class="list"></td>
- </tr>
-<?php
- $a_cert = $a_user[$id]['cert'];
- if (is_array($a_cert)):
- $i = 0;
- foreach ($a_cert as $certref):
- $cert = lookup_cert($certref);
- $ca = lookup_ca($cert['caref']);
-?>
- <tr>
- <td class="listlr">
- <?=htmlspecialchars($cert['descr']);?>
-<?php
- if (is_cert_revoked($cert)):
-?>
- (<b>Revoked</b>)
-<?php
- endif;
-?>
- </td>
- <td class="listr">
- <?=htmlspecialchars($ca['descr']);?>
- </td>
- <td valign="middle" class="list nowrap">
- <input type="image" name="expckey[]" width="17" height="17" border="0"
- src="/themes/<?=$g['theme'];?>/images/icons/icon_down.gif"
- onclick="document.getElementById('certid').value='<?=$i;?>';
- document.getElementById('userid').value='<?=$id;?>';
- document.getElementById('act').value='<?php echo "expckey";?>';"
- title="<?=gettext("export private key");?>" />
- <input type="image" name="expcert[]" width="17" height="17" border="0"
- src="/themes/<?=$g['theme'];?>/images/icons/icon_down.gif"
- onclick="document.getElementById('certid').value='<?=$i;?>';
- document.getElementById('userid').value='<?=$id;?>';
- document.getElementById('act').value='<?php echo "expcert";?>';"
- title="<?=gettext("export cert");?>" />
- <input type="image" name="delcert[]" width="17" height="17" border="0"
- src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif"
- onclick="document.getElementById('certid').value='<?=$i;?>';
- document.getElementById('userid').value='<?=$id;?>';
- document.getElementById('act').value='<?php echo "delcert";?>';
- return confirm('<?=gettext("Do you really want to remove this certificate association?") .'\n'. gettext("(Certificate will not be deleted)");?>')"
- title="<?=gettext("delete cert");?>" />
- </td>
- </tr>
-<?php
- $i++;
- endforeach;
- endif;
-?>
- <tr>
- <td class="list" colspan="2"></td>
- <td class="list">
- <a href="system_certmanager.php?act=new&amp;userid=<?=$id?>">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" />
- </a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-<?php
- else:
- if (is_array($config['ca']) && count($config['ca']) > 0):
- $i = 0;
- foreach ($config['ca'] as $ca) {
- if (!$ca['prv']) {
- continue;
- }
- $i++;
- }
-?>
+$section = new Form_Section('Keys');
- <tr id="usercertchck">
- <td width="22%" valign="top" class="vncell"><?=gettext("Certificate");?></td>
- <td width="78%" class="vtable">
- <input type="checkbox" onclick="javascript:usercertClicked(this)" /> <?=gettext("Click to create a user certificate."); ?>
- </td>
- </tr>
+$section->addInput(new Form_Textarea(
+ 'authorizedkeys',
+ 'Authorized keys',
+ 'text',
+ $pconfig['authorizedkeys']
+))->setHelp('Paste an authorized keys file here.');
-<?php
- if ($i > 0):
-?>
- <tr id="usercert" style="display:none">
- <td width="22%" valign="top" class="vncell"><?=gettext("Certificate");?></td>
- <td width="78%" class="vtable">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="certificate">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
- <td width="78%" class="vtable">
- <input name="name" type="text" class="formfld unknown" id="name" size="20" value="<?=htmlspecialchars($pconfig['name']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate authority");?></td>
- <td width="78%" class="vtable">
- <select name='caref' id='caref' class="formselect" onchange='internalca_change()'>
-<?php
- $rowIndex = 0;
- foreach ($config['ca'] as $ca):
- if (!$ca['prv']) {
- continue;
- }
- $rowIndex++;
-?>
- <option value="<?=$ca['refid'];?>"><?=htmlspecialchars($ca['descr']);?></option>
-<?php
- endforeach;
- if ($rowIndex == 0) {
- echo "<option></option>";
- }
-?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Key length");?></td>
- <td width="78%" class="vtable">
- <select name='keylen' class="formselect">
-<?php
- $cert_keylens = array("2048", "512", "1024", "4096");
- foreach ($cert_keylens as $len):
-?>
- <option value="<?=$len;?>"><?=$len;?></option>
-<?php
- endforeach;
- if (!count($cert_keylens)) {
- echo "<option></option>";
- }
-?>
- </select>
- bits
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Lifetime");?></td>
- <td width="78%" class="vtable">
- <input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="5" value="<?=htmlspecialchars($pconfig['lifetime']);?>" />days
- </td>
- </tr>
- </table>
- </td>
- </tr>
-<?php
- endif;
- endif;
- endif;
-?>
- <tr id="sshkeychck" <?php if (!empty($pconfig['authorizedkeys'])) echo 'style="display:none"'; ?>>
- <td width="22%" valign="top" class="vncell"><?=gettext("Authorized keys");?></td>
- <td width="78%" class="vtable">
- <input type="checkbox" onclick="javascript:sshkeyClicked(this)" /> <?=gettext("Click to paste an authorized key."); ?>
- </td>
- </tr>
- <tr id="sshkey" <?php if (empty($pconfig['authorizedkeys'])) echo 'style="display:none"'; ?>>
- <td width="22%" valign="top" class="vncell"><?=gettext("Authorized keys");?></td>
- <td width="78%" class="vtable">
- <script type="text/javascript">
- //<![CDATA[
- window.onload=function() {
- document.getElementById("authorizedkeys").wrap='off';
- }
- //]]>
- </script>
- <textarea name="authorizedkeys" cols="65" rows="7" id="authorizedkeys" class="formfld_cert"><?=htmlspecialchars($pconfig['authorizedkeys']);?></textarea>
- <br />
- <?=gettext("Paste an authorized keys file here.");?>
- </td>
- </tr>
- <tr id="ipsecpskrow">
- <td width="22%" valign="top" class="vncell"><?=gettext("IPsec Pre-Shared Key");?></td>
- <td width="78%" class="vtable">
- <input name="ipsecpsk" type="text" class="formfld unknown" id="ipsecpsk" size="65" value="<?=htmlspecialchars($pconfig['ipsecpsk']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <?php if (isset($id) && $a_user[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif;?>
- </td>
- </tr>
- </table>
- </form>
-<?php
- else:
-?>
- <form action="system_usermanager.php" method="post" name="iform2" id="iform2">
- <input type="hidden" id="act" name="act" value="" />
- <input type="hidden" id="userid" name="userid" value="<?=(isset($id) ? $id : '');?>" />
- <input type="hidden" id="username" name="username" value="" />
- <input type="hidden" id="privid" name="privid" value="" />
- <input type="hidden" id="certid" name="certid" value="" />
- <table class="sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
- <thead>
- <tr>
- <th width="5%" class="list">&nbsp;</th>
- <th width="25%" class="listhdrr"><?=gettext("Username"); ?></th>
- <th width="25%" class="listhdrr"><?=gettext("Full name"); ?></th>
- <th width="5%" class="listhdrr"><?=gettext("Disabled"); ?></th>
- <th width="25%" class="listhdrr"><?=gettext("Groups"); ?></th>
- <th width="10%" class="list"></th>
- </tr>
- </thead>
- <tfoot>
- <tr>
- <td class="list" colspan="5"></td>
- <td class="list">
- <input type="image" name="addcert" width="17" height="17" border="0"
- src="/themes/<?=$g['theme'];?>/images/icons/icon_plus.gif"
- onclick="document.getElementById('act').value='<?php echo "new";?>';"
- title="<?=gettext("add user");?>" />
- <input type="image" src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" name="dellall" title="<?=gettext('Delete selected users')?>" onClick="return confirm('<?=gettext("Do you really want to delete selected Users?");?>')" />
- </td>
- </tr>
- <tr>
- <td colspan="5">
- <p>
- <?=gettext("Additional users can be added here. User permissions for accessing " .
- "the webConfigurator can be assigned directly or inherited from group memberships. " .
- "An icon that appears grey indicates that it is a system defined object. " .
- "Some system object properties can be modified but they cannot be deleted."); ?>
- <br /><br />
- <?=gettext("Accounts created here are also used for other parts of the system " .
- "such as OpenVPN, IPsec, and Captive Portal.");?>
- </p>
- </td>
- </tr>
- </tfoot>
- <tbody>
-<?php
- $i = 0;
- foreach ($a_user as $userent):
-?>
- <tr ondblclick="document.getElementById('act').value='<?php echo "edit";?>';
- document.getElementById('userid').value='<?=$i;?>';
- document.iform2.submit();" id="fr<?=$i?>">
- <td class="list" id="frd<?=$i?>">
- <?php if ($userent['scope'] != "system") : ?>
- <input type="checkbox" id="frc<?=$i?>" onclick="fr_bgcolor(<?=$i?>)" name="delete_check[]" value="<?=$i?>" />
- <?php endif; ?>
- </td>
- <td class="listlr" id="frd<?=$i?>" onclick="fr_toggle('<?=$i;?>')">
- <table border="0" cellpadding="0" cellspacing="0" summary="icons">
- <tr>
- <td align="left" valign="middle">
-<?php
- if ($userent['scope'] != "user") {
- $usrimg = "/themes/{$g['theme']}/images/icons/icon_system-user-grey.png";
- } else {
- $usrimg = "/themes/{$g['theme']}/images/icons/icon_system-user.png";
- }
-?>
- <img src="<?=$usrimg;?>" alt="<?=gettext("User"); ?>" title="<?=gettext("User"); ?>" border="0" height="16" width="16" />
- </td>
- <td align="left" valign="middle">
- <?=htmlspecialchars($userent['name']);?>
- </td>
- </tr>
- </table>
- </td>
- <td class="listr" id="frd<?=$i?>" onclick="fr_toggle('<?=$i;?>')"><?=htmlspecialchars($userent['descr']);?>&nbsp;</td>
- <td class="listr" id="frd<?=$i?>" onclick="fr_toggle('<?=$i;?>')"><?php if (isset($userent['disabled'])) echo "*"; ?></td>
- <td class="listbg" onclick="fr_toggle('<?=$i;?>')">
- <?=implode(",", local_user_get_groups($userent));?>
- &nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <input type="image" name="edituser[]" width="17" height="17" border="0"
- src="/themes/<?=$g['theme'];?>/images/icons/icon_e.gif"
- onclick="document.getElementById('userid').value='<?=$i;?>';
- document.getElementById('act').value='<?php echo "edit";?>';"
- title="<?=gettext("edit user");?>" />
-<?php
- if ($userent['scope'] != "system"):
-?>
- &nbsp;
- <input type="image" name="deluser[]" width="17" height="17" border="0"
- src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif"
- onclick="document.getElementById('userid').value='<?=$i;?>';
- document.getElementById('username').value='<?=$userent['name'];?>';
- document.getElementById('act').value='<?php echo "deluser";?>';
- return confirm('<?=gettext("Do you really want to delete this user?");?>');"
- title="<?=gettext("delete user");?>" />
-<?php
- endif;
-?>
- </td>
- </tr>
-<?php
- $i++;
- endforeach;
-?>
- </tbody>
- </table>
- </form>
-<?php
- endif;
-?>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc");?>
-</body>
-</html>
+$section->addInput(new Form_Input(
+ 'ipsecpsk',
+ 'IPsec Pre-Shared Key',
+ 'text',
+ $pconfig['ipsecpsk']
+));
+
+$form->add($section);
+print $form;
+
+include('foot.inc'); \ No newline at end of file
diff --git a/src/usr/local/www/system_usermanager_addprivs.php b/src/usr/local/www/system_usermanager_addprivs.php
index 40b11a6..2e05769 100644
--- a/src/usr/local/www/system_usermanager_addprivs.php
+++ b/src/usr/local/www/system_usermanager_addprivs.php
@@ -31,7 +31,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: auth
+ pfSense_MODULE: auth
*/
##|+PRIV
@@ -52,6 +52,7 @@ $pgtitle = array("System", "User manager", "Add privileges");
if (is_numericint($_GET['userid'])) {
$userid = $_GET['userid'];
}
+
if (isset($_POST['userid']) && is_numericint($_POST['userid'])) {
$userid = $_POST['userid'];
}
@@ -107,114 +108,107 @@ if ($_POST) {
exit;
}
+
conf_mount_ro();
}
+function build_priv_list() {
+ global $priv_list, $a_user;
+
+ $list = array();
+
+ foreach($priv_list as $pname => $pdata) {
+ if (in_array($pname, $a_user['priv']))
+ continue;
+
+ $list[$pname] = $pdata['name'];
+ }
+
+ return($list);
+}
+
/* if ajax is calling, give them an update message */
if (isAjax()) {
print_info_box_np($savemsg);
}
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
+if ($input_errors)
+ print_input_errors($input_errors);
-<?php
+if ($savemsg)
+ print_info_box($savemsg, 'success');
-if (is_array($priv_list)) {
- $id = 0;
+$tab_array = array();
+$tab_array[] = array(gettext("Users"), true, "system_usermanager.php");
+$tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
+$tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
+$tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
+display_top_tabs($tab_array);
- $jdescs = "var descs = new Array();\n";
- foreach ($priv_list as $pname => $pdata) {
- if (in_array($pname, $a_user['priv'])) {
- continue;
- }
- $desc = addslashes(preg_replace("/pfSense/i", $g['product_name'], $pdata['descr']));
- $jdescs .= "descs[{$id}] = '{$desc}';\n";
- $id++;
- }
+require('classes/Form.class.php');
- echo $jdescs;
+$form = new Form();
+
+$section = new Form_Section('User privileges');
+
+$section->addInput(new Form_Select(
+ 'sysprivs',
+ 'System',
+ null,
+ build_priv_list(),
+ true
+))->addClass('multiselect')->setHelp('Hold down CTRL (PC)/COMMAND (Mac) key to select multiple items');
+
+if (isset($userid)) {
+ $section->addInput(new Form_Input(
+ 'userid',
+ null,
+ 'hidden',
+ $userid
+ ));
}
+$form->add($section);
+
+print($form);
?>
-function update_description() {
- var index = document.iform.sysprivs.selectedIndex;
- document.getElementById("pdesc").innerHTML = descs[index];
-}
+<div class="panel panel-body alert-info" id="pdesc">Select a privilege from the list above for a description"</div>
+
+<script>
+//<![CDATA[
+events.push(function(){
-//]]>
-</script>
<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
+
+ // Build a list of privilege descriptions
+ if (is_array($priv_list)) {
+ $id = 0;
+
+ $jdescs = "var descs = new Array();\n";
+ foreach ($priv_list as $pname => $pdata) {
+ if (in_array($pname, $a_user['priv'])) {
+ continue;
+ }
+ $desc = addslashes(preg_replace("/pfSense/i", $g['product_name'], $pdata['descr']));
+ $jdescs .= "descs[{$id}] = '{$desc}';\n";
+ $id++;
+ }
+
+ echo $jdescs;
}
?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="user manager add privileges">
- <tr>
- <td>
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Users"), true, "system_usermanager.php");
- $tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
- $tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
- $tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <form action="system_usermanager_addprivs.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("System Privileges");?></td>
- <td width="78%" class="vtable">
- <select name="sysprivs[]" id="sysprivs" class="formselect" onchange="update_description();" multiple="multiple" size="35">
- <?php
- foreach ($priv_list as $pname => $pdata):
- if (in_array($pname, $a_user['priv'])) {
- continue;
- }
- ?>
- <option value="<?=$pname;?>"><?=$pdata['name'];?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <?=gettext("Hold down CTRL (pc)/COMMAND (mac) key to select multiple items");?>
- </td>
- </tr>
- <tr height="60">
- <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
- <td width="78%" valign="top" class="vtable" id="pdesc">
- <em><?=gettext("Select a privilege from the list above for a description"); ?></em>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submitt" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input id="cancelbutton" class="formbtn" type="button" value="<?=gettext("Cancel");?>" onclick="history.back()" />
- <?php if (isset($userid)): ?>
- <input name="userid" type="hidden" value="<?=htmlspecialchars($userid);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </form>
- </div>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ // Set the number of options to display
+ $('.multiselect').attr("size","20");
+
+ // When the 'sysprivs" selector is clicked, we display a description
+ $('.multiselect').click(function() {
+ $('#pdesc').html(descs[$(this).children('option:selected').index()]);
+ });
+});
+//]]>
+</script>
+
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_usermanager_passwordmg.php b/src/usr/local/www/system_usermanager_passwordmg.php
index 6d785ee..cb02942 100644
--- a/src/usr/local/www/system_usermanager_passwordmg.php
+++ b/src/usr/local/www/system_usermanager_passwordmg.php
@@ -90,66 +90,39 @@ session_commit();
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php
-include("fbegin.inc");
-
if ($input_errors) {
print_input_errors($input_errors);
}
+
if ($savemsg) {
print_info_box($savemsg);
}
if ($islocal == false) {
echo gettext("Sorry, you cannot change the password for a non-local user.");
- include("fend.inc");
+ include("foot.inc");
exit;
}
-?>
+require('classes/Form.class.php');
-<div id="mainarea">
- <div class="tabcont">
- <form action="system_usermanager_passwordmg.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
-<?php
- if (!session_id()) {
- session_start();
- }
-?>
- <td colspan="2" valign="top" class="listtopic"><?=$_SESSION['Username']?>'s <?=gettext("Password"); ?></td>
-<?php session_commit(); ?>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell" rowspan="2"><?=gettext("Password"); ?></td>
- <td width="78%" class="vtable">
- <input name="passwordfld1" type="password" class="formfld pwd" id="passwordfld1" size="20" />
- </td>
- </tr>
- <tr>
- <td width="78%" class="vtable">
- <input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" />
- &nbsp;<?=gettext("(confirmation)");?>
- <br />
- <span class="vexpl">
- <?=gettext("Select a new password");?>
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- </td>
- </tr>
- </table>
- </form>
- </div>
-</div>
-<?php include("fend.inc");?>
-</body>
-</html>
+$form = new Form();
+
+$section = new Form_Section('Update Password');
+
+$section->addInput(new Form_Input(
+ 'passwordfld1',
+ 'Password',
+ 'password'
+));
+
+$section->addInput(new Form_Input(
+ 'passwordfld2',
+ 'Confirmation',
+ 'password'
+))->setHelp('Select a new password');
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_usermanager_settings.php b/src/usr/local/www/system_usermanager_settings.php
index cadfb08..a89970e 100644
--- a/src/usr/local/www/system_usermanager_settings.php
+++ b/src/usr/local/www/system_usermanager_settings.php
@@ -94,92 +94,61 @@ if ($_POST) {
}
include("head.inc");
-?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc");?>
-<?php if ($input_errors) print_input_errors($input_errors);?>
-<?php if ($savemsg) print_info_box($savemsg);?>
+if ($input_errors)
+ print_input_errors($input_errors);
+if ($savemsg)
+ print_info_box($savemsg);
-<?php
- if ($save_and_test) {
- echo "<script type=\"text/javascript\">\n";
- echo "//<![CDATA[\n";
- echo "myRef = window.open('system_usermanager_settings_test.php?authserver={$pconfig['authmode']}','mywin', ";
- echo "'left=20,top=20,width=700,height=550,toolbar=1,resizable=0');\n";
- echo "if (myRef==null || typeof(myRef)=='undefined') alert('" . gettext("Popup blocker detected. Action aborted.") ."');\n";
- echo "//]]>\n";
- echo "</script>\n";
- }
-?>
+if($save_and_test) {
+ echo "<script>\n";
+ echo "myRef = window.open('system_usermanager_settings_test.php?authserver=".$pconfig['authmode']."','mywin','left=20,top=20,width=700,height=550,toolbar=1,resizable=0');\n";
+ echo "if (myRef==null || typeof(myRef)=='undefined') alert('" . gettext("Popup blocker detected. Action aborted.") ."');\n";
+ echo "</script>\n";
+}
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="user manager settings">
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
- $tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
- $tab_array[] = array(gettext("Settings"), true, "system_usermanager_settings.php");
- $tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
- display_top_tabs($tab_array);
-
- /* Default to pfsense backend type if none is defined */
- if (!$pconfig['backend']) {
- $pconfig['backend'] = "pfsense";
- }
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <form id="iform" name="iform" action="system_usermanager_settings.php" method="post">
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="6" summary="main area">
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Session Timeout"); ?></td>
- <td width="78%" class="vtable">
- <input name="session_timeout" id="session_timeout" type="text" size="8" value="<?=htmlspecialchars($pconfig['session_timeout']);?>" />
- <br />
- <?=gettext("Time in minutes to expire idle management sessions. The default is 4 hours (240 minutes).");?><br />
- <?=gettext("Enter 0 to never expire sessions. NOTE: This is a security risk!");?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Authentication Server"); ?></td>
- <td width="78%" class="vtable">
- <select name='authmode' id='authmode' class="formselect" >
-<?php
- $auth_servers = auth_get_authserver_list();
- foreach ($auth_servers as $auth_server):
- $selected = "";
- if ($auth_server['name'] == $pconfig['authmode']) {
- $selected = "selected=\"selected\"";
- }
- if (!isset($pconfig['authmode']) && $auth_server['name'] == "Local Database") {
- $selected = "selected=\"selected\"";
- }
-?>
- <option value="<?=$auth_server['name'];?>" <?=$selected;?>><?=$auth_server['name'];?></option>
-<?php
- endforeach;
-?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="save" name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- <input id="savetest" name="savetest" type="submit" class="formbtn" value="<?=gettext("Save and Test");?>" />
- </td>
- </tr>
- </table>
- </form>
- </div>
- </td>
- </tr>
- </table>
-<?php include("fend.inc");?>
-</body>
-</html>
+$tab_array = array();
+$tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
+$tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
+$tab_array[] = array(gettext("Settings"), true, "system_usermanager_settings.php");
+$tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
+display_top_tabs($tab_array);
+
+/* Default to pfsense backend type if none is defined */
+if(!$pconfig['backend'])
+ $pconfig['backend'] = "pfsense";
+
+require('classes/Form.class.php');
+$form = new Form;
+
+$section = new Form_Section('Settings');
+
+$section->addInput(new Form_Input(
+ 'session_timeout',
+ 'Session timeout',
+ 'number',
+ $pconfig['session_timeout']
+))->setHelp('Time in minutes to expire idle management sessions. The default is 4 '.
+ 'hours (240 minutes).Enter 0 to never expire sessions. NOTE: This is a security '.
+ 'risk!');
+
+$auth_servers = array();
+foreach (auth_get_authserver_list() as $auth_server)
+ $auth_servers[ $auth_server['name'] ] = $auth_server['name'];
+
+$section->addInput(new Form_Select(
+ 'authmode',
+ 'Authentication Server',
+ $pconfig['authmode'],
+ $auth_servers
+));
+
+$form->addGlobal(new Form_Button(
+ 'savetest',
+ 'Save & Test'
+))->removeClass('btn-primary')->addClass('btn-default');
+
+$form->add($section);
+print $form;
+
+include("fend.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/system_usermanager_settings_test.php b/src/usr/local/www/system_usermanager_settings_test.php
index 9076262..f2cdef8 100755
--- a/src/usr/local/www/system_usermanager_settings_test.php
+++ b/src/usr/local/www/system_usermanager_settings_test.php
@@ -49,44 +49,25 @@ if (isset($config['system']['authserver'][0]['host'])) {
$authcfg = auth_get_authserver($authserver);
}
-?>
-
-<html>
-<HEAD>
- <STYLE type="text/css">
- TABLE {
- border-width: 1px;
- border-spacing: 0px;
- border-style: solid solid solid solid;
- border-color: gray gray gray gray;
- border-collapse: separate;
- background-color: collapse;
- }
- TD {
- border-width: 1px 1px 1px 1px;
- border-spacing: 0px;
- border-style: solid solid solid solid;
- border-color: gray gray gray gray;
- border-collapse: collapse;
- background-color: #dddddd;
- }
- </STYLE>
-</HEAD>
-<body>
- <form method="post" name="iform" id="iform">
-
+?><!DOCTYPE html>
+<html lang="en">
+<head>
+ <link rel="stylesheet" href="/bootstrap/css/pfSense.css" />
+ <title><?=gettext("Test Authentication server"); ?></title>
+</head>
+<body id="system_usermanager_settings_test" class="no-menu">
+ <div id="jumbotron">
+ <div class="container">
+ <div class="col-sm-offset-3 col-sm-6 col-xs-12">
+ <pre>
<?php
-$theme = $config['theme'];
if (!$authcfg) {
printf(gettext("Could not find settings for %s%s"), htmlspecialchars($authserver), "<p/>");
} else {
- if ($theme != "" && file_exists("/usr/local/www/themes/{$theme}/images/logo.gif")) {
- echo "<p><img src='/themes/{$theme}/images/logo.gif' style='float: left'><br/><br/><br/></p>";
- }
echo "<b>" . sprintf(gettext("Testing %s LDAP settings... One moment please..."), $g['product_name']) . "</b>";
- echo "<table width='100%'>";
+ echo "<table>";
echo "<tr><td>" . gettext("Attempting connection to") . " " . "<td><center>$auth_server</b></center></td>";
if (ldap_test_connection($authcfg)) {
@@ -126,9 +107,11 @@ if (!$authcfg) {
}
?>
- <p/>
- <input type="Button" value="<?=gettext("Close"); ?>" onClick='Javascript:window.close();'>
+ </pre>
- </form>
+ <a href="javascript:window.close();" class="btn btn-primary">Return</a>
+ </div>
+ </div>
+ </div>
</body>
-</html>
+</html> \ No newline at end of file
diff --git a/src/usr/local/www/themes/_corporate/all.css b/src/usr/local/www/themes/_corporate/all.css
deleted file mode 100644
index ea578fa..0000000
--- a/src/usr/local/www/themes/_corporate/all.css
+++ /dev/null
@@ -1,1209 +0,0 @@
-/*
- * "corporate" theme by Guillaume Belanger <gbelanger@exosecurity.com>
- * based on the original "metallic" theme */
-
-
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-}
-
-.nowrap { white-space: nowrap; }
-
-.addgatewaybox {
- background-color: #990000;
- border-style: none none none none;
- width: 225px;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 11px;
- font-family: "Trebuchet MS", sans-serif;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- background-color: #333333;
- margin: 5px auto;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 815px;
- margin: 5px auto;
-}
-
-#header {
- background: url('images/header.gif') no-repeat;
- background-position: 4px;
- height: 102px;
- width: 808px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.gif') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 28px;
- left: 230px;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: bold;
- font-family: Verdana;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 4px;
- margin-top: 0px;
- margin-left: 5px;
- padding-top: 0px;
- width: 800px;
- background: url('images/horizontal.gif') repeat-y;
-}
-
-#left {
- width: 800px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.gif') no-repeat;
- top: -18px;
- left: 7px;
- width: 800px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 7px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -24px;
- left: -2px;
- width: 800px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- width: 7.75em;
- height: 28px;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- background-color: #202020;
- /* background: url("images/menu_footer.gif") no-repeat; */
- background-position: bottom;
-
- padding: 0em 0em 0em 0;
- margin-top: 4px;
- padding-top: 0em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #303030;
- border-top: 0px;
- width: 8.9em;
- height: 1.6em;
- line-height: 1.6em;
- background: url('images/metal_bgr.gif') repeat-x;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background: url('images/metal_bgr_red.gif') repeat-x;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/metallic/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/metallic/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/metallic/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/metallic/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/metallic/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/metallic/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/metallic/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/metallic/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/metallic/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/metallic/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/metallic/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/metallic/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/metallic/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/metallic/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/metallic/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/metallic/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/metallic/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/metallic/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #FFFFFF;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #DDDDDD;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 6px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(/themes/metallic/images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password, #password2 {
- font-size: small;
- width: 60%;
- padding-left: 19px;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-/* Widget CSS */
-.widgetsubheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #B1B1B1;
- padding-right: 6px;
- padding-left: 6px;
- color: #000000;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetdiv{
- margin:5px;
- padding: 5px;
- background:#CCCCCC;
-}
-.widgetconfigdiv{
- background:#BBBBBB;
- font-size: 11px;
- color: #000000;
- padding-right: 5px;
- padding-left: 5px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-div#log div.log-entry-mini {
- clear: both;
-}
-
-div#log div.log-entry-mini span {
- padding: 2px 2px 2px 2px;
- padding-left: 6px;
-}
-
-div#log span.log-action-mini-header,
-div#log span.log-time-mini-header,
-div#log span.log-interface-mini-header,
-div#log span.log-source-mini-header,
-div#log span.log-destination-mini-header,
-div#log span.log-protocol-mini-header {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 12px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-time-mini,
-div#log span.log-interface-mini,
-div#log span.log-source-mini,
-div#log span.log-destination-mini,
-div#log span.log-protocol-mini {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 11px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-action-mini-header {
- width: 6%;
-}
-
-div#log span.log-time-mini,
-div#log span.log-time-mini-header {
- width: 19%;
-}
-
-div#log span.log-interface-mini,
-div#log span.log-interface-mini-header {
- width: 8%;
-}
-
-div#log span.log-source-mini,
-div#log span.log-source-mini-header {
- width: 23%;
-}
-
-div#log span.log-destination-mini,
-div#log span.log-destination-mini-header {
- width: 31%;
-}
-
-div#log span.log-protocol-mini,
-div#log span.log-protocol-mini-header {
- width: 8%;
- border-right: 1px solid #999;
-}
-
-/*thermal_sensors widget styles*/
-
-.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
-.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
-.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
- background-color: LimeGreen;
- border-top-width: 2px; border-top-color: Lime;
- border-left-width: 0px;
- border-right-width: 0px;
- border-bottom-width: 2px; border-bottom-color: Green;
-}
-.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
-.thermalSensorText { float: left; height: 20px; top: 3px; }
-.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
-
-.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-
-.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
-
-.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
-
-/* widget textarea styles - full width */
-.textarea_widget {
- width: 100%;
- resize:vertical;
- -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
- -moz-box-sizing: border-box; /* Firefox, other Gecko */
- box-sizing: border-box; /* IE 8+ */
-}
diff --git a/src/usr/local/www/themes/_corporate/bottom-loader.js b/src/usr/local/www/themes/_corporate/bottom-loader.js
deleted file mode 100644
index a21f775..0000000
--- a/src/usr/local/www/themes/_corporate/bottom-loader.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//<![CDATA[
-
- NiftyCheck();
- Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
- Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
- Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
- Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
- Rounded("div#topbox","all","#FFF","#990000","smooth");
-
-//]]>
diff --git a/src/usr/local/www/themes/_corporate/graphlink.css b/src/usr/local/www/themes/_corporate/graphlink.css
deleted file mode 100644
index 5bb1b4c..0000000
--- a/src/usr/local/www/themes/_corporate/graphlink.css
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- $Id$
-
- This file is part of the GraphLink software.
- GraphLink is distributed under the MIT License.
- Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
-*******************************************************************************/
-
-/**
- * Defines the background image used for the graph, as well as the actual data
- * locations.
- * Use padding-left and padding-top to align the data area correctly with your
- * background image.
- * Width and height should same as the dimensions of the image, minus the
- * padding values in both directions.
- */
-div.GraphLink {
- width: 212px;
- height: 60px;
- padding-left: 38px;
- padding-top: 10px;
- background-image: url(/themes/corporate/images/misc/graph.png);
- overflow: hidden;
-}
-
-/**
- * Defines the data display area. Modify to fit your background image.
- */
-div.GraphLinkData {
- width: 200px;
- height: 50px;
- overflow: hidden;
-}
-
-/**
- * Defines the look of one bar. Nothing to change here other than the color.
- */
-span.GraphLinkBar {
- background-color: #990000;
- height: 100%;
- float: left;
- overflow: hidden;
-}
diff --git a/src/usr/local/www/themes/_corporate/images/alert_bgr.gif b/src/usr/local/www/themes/_corporate/images/alert_bgr.gif
deleted file mode 100755
index 65498f1..0000000
--- a/src/usr/local/www/themes/_corporate/images/alert_bgr.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/footer.gif b/src/usr/local/www/themes/_corporate/images/footer.gif
deleted file mode 100755
index e516113..0000000
--- a/src/usr/local/www/themes/_corporate/images/footer.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/header.gif b/src/usr/local/www/themes/_corporate/images/header.gif
deleted file mode 100755
index aebc511..0000000
--- a/src/usr/local/www/themes/_corporate/images/header.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/help.png b/src/usr/local/www/themes/_corporate/images/help.png
deleted file mode 100755
index 1de05e3..0000000
--- a/src/usr/local/www/themes/_corporate/images/help.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/horizontal.gif b/src/usr/local/www/themes/_corporate/images/horizontal.gif
deleted file mode 100755
index 4ed7694..0000000
--- a/src/usr/local/www/themes/_corporate/images/horizontal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/favicon.ico b/src/usr/local/www/themes/_corporate/images/icons/favicon.ico
deleted file mode 100644
index 3440bf2..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_3g.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_3g.gif
deleted file mode 100755
index 46ccb92..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_3g.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_3g_inactive.gif
deleted file mode 100755
index cf983e4..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_3g_inactive.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_advanced.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_advanced.gif
deleted file mode 100644
index 3ede1ff..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_advanced.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_advanced_s.gif
deleted file mode 100644
index b233549..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_advanced_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_alert.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_alert.gif
deleted file mode 100755
index 7646941..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_alert.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_host.gif
deleted file mode 100644
index ad43e17..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_host.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_net.gif
deleted file mode 100644
index abd1b8b..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_net.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_port.gif
deleted file mode 100644
index 4acf2aa..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_port.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_url.gif
deleted file mode 100644
index 660571e..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_url.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_url_reload.gif
deleted file mode 100644
index 55c1c4a..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_url_reload.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_block.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_block.gif
deleted file mode 100755
index 670c968..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_block.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_block_add.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_block_add.gif
deleted file mode 100755
index eb726d6..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_block_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_block_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_block_d.gif
deleted file mode 100755
index e6345fe..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_block_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_cablenic.gif
deleted file mode 100755
index a071c66..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_cablenic.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_cal.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_cal.gif
deleted file mode 100755
index a9c7c87..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_cal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_cal_mo.gif
deleted file mode 100755
index 1647e2f..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_cal_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_carp.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_carp.gif
deleted file mode 100755
index 9454a82..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_carp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_carp_d.gif
deleted file mode 100755
index 2ba8db2..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_carp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_chain.png b/src/usr/local/www/themes/_corporate/images/icons/icon_chain.png
deleted file mode 100644
index 12db07a..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_chain.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_check.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_check.gif
deleted file mode 100755
index 393674d..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_check.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_clock_green.gif
deleted file mode 100755
index e171ba8..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_clock_green.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_clock_grey.gif
deleted file mode 100755
index 00c865a..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_clock_grey.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_clock_red.gif
deleted file mode 100755
index 7b412ee..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_clock_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_close.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_close.gif
deleted file mode 100755
index e0f86a7..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_close.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_configure.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_configure.gif
deleted file mode 100755
index 7182e0d..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_configure.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_down.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_down.gif
deleted file mode 100755
index b71a9c5..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_down_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_down_d.gif
deleted file mode 100755
index 70a7473..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_down_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_down_mo.gif
deleted file mode 100755
index 584587a..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_down_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_e.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_e.gif
deleted file mode 100755
index 2950800..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_e.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_e_mo.gif
deleted file mode 100755
index 9ba5738..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_e_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_error.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_error.gif
deleted file mode 100755
index e0fa659..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_error.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_exclam.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_exclam.gif
deleted file mode 100755
index 36c2ec7..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_exclam.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_flag_de.png b/src/usr/local/www/themes/_corporate/images/icons/icon_flag_de.png
deleted file mode 100755
index 069cbbe..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_flag_de.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_flag_en.png b/src/usr/local/www/themes/_corporate/images/icons/icon_flag_en.png
deleted file mode 100755
index bd7f9a5..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_flag_en.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_flag_es.png b/src/usr/local/www/themes/_corporate/images/icons/icon_flag_es.png
deleted file mode 100755
index 434776c..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_flag_es.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/_corporate/images/icons/icon_flag_pt_BR.png
deleted file mode 100755
index f786349..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_flag_pt_BR.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_cert.png
deleted file mode 100755
index 48a34b6..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_cert.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_file.png
deleted file mode 100755
index 48a9ed2..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_file.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_group.png
deleted file mode 100755
index 7d929c0..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_host.png
deleted file mode 100755
index 867ef2c..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_host.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_imp.png
deleted file mode 100755
index f667cfc..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_imp.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_mail.png
deleted file mode 100755
index d2d4548..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_mail.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_pwd.png
deleted file mode 100755
index 06b53a1..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_pwd.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_search.png
deleted file mode 100755
index 33de926..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_search.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_time.png
deleted file mode 100755
index aa8300a..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_time.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_unknown.png
deleted file mode 100755
index 1857d0e..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_unknown.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_url.png
deleted file mode 100755
index cf56792..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_url.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_user.png
deleted file mode 100755
index e00eebe..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_fw-update.gif
deleted file mode 100755
index 52c18ac..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_fw-update.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_help.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_help.gif
deleted file mode 100644
index 84c84db..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_help.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_ifalias.gif
deleted file mode 100644
index 0c569a7..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_ifalias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_ifalias_d.gif
deleted file mode 100644
index faa84d4..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_ifalias_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_import_alias.gif
deleted file mode 100755
index d11a5f0..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_import_alias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_in.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_in_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_info_pkg.gif
deleted file mode 100644
index cd3a532..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_info_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_interface_down.gif
deleted file mode 100755
index 0626655..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_interface_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_interface_up.gif
deleted file mode 100755
index 1449513..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_interface_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_left.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_left.gif
deleted file mode 100755
index 8effefe..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_left_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_left_d.gif
deleted file mode 100755
index c778014..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_left_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_left_mo.gif
deleted file mode 100755
index 84c6fa2..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_left_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_log.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_log.gif
deleted file mode 100755
index 4a1983a..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_log.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_log_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_log_d.gif
deleted file mode 100755
index d31bd9b..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_log_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_log_s.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_log_s.gif
deleted file mode 100755
index f9fda33..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_log_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_log_s_d.gif
deleted file mode 100755
index fb2c05f..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_log_s_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_logs.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_logs.gif
deleted file mode 100644
index afe0104..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_logs.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_match.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_match.gif
deleted file mode 100644
index 215571f..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_match.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_match_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_match_d.gif
deleted file mode 100644
index 6e4c364..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_match_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_minus.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_minus.gif
deleted file mode 100755
index 417544f..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_minus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_open.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_open.gif
deleted file mode 100755
index ac3da14..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_open.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_other.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_other.gif
deleted file mode 100755
index e6f780f..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_other.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_other_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_other_d.gif
deleted file mode 100755
index b08d970..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_other_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_out.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_out_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_parp.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_parp.gif
deleted file mode 100755
index 96acaf3..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_parp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_parp_d.gif
deleted file mode 100755
index 7d7d00e..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_parp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_pass.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_pass.gif
deleted file mode 100755
index fe1bb0d..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_pass.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_pass_add.gif
deleted file mode 100755
index f7f4c20..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_pass_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_pass_d.gif
deleted file mode 100755
index 6adc431..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_pass_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_plus.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_plus.gif
deleted file mode 100755
index 2a94eeb..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_plus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_bl.gif
deleted file mode 100755
index 8dcd7c0..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_bl.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_bl_p.gif
deleted file mode 100755
index 0c79849..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_bl_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_d.gif
deleted file mode 100755
index ebc7457..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_mo.gif
deleted file mode 100755
index 1c7ca08..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_p.gif
deleted file mode 100755
index eb41284..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall.gif
deleted file mode 100755
index d78b867..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_d.gif
deleted file mode 100755
index 13658f7..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_mo.gif
deleted file mode 100755
index 90b576e..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg.gif
deleted file mode 100755
index 9aebb03..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_d.gif
deleted file mode 100755
index 4ab4992..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_mo.gif
deleted file mode 100755
index 7025d20..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml.gif
deleted file mode 100755
index 4542432..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_d.gif
deleted file mode 100755
index 8d3a68d..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_mo.gif
deleted file mode 100755
index 15e0aed..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reject.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reject.gif
deleted file mode 100755
index 5565cd6..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_reject.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reject_d.gif
deleted file mode 100755
index 6c09fae..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_reject_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_right.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_right.gif
deleted file mode 100644
index fdf2d8b..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_restart.gif
deleted file mode 100755
index e49fbd7..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_service_restart.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_restart_d.gif
deleted file mode 100755
index a5d6d7c..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_service_restart_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_running.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_running.gif
deleted file mode 100644
index 543fd56..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_service_running.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_start.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_start.gif
deleted file mode 100755
index 09bb58f..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_service_start.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_start_d.gif
deleted file mode 100755
index f58f111..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_service_start_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_status.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_status.gif
deleted file mode 100644
index a93bcfb..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_service_status.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_stop.gif
deleted file mode 100755
index 922addc..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_service_stop.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_stop_d.gif
deleted file mode 100755
index b4cfdea..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_service_stop_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_stopped.gif
deleted file mode 100644
index f93a25d..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_service_stopped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_services_restart_mo.gif
deleted file mode 100755
index a092b40..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_services_restart_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_services_start_mo.gif
deleted file mode 100755
index ecdb58f..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_services_start_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_services_stop_mo.gif
deleted file mode 100755
index c00e208..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_services_stop_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/_corporate/images/icons/icon_system-group-grey.png
deleted file mode 100644
index d7b964d..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_system-group-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_system-group.png b/src/usr/local/www/themes/_corporate/images/icons/icon_system-group.png
deleted file mode 100644
index 1c974f2..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_system-group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/_corporate/images/icons/icon_system-user-grey.png
deleted file mode 100644
index 2f6047d..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_system-user-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_system-user.png b/src/usr/local/www/themes/_corporate/images/icons/icon_system-user.png
deleted file mode 100644
index ef82156..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_system-user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/_corporate/images/icons/icon_system_lock_screen.png
deleted file mode 100644
index 30f306d..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_system_lock_screen.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_system_logout.png b/src/usr/local/www/themes/_corporate/images/icons/icon_system_logout.png
deleted file mode 100755
index 9bbb6c7..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_system_logout.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_trapped.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_trapped.gif
deleted file mode 100755
index ffeb2cd..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_trapped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_trapped_p.gif
deleted file mode 100755
index 6d46aaf..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_trapped_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_ts_rule.gif
deleted file mode 100755
index e15ab6c..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_ts_rule.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_ts_rule_d.gif
deleted file mode 100755
index f776281..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_ts_rule_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_up.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_up.gif
deleted file mode 100755
index 883c5a2..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_up_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_up_d.gif
deleted file mode 100755
index 0ddcce2..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_up_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_up_mo.gif
deleted file mode 100755
index 9f869a4..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_up_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_wlan.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_wlan.gif
deleted file mode 100755
index 1f0addc..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_wlan.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_wlan_d.gif
deleted file mode 100755
index 35bf580..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_wlan_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_wol_all.gif
deleted file mode 100755
index 2d22182..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_wol_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/_corporate/images/icons/icon_wzd_nsaved.png
deleted file mode 100644
index 21cb27d..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_wzd_nsaved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/_corporate/images/icons/icon_wzd_saved.png
deleted file mode 100644
index ab82946..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_wzd_saved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_x.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_x.gif
deleted file mode 100755
index 24e4d49..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_x_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_x_d.gif
deleted file mode 100755
index d2bfbc8..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_x_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_x_mo.gif
deleted file mode 100755
index da7b57c..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_x_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_x_p.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_x_p.gif
deleted file mode 100755
index 8828fa6..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/icon_x_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/in.gif b/src/usr/local/www/themes/_corporate/images/icons/in.gif
deleted file mode 100644
index f1da771..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/in_d.gif b/src/usr/local/www/themes/_corporate/images/icons/in_d.gif
deleted file mode 100644
index 18e26be..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/out.gif b/src/usr/local/www/themes/_corporate/images/icons/out.gif
deleted file mode 100644
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/out_d.gif b/src/usr/local/www/themes/_corporate/images/icons/out_d.gif
deleted file mode 100644
index 879f1da..0000000
--- a/src/usr/local/www/themes/_corporate/images/icons/out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/log.png b/src/usr/local/www/themes/_corporate/images/log.png
deleted file mode 100755
index 762ba80..0000000
--- a/src/usr/local/www/themes/_corporate/images/log.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/logo.gif b/src/usr/local/www/themes/_corporate/images/logo.gif
deleted file mode 100755
index 08638ff..0000000
--- a/src/usr/local/www/themes/_corporate/images/logo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/menu_down.gif b/src/usr/local/www/themes/_corporate/images/menu_down.gif
deleted file mode 100755
index 137de8d..0000000
--- a/src/usr/local/www/themes/_corporate/images/menu_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/menu_footer.gif b/src/usr/local/www/themes/_corporate/images/menu_footer.gif
deleted file mode 100755
index d06faa4..0000000
--- a/src/usr/local/www/themes/_corporate/images/menu_footer.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/menu_right.gif b/src/usr/local/www/themes/_corporate/images/menu_right.gif
deleted file mode 100755
index 881327c..0000000
--- a/src/usr/local/www/themes/_corporate/images/menu_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/metal_bgr.gif b/src/usr/local/www/themes/_corporate/images/metal_bgr.gif
deleted file mode 100755
index a0ca6c8..0000000
--- a/src/usr/local/www/themes/_corporate/images/metal_bgr.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/metal_bgr_red.gif b/src/usr/local/www/themes/_corporate/images/metal_bgr_red.gif
deleted file mode 100755
index c4a1465..0000000
--- a/src/usr/local/www/themes/_corporate/images/metal_bgr_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/bar_blue.gif b/src/usr/local/www/themes/_corporate/images/misc/bar_blue.gif
deleted file mode 100755
index 953cde1..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/bar_blue.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/bar_gray.gif b/src/usr/local/www/themes/_corporate/images/misc/bar_gray.gif
deleted file mode 100755
index a82da78..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/bar_gray.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/bar_left.gif b/src/usr/local/www/themes/_corporate/images/misc/bar_left.gif
deleted file mode 100755
index ea98cec..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/bar_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/bar_right.gif b/src/usr/local/www/themes/_corporate/images/misc/bar_right.gif
deleted file mode 100755
index b5114b0..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/bar_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/_corporate/images/misc/bullet_toggle_minus.png
deleted file mode 100755
index 37db2fd..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/bullet_toggle_minus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/_corporate/images/misc/bullet_toggle_plus.png
deleted file mode 100755
index fba7af9..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/bullet_toggle_plus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/button.gif b/src/usr/local/www/themes/_corporate/images/misc/button.gif
deleted file mode 100755
index e85dbb3..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/button.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/key_128.gif b/src/usr/local/www/themes/_corporate/images/misc/key_128.gif
deleted file mode 100755
index ea5ae34..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/key_128.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/key_152.gif b/src/usr/local/www/themes/_corporate/images/misc/key_152.gif
deleted file mode 100755
index 6c7fc03..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/key_152.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/key_256.gif b/src/usr/local/www/themes/_corporate/images/misc/key_256.gif
deleted file mode 100755
index 3e1c377..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/key_256.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/key_64.gif b/src/usr/local/www/themes/_corporate/images/misc/key_64.gif
deleted file mode 100755
index 87892bd..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/key_64.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/left_background.gif b/src/usr/local/www/themes/_corporate/images/misc/left_background.gif
deleted file mode 100755
index 529d827..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/left_background.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/loader.gif b/src/usr/local/www/themes/_corporate/images/misc/loader.gif
deleted file mode 100755
index 5d10ac3..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/loader_tab.gif b/src/usr/local/www/themes/_corporate/images/misc/loader_tab.gif
deleted file mode 100755
index 05bb04c..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/loader_tab.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/logon.png b/src/usr/local/www/themes/_corporate/images/misc/logon.png
deleted file mode 100755
index baf8a9d..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/logon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_0.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_0.gif
deleted file mode 100755
index 160b56d..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/plogo_0.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_1.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_1.gif
deleted file mode 100755
index 50342d6..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/plogo_1.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_10.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_10.gif
deleted file mode 100755
index 06cba14..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/plogo_10.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_2.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_2.gif
deleted file mode 100755
index 9d10230..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/plogo_2.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_3.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_3.gif
deleted file mode 100755
index 1983f87..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/plogo_3.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_4.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_4.gif
deleted file mode 100755
index f7158bd..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/plogo_4.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_5.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_5.gif
deleted file mode 100755
index c7af593..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/plogo_5.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_6.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_6.gif
deleted file mode 100755
index 310eb22..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/plogo_6.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_7.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_7.gif
deleted file mode 100755
index 06bd2e8..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/plogo_7.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_8.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_8.gif
deleted file mode 100755
index c6ef564..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/plogo_8.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_9.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_9.gif
deleted file mode 100755
index 4f0cd4d..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/plogo_9.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/progress_bar.gif b/src/usr/local/www/themes/_corporate/images/misc/progress_bar.gif
deleted file mode 100755
index 3b4aa52..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/progress_bar.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/tri_c.gif b/src/usr/local/www/themes/_corporate/images/misc/tri_c.gif
deleted file mode 100755
index 317b758..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/tri_c.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/tri_c_black.gif b/src/usr/local/www/themes/_corporate/images/misc/tri_c_black.gif
deleted file mode 100755
index 309846e..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/tri_c_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/tri_o.gif b/src/usr/local/www/themes/_corporate/images/misc/tri_o.gif
deleted file mode 100755
index eb95c32..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/tri_o.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/tri_o_black.gif b/src/usr/local/www/themes/_corporate/images/misc/tri_o_black.gif
deleted file mode 100755
index f818f3b..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/tri_o_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/widget_loader.gif b/src/usr/local/www/themes/_corporate/images/misc/widget_loader.gif
deleted file mode 100755
index fad101f..0000000
--- a/src/usr/local/www/themes/_corporate/images/misc/widget_loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/new_tab_menu.png b/src/usr/local/www/themes/_corporate/images/new_tab_menu.png
deleted file mode 100755
index 4bdfcef..0000000
--- a/src/usr/local/www/themes/_corporate/images/new_tab_menu.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/status.png b/src/usr/local/www/themes/_corporate/images/status.png
deleted file mode 100755
index a3e368e..0000000
--- a/src/usr/local/www/themes/_corporate/images/status.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/transparent.gif b/src/usr/local/www/themes/_corporate/images/transparent.gif
deleted file mode 100755
index 89c5530..0000000
--- a/src/usr/local/www/themes/_corporate/images/transparent.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/transparent_pixel.gif b/src/usr/local/www/themes/_corporate/images/transparent_pixel.gif
deleted file mode 100755
index 35d42e8..0000000
--- a/src/usr/local/www/themes/_corporate/images/transparent_pixel.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/blank.gif b/src/usr/local/www/themes/_corporate/javascript/ie7/blank.gif
deleted file mode 100755
index a4fe2e6..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/blank.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-box-model.js
deleted file mode 100644
index 45543f6..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-box-model.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-core.js
deleted file mode 100644
index b11e2b1..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-core.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css-strict.js
deleted file mode 100644
index 4406d7a..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css-strict.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css2.js
deleted file mode 100644
index 7121c8e..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css2.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css3.js
deleted file mode 100644
index 86b24f5..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css3.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-fixed.js
deleted file mode 100644
index 4321cda..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-fixed.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-html4.js
deleted file mode 100644
index 4d2baa9..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-html4.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-ie5.js
deleted file mode 100644
index 707fa56..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-ie5.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite-p.js
deleted file mode 100644
index 3a66d19..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite.js
deleted file mode 100644
index 88c764f..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-png.js
deleted file mode 100644
index 7b8f2cf..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-png.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-server.css
deleted file mode 100644
index 47c7edd..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-server.css
+++ /dev/null
@@ -1,43 +0,0 @@
-body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
-body {margin: 8px; background: #333;}
-h1 {margin: 0;}
-h1 a:hover {background-color: transparent;}
-h2 {font-size: 1.75em;}
-h3 {font-size: 1.1em;}
-a:active {color: #ff0000;}
-a:link {color: #0a6cce;}
-a:visited {color: #0a6cce;}
-code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
- padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
-code.box {display: block; padding: 10px; margin: 0.5em 0;}
-ul {list-style-type: square;}
-dd {margin: .2em 0 .5em 1em;}
-dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
-dl.library dd {font-style: italic; margin-left: 3em;}
-dt {font-weight: bold;}
-dt.pack {color: brown;}
-a img {border-style: none;}
-hr {height: 1px; color: #000; border-style: solid;}
-hr.short {height: 2px; width: 100px;}
-div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
-hr {border-bottom-width: 0px;}
-div.header hr {color: #0a6cce; background-color: #0a6cce;}
-div.content {min-height: 100px;}
-div.footer hr {color: #898e79; background-color: #898e79; }
-div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
-a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
-div.footer a:hover {background-color: transparent; text-decoration: none;}
-div.header .menu {text-align: right;}
-div.footer {font-size: x-small; margin-top: 8px;}
-div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
-#license {margin-top: 5px; font-size: xx-small;}
-table {border-top: 1px solid #000; border-left: 1px solid #000;}
-th {background-color: #fff; text-align: left;}
-th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
-th.small {width: 100px;}
-th.medium {width: 200px;}
-th.large {width: 270px;}
-th.x-large {width: 408px;}
-table.fixed {table-layout: fixed;}
-span.comment {color: #666;}
-
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard-p.js
deleted file mode 100644
index 73e99ac..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard.js
deleted file mode 100644
index 2109905..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/test-trans.png b/src/usr/local/www/themes/_corporate/javascript/ie7/test-trans.png
deleted file mode 100755
index e187e2c..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/ie7/test-trans.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/javascript/niftyjsCode.js b/src/usr/local/www/themes/_corporate/javascript/niftyjsCode.js
deleted file mode 100644
index 75ef8b0..0000000
--- a/src/usr/local/www/themes/_corporate/javascript/niftyjsCode.js
+++ /dev/null
@@ -1,174 +0,0 @@
-function NiftyCheck(){
-if(!document.getElementById || !document.createElement)
- return(false);
-isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
-if(Array.prototype.push==null){Array.prototype.push=function(){
- this[this.length]=arguments[0]; return(this.length);};}
-return(true);
-}
-
-function Rounded(selector,wich,bk,color,opt){
-var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
-
-if(color=="transparent"){
- cn=cn+"x";
- ecolor=bk;
- bk="transparent";
- }
-else if(opt && opt.indexOf("border")>=0){
- var optar=opt.split(" ");
- for(i=0;i<optar.length;i++)
- if(optar[i].indexOf("#")>=0) ecolor=optar[i];
- if(ecolor=="") ecolor="#666";
- cn+="e";
- edges=true;
- }
-else if(opt && opt.indexOf("smooth")>=0){
- cn+="a";
- ecolor=Mix(bk,color);
- }
-if(opt && opt.indexOf("small")>=0) cn+="s";
-prefixt=cn;
-prefixb=cn;
-if(wich.indexOf("all")>=0){t=true;b=true;}
-else if(wich.indexOf("top")>=0) t="true";
-else if(wich.indexOf("tl")>=0){
- t="true";
- if(wich.indexOf("tr")<0) prefixt+="l";
- }
-else if(wich.indexOf("tr")>=0){
- t="true";
- prefixt+="r";
- }
-if(wich.indexOf("bottom")>=0) b=true;
-else if(wich.indexOf("bl")>=0){
- b="true";
- if(wich.indexOf("br")<0) prefixb+="l";
- }
-else if(wich.indexOf("br")>=0){
- b="true";
- prefixb+="r";
- }
-var v=getElementsBySelector(selector);
-var l=v.length;
-for(i=0;i<l;i++){
- if(edges) AddBorder(v[i],ecolor);
- if(t) AddTop(v[i],bk,color,ecolor,prefixt);
- if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
- }
-}
-
-function AddBorder(el,bc){
-var i;
-if(!el.passed){
- if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
- var t=el.firstChild.nodeValue;
- el.removeChild(el.lastChild);
- var d=CreateEl("span");
- d.style.display="block";
- d.appendChild(document.createTextNode(t));
- el.appendChild(d);
- }
- for(i=0;i<el.childNodes.length;i++){
- if(el.childNodes[i].nodeType==1){
- el.childNodes[i].style.borderLeft="1px solid "+bc;
- el.childNodes[i].style.borderRight="1px solid "+bc;
- }
- }
- }
-el.passed=true;
-}
-
-function AddTop(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=1;i<=lim;i++){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingTop=0;
-el.insertBefore(d,el.firstChild);
-}
-
-function AddBottom(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=lim;i>0;i--){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingBottom=0;
-el.appendChild(d);
-}
-
-function CreateEl(x){
-if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
-else return(document.createElement(x));
-}
-
-function getElementsBySelector(selector){
-var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
-
-if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
- s=selector.split(" ");
- var fs=s[0].split("#");
- if(fs.length==1) return(objlist);
- f=document.getElementById(fs[1]);
- if(f) return(f.getElementsByTagName(s[1]));
- return(objlist);
- }
-if(selector.indexOf("#")>0){ //id selector like "tag#id"
- s=selector.split("#");
- tag=s[0];
- selid=s[1];
- }
-if(selid!=""){
- f=document.getElementById(selid);
- if(f) objlist.push(f);
- return(objlist);
- }
-if(selector.indexOf(".")>0){ //class selector like "tag.class"
- s=selector.split(".");
- tag=s[0];
- selclass=s[1];
- }
-var v=document.getElementsByTagName(tag); // tag selector like "tag"
-if(selclass=="")
- return(v);
-for(i=0;i<v.length;i++){
- if(v[i].className.indexOf(selclass)>=0){
- objlist.push(v[i]);
- }
- }
-return(objlist);
-}
-
-function Mix(c1,c2){
-var i,step1,step2,x,y,r=new Array(3);
-if(c1.length==4)step1=1;
-else step1=2;
-if(c2.length==4) step2=1;
-else step2=2;
-for(i=0;i<3;i++){
- x=parseInt(c1.substr(1+step1*i,step1),16);
- if(step1==1) x=16*x+x;
- y=parseInt(c2.substr(1+step2*i,step2),16);
- if(step2==1) y=16*y+y;
- r[i]=Math.floor((x*50+y*50)/100);
- }
-return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/_corporate/loader.js b/src/usr/local/www/themes/_corporate/loader.js
deleted file mode 100644
index 4512d5e..0000000
--- a/src/usr/local/www/themes/_corporate/loader.js
+++ /dev/null
@@ -1,29 +0,0 @@
-//<![CDATA[
-var browser = '';
-var version = '';
-var entrance = '';
-var cond = '';
-
-// BROWSER?
-if (browser == '') {
- if (navigator.appName.indexOf('Microsoft') != -1)
- browser = 'IE';
- else if (navigator.appName.indexOf('Netscape') != -1)
- browser = 'Netscape';
- else
- browser = 'IE';
-}
-if (version == '') {
- version= navigator.appVersion;
- paren = version.indexOf('(');
- whole_version = navigator.appVersion.substring(0,paren-1);
- version = parseInt(whole_version);
-}
-
-if (version < 7) {
- document.write('<script type="text/javascript" src="/themes/corporate/javascript/ie7/ie7-standard-p.js"></script>');
-}
-
-document.write('<script type="text/javascript" src="/themes/corporate/javascript/niftyjsCode.js"></script>');
-
-//]]>
diff --git a/src/usr/local/www/themes/_corporate/new_tab_menu.css b/src/usr/local/www/themes/_corporate/new_tab_menu.css
deleted file mode 100644
index aae94e3..0000000
--- a/src/usr/local/www/themes/_corporate/new_tab_menu.css
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- new_tab_menu.css
- part of pfSense
- Copyright (C) 2010-2011 Robert Zelaya
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
-
- Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
- The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
-
- <tr>
- <td>
- <?php
- $tab_array_indent = 0; // move to the line in px
- $tab_array_space = 1; // space betwen lines in px
- $tab_array_char_limit = 82; // number or chr before the drop down box
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
-
-*/
-
-.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
-
-.newtabmenu li{float:left; margin-right:2px; text-align: center;}
-.newtabmenu a:link, .newtabmenu a:visited{
- background:url(imagesimages/new_tab_menu.png) right 45px;
- color:#ffffff; /* noactive font */
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- font-weight:bold;
- font-size:.9em;
- height:20px;
- line-height:20px;
- text-decoration:none;
-}
-.newtabmenu a span{
- background:url(images/new_tab_menu.png) left 45px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- height:20px;
- margin-right:7px;
- padding-left:7px;
-}
-.newtabmenu a:hover{
- background:url(images/new_tab_menu.png) right 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- color:#ffffff; /* hover over font */
-}
-.newtabmenu a:hover span{
- background:url(images/new_tab_menu.png) left 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
-}
-
-/* -------------------------------- */
-/* ACTIVE ELEMENTS */
-.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
- color:#000000; /* active font */
- background:url(images/new_tab_menu.png) right 0 no-repeat;
-}
-.newtabmenu_active a span, .newtabmenu_active a:hover span{
- background:url(images/new_tab_menu.png) left 0 no-repeat;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/_corporate/new_tab_menu.png b/src/usr/local/www/themes/_corporate/new_tab_menu.png
deleted file mode 100755
index 4bdfcef..0000000
--- a/src/usr/local/www/themes/_corporate/new_tab_menu.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/rrdcolors.inc.php b/src/usr/local/www/themes/_corporate/rrdcolors.inc.php
deleted file mode 100644
index dcb7a39..0000000
--- a/src/usr/local/www/themes/_corporate/rrdcolors.inc.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/* $Id$ */
-/*
- rrdcolors.inc.php
- Part of pfSense
- Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/* This file is included by the RRD graphing page and sets the colors */
-
-/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* 95th Percentile Lines Out, In */
-$colortraffic95 = array('660000', 'FF0000');
-
-/* State Table pfrate, pfstates, pfnat, srcip, dstip */
-$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
-
-/* Processor Usage user, nice, system, int, processes */
-$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
-
-/* Memory Usage active, inact, free, cache, wire */
-$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
-
-/* MBUF Usage current, cache, total, max */
-$colormbuf = array('0080FF','00E344','FF0000','000000');
-
-/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
-$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
-$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
-/* Quality Graph Loss */
-$colorqualityloss = 'ee0000';
-
-/* Wireless Graph SNR, Rate, Channel*/
-/* Cellular Graph RSSI, */
-$colorwireless = array('333333','a83c3c','999999');
-
-/* SPAMD Times min area, avg area, max area, Time line */
-$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
-/* SPAMD Connections max area, min area, min line, max line, avg line */
-$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
-
-/* OpenVPN Users Online Users */
-$colorvpnusers = array('990000');
-
-/* Captive Portal Total Users Total Users */
-/* Captive Portal Concurrent Concurrent Users */
-$colorcaptiveportalusers = array('990000');
-
-?>
diff --git a/src/usr/local/www/themes/_corporate/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/_corporate/styles/jquery-ui-1.11.1.css
deleted file mode 100644
index 8a8c54f..0000000
--- a/src/usr/local/www/themes/_corporate/styles/jquery-ui-1.11.1.css
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*! jQuery UI - v1.11.1 - 2014-09-22
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.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:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-clearfix {
- min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* 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: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.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: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- 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;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- min-height: 0; /* support: IE7 */
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
- position: absolute;
- left: .5em;
- top: 50%;
- margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-button {
- display: inline-block;
- position: relative;
- padding: 0;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
- width: 2.4em;
-}
-.ui-button-icons-only {
- width: 3.4em;
-}
-button.ui-button-icons-only {
- width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
- display: block;
- line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
- padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
- padding: .4em;
- text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
- padding-left: 2.1em;
- padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
- padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
- position: absolute;
- top: 50%;
- margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
- left: 50%;
- margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
- left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
- right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
- margin-right: 7px;
-}
-.ui-buttonset .ui-button {
- margin-left: 0;
- margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.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 {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.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,
-.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%;
- font-size: 0;
-}
-
-/* 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,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-.ui-dialog {
- overflow: hidden;
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
- width: 12px;
- height: 12px;
- right: -5px;
- bottom: -5px;
- background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: none;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- position: relative;
- margin: 0;
- padding: 3px 1em 3px .4em;
- cursor: pointer;
- min-height: 0; /* support: IE7 */
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-progressbar {
- height: 1em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
- background-color: #990000;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
- height: 100%;
- filter: alpha(opacity=25); /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- /* Support: IE7 */
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-button {
- display: inline-block;
- overflow: hidden;
- position: relative;
- text-decoration: none;
- cursor: pointer;
-}
-.ui-selectmenu-button span.ui-icon {
- right: 0.5em;
- left: auto;
- margin-top: -8px;
- position: absolute;
- top: 50%;
-}
-.ui-selectmenu-button span.ui-selectmenu-text {
- text-align: left;
- padding: 0.4em 2.1em 0.4em 1em;
- display: block;
- line-height: 1.4;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.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;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.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;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 22px;
-}
-.ui-spinner-button {
- width: 16px;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top: none;
- border-bottom: none;
- border-right: none;
-}
-/* vertically center icon */
-.ui-spinner .ui-icon {
- position: absolute;
- margin-top: -8px;
- top: 50%;
- left: 0;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
- /* need to fix icons sprite */
- background-position: -65px -16px;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
- -webkit-box-shadow: 0 0 5px #aaa;
- box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #aaaaaa;
- background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #bbbbbb;
- /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
- color: #444444;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #444444;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #cccccc;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #3383bb;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #3383bb;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #bbbbbb;
- background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #599fcf;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited {
- color: #599fcf;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #999999;
- background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #ffffff;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #ffffff;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
- color: #444444;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #444444;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #c0402a;
- background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
- color: #ffffff;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #ffffff;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #ffffff;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70); /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35); /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-state-default .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-active .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
-}
-.ui-state-highlight .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.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-on { background-position: -96px -144px; }
-.ui-icon-radio-off { 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-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.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-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 6px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
- opacity: .8;
- filter: Alpha(Opacity=80); /* support: IE8 */
-}
-.ui-widget-shadow {
- margin: -4px 0 0 -4px;
- padding: 4px;
- background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
- opacity: .6;
- filter: Alpha(Opacity=60); /* support: IE8 */
- border-radius: 0pxdow;
-}
diff --git a/src/usr/local/www/themes/code-red/all.css b/src/usr/local/www/themes/code-red/all.css
deleted file mode 100644
index c26ec3d..0000000
--- a/src/usr/local/www/themes/code-red/all.css
+++ /dev/null
@@ -1,1301 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, sans-serif;
- font-size: 0.9em;
-
-}
-
-.nowrap { white-space: nowrap; }
-
-.addgatewaybox {
- background-color: #990000;
- border-style: none none none none;
- width: 225px;
-}
-
-.infobox {
- width:100%;
-}
-
-.infoboxsave {
- padding-right: 10px;
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-.inputerrorsleft {
- background-color: #990000;
- width: 36px;
-}
-
-.inputerrorsright {
- background-color: #FFD9D1;
- color: #000000;
- font-size: 11px;
- padding-left: 8px;
- padding-top: 6px;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 220px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 11px;
- font-family: "Trebuchet MS", sans-serif;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- background: url('images/background.gif') no-repeat;
- background-position : center 0px;
- background-color: #4a0203;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 29px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 22px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 15px;
- left: 210px;
- font-size: 14px;
- color: #990000;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #990000;
- text-align: right;
- padding-right: 18px;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -5px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 82px;
- color: #999999;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- position: relative;
- top: -35px;
- left: 3px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- width: 80px;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- /* top: 2em;
- left: -2px; */
- width: 120px;
- font-weight: normal;
- /* background: transparent bottom left no-repeat; */
- /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020; */
- /* background: url("images/menubgr_footer.png") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 5px;
- padding-bottom: 10px;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 0px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
-/* background-color: #990000; */
- background: url(images/menubgr.png) repeat-y;
- z-index: 2;
-/* color: #FFF; */
-}
-#navigation ul li ul li:hover {
-/* background-color: #666666; */
- background-image: url(images/menubgr_highlight.png);
- background-repeat: repeat-y;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 5px;
- margin-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 10;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-
-#graph {
- position: relative;
- z-index: 10;
-}
-
-
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #999999;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listrborder {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-left: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- color: #FFFFFF;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #DDDDDD;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 6px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password, #password2 {
- font-size: small;
- width: 60%;
- padding-left: 19px;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-/* Widget CSS */
-.widgetsubheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #B1B1B1;
- padding-right: 6px;
- padding-left: 6px;
- color: #000000;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetdiv{
- margin:5px;
- padding: 5px;
- background:#CCCCCC;
-}
-.widgetconfigdiv{
- background:#BBBBBB;
- font-size: 11px;
- color: #000000;
- padding-right: 5px;
- padding-left: 5px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-div#log div.log-entry-mini {
- clear: both;
-}
-
-div#log div.log-entry-mini span {
- padding: 2px 2px 2px 2px;
- padding-left: 6px;
-}
-
-div#log span.log-action-mini-header,
-div#log span.log-time-mini-header,
-div#log span.log-interface-mini-header,
-div#log span.log-source-mini-header,
-div#log span.log-destination-mini-header,
-div#log span.log-protocol-mini-header {
- float: left;
- text-align: left;
- background-color: #B1B1B1;
- font-size: 12px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-time-mini,
-div#log span.log-interface-mini,
-div#log span.log-source-mini,
-div#log span.log-destination-mini,
-div#log span.log-protocol-mini {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 11px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-action-mini-header {
- width: 6%;
-}
-
-div#log span.log-time-mini,
-div#log span.log-time-mini-header {
- width: 19%;
-}
-
-div#log span.log-interface-mini,
-div#log span.log-interface-mini-header {
- width: 8%;
-}
-
-div#log span.log-source-mini,
-div#log span.log-source-mini-header {
- width: 23%;
-}
-
-div#log span.log-destination-mini,
-div#log span.log-destination-mini-header {
- width: 31%;
-}
-
-div#log span.log-protocol-mini,
-div#log span.log-protocol-mini-header {
- width: 8%;
- border-right: 1px solid #999;
-}
-
-/* Sortable tables */
-table.sortable thead {
- background-color:#eee;
- color:#666666;
- font-weight: bold;
- cursor: default;
-}
-
-/*thermal_sensors widget styles*/
-
-.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
-.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
-.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
- background-color: LimeGreen;
- border-top-width: 2px; border-top-color: Lime;
- border-left-width: 0px;
- border-right-width: 0px;
- border-bottom-width: 2px; border-bottom-color: Green;
-}
-.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
-.thermalSensorText { float: left; height: 20px; top: 3px; }
-.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
-
-.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-
-.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
-
-.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
-
-/* widget textarea styles - full width */
-.textarea_widget {
- width: 100%;
- resize:vertical;
- -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
- -moz-box-sizing: border-box; /* Firefox, other Gecko */
- box-sizing: border-box; /* IE 8+ */
-}
diff --git a/src/usr/local/www/themes/code-red/bottom-loader.js b/src/usr/local/www/themes/code-red/bottom-loader.js
deleted file mode 100755
index a21f775..0000000
--- a/src/usr/local/www/themes/code-red/bottom-loader.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//<![CDATA[
-
- NiftyCheck();
- Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
- Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
- Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
- Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
- Rounded("div#topbox","all","#FFF","#990000","smooth");
-
-//]]>
diff --git a/src/usr/local/www/themes/code-red/favicon.ico b/src/usr/local/www/themes/code-red/favicon.ico
deleted file mode 100755
index 3440bf2..0000000
--- a/src/usr/local/www/themes/code-red/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/graphlink.css b/src/usr/local/www/themes/code-red/graphlink.css
deleted file mode 100755
index 13f65f0..0000000
--- a/src/usr/local/www/themes/code-red/graphlink.css
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- $Id$
-
- This file is part of the GraphLink software.
- GraphLink is distributed under the MIT License.
- Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
-*******************************************************************************/
-
-/**
- * Defines the background image used for the graph, as well as the actual data
- * locations.
- * Use padding-left and padding-top to align the data area correctly with your
- * background image.
- * Width and height should same as the dimensions of the image, minus the
- * padding values in both directions.
- */
-div.GraphLink {
- width: 212px;
- height: 60px;
- padding-left: 38px;
- padding-top: 10px;
- background-image: url(/themes/nervecenter/images/misc/graph.png);
- overflow: hidden;
-}
-
-/**
- * Defines the data display area. Modify to fit your background image.
- */
-div.GraphLinkData {
- width: 200px;
- height: 50px;
- overflow: hidden;
-}
-
-/**
- * Defines the look of one bar. Nothing to change here other than the color.
- */
-span.GraphLinkBar {
- background-color: #990000;
- height: 100%;
- float: left;
- overflow: hidden;
-}
diff --git a/src/usr/local/www/themes/code-red/images/alert_bgr.png b/src/usr/local/www/themes/code-red/images/alert_bgr.png
deleted file mode 100755
index f84afd4..0000000
--- a/src/usr/local/www/themes/code-red/images/alert_bgr.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/background.gif b/src/usr/local/www/themes/code-red/images/background.gif
deleted file mode 100755
index 3f0dc77..0000000
--- a/src/usr/local/www/themes/code-red/images/background.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/background.png b/src/usr/local/www/themes/code-red/images/background.png
deleted file mode 100755
index e68893d..0000000
--- a/src/usr/local/www/themes/code-red/images/background.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/button_left.gif b/src/usr/local/www/themes/code-red/images/button_left.gif
deleted file mode 100755
index 2e46d25..0000000
--- a/src/usr/local/www/themes/code-red/images/button_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/button_mid.gif b/src/usr/local/www/themes/code-red/images/button_mid.gif
deleted file mode 100755
index 4198d93..0000000
--- a/src/usr/local/www/themes/code-red/images/button_mid.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/button_right.gif b/src/usr/local/www/themes/code-red/images/button_right.gif
deleted file mode 100755
index 0faaa67..0000000
--- a/src/usr/local/www/themes/code-red/images/button_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/footer.png b/src/usr/local/www/themes/code-red/images/footer.png
deleted file mode 100755
index e609b9d..0000000
--- a/src/usr/local/www/themes/code-red/images/footer.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/header.png b/src/usr/local/www/themes/code-red/images/header.png
deleted file mode 100755
index 4525e61..0000000
--- a/src/usr/local/www/themes/code-red/images/header.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/help.png b/src/usr/local/www/themes/code-red/images/help.png
deleted file mode 100755
index 1de05e3..0000000
--- a/src/usr/local/www/themes/code-red/images/help.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/horizontal.gif b/src/usr/local/www/themes/code-red/images/horizontal.gif
deleted file mode 100755
index a280dcb..0000000
--- a/src/usr/local/www/themes/code-red/images/horizontal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/favicon.ico b/src/usr/local/www/themes/code-red/images/icons/favicon.ico
deleted file mode 100755
index 3440bf2..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_3g.gif b/src/usr/local/www/themes/code-red/images/icons/icon_3g.gif
deleted file mode 100755
index 46ccb92..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_3g.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/code-red/images/icons/icon_3g_inactive.gif
deleted file mode 100755
index cf983e4..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_3g_inactive.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_advanced.gif b/src/usr/local/www/themes/code-red/images/icons/icon_advanced.gif
deleted file mode 100644
index 3ede1ff..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_advanced.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/code-red/images/icons/icon_advanced_s.gif
deleted file mode 100644
index b233549..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_advanced_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_alert.gif b/src/usr/local/www/themes/code-red/images/icons/icon_alert.gif
deleted file mode 100755
index 7646941..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_alert.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/code-red/images/icons/icon_alias_host.gif
deleted file mode 100755
index ad43e17..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_alias_host.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/code-red/images/icons/icon_alias_net.gif
deleted file mode 100755
index abd1b8b..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_alias_net.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/code-red/images/icons/icon_alias_port.gif
deleted file mode 100755
index 4acf2aa..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_alias_port.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/code-red/images/icons/icon_alias_url.gif
deleted file mode 100755
index 660571e..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_alias_url.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/code-red/images/icons/icon_alias_url_reload.gif
deleted file mode 100755
index 55c1c4a..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_alias_url_reload.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_block.gif b/src/usr/local/www/themes/code-red/images/icons/icon_block.gif
deleted file mode 100755
index 670c968..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_block.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_block_add.gif b/src/usr/local/www/themes/code-red/images/icons/icon_block_add.gif
deleted file mode 100755
index eb726d6..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_block_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_block_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_block_d.gif
deleted file mode 100755
index e6345fe..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_block_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/code-red/images/icons/icon_cablenic.gif
deleted file mode 100755
index 9173058..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_cablenic.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_cal.gif b/src/usr/local/www/themes/code-red/images/icons/icon_cal.gif
deleted file mode 100755
index a9c7c87..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_cal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_cal_mo.gif
deleted file mode 100755
index 1647e2f..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_cal_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_carp.gif b/src/usr/local/www/themes/code-red/images/icons/icon_carp.gif
deleted file mode 100755
index 9454a82..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_carp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_carp_d.gif
deleted file mode 100755
index 2ba8db2..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_carp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_chain.png b/src/usr/local/www/themes/code-red/images/icons/icon_chain.png
deleted file mode 100644
index 12db07a..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_chain.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_check.gif b/src/usr/local/www/themes/code-red/images/icons/icon_check.gif
deleted file mode 100755
index 393674d..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_check.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/code-red/images/icons/icon_clock_green.gif
deleted file mode 100755
index e171ba8..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_clock_green.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/code-red/images/icons/icon_clock_grey.gif
deleted file mode 100755
index 00c865a..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_clock_grey.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/code-red/images/icons/icon_clock_red.gif
deleted file mode 100755
index 7b412ee..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_clock_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_close.gif b/src/usr/local/www/themes/code-red/images/icons/icon_close.gif
deleted file mode 100755
index e0f86a7..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_close.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_configure.gif b/src/usr/local/www/themes/code-red/images/icons/icon_configure.gif
deleted file mode 100755
index 7182e0d..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_configure.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_down.gif b/src/usr/local/www/themes/code-red/images/icons/icon_down.gif
deleted file mode 100755
index b71a9c5..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_down_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_down_d.gif
deleted file mode 100755
index 70a7473..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_down_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_down_mo.gif
deleted file mode 100755
index 584587a..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_down_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_e.gif b/src/usr/local/www/themes/code-red/images/icons/icon_e.gif
deleted file mode 100755
index 2950800..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_e.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_e_mo.gif
deleted file mode 100755
index 9ba5738..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_e_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_error.gif b/src/usr/local/www/themes/code-red/images/icons/icon_error.gif
deleted file mode 100755
index e0fa659..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_error.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_exclam.gif b/src/usr/local/www/themes/code-red/images/icons/icon_exclam.gif
deleted file mode 100755
index 36c2ec7..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_exclam.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_flag_de.png b/src/usr/local/www/themes/code-red/images/icons/icon_flag_de.png
deleted file mode 100755
index 069cbbe..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_flag_de.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_flag_en.png b/src/usr/local/www/themes/code-red/images/icons/icon_flag_en.png
deleted file mode 100755
index bd7f9a5..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_flag_en.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_flag_es.png b/src/usr/local/www/themes/code-red/images/icons/icon_flag_es.png
deleted file mode 100755
index 434776c..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_flag_es.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/code-red/images/icons/icon_flag_pt_BR.png
deleted file mode 100755
index f786349..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_flag_pt_BR.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_cert.png
deleted file mode 100755
index 48a34b6..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_cert.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_file.png
deleted file mode 100755
index 48a9ed2..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_file.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_group.png
deleted file mode 100755
index 7d929c0..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_host.png
deleted file mode 100755
index 867ef2c..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_host.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_imp.png
deleted file mode 100755
index f667cfc..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_imp.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_mail.png
deleted file mode 100755
index d2d4548..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_mail.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_pwd.png
deleted file mode 100755
index 06b53a1..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_pwd.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_search.png
deleted file mode 100755
index 33de926..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_search.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_time.png
deleted file mode 100755
index aa8300a..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_time.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_unknown.png
deleted file mode 100755
index 1857d0e..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_unknown.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_url.png
deleted file mode 100755
index cf56792..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_url.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_user.png
deleted file mode 100755
index e00eebe..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/code-red/images/icons/icon_fw-update.gif
deleted file mode 100755
index 52c18ac..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_fw-update.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_help.gif b/src/usr/local/www/themes/code-red/images/icons/icon_help.gif
deleted file mode 100644
index 84c84db..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_help.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/code-red/images/icons/icon_ifalias.gif
deleted file mode 100755
index 0c569a7..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_ifalias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_ifalias_d.gif
deleted file mode 100755
index faa84d4..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_ifalias_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/code-red/images/icons/icon_import_alias.gif
deleted file mode 100755
index d11a5f0..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_import_alias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_in.gif b/src/usr/local/www/themes/code-red/images/icons/icon_in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_in_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/code-red/images/icons/icon_info_pkg.gif
deleted file mode 100755
index cd3a532..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_info_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/code-red/images/icons/icon_interface_down.gif
deleted file mode 100755
index 0626655..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_interface_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/code-red/images/icons/icon_interface_up.gif
deleted file mode 100755
index 1449513..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_interface_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_left.gif b/src/usr/local/www/themes/code-red/images/icons/icon_left.gif
deleted file mode 100755
index 8effefe..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_left_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_left_d.gif
deleted file mode 100755
index c778014..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_left_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_left_mo.gif
deleted file mode 100755
index 84c6fa2..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_left_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_log.gif b/src/usr/local/www/themes/code-red/images/icons/icon_log.gif
deleted file mode 100755
index 4a1983a..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_log.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_log_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_log_d.gif
deleted file mode 100755
index d31bd9b..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_log_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_log_s.gif b/src/usr/local/www/themes/code-red/images/icons/icon_log_s.gif
deleted file mode 100755
index f9fda33..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_log_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_log_s_d.gif
deleted file mode 100755
index fb2c05f..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_log_s_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_logs.gif b/src/usr/local/www/themes/code-red/images/icons/icon_logs.gif
deleted file mode 100644
index afe0104..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_logs.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_match.gif b/src/usr/local/www/themes/code-red/images/icons/icon_match.gif
deleted file mode 100644
index 215571f..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_match.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_match_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_match_d.gif
deleted file mode 100644
index 6e4c364..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_match_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_minus.gif b/src/usr/local/www/themes/code-red/images/icons/icon_minus.gif
deleted file mode 100755
index 417544f..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_minus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_open.gif b/src/usr/local/www/themes/code-red/images/icons/icon_open.gif
deleted file mode 100755
index ac3da14..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_open.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_other.gif b/src/usr/local/www/themes/code-red/images/icons/icon_other.gif
deleted file mode 100755
index e6f780f..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_other.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_other_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_other_d.gif
deleted file mode 100755
index b08d970..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_other_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_out.gif b/src/usr/local/www/themes/code-red/images/icons/icon_out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_out_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_parp.gif b/src/usr/local/www/themes/code-red/images/icons/icon_parp.gif
deleted file mode 100755
index 96acaf3..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_parp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_parp_d.gif
deleted file mode 100755
index 7d7d00e..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_parp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_pass.gif b/src/usr/local/www/themes/code-red/images/icons/icon_pass.gif
deleted file mode 100755
index fe1bb0d..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_pass.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/code-red/images/icons/icon_pass_add.gif
deleted file mode 100755
index f7f4c20..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_pass_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_pass_d.gif
deleted file mode 100755
index 6adc431..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_pass_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_plus.gif b/src/usr/local/www/themes/code-red/images/icons/icon_plus.gif
deleted file mode 100755
index 2a94eeb..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_plus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/code-red/images/icons/icon_plus_bl.gif
deleted file mode 100755
index 8dcd7c0..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_plus_bl.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/code-red/images/icons/icon_plus_bl_p.gif
deleted file mode 100755
index 0c79849..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_plus_bl_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_plus_d.gif
deleted file mode 100755
index ebc7457..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_plus_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_plus_mo.gif
deleted file mode 100755
index 1c7ca08..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_plus_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/code-red/images/icons/icon_plus_p.gif
deleted file mode 100755
index eb41284..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_plus_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall.gif
deleted file mode 100755
index d78b867..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_d.gif
deleted file mode 100755
index 13658f7..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_mo.gif
deleted file mode 100755
index 90b576e..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg.gif
deleted file mode 100755
index 9aebb03..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_d.gif
deleted file mode 100755
index 4ab4992..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_mo.gif
deleted file mode 100755
index 7025d20..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml.gif
deleted file mode 100755
index 4542432..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_d.gif
deleted file mode 100755
index 8d3a68d..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_mo.gif
deleted file mode 100755
index 15e0aed..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reject.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reject.gif
deleted file mode 100755
index 5565cd6..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_reject.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reject_d.gif
deleted file mode 100755
index 6c09fae..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_reject_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_right.gif b/src/usr/local/www/themes/code-red/images/icons/icon_right.gif
deleted file mode 100755
index fdf2d8b..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_restart.gif
deleted file mode 100755
index e49fbd7..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_service_restart.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_restart_d.gif
deleted file mode 100755
index a5d6d7c..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_service_restart_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_running.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_running.gif
deleted file mode 100644
index 543fd56..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_service_running.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_start.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_start.gif
deleted file mode 100755
index 09bb58f..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_service_start.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_start_d.gif
deleted file mode 100755
index f58f111..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_service_start_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_status.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_status.gif
deleted file mode 100644
index a93bcfb..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_service_status.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_stop.gif
deleted file mode 100755
index 922addc..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_service_stop.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_stop_d.gif
deleted file mode 100755
index b4cfdea..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_service_stop_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_stopped.gif
deleted file mode 100644
index f93a25d..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_service_stopped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_services_restart_mo.gif
deleted file mode 100755
index a092b40..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_services_restart_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_services_start_mo.gif
deleted file mode 100755
index ecdb58f..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_services_start_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_services_stop_mo.gif
deleted file mode 100755
index c00e208..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_services_stop_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/code-red/images/icons/icon_system-group-grey.png
deleted file mode 100755
index d7b964d..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_system-group-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_system-group.png b/src/usr/local/www/themes/code-red/images/icons/icon_system-group.png
deleted file mode 100755
index 1c974f2..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_system-group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/code-red/images/icons/icon_system-user-grey.png
deleted file mode 100755
index 2f6047d..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_system-user-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_system-user.png b/src/usr/local/www/themes/code-red/images/icons/icon_system-user.png
deleted file mode 100755
index ef82156..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_system-user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/code-red/images/icons/icon_system_lock_screen.png
deleted file mode 100755
index 30f306d..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_system_lock_screen.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_system_logout.png b/src/usr/local/www/themes/code-red/images/icons/icon_system_logout.png
deleted file mode 100755
index 9bbb6c7..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_system_logout.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_trapped.gif b/src/usr/local/www/themes/code-red/images/icons/icon_trapped.gif
deleted file mode 100755
index ffeb2cd..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_trapped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/code-red/images/icons/icon_trapped_p.gif
deleted file mode 100755
index 6d46aaf..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_trapped_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/code-red/images/icons/icon_ts_rule.gif
deleted file mode 100755
index e15ab6c..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_ts_rule.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_ts_rule_d.gif
deleted file mode 100755
index f776281..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_ts_rule_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_up.gif b/src/usr/local/www/themes/code-red/images/icons/icon_up.gif
deleted file mode 100755
index 883c5a2..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_up_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_up_d.gif
deleted file mode 100755
index 0ddcce2..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_up_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_up_mo.gif
deleted file mode 100755
index 9f869a4..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_up_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_wlan.gif b/src/usr/local/www/themes/code-red/images/icons/icon_wlan.gif
deleted file mode 100755
index 1f0addc..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_wlan.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_wlan_d.gif
deleted file mode 100755
index 35bf580..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_wlan_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/code-red/images/icons/icon_wol_all.gif
deleted file mode 100755
index 2d22182..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_wol_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/code-red/images/icons/icon_wzd_nsaved.png
deleted file mode 100755
index 21cb27d..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_wzd_nsaved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/code-red/images/icons/icon_wzd_saved.png
deleted file mode 100755
index ab82946..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_wzd_saved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_x.gif b/src/usr/local/www/themes/code-red/images/icons/icon_x.gif
deleted file mode 100755
index 24e4d49..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_x_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_x_d.gif
deleted file mode 100755
index d2bfbc8..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_x_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_x_mo.gif
deleted file mode 100755
index da7b57c..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_x_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_x_p.gif b/src/usr/local/www/themes/code-red/images/icons/icon_x_p.gif
deleted file mode 100755
index 8828fa6..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/icon_x_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/in.gif b/src/usr/local/www/themes/code-red/images/icons/in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/in_d.gif b/src/usr/local/www/themes/code-red/images/icons/in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/out.gif b/src/usr/local/www/themes/code-red/images/icons/out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/out_d.gif b/src/usr/local/www/themes/code-red/images/icons/out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/code-red/images/icons/out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/log.png b/src/usr/local/www/themes/code-red/images/log.png
deleted file mode 100755
index 762ba80..0000000
--- a/src/usr/local/www/themes/code-red/images/log.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/logo.gif b/src/usr/local/www/themes/code-red/images/logo.gif
deleted file mode 100755
index 3455d6b..0000000
--- a/src/usr/local/www/themes/code-red/images/logo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/logobig.jpg b/src/usr/local/www/themes/code-red/images/logobig.jpg
deleted file mode 100755
index 62922ce..0000000
--- a/src/usr/local/www/themes/code-red/images/logobig.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/logon-background.gif b/src/usr/local/www/themes/code-red/images/logon-background.gif
deleted file mode 100755
index 0176101..0000000
--- a/src/usr/local/www/themes/code-red/images/logon-background.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/menu_down.gif b/src/usr/local/www/themes/code-red/images/menu_down.gif
deleted file mode 100755
index 137de8d..0000000
--- a/src/usr/local/www/themes/code-red/images/menu_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/menu_footer.gif b/src/usr/local/www/themes/code-red/images/menu_footer.gif
deleted file mode 100755
index d06faa4..0000000
--- a/src/usr/local/www/themes/code-red/images/menu_footer.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/menu_right.gif b/src/usr/local/www/themes/code-red/images/menu_right.gif
deleted file mode 100755
index 881327c..0000000
--- a/src/usr/local/www/themes/code-red/images/menu_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/menubgr.png b/src/usr/local/www/themes/code-red/images/menubgr.png
deleted file mode 100755
index 45e0ec7..0000000
--- a/src/usr/local/www/themes/code-red/images/menubgr.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/menubgr_footer.png b/src/usr/local/www/themes/code-red/images/menubgr_footer.png
deleted file mode 100755
index 5d351e4..0000000
--- a/src/usr/local/www/themes/code-red/images/menubgr_footer.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/menubgr_highlight.png b/src/usr/local/www/themes/code-red/images/menubgr_highlight.png
deleted file mode 100755
index f00582b..0000000
--- a/src/usr/local/www/themes/code-red/images/menubgr_highlight.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/metal_bgr.gif b/src/usr/local/www/themes/code-red/images/metal_bgr.gif
deleted file mode 100755
index a0ca6c8..0000000
--- a/src/usr/local/www/themes/code-red/images/metal_bgr.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/metal_bgr_red.gif b/src/usr/local/www/themes/code-red/images/metal_bgr_red.gif
deleted file mode 100755
index c4a1465..0000000
--- a/src/usr/local/www/themes/code-red/images/metal_bgr_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/background.gif b/src/usr/local/www/themes/code-red/images/misc/background.gif
deleted file mode 100755
index 87cceb3..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/background.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/bar_blue.gif b/src/usr/local/www/themes/code-red/images/misc/bar_blue.gif
deleted file mode 100755
index 741186a..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/bar_blue.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/bar_gray.gif b/src/usr/local/www/themes/code-red/images/misc/bar_gray.gif
deleted file mode 100755
index e86e245..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/bar_gray.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/bar_left.gif b/src/usr/local/www/themes/code-red/images/misc/bar_left.gif
deleted file mode 100755
index af751fa..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/bar_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/bar_right.gif b/src/usr/local/www/themes/code-red/images/misc/bar_right.gif
deleted file mode 100755
index ff12d9e..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/bar_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/code-red/images/misc/bullet_toggle_minus.png
deleted file mode 100755
index 37db2fd..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/bullet_toggle_minus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/code-red/images/misc/bullet_toggle_plus.png
deleted file mode 100755
index fba7af9..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/bullet_toggle_plus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/button.gif b/src/usr/local/www/themes/code-red/images/misc/button.gif
deleted file mode 100755
index e85dbb3..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/button.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/graph.png b/src/usr/local/www/themes/code-red/images/misc/graph.png
deleted file mode 100755
index 507ec75..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/graph.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/key_128.gif b/src/usr/local/www/themes/code-red/images/misc/key_128.gif
deleted file mode 100755
index ea5ae34..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/key_128.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/key_152.gif b/src/usr/local/www/themes/code-red/images/misc/key_152.gif
deleted file mode 100755
index 6c7fc03..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/key_152.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/key_256.gif b/src/usr/local/www/themes/code-red/images/misc/key_256.gif
deleted file mode 100755
index 3e1c377..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/key_256.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/key_64.gif b/src/usr/local/www/themes/code-red/images/misc/key_64.gif
deleted file mode 100755
index 87892bd..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/key_64.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/left_background.gif b/src/usr/local/www/themes/code-red/images/misc/left_background.gif
deleted file mode 100755
index 529d827..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/left_background.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/loader.gif b/src/usr/local/www/themes/code-red/images/misc/loader.gif
deleted file mode 100755
index 5d10ac3..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/loader_all.gif b/src/usr/local/www/themes/code-red/images/misc/loader_all.gif
deleted file mode 100755
index cb6bc0c..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/loader_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/loader_filter.gif b/src/usr/local/www/themes/code-red/images/misc/loader_filter.gif
deleted file mode 100755
index b838b17..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/loader_filter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/loader_tab.gif b/src/usr/local/www/themes/code-red/images/misc/loader_tab.gif
deleted file mode 100755
index 05bb04c..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/loader_tab.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/logon.png b/src/usr/local/www/themes/code-red/images/misc/logon.png
deleted file mode 100755
index 7921782..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/logon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_0.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_0.gif
deleted file mode 100755
index 160b56d..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/plogo_0.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_1.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_1.gif
deleted file mode 100755
index 50342d6..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/plogo_1.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_10.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_10.gif
deleted file mode 100755
index 06cba14..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/plogo_10.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_2.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_2.gif
deleted file mode 100755
index 9d10230..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/plogo_2.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_3.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_3.gif
deleted file mode 100755
index 1983f87..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/plogo_3.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_4.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_4.gif
deleted file mode 100755
index f7158bd..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/plogo_4.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_5.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_5.gif
deleted file mode 100755
index c7af593..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/plogo_5.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_6.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_6.gif
deleted file mode 100755
index 310eb22..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/plogo_6.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_7.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_7.gif
deleted file mode 100755
index 06bd2e8..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/plogo_7.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_8.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_8.gif
deleted file mode 100755
index c6ef564..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/plogo_8.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_9.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_9.gif
deleted file mode 100755
index 4f0cd4d..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/plogo_9.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/progress_bar.gif b/src/usr/local/www/themes/code-red/images/misc/progress_bar.gif
deleted file mode 100755
index 3b4aa52..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/progress_bar.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/rrd_error.png b/src/usr/local/www/themes/code-red/images/misc/rrd_error.png
deleted file mode 100755
index a79ecf3..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/rrd_error.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_alerter.gif b/src/usr/local/www/themes/code-red/images/misc/status_alerter.gif
deleted file mode 100755
index 7ff1e95..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/status_alerter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_carpmaster.gif b/src/usr/local/www/themes/code-red/images/misc/status_carpmaster.gif
deleted file mode 100755
index 2c32908..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/status_carpmaster.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_left.gif b/src/usr/local/www/themes/code-red/images/misc/status_left.gif
deleted file mode 100755
index b5a2930..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/status_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_page_loading.gif b/src/usr/local/www/themes/code-red/images/misc/status_page_loading.gif
deleted file mode 100755
index 067ef18..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/status_page_loading.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_reload_all.gif b/src/usr/local/www/themes/code-red/images/misc/status_reload_all.gif
deleted file mode 100755
index 72de6bd..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/status_reload_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_reload_filter.gif b/src/usr/local/www/themes/code-red/images/misc/status_reload_filter.gif
deleted file mode 100755
index d72761a..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/status_reload_filter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_right.gif b/src/usr/local/www/themes/code-red/images/misc/status_right.gif
deleted file mode 100755
index bf66fdb..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/status_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/tri_c.gif b/src/usr/local/www/themes/code-red/images/misc/tri_c.gif
deleted file mode 100755
index 317b758..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/tri_c.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/tri_c_black.gif b/src/usr/local/www/themes/code-red/images/misc/tri_c_black.gif
deleted file mode 100755
index 309846e..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/tri_c_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/tri_o.gif b/src/usr/local/www/themes/code-red/images/misc/tri_o.gif
deleted file mode 100755
index eb95c32..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/tri_o.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/tri_o_black.gif b/src/usr/local/www/themes/code-red/images/misc/tri_o_black.gif
deleted file mode 100755
index f818f3b..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/tri_o_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/widget_loader.gif b/src/usr/local/www/themes/code-red/images/misc/widget_loader.gif
deleted file mode 100755
index ca35e2a..0000000
--- a/src/usr/local/www/themes/code-red/images/misc/widget_loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/new_tab_menu.png b/src/usr/local/www/themes/code-red/images/new_tab_menu.png
deleted file mode 100755
index 4bdfcef..0000000
--- a/src/usr/local/www/themes/code-red/images/new_tab_menu.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/status.png b/src/usr/local/www/themes/code-red/images/status.png
deleted file mode 100755
index a3e368e..0000000
--- a/src/usr/local/www/themes/code-red/images/status.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/transparent.gif b/src/usr/local/www/themes/code-red/images/transparent.gif
deleted file mode 100755
index 89c5530..0000000
--- a/src/usr/local/www/themes/code-red/images/transparent.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/transparent_pixel.gif b/src/usr/local/www/themes/code-red/images/transparent_pixel.gif
deleted file mode 100755
index 35d42e8..0000000
--- a/src/usr/local/www/themes/code-red/images/transparent_pixel.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/blank.gif b/src/usr/local/www/themes/code-red/javascript/ie7/blank.gif
deleted file mode 100755
index a4fe2e6..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/blank.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-box-model.js
deleted file mode 100755
index 45543f6..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-box-model.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-core.js
deleted file mode 100755
index b11e2b1..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-core.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css-strict.js
deleted file mode 100755
index 4406d7a..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css-strict.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css2.js
deleted file mode 100755
index 7121c8e..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css2.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css3.js
deleted file mode 100755
index 86b24f5..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css3.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-fixed.js
deleted file mode 100755
index 4321cda..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-fixed.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-html4.js
deleted file mode 100755
index 4d2baa9..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-html4.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-ie5.js
deleted file mode 100755
index 707fa56..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-ie5.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite-p.js
deleted file mode 100644
index 3a66d19..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite.js
deleted file mode 100755
index 88c764f..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-png.js
deleted file mode 100755
index 7b8f2cf..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-png.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-server.css
deleted file mode 100755
index 47c7edd..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-server.css
+++ /dev/null
@@ -1,43 +0,0 @@
-body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
-body {margin: 8px; background: #333;}
-h1 {margin: 0;}
-h1 a:hover {background-color: transparent;}
-h2 {font-size: 1.75em;}
-h3 {font-size: 1.1em;}
-a:active {color: #ff0000;}
-a:link {color: #0a6cce;}
-a:visited {color: #0a6cce;}
-code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
- padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
-code.box {display: block; padding: 10px; margin: 0.5em 0;}
-ul {list-style-type: square;}
-dd {margin: .2em 0 .5em 1em;}
-dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
-dl.library dd {font-style: italic; margin-left: 3em;}
-dt {font-weight: bold;}
-dt.pack {color: brown;}
-a img {border-style: none;}
-hr {height: 1px; color: #000; border-style: solid;}
-hr.short {height: 2px; width: 100px;}
-div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
-hr {border-bottom-width: 0px;}
-div.header hr {color: #0a6cce; background-color: #0a6cce;}
-div.content {min-height: 100px;}
-div.footer hr {color: #898e79; background-color: #898e79; }
-div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
-a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
-div.footer a:hover {background-color: transparent; text-decoration: none;}
-div.header .menu {text-align: right;}
-div.footer {font-size: x-small; margin-top: 8px;}
-div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
-#license {margin-top: 5px; font-size: xx-small;}
-table {border-top: 1px solid #000; border-left: 1px solid #000;}
-th {background-color: #fff; text-align: left;}
-th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
-th.small {width: 100px;}
-th.medium {width: 200px;}
-th.large {width: 270px;}
-th.x-large {width: 408px;}
-table.fixed {table-layout: fixed;}
-span.comment {color: #666;}
-
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard-p.js
deleted file mode 100644
index 73e99ac..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard.js
deleted file mode 100755
index 2109905..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/test-trans.png b/src/usr/local/www/themes/code-red/javascript/ie7/test-trans.png
deleted file mode 100755
index e187e2c..0000000
--- a/src/usr/local/www/themes/code-red/javascript/ie7/test-trans.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/img/grey-40.png b/src/usr/local/www/themes/code-red/javascript/img/grey-40.png
deleted file mode 100755
index 758b716..0000000
--- a/src/usr/local/www/themes/code-red/javascript/img/grey-40.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/img/submenu-off.gif b/src/usr/local/www/themes/code-red/javascript/img/submenu-off.gif
deleted file mode 100755
index ddcdcae..0000000
--- a/src/usr/local/www/themes/code-red/javascript/img/submenu-off.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/img/submenu-on.gif b/src/usr/local/www/themes/code-red/javascript/img/submenu-on.gif
deleted file mode 100755
index 7a58077..0000000
--- a/src/usr/local/www/themes/code-red/javascript/img/submenu-on.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/img/white-90.png b/src/usr/local/www/themes/code-red/javascript/img/white-90.png
deleted file mode 100755
index efc84b4..0000000
--- a/src/usr/local/www/themes/code-red/javascript/img/white-90.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/img/x.gif b/src/usr/local/www/themes/code-red/javascript/img/x.gif
deleted file mode 100755
index 5bfd67a..0000000
--- a/src/usr/local/www/themes/code-red/javascript/img/x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/niftyjsCode.js b/src/usr/local/www/themes/code-red/javascript/niftyjsCode.js
deleted file mode 100644
index e71ea14..0000000
--- a/src/usr/local/www/themes/code-red/javascript/niftyjsCode.js
+++ /dev/null
@@ -1,174 +0,0 @@
-function NiftyCheck(){
-if(!document.getElementById || !document.createElement)
- return(false);
-isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
-if(Array.prototype.push==null){Array.prototype.push=function(){
- this[this.length]=arguments[0]; return(this.length);};}
-return(true);
-}
-
-function Rounded(selector,wich,bk,color,opt){
-var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
-
-if(color=="transparent"){
- cn=cn+"x";
- ecolor=bk;
- bk="transparent";
- }
-else if(opt && opt.indexOf("border")>=0){
- var optar=opt.split(" ");
- for(i=0;i<optar.length;i++)
- if(optar[i].indexOf("#")>=0) ecolor=optar[i];
- if(ecolor=="") ecolor="#666";
- cn+="e";
- edges=true;
- }
-else if(opt && opt.indexOf("smooth")>=0){
- cn+="a";
- ecolor=Mix(bk,color);
- }
-if(opt && opt.indexOf("small")>=0) cn+="s";
-prefixt=cn;
-prefixb=cn;
-if(wich.indexOf("all")>=0){t=true;b=true;}
-else if(wich.indexOf("top")>=0) t="true";
-else if(wich.indexOf("tl")>=0){
- t="true";
- if(wich.indexOf("tr")<0) prefixt+="l";
- }
-else if(wich.indexOf("tr")>=0){
- t="true";
- prefixt+="r";
- }
-if(wich.indexOf("bottom")>=0) b=true;
-else if(wich.indexOf("bl")>=0){
- b="true";
- if(wich.indexOf("br")<0) prefixb+="l";
- }
-else if(wich.indexOf("br")>=0){
- b="true";
- prefixb+="r";
- }
-var v=getElementsBySelector(selector);
-var l=v.length;
-for(i=0;i<l;i++){
- if(edges) AddBorder(v[i],ecolor);
- if(t) AddTop(v[i],bk,color,ecolor,prefixt);
- if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
- }
-}
-
-function AddBorder(el,bc){
-var i;
-if(!el.passed){
- if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
- var t=el.firstChild.nodeValue;
- el.removeChild(el.lastChild);
- var d=CreateEl("span");
- d.style.display="block";
- d.appendChild(document.createTextNode(t));
- el.appendChild(d);
- }
- for(i=0;i<el.childNodes.length;i++){
- if(el.childNodes[i].nodeType==1){
- el.childNodes[i].style.borderLeft="1px solid "+bc;
- el.childNodes[i].style.borderRight="1px solid "+bc;
- }
- }
- }
-el.passed=true;
-}
-
-function AddTop(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=1;i<=lim;i++){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingTop=0;
-el.insertBefore(d,el.firstChild);
-}
-
-function AddBottom(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=lim;i>0;i--){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingBottom=0;
-el.appendChild(d);
-}
-
-function CreateEl(x){
-if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
-else return(document.createElement(x));
-}
-
-function getElementsBySelector(selector){
-var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
-
-if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
- s=selector.split(" ");
- var fs=s[0].split("#");
- if(fs.length==1) return(objlist);
- f=document.getElementById(fs[1]);
- if(f) return(f.getElementsByTagName(s[1]));
- return(objlist);
- }
-if(selector.indexOf("#")>0){ //id selector like "tag#id"
- s=selector.split("#");
- tag=s[0];
- selid=s[1];
- }
-if(selid!=""){
- f=document.getElementById(selid);
- if(f) objlist.push(f);
- return(objlist);
- }
-if(selector.indexOf(".")>0){ //class selector like "tag.class"
- s=selector.split(".");
- tag=s[0];
- selclass=s[1];
- }
-var v=document.getElementsByTagName(tag); // tag selector like "tag"
-if(selclass=="")
- return(v);
-for(i=0;i<v.length;i++){
- if(v[i].className.indexOf(selclass)>=0){
- objlist.push(v[i]);
- }
- }
-return(objlist);
-}
-
-function Mix(c1,c2){
-var i,step1,step2,x,y,r=new Array(3);
-if(c1.length==4)step1=1;
-else step1=2;
-if(c2.length==4) step2=1;
-else step2=2;
-for(i=0;i<3;i++){
- x=parseInt(c1.substr(1+step1*i,step1),16);
- if(step1==1) x=16*x+x;
- y=parseInt(c2.substr(1+step2*i,step2),16);
- if(step2==1) y=16*y+y;
- r[i]=Math.floor((x*50+y*50)/100);
- }
-return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/javascript/transmenu-body.php b/src/usr/local/www/themes/code-red/javascript/transmenu-body.php
deleted file mode 100755
index 6da8efc..0000000
--- a/src/usr/local/www/themes/code-red/javascript/transmenu-body.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/* $Id$ */
-/* ========================================================================== */
-/*
- transmenu-body.php
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- All rights reserved.
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-function nervecenterTransmenuGetBodyJS() {
- global $rootmenu;
-
- if (isset($rootmenu)) {
- return $rootmenu->getMenuJScript();
- } else if (empty($rootmenu)) {
- return "alert('No rootmenu object found.');";
- } else {
- return "alert('No JavaScript attached to rootmenu object.');";
- }
-}
-
-?>
diff --git a/src/usr/local/www/themes/code-red/javascript/transmenu-head.php b/src/usr/local/www/themes/code-red/javascript/transmenu-head.php
deleted file mode 100755
index 7d72c30..0000000
--- a/src/usr/local/www/themes/code-red/javascript/transmenu-head.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-/* $Id$ */
-/* ========================================================================== */
-/*
- transmenu-head.php
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- All rights reserved.
-
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-function nervecenterTransmenuGetHeadJS() {
- global $g, $rootmenu;
-
- $transmenu_stub =<<<EOD
- function tmenuinit() {
- //==========================================================================================
- // if supported, initialize TransMenus
- //==========================================================================================
- // Check isSupported() so that menus aren't accidentally sent to non-supporting browsers.
- // This is better than server-side checking because it will also catch browsers which would
- // normally support the menus but have javascript disabled.
- //
- // If supported, call initialize() and then hook whatever image rollover code you need to do
- // to the .onactivate and .ondeactivate events for each menu.
- //==========================================================================================
- if (TransMenu.isSupported()) {
- TransMenu.initialize();
-
- // hook all the highlight swapping of the main toolbar to menu activation/deactivation
- // instead of simple rollover to get the effect where the button stays hightlit until
- // the menu is closed.
- @@CHILD_JSCRIPT@@
- }
- } // end function
-EOD;
-
- if (empty($rootmenu)) {
- require_once("menudef.inc");
- }
-
- $childJScript = "";
- foreach ($rootmenu->getChildren() as $component) {
- $id = "mnua_" . str_replace(" ", "", strtolower($component->getID()));
-
- $childJScript .=<<<EOD
- {$id}.onactivate = function() { document.getElementById("{$id}").className = "hover"; };
- {$id}.ondeactivate = function() { document.getElementById("{$id}").className = ""; };
-
-EOD;
- }
-
- $transmenu_stub = basename($_SERVER['PHP_SELF']) != "wizard.php" ? str_replace("@@CHILD_JSCRIPT@@", $childJScript, $transmenu_stub) : "";
-
- return $transmenu_stub;
-}
-
-?>
diff --git a/src/usr/local/www/themes/code-red/javascript/transmenu.org b/src/usr/local/www/themes/code-red/javascript/transmenu.org
deleted file mode 100755
index 6c9e353..0000000
--- a/src/usr/local/www/themes/code-red/javascript/transmenu.org
+++ /dev/null
@@ -1,785 +0,0 @@
-/* =================================================================================================
- * TransMenu
- * March, 2003
- *
- * Customizable multi-level animated DHTML menus with transparency.
- *
- * Copyright 2003-2004, Aaron Boodman (www.youngpup.net)
- * =================================================================================================
- * "Can I use this?"
- *
- * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
- * out at: http://creativecommons.org/licenses/by/2.0/
- *
- * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
- * for writing it. You may not misrepresent yourself as the author of this code.
- * =================================================================================================
- * "It's kinda hard to read, though"
- *
- * The uncompressed, commented version of this script can be found at:
- * http://youngpup.net/projects/transMenus
- * =================================================================================================
- * updates:
- * 04.19.04 fixed cascade problem with menus nested greater than two levels.
- * 12.23.03 added hideCurrent for menu actuators with no menus. renamed to TransMenu.
- * 04.18.03 fixed render bug in IE 5.0 Mac by removing that browser from compatibility table ;)
- * also made gecko check a little more strict by specifying build no.
- * ============================================================================================== */
-
-
-
-//==================================================================================================
-// Configuration properties
-//==================================================================================================
-TransMenu.spacerGif = "themes/nervecenter/javascript/img/x.gif"; // path to a transparent spacer gif
-TransMenu.dingbatOn = "themes/nervecenter/javascript/img/submenu-on.gif"; // path to the active sub menu dingbat
-TransMenu.dingbatOff = "themes/nervecenter/javascript/img/submenu-off.gif"; // path to the inactive sub menu dingbat
-TransMenu.dingbatSize = 14; // size of the dingbat (square shape assumed)
-TransMenu.menuPadding = 5; // padding between menu border and items grid
-TransMenu.itemPadding = 3; // additional padding around each item
-TransMenu.shadowSize = 2; // size of shadow under menu
-TransMenu.shadowOffset = 3; // distance shadow should be offset from leading edge
-TransMenu.shadowColor = "#FF0000"; // color of shadow (transparency is set in CSS)
-TransMenu.shadowPng = "themes/nervecenter/javascript/img/grey-40.png"; // a PNG graphic to serve as the shadow for mac IE5
-TransMenu.backgroundColor = "#990000"; // color of the background (transparency set in CSS)
-TransMenu.backgroundPng = "themes/nervecenter/javascript/img/white-90.png"; // a PNG graphic to server as the background for mac IE5
-TransMenu.hideDelay = 1000; // number of milliseconds to wait before hiding a menu
-TransMenu.slideTime = 400; // number of milliseconds it takes to open and close a menu
-
-
-//==================================================================================================
-// Internal use properties
-//==================================================================================================
-TransMenu.reference = {topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};
-TransMenu.direction = {down:1,right:2};
-TransMenu.registry = [];
-TransMenu._maxZ = 100;
-
-
-
-//==================================================================================================
-// Static methods
-//==================================================================================================
-// supporting win ie5+, mac ie5.1+ and gecko >= mozilla 1.0
-TransMenu.isSupported = function() {
- var ua = navigator.userAgent.toLowerCase();
- var pf = navigator.platform.toLowerCase();
- var an = navigator.appName;
- var r = false;
-
- if (ua.indexOf("gecko") > -1 && navigator.productSub >= 20020605) r = true; // gecko >= moz 1.0
- else if (an == "Microsoft Internet Explorer") {
- if (document.getElementById) { // ie5.1+ mac,win
- if (pf.indexOf("mac") == 0) {
- r = /msie (\d(.\d*)?)/.test(ua) && Number(RegExp.$1) >= 5.1;
- }
- else r = true;
- }
- }
-
- return r;
-}
-
-// call this in onload once menus have been created
-TransMenu.initialize = function() {
- for (var i = 0, menu = null; menu = this.registry[i]; i++) {
- menu.initialize();
- }
-}
-
-// call this in document body to write out menu html
-TransMenu.renderAll = function() {
- var aMenuHtml = [];
- for (var i = 0, menu = null; menu = this.registry[i]; i++) {
- aMenuHtml[i] = menu.toString();
- }
- document.write(aMenuHtml.join(""));
-}
-
-//==================================================================================================
-// TransMenu constructor (only called internally)
-//==================================================================================================
-// oActuator : The thing that causes the menu to be shown when it is mousedover. Either a
-// reference to an HTML element, or a TransMenuItem from an existing menu.
-// iDirection : The direction to slide out. One of TransMenu.direction.
-// iLeft : Left pixel offset of menu from actuator
-// iTop : Top pixel offset of menu from actuator
-// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
-// parentMenuSet : Menuset this menu will be added to.
-//==================================================================================================
-function TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, parentMenuSet) {
- // public methods
- this.addItem = addItem;
- this.addMenu = addMenu;
- this.toString = toString;
- this.initialize = initialize;
- this.isOpen = false;
- this.show = show;
- this.hide = hide;
- this.items = [];
-
- // events
- this.onactivate = new Function(); // when the menu starts to slide open
- this.ondeactivate = new Function(); // when the menu finishes sliding closed
- this.onmouseover = new Function(); // when the menu has been moused over
- this.onqueue = new Function(); // hack .. when the menu sets a timer to be closed a little while in the future
- this.ondequeue = new Function();
-
- // initialization
- this.index = TransMenu.registry.length;
- TransMenu.registry[this.index] = this;
-
- var id = "TransMenu" + this.index;
- var contentHeight = null;
- var contentWidth = null;
- var childMenuSet = null;
- var animating = false;
- var childMenus = [];
- var slideAccel = -1;
- var elmCache = null;
- var ready = false;
- var _this = this;
- var a = null;
-
- var pos = iDirection == TransMenu.direction.down ? "top" : "left";
- var dim = null;
-
- // private and public method implimentations
- function addItem(sText, sUrl) {
- var item = new TransMenuItem(sText, sUrl, this);
- item._index = this.items.length;
- this.items[item._index] = item;
- }
-
- function addMenu(oMenuItem) {
- if (!oMenuItem.parentMenu == this) throw new Error("Cannot add a menu here");
-
- if (childMenuSet == null) childMenuSet = new TransMenuSet(TransMenu.direction.right, -5, 2, TransMenu.reference.topRight);
-
- var m = childMenuSet.addMenu(oMenuItem);
-
- childMenus[oMenuItem._index] = m;
- m.onmouseover = child_mouseover;
- m.ondeactivate = child_deactivate;
- m.onqueue = child_queue;
- m.ondequeue = child_dequeue;
-
- return m;
- }
-
- function initialize() {
- initCache();
- initEvents();
- initSize();
- ready = true;
- }
-
- function show() {
- //dbg_dump("show");
- if (ready) {
- _this.isOpen = true;
- animating = true;
- setContainerPos();
- elmCache["clip"].style.visibility = "visible";
- elmCache["clip"].style.zIndex = TransMenu._maxZ++;
- //dbg_dump("maxZ: " + TransMenu._maxZ);
- slideStart();
- _this.onactivate();
- }
- }
-
- function hide() {
- if (ready) {
- _this.isOpen = false;
- animating = true;
-
- for (var i = 0, item = null; item = elmCache.item[i]; i++)
- dehighlight(item);
-
- if (childMenuSet) childMenuSet.hide();
-
- slideStart();
- _this.ondeactivate();
- }
- }
-
- function setContainerPos() {
- var sub = oActuator.constructor == TransMenuItem;
- var act = sub ? oActuator.parentMenu.elmCache["item"][oActuator._index] : oActuator;
- var el = act;
-
- var x = 0;
- var y = 0;
-
-
- var minX = 0;
- var maxX = (window.innerWidth ? window.innerWidth : document.body.clientWidth) - parseInt(elmCache["clip"].style.width);
- var minY = 0;
- var maxY = (window.innerHeight ? window.innerHeight : document.body.clientHeight) - parseInt(elmCache["clip"].style.height);
-
- // add up all offsets... subtract any scroll offset
- while (sub ? el.parentNode.className.indexOf("transMenu") == -1 : el.offsetParent) {
- x += el.offsetLeft;
- y += el.offsetTop;
-
- if (el.scrollLeft) x -= el.scrollLeft;
- if (el.scrollTop) y -= el.scrollTop;
-
- el = el.offsetParent;
- }
-
- if (oActuator.constructor == TransMenuItem) {
- x += parseInt(el.parentNode.style.left);
- y += parseInt(el.parentNode.style.top);
- }
-
- switch (iReferencePoint) {
- case TransMenu.reference.topLeft:
- break;
- case TransMenu.reference.topRight:
- x += act.offsetWidth;
- break;
- case TransMenu.reference.bottomLeft:
- y += act.offsetHeight;
- break;
- case TransMenu.reference.bottomRight:
- x += act.offsetWidth;
- y += act.offsetHeight;
- break;
- }
-
- x += iLeft;
- y += iTop;
-
- x = Math.max(Math.min(x, maxX), minX);
- y = Math.max(Math.min(y, maxY), minY);
-
- elmCache["clip"].style.left = x + "px";
- elmCache["clip"].style.top = y + "px";
- }
-
- function slideStart() {
- var x0 = parseInt(elmCache["content"].style[pos]);
- var x1 = _this.isOpen ? 0 : -dim;
-
- if (a != null) a.stop();
- a = new Accelimation(x0, x1, TransMenu.slideTime, slideAccel);
-
- a.onframe = slideFrame;
- a.onend = slideEnd;
-
- a.start();
- }
-
- function slideFrame(x) {
- elmCache["content"].style[pos] = x + "px";
- }
-
- function slideEnd() {
- if (!_this.isOpen) elmCache["clip"].style.visibility = "hidden";
- animating = false;
- }
-
- function initSize() {
- // everything is based off the size of the items table...
- var ow = elmCache["items"].offsetWidth;
- var oh = elmCache["items"].offsetHeight;
- var ua = navigator.userAgent.toLowerCase();
-
- // clipping container should be ow/oh + the size of the shadow
- elmCache["clip"].style.width = ow + TransMenu.shadowSize + 2 + "px";
- elmCache["clip"].style.height = oh + TransMenu.shadowSize + 2 + "px";
-
- // same with content...
- elmCache["content"].style.width = ow + TransMenu.shadowSize + "px";
- elmCache["content"].style.height = oh + TransMenu.shadowSize + "px";
-
- contentHeight = oh + TransMenu.shadowSize;
- contentWidth = ow + TransMenu.shadowSize;
-
- dim = iDirection == TransMenu.direction.down ? contentHeight : contentWidth;
-
- // set initially closed
- elmCache["content"].style[pos] = -dim - TransMenu.shadowSize + "px";
- elmCache["clip"].style.visibility = "hidden";
-
- // if *not* mac/ie 5
- if (ua.indexOf("mac") == -1 || ua.indexOf("gecko") > -1) {
- // set background div to offset size
- elmCache["background"].style.width = ow + "px";
- elmCache["background"].style.height = oh + "px";
- elmCache["background"].style.backgroundColor = TransMenu.backgroundColor;
-
- // shadow left starts at offset left and is offsetHeight pixels high
- elmCache["shadowRight"].style.left = ow + "px";
- elmCache["shadowRight"].style.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize) + "px";
- elmCache["shadowRight"].style.backgroundColor = TransMenu.shadowColor;
-
- // shadow bottom starts at offset height and is offsetWidth - shadowOffset
- // pixels wide (we don't want the bottom and right shadows to overlap or we
- // get an extra bright bottom-right corner)
- elmCache["shadowBottom"].style.top = oh + "px";
- elmCache["shadowBottom"].style.width = ow - TransMenu.shadowOffset + "px";
- elmCache["shadowBottom"].style.backgroundColor = TransMenu.shadowColor;
- }
- // mac ie is a little different because we use a PNG for the transparency
- else {
- // set background div to offset size
- elmCache["background"].firstChild.src = TransMenu.backgroundPng;
- elmCache["background"].firstChild.width = ow;
- elmCache["background"].firstChild.height = oh;
-
- // shadow left starts at offset left and is offsetHeight pixels high
- elmCache["shadowRight"].firstChild.src = TransMenu.shadowPng;
- elmCache["shadowRight"].style.left = ow + "px";
- elmCache["shadowRight"].firstChild.width = TransMenu.shadowSize;
- elmCache["shadowRight"].firstChild.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize);
-
- // shadow bottom starts at offset height and is offsetWidth - shadowOffset
- // pixels wide (we don't want the bottom and right shadows to overlap or we
- // get an extra bright bottom-right corner)
- elmCache["shadowBottom"].firstChild.src = TransMenu.shadowPng;
- elmCache["shadowBottom"].style.top = oh + "px";
- elmCache["shadowBottom"].firstChild.height = TransMenu.shadowSize;
- elmCache["shadowBottom"].firstChild.width = ow - TransMenu.shadowOffset;
- }
- }
-
- function initCache() {
- var menu = document.getElementById(id);
- var all = menu.all ? menu.all : menu.getElementsByTagName("*"); // IE/win doesn't support * syntax, but does have the document.all thing
-
- elmCache = {};
- elmCache["clip"] = menu;
- elmCache["item"] = [];
-
- for (var i = 0, elm = null; elm = all[i]; i++) {
- switch (elm.className) {
- case "items":
- case "content":
- case "background":
- case "shadowRight":
- case "shadowBottom":
- elmCache[elm.className] = elm;
- break;
- case "item":
- elm._index = elmCache["item"].length;
- elmCache["item"][elm._index] = elm;
- break;
- }
- }
-
- // hack!
- _this.elmCache = elmCache;
- }
-
- function initEvents() {
- // hook item mouseover
- for (var i = 0, item = null; item = elmCache.item[i]; i++) {
- item.onmouseover = item_mouseover;
- item.onmouseout = item_mouseout;
- item.onclick = item_click;
- }
-
- // hook actuation
- if (typeof oActuator.tagName != "undefined") {
- oActuator.onmouseover = actuator_mouseover;
- oActuator.onmouseout = actuator_mouseout;
- }
-
- // hook menu mouseover
- elmCache["content"].onmouseover = content_mouseover;
- elmCache["content"].onmouseout = content_mouseout;
- }
-
- function highlight(oRow) {
- oRow.className = "item hover";
- if (childMenus[oRow._index])
- oRow.lastChild.firstChild.src = TransMenu.dingbatOn;
- }
-
- function dehighlight(oRow) {
- oRow.className = "item";
- if (childMenus[oRow._index])
- oRow.lastChild.firstChild.src = TransMenu.dingbatOff;
- }
-
- function item_mouseover() {
- if (!animating) {
- highlight(this);
-
- if (childMenus[this._index])
- childMenuSet.showMenu(childMenus[this._index]);
- else if (childMenuSet) childMenuSet.hide();
- }
- }
-
- function item_mouseout() {
- if (!animating) {
- if (childMenus[this._index])
- childMenuSet.hideMenu(childMenus[this._index]);
- else // otherwise child_deactivate will do this
- dehighlight(this);
- }
- }
-
- function item_click() {
- if (!animating) {
- if (_this.items[this._index].url)
- location.href = _this.items[this._index].url;
- }
- }
-
- function actuator_mouseover() {
- parentMenuSet.showMenu(_this);
- }
-
- function actuator_mouseout() {
- parentMenuSet.hideMenu(_this);
- }
-
- function content_mouseover() {
- if (!animating) {
- parentMenuSet.showMenu(_this);
- _this.onmouseover();
- }
- }
-
- function content_mouseout() {
- if (!animating) {
- parentMenuSet.hideMenu(_this);
- }
- }
-
- function child_mouseover() {
- if (!animating) {
- parentMenuSet.showMenu(_this);
- }
- }
-
- function child_deactivate() {
- for (var i = 0; i < childMenus.length; i++) {
- if (childMenus[i] == this) {
- dehighlight(elmCache["item"][i]);
- break;
- }
- }
- }
-
- function child_queue() {
- parentMenuSet.hideMenu(_this);
- }
-
- function child_dequeue() {
- parentMenuSet.showMenu(_this);
- }
-
- function toString() {
- var aHtml = [];
- var sClassName = "transMenu" + (oActuator.constructor != TransMenuItem ? " top" : "");
-
- for (var i = 0, item = null; item = this.items[i]; i++) {
- aHtml[i] = item.toString(childMenus[i]);
- }
-
- return '<div id="' + id + '" class="' + sClassName + '">' +
- '<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">' +
- '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr>' +
- aHtml.join('') +
- '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr></table>' +
- '<div class="shadowBottom"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '<div class="shadowRight"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '<div class="background"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '</div></div>';
- }
-}
-
-
-//==================================================================================================
-// TransMenuSet
-//==================================================================================================
-// iDirection : The direction to slide out. One of TransMenu.direction.
-// iLeft : Left pixel offset of menus from actuator
-// iTop : Top pixel offset of menus from actuator
-// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
-//==================================================================================================
-TransMenuSet.registry = [];
-
-function TransMenuSet(iDirection, iLeft, iTop, iReferencePoint) {
- // public methods
- this.addMenu = addMenu;
- this.showMenu = showMenu;
- this.hideMenu = hideMenu;
- this.hide = hide;
- this.hideCurrent = hideCurrent;
-
- // initialization
- var menus = [];
- var _this = this;
- var current = null;
-
- this.index = TransMenuSet.registry.length;
- TransMenuSet.registry[this.index] = this;
-
- // method implimentations...
- function addMenu(oActuator) {
- var m = new TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, this);
- menus[menus.length] = m;
- return m;
- }
-
- function showMenu(oMenu) {
- if (oMenu != current) {
- // close currently open menu
- if (current != null) hide(current);
-
- // set current menu to this one
- current = oMenu;
-
- // if this menu is closed, open it
- oMenu.show();
- }
- else {
- // hide pending calls to close this menu
- cancelHide(oMenu);
- }
- }
-
- function hideMenu(oMenu) {
- //dbg_dump("hideMenu a " + oMenu.index);
- if (current == oMenu && oMenu.isOpen) {
- //dbg_dump("hideMenu b " + oMenu.index);
- if (!oMenu.hideTimer) scheduleHide(oMenu);
- }
- }
-
- function scheduleHide(oMenu) {
- //dbg_dump("scheduleHide " + oMenu.index);
- oMenu.onqueue();
- oMenu.hideTimer = window.setTimeout("TransMenuSet.registry[" + _this.index + "].hide(TransMenu.registry[" + oMenu.index + "])", TransMenu.hideDelay);
- }
-
- function cancelHide(oMenu) {
- //dbg_dump("cancelHide " + oMenu.index);
- if (oMenu.hideTimer) {
- oMenu.ondequeue();
- window.clearTimeout(oMenu.hideTimer);
- oMenu.hideTimer = null;
- }
- }
-
- function hide(oMenu) {
- if (!oMenu && current) oMenu = current;
-
- if (oMenu && current == oMenu && oMenu.isOpen) {
- hideCurrent();
- }
- }
-
- function hideCurrent() {
- if (null != current) {
- cancelHide(current);
- current.hideTimer = null;
- current.hide();
- current = null;
- }
- }
-}
-
-//==================================================================================================
-// TransMenuItem (internal)
-// represents an item in a dropdown
-//==================================================================================================
-// sText : The item display text
-// sUrl : URL to load when the item is clicked
-// oParent : Menu this item is a part of
-//==================================================================================================
-function TransMenuItem(sText, sUrl, oParent) {
- this.toString = toString;
- this.text = sText;
- this.url = sUrl;
- this.parentMenu = oParent;
-
- function toString(bDingbat) {
- var sDingbat = bDingbat ? TransMenu.dingbatOff : TransMenu.spacerGif;
- var iEdgePadding = TransMenu.itemPadding + TransMenu.menuPadding;
- var sPaddingLeft = "padding:" + TransMenu.itemPadding + "px; padding-left:" + iEdgePadding + "px;"
- var sPaddingRight = "padding:" + TransMenu.itemPadding + "px; padding-right:" + iEdgePadding + "px;"
-
- return '<tr class="item"><td nowrap style="' + sPaddingLeft + '">' +
- sText + '</td><td width="14" style="' + sPaddingRight + '">' +
- '<img src="' + sDingbat + '" width="14" height="14"></td></tr>';
- }
-}
-
-
-
-
-
-
-//=====================================================================
-// Accel[erated] [an]imation object
-// change a property of an object over time in an accelerated fashion
-//=====================================================================
-// obj : reference to the object whose property you'd like to animate
-// prop : property you would like to change eg: "left"
-// to : final value of prop
-// time : time the animation should take to run
-// zip : optional. specify the zippiness of the acceleration. pick a
-// number between -1 and 1 where -1 is full decelerated, 1 is
-// full accelerated, and 0 is linear (no acceleration). default
-// is 0.
-// unit : optional. specify the units for use with prop. default is
-// "px".
-//=====================================================================
-// bezier functions lifted from the lib_animation.js file in the
-// 13th Parallel API. www.13thparallel.org
-//=====================================================================
-
-function Accelimation(from, to, time, zip) {
- if (typeof zip == "undefined") zip = 0;
- if (typeof unit == "undefined") unit = "px";
-
- this.x0 = from;
- this.x1 = to;
- this.dt = time;
- this.zip = -zip;
- this.unit = unit;
- this.timer = null;
- this.onend = new Function();
- this.onframe = new Function();
-}
-
-
-
-//=====================================================================
-// public methods
-//=====================================================================
-
-// after you create an accelimation, you call this to start it-a runnin'
-Accelimation.prototype.start = function() {
- this.t0 = new Date().getTime();
- this.t1 = this.t0 + this.dt;
- var dx = this.x1 - this.x0;
- this.c1 = this.x0 + ((1 + this.zip) * dx / 3);
- this.c2 = this.x0 + ((2 + this.zip) * dx / 3);
- Accelimation._add(this);
-}
-
-// and if you need to stop it early for some reason...
-Accelimation.prototype.stop = function() {
- Accelimation._remove(this);
-}
-
-
-
-//=====================================================================
-// private methods
-//=====================================================================
-
-// paints one frame. gets called by Accelimation._paintAll.
-Accelimation.prototype._paint = function(time) {
- if (time < this.t1) {
- var elapsed = time - this.t0;
- this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));
- }
- else this._end();
-}
-
-// ends the animation
-Accelimation.prototype._end = function() {
- Accelimation._remove(this);
- this.onframe(this.x1);
- this.onend();
-}
-
-
-
-
-//=====================================================================
-// static methods (all private)
-//=====================================================================
-
-// add a function to the list of ones to call periodically
-Accelimation._add = function(o) {
- var index = this.instances.length;
- this.instances[index] = o;
- // if this is the first one, start the engine
- if (this.instances.length == 1) {
- this.timerID = window.setInterval("Accelimation._paintAll()", this.targetRes);
- }
-}
-
-// remove a function from the list
-Accelimation._remove = function(o) {
- for (var i = 0; i < this.instances.length; i++) {
- if (o == this.instances[i]) {
- this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) );
- break;
- }
- }
- // if that was the last one, stop the engine
- if (this.instances.length == 0) {
- window.clearInterval(this.timerID);
- this.timerID = null;
- }
-}
-
-// "engine" - call each function in the list every so often
-Accelimation._paintAll = function() {
- var now = new Date().getTime();
- for (var i = 0; i < this.instances.length; i++) {
- this.instances[i]._paint(now);
- }
-}
-
-
-// Bezier functions:
-Accelimation._B1 = function(t) { return t*t*t }
-Accelimation._B2 = function(t) { return 3*t*t*(1-t) }
-Accelimation._B3 = function(t) { return 3*t*(1-t)*(1-t) }
-Accelimation._B4 = function(t) { return (1-t)*(1-t)*(1-t) }
-
-
-//Finds the coordinates of a point at a certain stage through a bezier curve
-Accelimation._getBezier = function(percent,startPos,endPos,control1,control2) {
- return endPos * this._B1(percent) + control2 * this._B2(percent) + control1 * this._B3(percent) + startPos * this._B4(percent);
-}
-
-
-//=====================================================================
-// static properties
-//=====================================================================
-
-Accelimation.instances = [];
-Accelimation.targetRes = 10;
-Accelimation.timerID = null;
-
-
-//=====================================================================
-// IE win memory cleanup
-//=====================================================================
-
-if (window.attachEvent) {
- var cearElementProps = [
- 'data',
- 'onmouseover',
- 'onmouseout',
- 'onmousedown',
- 'onmouseup',
- 'ondblclick',
- 'onclick',
- 'onselectstart',
- 'oncontextmenu'
- ];
-
- window.attachEvent("onunload", function() {
- var el;
- for(var d = document.all.length;d--;){
- el = document.all[d];
- for(var c = cearElementProps.length;c--;){
- el[cearElementProps[c]] = null;
- }
- }
- });
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/javascript/transmenuC.js b/src/usr/local/www/themes/code-red/javascript/transmenuC.js
deleted file mode 100755
index 88626c7..0000000
--- a/src/usr/local/www/themes/code-red/javascript/transmenuC.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/* =================================================================================================
- * TransMenu
- * March, 2003
- * Customizable multi-level animated DHTML menus with transparency.
- * =================================================================================================
- * "Can I use this?"
- *
- * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
- * out at: http://creativecommons.org/licenses/by/2.0/
- *
- * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
- * for writing it. You may not misrepresent yourself as the author of this code.
- * =================================================================================================
- * "It's kinda hard to read, though"
- *
- * The uncompressed, commented version of this script can be found at:
- * http://youngpup.net/projects/transMenus
- * ============================================================================================== */
-TransMenu.spacerGif="themes/nervecenter/javascript/img/x.gif";TransMenu.dingbatOn="themes/nervecenter/javascript/img/submenu-on.gif";TransMenu.dingbatOff="themes/nervecenter/javascript/img/submenu-off.gif";TransMenu.dingbatSize=14;TransMenu.menuPadding=5;TransMenu.itemPadding=3;TransMenu.shadowSize=2;TransMenu.shadowOffset=3;TransMenu.shadowColor="#000000";TransMenu.shadowPng="themes/nervecenter/javascript/img/grey-40.png";TransMenu.backgroundColor="#990000";TransMenu.backgroundPng="themes/nervecenter/javascript/img/white-90.png";TransMenu.hideDelay=1000;TransMenu.slideTime=400;TransMenu.reference={topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};TransMenu.direction={down:1,right:2};TransMenu.registry=[];TransMenu._maxZ=100;TransMenu.isSupported=function(){var ua=navigator.userAgent.toLowerCase();var pf=navigator.platform.toLowerCase();var an=navigator.appName;var r=false;if(ua.indexOf("gecko")>-1&&navigator.productSub>=20020605)r=true;else if(an=="Microsoft Internet Explorer"){if(document.getElementById){if(pf.indexOf("mac")==0){r=/msie (\d(.\d*)?)/.test(ua)&&Number(RegExp.$1)>=5.1;}
-else r=true;}}
-return r;}
-TransMenu.initialize=function(){for(var i=0,menu=null;menu=this.registry[i];i++){menu.initialize();}}
-TransMenu.renderAll=function(){var aMenuHtml=[];for(var i=0,menu=null;menu=this.registry[i];i++){aMenuHtml[i]=menu.toString();}
-document.write(aMenuHtml.join(""));}
-function TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,parentMenuSet){this.addItem=addItem;this.addMenu=addMenu;this.toString=toString;this.initialize=initialize;this.isOpen=false;this.show=show;this.hide=hide;this.items=[];this.onactivate=new Function();this.ondeactivate=new Function();this.onmouseover=new Function();this.onqueue=new Function();this.ondequeue=new Function();this.index=TransMenu.registry.length;TransMenu.registry[this.index]=this;var id="TransMenu"+this.index;var contentHeight=null;var contentWidth=null;var childMenuSet=null;var animating=false;var childMenus=[];var slideAccel=-1;var elmCache=null;var ready=false;var _this=this;var a=null;var pos=iDirection==TransMenu.direction.down?"top":"left";var dim=null;function addItem(sText,sUrl){var item=new TransMenuItem(sText,sUrl,this);item._index=this.items.length;this.items[item._index]=item;}
-function addMenu(oMenuItem){if(!oMenuItem.parentMenu==this)throw new Error("Cannot add a menu here");if(childMenuSet==null)childMenuSet=new TransMenuSet(TransMenu.direction.right,-5,2,TransMenu.reference.topRight);var m=childMenuSet.addMenu(oMenuItem);childMenus[oMenuItem._index]=m;m.onmouseover=child_mouseover;m.ondeactivate=child_deactivate;m.onqueue=child_queue;m.ondequeue=child_dequeue;return m;}
-function initialize(){initCache();initEvents();initSize();ready=true;}
-function show(){if(ready){_this.isOpen=true;animating=true;setContainerPos();elmCache["clip"].style.visibility="visible";elmCache["clip"].style.zIndex=TransMenu._maxZ++;slideStart();_this.onactivate();}}
-function hide(){if(ready){_this.isOpen=false;animating=true;for(var i=0,item=null;item=elmCache.item[i];i++)dehighlight(item);if(childMenuSet)childMenuSet.hide();slideStart();_this.ondeactivate();}}
-function setContainerPos(){var sub=oActuator.constructor==TransMenuItem;var act=sub?oActuator.parentMenu.elmCache["item"][oActuator._index]:oActuator;var el=act;var x=0;var y=0;var minX=0;var maxX=(window.innerWidth?window.innerWidth:document.body.clientWidth)-parseInt(elmCache["clip"].style.width);var minY=0;var maxY=(window.innerHeight?window.innerHeight:document.body.clientHeight)-parseInt(elmCache["clip"].style.height);while(sub?el.parentNode.className.indexOf("transMenu")==-1:el.offsetParent){x+=el.offsetLeft;y+=el.offsetTop;if(el.scrollLeft)x-=el.scrollLeft;if(el.scrollTop)y-=el.scrollTop;el=el.offsetParent;}
-if(oActuator.constructor==TransMenuItem){x+=parseInt(el.parentNode.style.left);y+=parseInt(el.parentNode.style.top);}
-switch(iReferencePoint){case TransMenu.reference.topLeft:break;case TransMenu.reference.topRight:x+=act.offsetWidth;break;case TransMenu.reference.bottomLeft:y+=act.offsetHeight;break;case TransMenu.reference.bottomRight:x+=act.offsetWidth;y+=act.offsetHeight;break;}
-x+=iLeft;y+=iTop;x=Math.max(Math.min(x,maxX),minX);y=Math.max(Math.min(y,maxY),minY);elmCache["clip"].style.left=x+"px";elmCache["clip"].style.top=y+"px";}
-function slideStart(){var x0=parseInt(elmCache["content"].style[pos]);var x1=_this.isOpen?0:-dim;if(a!=null)a.stop();a=new Accelimation(x0,x1,TransMenu.slideTime,slideAccel);a.onframe=slideFrame;a.onend=slideEnd;a.start();}
-function slideFrame(x){elmCache["content"].style[pos]=x+"px";}
-function slideEnd(){if(!_this.isOpen)elmCache["clip"].style.visibility="hidden";animating=false;}
-function initSize(){var ow=elmCache["items"].offsetWidth;var oh=elmCache["items"].offsetHeight;var ua=navigator.userAgent.toLowerCase();elmCache["clip"].style.width=ow+TransMenu.shadowSize+2+"px";elmCache["clip"].style.height=oh+TransMenu.shadowSize+2+"px";elmCache["content"].style.width=ow+TransMenu.shadowSize+"px";elmCache["content"].style.height=oh+TransMenu.shadowSize+"px";contentHeight=oh+TransMenu.shadowSize;contentWidth=ow+TransMenu.shadowSize;dim=iDirection==TransMenu.direction.down?contentHeight:contentWidth;elmCache["content"].style[pos]=-dim-TransMenu.shadowSize+"px";elmCache["clip"].style.visibility="hidden";if(ua.indexOf("mac")==-1||ua.indexOf("gecko")>-1){elmCache["background"].style.width=ow+"px";elmCache["background"].style.height=oh+"px";elmCache["background"].style.backgroundColor=TransMenu.backgroundColor;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].style.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize)+"px";elmCache["shadowRight"].style.backgroundColor=TransMenu.shadowColor;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].style.width=ow-TransMenu.shadowOffset+"px";elmCache["shadowBottom"].style.backgroundColor=TransMenu.shadowColor;}
-else{elmCache["background"].firstChild.src=TransMenu.backgroundPng;elmCache["background"].firstChild.width=ow;elmCache["background"].firstChild.height=oh;elmCache["shadowRight"].firstChild.src=TransMenu.shadowPng;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].firstChild.width=TransMenu.shadowSize;elmCache["shadowRight"].firstChild.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize);elmCache["shadowBottom"].firstChild.src=TransMenu.shadowPng;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].firstChild.height=TransMenu.shadowSize;elmCache["shadowBottom"].firstChild.width=ow-TransMenu.shadowOffset;}}
-function initCache(){var menu=document.getElementById(id);var all=menu.all?menu.all:menu.getElementsByTagName("*");elmCache={};elmCache["clip"]=menu;elmCache["item"]=[];for(var i=0,elm=null;elm=all[i];i++){switch(elm.className){case"items":case"content":case"background":case"shadowRight":case"shadowBottom":elmCache[elm.className]=elm;break;case"item":elm._index=elmCache["item"].length;elmCache["item"][elm._index]=elm;break;}}
-_this.elmCache=elmCache;}
-function initEvents(){for(var i=0,item=null;item=elmCache.item[i];i++){item.onmouseover=item_mouseover;item.onmouseout=item_mouseout;item.onclick=item_click;}
-if(typeof oActuator.tagName!="undefined"){oActuator.onmouseover=actuator_mouseover;oActuator.onmouseout=actuator_mouseout;}
-elmCache["content"].onmouseover=content_mouseover;elmCache["content"].onmouseout=content_mouseout;}
-function highlight(oRow){oRow.className="item hover";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOn;}
-function dehighlight(oRow){oRow.className="item";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOff;}
-function item_mouseover(){if(!animating){highlight(this);if(childMenus[this._index])childMenuSet.showMenu(childMenus[this._index]);else if(childMenuSet)childMenuSet.hide();}}
-function item_mouseout(){if(!animating){if(childMenus[this._index])childMenuSet.hideMenu(childMenus[this._index]);else dehighlight(this);}}
-function item_click(){if(!animating){if(_this.items[this._index].url)location.href=_this.items[this._index].url;}}
-function actuator_mouseover(){parentMenuSet.showMenu(_this);}
-function actuator_mouseout(){parentMenuSet.hideMenu(_this);}
-function content_mouseover(){if(!animating){parentMenuSet.showMenu(_this);_this.onmouseover();}}
-function content_mouseout(){if(!animating){parentMenuSet.hideMenu(_this);}}
-function child_mouseover(){if(!animating){parentMenuSet.showMenu(_this);}}
-function child_deactivate(){for(var i=0;i<childMenus.length;i++){if(childMenus[i]==this){dehighlight(elmCache["item"][i]);break;}}}
-function child_queue(){parentMenuSet.hideMenu(_this);}
-function child_dequeue(){parentMenuSet.showMenu(_this);}
-function toString(){var aHtml=[];var sClassName="transMenu"+(oActuator.constructor!=TransMenuItem?" top":"");for(var i=0,item=null;item=this.items[i];i++){aHtml[i]=item.toString(childMenus[i]);}
-return'<div id="'+id+'" class="'+sClassName+'">'+'<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">'+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr>'+aHtml.join('')+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr></table>'+'<div class="shadowBottom"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="shadowRight"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="background"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'</div></div>';}}
-TransMenuSet.registry=[];function TransMenuSet(iDirection,iLeft,iTop,iReferencePoint){this.addMenu=addMenu;this.showMenu=showMenu;this.hideMenu=hideMenu;this.hide=hide;this.hideCurrent=hideCurrent;var menus=[];var _this=this;var current=null;this.index=TransMenuSet.registry.length;TransMenuSet.registry[this.index]=this;function addMenu(oActuator){var m=new TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,this);menus[menus.length]=m;return m;}
-function showMenu(oMenu){if(oMenu!=current){if(current!=null)hide(current);current=oMenu;oMenu.show();}
-else{cancelHide(oMenu);}}
-function hideMenu(oMenu){if(current==oMenu&&oMenu.isOpen){if(!oMenu.hideTimer)scheduleHide(oMenu);}}
-function scheduleHide(oMenu){oMenu.onqueue();oMenu.hideTimer=window.setTimeout("TransMenuSet.registry["+_this.index+"].hide(TransMenu.registry["+oMenu.index+"])",TransMenu.hideDelay);}
-function cancelHide(oMenu){if(oMenu.hideTimer){oMenu.ondequeue();window.clearTimeout(oMenu.hideTimer);oMenu.hideTimer=null;}}
-function hide(oMenu){if(!oMenu&&current)oMenu=current;if(oMenu&&current==oMenu&&oMenu.isOpen){hideCurrent();}}
-function hideCurrent(){if (null != current){cancelHide(current);current.hideTimer=null;current.hide();current=null;}}}
-function TransMenuItem(sText,sUrl,oParent){this.toString=toString;this.text=sText;this.url=sUrl;this.parentMenu=oParent;function toString(bDingbat){var sDingbat=bDingbat?TransMenu.dingbatOff:TransMenu.spacerGif;var iEdgePadding=TransMenu.itemPadding+TransMenu.menuPadding;var sPaddingLeft="padding:"+TransMenu.itemPadding+"px; padding-left:"+iEdgePadding+"px;"
-var sPaddingRight="padding:"+TransMenu.itemPadding+"px; padding-right:"+iEdgePadding+"px;"
-return'<tr class="item"><td nowrap style="'+sPaddingLeft+'">'+sText+'</td><td width="14" style="'+sPaddingRight+'">'+'<img src="'+sDingbat+'" width="14" height="14"></td></tr>';}}
-function Accelimation(from,to,time,zip){if(typeof zip=="undefined")zip=0;if(typeof unit=="undefined")unit="px";this.x0=from;this.x1=to;this.dt=time;this.zip=-zip;this.unit=unit;this.timer=null;this.onend=new Function();this.onframe=new Function();}
-Accelimation.prototype.start=function(){this.t0=new Date().getTime();this.t1=this.t0+this.dt;var dx=this.x1-this.x0;this.c1=this.x0+((1+this.zip)*dx/3);this.c2=this.x0+((2+this.zip)*dx/3);Accelimation._add(this);}
-Accelimation.prototype.stop=function(){Accelimation._remove(this);}
-Accelimation.prototype._paint=function(time){if(time<this.t1){var elapsed=time-this.t0;this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));}
-else this._end();}
-Accelimation.prototype._end=function(){Accelimation._remove(this);this.onframe(this.x1);this.onend();}
-Accelimation._add=function(o){var index=this.instances.length;this.instances[index]=o;if(this.instances.length==1){this.timerID=window.setInterval("Accelimation._paintAll()",this.targetRes);}}
-Accelimation._remove=function(o){for(var i=0;i<this.instances.length;i++){if(o==this.instances[i]){this.instances=this.instances.slice(0,i).concat(this.instances.slice(i+1));break;}}
-if(this.instances.length==0){window.clearInterval(this.timerID);this.timerID=null;}}
-Accelimation._paintAll=function(){var now=new Date().getTime();for(var i=0;i<this.instances.length;i++){this.instances[i]._paint(now);}}
-Accelimation._B1=function(t){return t*t*t}
-Accelimation._B2=function(t){return 3*t*t*(1-t)}
-Accelimation._B3=function(t){return 3*t*(1-t)*(1-t)}
-Accelimation._B4=function(t){return(1-t)*(1-t)*(1-t)}
-Accelimation._getBezier=function(percent,startPos,endPos,control1,control2){return endPos*this._B1(percent)+control2*this._B2(percent)+control1*this._B3(percent)+startPos*this._B4(percent);}
-Accelimation.instances=[];Accelimation.targetRes=10;Accelimation.timerID=null;
-if(window.attachEvent){var cearElementProps=['data','onmouseover','onmouseout','onmousedown','onmouseup','ondblclick','onclick','onselectstart','oncontextmenu'];window.attachEvent("onunload", function() {var el;for(var d=document.all.length;d--;){el=document.all[d];for(var c=cearElementProps.length;c--;){el[cearElementProps[c]] = null;}}});} \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/jsevents/body.def b/src/usr/local/www/themes/code-red/jsevents/body.def
deleted file mode 100755
index 501d548..0000000
--- a/src/usr/local/www/themes/code-red/jsevents/body.def
+++ /dev/null
@@ -1,7 +0,0 @@
-# Format: <event_name>=<jsfunction_name> !<forbidden_page_0>,<forbidden_page_1>...<forbidden_page_n>
-# where: forbidden pages are those pages that should *not* use
-# the particular JavaScript function within the JS event
-# specified below.
-# $Id$
-#
-onload=tmenuinit(); !wizard.php \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/loader.js b/src/usr/local/www/themes/code-red/loader.js
deleted file mode 100644
index 7f67dc0..0000000
--- a/src/usr/local/www/themes/code-red/loader.js
+++ /dev/null
@@ -1,29 +0,0 @@
-//<![CDATA[
-var browser = '';
-var version = '';
-var entrance = '';
-var cond = '';
-
-// BROWSER?
-if (browser == '') {
- if (navigator.appName.indexOf('Microsoft') != -1)
- browser = 'IE';
- else if (navigator.appName.indexOf('Netscape') != -1)
- browser = 'Netscape';
- else
- browser = 'IE';
-}
-if (version == '') {
- version= navigator.appVersion;
- paren = version.indexOf('(');
- whole_version = navigator.appVersion.substring(0,paren-1);
- version = parseInt(whole_version);
-}
-
-if (browser == 'IE' && version < 7) {
- document.write('<script type="text/javascript" src="/themes/code-red/javascript/ie7/ie7-standard-p.js"></script>');
-}
-
-document.write('<script type="text/javascript" src="/themes/code-red/javascript/niftyjsCode.js"></script>');
-
-//]]>
diff --git a/src/usr/local/www/themes/code-red/login.css b/src/usr/local/www/themes/code-red/login.css
deleted file mode 100755
index 6ccdd42..0000000
--- a/src/usr/local/www/themes/code-red/login.css
+++ /dev/null
@@ -1,1136 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #999999;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- background: url('images/logon-background.gif') no-repeat;
- background-position : center 0px;
- background-color: #4a0203;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 10;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-
-#graph {
- position: relative;
- z-index: 10;
-}
-
-
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-
-#login {
-/* background: #cccccc; */
- background-color: transparent;
- border: 0px solid #cccccc;
- margin: 5em auto;
- padding: 0em;
- width: 400px;
-/* filter:alpha(opacity=60);
- -moz-opacity:0.6;
- -khtml-opacity: 0.6;
- opacity: 0.6; */
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
-/* background: #ffffff; */
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 400px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: -40px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -390px;
- left: 60px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- top: -300px; */
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- left: 10px;
- top: -300px; */
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- text-align: center;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -20px;
- left: 170px;
-}
-
-/* loginerror box follows */
-
-#login #inputerrors {
- background-color: transparent;
- border: 0px solid #666666;
- margin: 5em auto;
- vertical-align: middle;
- padding: 0em;
- width: 330px;
- height: 50px;
- position: relative;
- top: -112px;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/menu.inc b/src/usr/local/www/themes/code-red/menu.inc
deleted file mode 100755
index a274410..0000000
--- a/src/usr/local/www/themes/code-red/menu.inc
+++ /dev/null
@@ -1,177 +0,0 @@
-<?php
-/* $Id$ */
-/* ========================================================================== */
-/*
- menu.inc
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-require("menu.inc");
-
-define("TMENU_STUB", "
- // set up drop downs anywhere in the body of the page. I think the bottom of the page is better..
- // but you can experiment with effect on loadtime.
- if (TransMenu.isSupported()) {
-
- //==================================================================================================
- // create a set of dropdowns
- //==================================================================================================
- // the first param should always be down, as it is here
- //
- // The second and third param are the top and left offset positions of the menus from their actuators
- // respectively. To make a menu appear a little to the left and bottom of an actuator, you could use
- // something like -5, 5
- //
- // The last parameter can be .topLeft, .bottomLeft, .topRight, or .bottomRight to inidicate the corner
- // of the actuator from which to measure the offset positions above. Here we are saying we want the
- // menu to appear directly below the bottom left corner of the actuator
- //==================================================================================================
- var ms = new TransMenuSet(TransMenu.direction.down, 1, 0, TransMenu.reference.bottomLeft);
-
- //==================================================================================================
- // create a dropdown menu
- //==================================================================================================
- // the first parameter should be the HTML element which will act actuator for the menu
- //==================================================================================================
-
- @@MENU_DEFINITIONS@@
-
- //==================================================================================================
- // write drop downs into page
- //==================================================================================================
- // this method writes all the HTML for the menus into the page with document.write(). It must be
- // called within the body of the HTML page.
- //==================================================================================================
- TransMenu.renderAll();
- }
-");
-
-class NervecenterMenu extends Menu {
- private $menuJScript = "NOT-SET";
- private $menuJScriptEvents = "NOT-SET";
- private $menuID = "NOT-SET";
-
- public function __construct($identification = "", $filename = "", Component $c = NULL) {
- parent::__construct($identification, $filename, $c);
-
- $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
- $this->menuID = $id;
-
- if ($this->hasParent()) {
- $this->menuJScript = "\tvar {$id} = ms.addMenu(document.getElementById('{$id}'));\n";
- }
- } // end __construct
-
- public function getMenuID() {
- return $this->menuID;
- }
-
- public function setMenuID($myMenuID) {
- $this->menuID = $myMenuID;
- }
-
- public function getMenuJScript() {
- $childJScript = "";
- foreach ($this->getChildren() as $component) {
- $childJScript .= $component->getMenuJScript();
- }
-
- if (! $this->hasParent()) {
- $this->menuJScript = str_replace("@@MENU_DEFINITIONS@@", $childJScript, TMENU_STUB);
- } else {
- $this->menuJScript .= "\n$childJScript\n";
- }
-
- return $this->menuJScript;
- }
-
- public function getMenuJScriptEvents() {
- return $this->menuJScriptEvents;
- }
-
- public function __toString() {
- if (! $this->hasParent()) {
- $menuMarkup =<<<EOD
- <div id="menu">
- @@CHILD_ELEMENTS@@
- </div>
-
-EOD;
- } else {
- $name = gettext($this->getID());
- $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
-
- $menuMarkup =<<<EOD
- <a id="{$id}" href="#">{$name}</a>
- @@CHILD_ELEMENTS@@
-EOD;
- }
-
- $childMarkup = "";
- foreach ($this->getChildren() as $component) {
- $childMarkup .= $component;
- }
-
- $menuMarkup = str_replace("@@CHILD_ELEMENTS@@", $childMarkup, $menuMarkup);
-
- return $menuMarkup;
- }
-}
-
-class NervecenterMenuItem extends MenuItem {
- private $menuJScript = "NOT-SET";
- private $menuJScriptEvents = "NOT-SET";
-
- public function __construct($identification = "", $filename = "", $href = "", Component $c = NULL) {
- parent::__construct($identification, $filename, $href, $c);
-
- $href = $this->getHref() <> "" ? $this->getHref() : "{$this->getFile()}";
- $name = gettext($this->getID());
- $file = $this->getFile();
-
- $this->menuJScript = $this->check_access("{$file}", "\t{$this->getParent()->getMenuID()}.addItem('{$name}', '{$href}');\n");
- }
-
- public function getMenuJScript() {
- return $this->menuJScript;
- }
-
- public function getMenuJScriptEvents() {
- return $this->menuJScriptEvents;
- }
-
- public function __toString() {
- return "";
- }
-}
-
-?>
diff --git a/src/usr/local/www/themes/code-red/new_tab_menu.css b/src/usr/local/www/themes/code-red/new_tab_menu.css
deleted file mode 100644
index 04c4cf2..0000000
--- a/src/usr/local/www/themes/code-red/new_tab_menu.css
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- new_tab_menu.css
- part of pfSense
- Copyright (C) 2010-2011 Robert Zelaya
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
-
- Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
- The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
-
- <tr>
- <td>
- <?php
- $tab_array_indent = 0; // move to the line in px
- $tab_array_space = 1; // space betwen lines in px
- $tab_array_char_limit = 82; // number or chr before the drop down box
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
-
-*/
-
-.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
-
-.newtabmenu li{float:left; margin-right:2px; text-align: center;}
-.newtabmenu a:link, .newtabmenu a:visited{
- background:url(images/new_tab_menu.png) right 45px;
- color:#ffffff; /* noactive font */
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- font-weight:bold;
- font-size:.9em;
- height:20px;
- line-height:20px;
- text-decoration:none;
-}
-.newtabmenu a span{
- background:url(images/new_tab_menu.png) left 45px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- height:20px;
- margin-right:7px;
- padding-left:7px;
-}
-.newtabmenu a:hover{
- background:url(images/new_tab_menu.png) right 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- color:#ffffff; /* hover over font */
-}
-.newtabmenu a:hover span{
- background:url(images/new_tab_menu.png) left 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
-}
-
-/* -------------------------------- */
-/* ACTIVE ELEMENTS */
-.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
- color:#000000; /* active font */
- background:url(images/new_tab_menu.png) right 0 no-repeat;
-}
-.newtabmenu_active a span, .newtabmenu_active a:hover span{
- background:url(images/new_tab_menu.png) left 0 no-repeat;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/no_big_logo b/src/usr/local/www/themes/code-red/no_big_logo
deleted file mode 100755
index 6e5c70d..0000000
--- a/src/usr/local/www/themes/code-red/no_big_logo
+++ /dev/null
@@ -1 +0,0 @@
-NO! DONT! \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/rrdcolors.inc.php b/src/usr/local/www/themes/code-red/rrdcolors.inc.php
deleted file mode 100755
index dcb7a39..0000000
--- a/src/usr/local/www/themes/code-red/rrdcolors.inc.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/* $Id$ */
-/*
- rrdcolors.inc.php
- Part of pfSense
- Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/* This file is included by the RRD graphing page and sets the colors */
-
-/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* 95th Percentile Lines Out, In */
-$colortraffic95 = array('660000', 'FF0000');
-
-/* State Table pfrate, pfstates, pfnat, srcip, dstip */
-$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
-
-/* Processor Usage user, nice, system, int, processes */
-$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
-
-/* Memory Usage active, inact, free, cache, wire */
-$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
-
-/* MBUF Usage current, cache, total, max */
-$colormbuf = array('0080FF','00E344','FF0000','000000');
-
-/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
-$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
-$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
-/* Quality Graph Loss */
-$colorqualityloss = 'ee0000';
-
-/* Wireless Graph SNR, Rate, Channel*/
-/* Cellular Graph RSSI, */
-$colorwireless = array('333333','a83c3c','999999');
-
-/* SPAMD Times min area, avg area, max area, Time line */
-$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
-/* SPAMD Connections max area, min area, min line, max line, avg line */
-$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
-
-/* OpenVPN Users Online Users */
-$colorvpnusers = array('990000');
-
-/* Captive Portal Total Users Total Users */
-/* Captive Portal Concurrent Concurrent Users */
-$colorcaptiveportalusers = array('990000');
-
-?>
diff --git a/src/usr/local/www/themes/code-red/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/code-red/styles/jquery-ui-1.11.1.css
deleted file mode 100644
index 8a8c54f..0000000
--- a/src/usr/local/www/themes/code-red/styles/jquery-ui-1.11.1.css
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*! jQuery UI - v1.11.1 - 2014-09-22
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.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:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-clearfix {
- min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* 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: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.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: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- 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;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- min-height: 0; /* support: IE7 */
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
- position: absolute;
- left: .5em;
- top: 50%;
- margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-button {
- display: inline-block;
- position: relative;
- padding: 0;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
- width: 2.4em;
-}
-.ui-button-icons-only {
- width: 3.4em;
-}
-button.ui-button-icons-only {
- width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
- display: block;
- line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
- padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
- padding: .4em;
- text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
- padding-left: 2.1em;
- padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
- padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
- position: absolute;
- top: 50%;
- margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
- left: 50%;
- margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
- left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
- right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
- margin-right: 7px;
-}
-.ui-buttonset .ui-button {
- margin-left: 0;
- margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.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 {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.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,
-.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%;
- font-size: 0;
-}
-
-/* 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,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-.ui-dialog {
- overflow: hidden;
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
- width: 12px;
- height: 12px;
- right: -5px;
- bottom: -5px;
- background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: none;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- position: relative;
- margin: 0;
- padding: 3px 1em 3px .4em;
- cursor: pointer;
- min-height: 0; /* support: IE7 */
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-progressbar {
- height: 1em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
- background-color: #990000;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
- height: 100%;
- filter: alpha(opacity=25); /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- /* Support: IE7 */
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-button {
- display: inline-block;
- overflow: hidden;
- position: relative;
- text-decoration: none;
- cursor: pointer;
-}
-.ui-selectmenu-button span.ui-icon {
- right: 0.5em;
- left: auto;
- margin-top: -8px;
- position: absolute;
- top: 50%;
-}
-.ui-selectmenu-button span.ui-selectmenu-text {
- text-align: left;
- padding: 0.4em 2.1em 0.4em 1em;
- display: block;
- line-height: 1.4;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.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;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.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;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 22px;
-}
-.ui-spinner-button {
- width: 16px;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top: none;
- border-bottom: none;
- border-right: none;
-}
-/* vertically center icon */
-.ui-spinner .ui-icon {
- position: absolute;
- margin-top: -8px;
- top: 50%;
- left: 0;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
- /* need to fix icons sprite */
- background-position: -65px -16px;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
- -webkit-box-shadow: 0 0 5px #aaa;
- box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #aaaaaa;
- background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #bbbbbb;
- /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
- color: #444444;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #444444;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #cccccc;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #3383bb;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #3383bb;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #bbbbbb;
- background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #599fcf;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited {
- color: #599fcf;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #999999;
- background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #ffffff;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #ffffff;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
- color: #444444;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #444444;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #c0402a;
- background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
- color: #ffffff;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #ffffff;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #ffffff;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70); /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35); /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-state-default .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-active .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
-}
-.ui-state-highlight .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.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-on { background-position: -96px -144px; }
-.ui-icon-radio-off { 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-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.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-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 6px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
- opacity: .8;
- filter: Alpha(Opacity=80); /* support: IE8 */
-}
-.ui-widget-shadow {
- margin: -4px 0 0 -4px;
- padding: 4px;
- background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
- opacity: .6;
- filter: Alpha(Opacity=60); /* support: IE8 */
- border-radius: 0pxdow;
-}
diff --git a/src/usr/local/www/themes/code-red/styles/menustyles.css b/src/usr/local/www/themes/code-red/styles/menustyles.css
deleted file mode 100755
index 06b3c7a..0000000
--- a/src/usr/local/www/themes/code-red/styles/menustyles.css
+++ /dev/null
@@ -1,44 +0,0 @@
-#navigation {
- /* border:1px solid black; */
- width: 98%;
- vertical-align: middle;
- height: 16px;
- padding-top: 4px;
- }
-
-#menu {
- /* background: #990000; */
- /* border-bottom:1px solid white; */
- padding: 0 0 0 0;
- width: 98%;
- vertical-align: middle;
- height: 16px;
- }
-#menu a {
- padding: 2px 28px 4px 28px;
- text-decoration: none;
- font-weight: bold;
- font-size: 1.0em;
- color: #FFFFFF;
- width: 08%;
- height: 16px;
- }
-#menu a.hover {
- background: #AF2020;
- }
-#menu span {
- display: none;
- }
-
-#subnav {
- font-size: 10px;
- margin-bottom: 2em;
- }
-#subnav a {
- color: #FF0000; /* #FB3B00; */
- margin-right: 1em;
- }
-#subnav span {
- color: silver;
- margin-right: 1em;
- }
diff --git a/src/usr/local/www/themes/code-red/styles/transmenu.css b/src/usr/local/www/themes/code-red/styles/transmenu.css
deleted file mode 100755
index f683574..0000000
--- a/src/usr/local/www/themes/code-red/styles/transmenu.css
+++ /dev/null
@@ -1,75 +0,0 @@
-/* this is the clipping region for the menu. it's width and height get set by script, depending on the size of the items table */
-.transMenu {
- position:absolute;
- overflow:hidden;
- left:-1000px;
- top:-1000px;
- }
-
-/* this is the main container for the menu itself. it's width and height get set by script, depending on the size of the items table */
-.transMenu .content {
- position:absolute;
- }
-
-/* this table comprises all menu items. each TR is one item. It is relatively positioned so that the shadow and background transparent divs can be positioned underneath it */
-.transMenu .items {
- position:relative;
- left:0px; top:0px;
- z-index:2;
- }
-
-.transMenu.top .items {
- border-top:none;
- }
-
-/* each TR.item is one menu item */
-.transMenu .item {
- color: #FFFFFF; /* #336; */
- font-size: 1.1em;
- font-weight: normal;
- font-family:sans-serif;
- text-decoration:none;
- /* this is a hack for mac/ie5, whom incorrectly cascades the border properties of the parent table to each row */
- border:none;
- cursor:pointer;
- cursor:hand;
- }
-
-/* this DIV is the semi-transparent white background of each menu. the -moz-opacity is a proprietary way to get transparency in mozilla, the filter is for IE/windows 5.0+. */
-/* we set the background color in script because ie mac does not use it; that browser only uses a semi-transparent white PNG that the spacer gif inside this DIV is replaced by */
-.transMenu .background {
- position:absolute;
- left:0px; top:0px;
- z-index:1;
- -moz-opacity:.8;
- filter:alpha(opacity=80);
- }
-
-/* same concept as .background, but this is the sliver of shadow on the right of the menu. It's left, height, and background are set by script. In IE5/mac, it uses a PNG */
-.transMenu .shadowRight {
- position:absolute;
- z-index:3;
- top:3px; width:2px;
- -moz-opacity:.4;
- filter:alpha(opacity=40);
- }
-
-/* same concept as .background, but this is the sliver of shadow on the bottom of the menu. It's top, width, and background are set by script. In IE5/mac, it uses a PNG */
-.transMenu .shadowBottom {
- position:absolute;
- z-index:1;
- left:3px; height:2px;
- -moz-opacity:.4;
- filter:alpha(opacity=40);
- }
-
-/* this is the class that is used when the mouse is over an item. script sets the row to this class when required. */
-.transMenu .item.hover {
- background:#fdfdfd;
- color:black;
- }
-
-/* this is either the dingbat that indicates there is a submenu, or a spacer gif in it's place. We give it extra margin to create some space between the text and the dingbat */
-.transMenu .item img {
- margin-left:10px;
- } \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/wizard.css b/src/usr/local/www/themes/code-red/wizard.css
deleted file mode 100755
index c0a7546..0000000
--- a/src/usr/local/www/themes/code-red/wizard.css
+++ /dev/null
@@ -1,1068 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.nowrap { white-space: nowrap; }
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #5f0406;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- background: url('images/logon-background.gif') no-repeat;
- background-position : center 0px;
- background-color: #4a0203;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 10;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-
-#graph {
- position: relative;
- z-index: 10;
-}
-
-
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
diff --git a/src/usr/local/www/themes/metallic/all.css b/src/usr/local/www/themes/metallic/all.css
deleted file mode 100644
index 18a8c0b..0000000
--- a/src/usr/local/www/themes/metallic/all.css
+++ /dev/null
@@ -1,1269 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, sans-serif;
- font-size: 0.9em;
-}
-
-.nowrap { white-space: nowrap; }
-
-.infobox {
- width:100%;
-}
-
-.addgatewaybox {
- background-color: #990000;
- border-style: none none none none;
- width: 225px;
-}
-
-.infoboxsave {
- padding-right: 10px;
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-.inputerrorsleft {
- background-color: #990000;
- width: 36px;
-}
-
-.inputerrorsright {
- background-color: #FFD9D1;
- color: #000000;
- font-size: 11px;
- padding-left: 8px;
- padding-top: 6px;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 220px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 11px;
- font-family: "Trebuchet MS", sans-serif;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- background-color: #333333;
- margin: 5px auto;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 815px;
- margin: 5px auto;
-}
-
-#header {
- background: url('images/header.gif') no-repeat;
- background-position: 4px;
- height: 102px;
- width: 808px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.gif') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: bold;
- font-family: Verdana;
- text-align: center;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 4px;
- margin-top: 0px;
- margin-left: 5px;
- padding-top: 0px;
- width: 800px;
- background: url('images/horizontal.gif') repeat-y;
-}
-
-#left {
- width: 800px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.gif') no-repeat;
- top: -18px;
- left: 7px;
- width: 800px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- position: relative;
- top: -24px;
- left: -4px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- width: 80px;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #505050;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background: url('images/metal_bgr.gif') repeat-x;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background: url('images/metal_bgr_red.gif') repeat-x;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 5px;
- margin-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/metallic/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/metallic/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/metallic/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/metallic/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/metallic/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/metallic/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/metallic/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/metallic/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/metallic/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/metallic/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/metallic/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/metallic/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/metallic/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/metallic/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/metallic/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/metallic/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/metallic/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/metallic/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #FFFFFF;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listrborder {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-left: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- color: #FFFFFF;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #DDDDDD;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 6px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password, #password2 {
- font-size: small;
- width: 60%;
- padding-left: 19px;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-
-/* Widget CSS */
-.widgetsubheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #B1B1B1;
- padding-right: 6px;
- padding-left: 6px;
- color: #000000;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetdiv{
- margin:5px;
- padding: 5px;
- background:#CCCCCC;
-}
-.widgetconfigdiv{
- background:#BBBBBB;
- font-size: 11px;
- color: #000000;
- padding-right: 5px;
- padding-left: 5px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-div#log div.log-entry-mini {
- clear: both;
-}
-
-div#log div.log-entry-mini span {
- padding: 2px 2px 2px 2px;
- padding-left: 6px;
-}
-
-div#log span.log-action-mini-header,
-div#log span.log-time-mini-header,
-div#log span.log-interface-mini-header,
-div#log span.log-source-mini-header,
-div#log span.log-destination-mini-header,
-div#log span.log-protocol-mini-header {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 12px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-time-mini,
-div#log span.log-interface-mini,
-div#log span.log-source-mini,
-div#log span.log-destination-mini,
-div#log span.log-protocol-mini {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 11px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-action-mini-header {
- width: 6%;
-}
-
-div#log span.log-time-mini,
-div#log span.log-time-mini-header {
- width: 19%;
-}
-
-div#log span.log-interface-mini,
-div#log span.log-interface-mini-header {
- width: 8%;
-}
-
-div#log span.log-source-mini,
-div#log span.log-source-mini-header {
- width: 23%;
-}
-
-div#log span.log-destination-mini,
-div#log span.log-destination-mini-header {
- width: 31%;
-}
-
-div#log span.log-protocol-mini,
-div#log span.log-protocol-mini-header {
- width: 8%;
- border-right: 1px solid #999;
-}
-
-/* Sortable tables */
-table.sortable thead {
- cursor: default;
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-
-/*thermal_sensors widget styles*/
-
-.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
-.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
-.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
- background-color: LimeGreen;
- border-top-width: 2px; border-top-color: Lime;
- border-left-width: 0px;
- border-right-width: 0px;
- border-bottom-width: 2px; border-bottom-color: Green;
-}
-.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
-.thermalSensorText { float: left; height: 20px; top: 3px; }
-.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
-
-.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-
-.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
-
-.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
-
-/* widget textarea styles - full width */
-.textarea_widget {
- width: 100%;
- resize:vertical;
- -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
- -moz-box-sizing: border-box; /* Firefox, other Gecko */
- box-sizing: border-box; /* IE 8+ */
-}
diff --git a/src/usr/local/www/themes/metallic/apple-touch-icon.png b/src/usr/local/www/themes/metallic/apple-touch-icon.png
deleted file mode 100755
index 7a4b975..0000000
--- a/src/usr/local/www/themes/metallic/apple-touch-icon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/bottom-loader.js b/src/usr/local/www/themes/metallic/bottom-loader.js
deleted file mode 100644
index a21f775..0000000
--- a/src/usr/local/www/themes/metallic/bottom-loader.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//<![CDATA[
-
- NiftyCheck();
- Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
- Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
- Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
- Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
- Rounded("div#topbox","all","#FFF","#990000","smooth");
-
-//]]>
diff --git a/src/usr/local/www/themes/metallic/images/alert_bgr.gif b/src/usr/local/www/themes/metallic/images/alert_bgr.gif
deleted file mode 100755
index 65498f1..0000000
--- a/src/usr/local/www/themes/metallic/images/alert_bgr.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/footer.gif b/src/usr/local/www/themes/metallic/images/footer.gif
deleted file mode 100755
index f7c2af7..0000000
--- a/src/usr/local/www/themes/metallic/images/footer.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/header.gif b/src/usr/local/www/themes/metallic/images/header.gif
deleted file mode 100755
index 0a44068..0000000
--- a/src/usr/local/www/themes/metallic/images/header.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/help.png b/src/usr/local/www/themes/metallic/images/help.png
deleted file mode 100755
index 1de05e3..0000000
--- a/src/usr/local/www/themes/metallic/images/help.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/horizontal.gif b/src/usr/local/www/themes/metallic/images/horizontal.gif
deleted file mode 100755
index a280dcb..0000000
--- a/src/usr/local/www/themes/metallic/images/horizontal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/favicon.ico b/src/usr/local/www/themes/metallic/images/icons/favicon.ico
deleted file mode 100755
index 3440bf2..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_3g.gif b/src/usr/local/www/themes/metallic/images/icons/icon_3g.gif
deleted file mode 100755
index 46ccb92..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_3g.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/metallic/images/icons/icon_3g_inactive.gif
deleted file mode 100755
index cf983e4..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_3g_inactive.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_advanced.gif b/src/usr/local/www/themes/metallic/images/icons/icon_advanced.gif
deleted file mode 100755
index 3ede1ff..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_advanced.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/metallic/images/icons/icon_advanced_s.gif
deleted file mode 100755
index b233549..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_advanced_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_alert.gif b/src/usr/local/www/themes/metallic/images/icons/icon_alert.gif
deleted file mode 100755
index 7646941..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_alert.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/metallic/images/icons/icon_alias_host.gif
deleted file mode 100755
index ad43e17..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_alias_host.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/metallic/images/icons/icon_alias_net.gif
deleted file mode 100755
index abd1b8b..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_alias_net.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/metallic/images/icons/icon_alias_port.gif
deleted file mode 100755
index 4acf2aa..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_alias_port.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/metallic/images/icons/icon_alias_url.gif
deleted file mode 100755
index 660571e..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_alias_url.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/metallic/images/icons/icon_alias_url_reload.gif
deleted file mode 100755
index 55c1c4a..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_alias_url_reload.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_block.gif b/src/usr/local/www/themes/metallic/images/icons/icon_block.gif
deleted file mode 100755
index 670c968..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_block.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_block_add.gif b/src/usr/local/www/themes/metallic/images/icons/icon_block_add.gif
deleted file mode 100755
index eb726d6..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_block_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_block_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_block_d.gif
deleted file mode 100755
index e6345fe..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_block_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/metallic/images/icons/icon_cablenic.gif
deleted file mode 100755
index a071c66..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_cablenic.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_cal.gif b/src/usr/local/www/themes/metallic/images/icons/icon_cal.gif
deleted file mode 100755
index a9c7c87..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_cal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_cal_mo.gif
deleted file mode 100755
index 1647e2f..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_cal_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_carp.gif b/src/usr/local/www/themes/metallic/images/icons/icon_carp.gif
deleted file mode 100755
index 9454a82..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_carp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_carp_d.gif
deleted file mode 100755
index 2ba8db2..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_carp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_chain.png b/src/usr/local/www/themes/metallic/images/icons/icon_chain.png
deleted file mode 100644
index 12db07a..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_chain.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_check.gif b/src/usr/local/www/themes/metallic/images/icons/icon_check.gif
deleted file mode 100755
index 393674d..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_check.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/metallic/images/icons/icon_clock_green.gif
deleted file mode 100755
index e171ba8..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_clock_green.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/metallic/images/icons/icon_clock_grey.gif
deleted file mode 100755
index 00c865a..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_clock_grey.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/metallic/images/icons/icon_clock_red.gif
deleted file mode 100755
index 7b412ee..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_clock_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_close.gif b/src/usr/local/www/themes/metallic/images/icons/icon_close.gif
deleted file mode 100755
index e0f86a7..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_close.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_configure.gif b/src/usr/local/www/themes/metallic/images/icons/icon_configure.gif
deleted file mode 100755
index 7182e0d..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_configure.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_down.gif b/src/usr/local/www/themes/metallic/images/icons/icon_down.gif
deleted file mode 100755
index b71a9c5..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_down_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_down_d.gif
deleted file mode 100755
index 70a7473..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_down_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_down_mo.gif
deleted file mode 100755
index 584587a..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_down_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_e.gif b/src/usr/local/www/themes/metallic/images/icons/icon_e.gif
deleted file mode 100755
index 2950800..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_e.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_e_mo.gif
deleted file mode 100755
index 9ba5738..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_e_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_error.gif b/src/usr/local/www/themes/metallic/images/icons/icon_error.gif
deleted file mode 100755
index e0fa659..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_error.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_exclam.gif b/src/usr/local/www/themes/metallic/images/icons/icon_exclam.gif
deleted file mode 100755
index 36c2ec7..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_exclam.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_flag_de.png b/src/usr/local/www/themes/metallic/images/icons/icon_flag_de.png
deleted file mode 100755
index 069cbbe..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_flag_de.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_flag_en.png b/src/usr/local/www/themes/metallic/images/icons/icon_flag_en.png
deleted file mode 100755
index bd7f9a5..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_flag_en.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_flag_es.png b/src/usr/local/www/themes/metallic/images/icons/icon_flag_es.png
deleted file mode 100755
index 434776c..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_flag_es.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/metallic/images/icons/icon_flag_pt_BR.png
deleted file mode 100755
index f786349..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_flag_pt_BR.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_cert.png
deleted file mode 100755
index 48a34b6..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_cert.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_file.png
deleted file mode 100755
index 48a9ed2..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_file.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_group.png
deleted file mode 100755
index 7d929c0..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_host.png
deleted file mode 100755
index 867ef2c..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_host.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_imp.png
deleted file mode 100755
index f667cfc..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_imp.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_mail.png
deleted file mode 100755
index d2d4548..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_mail.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_pwd.png
deleted file mode 100755
index 06b53a1..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_pwd.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_search.png
deleted file mode 100755
index 33de926..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_search.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_time.png
deleted file mode 100755
index aa8300a..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_time.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_unknown.png
deleted file mode 100755
index 1857d0e..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_unknown.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_url.png
deleted file mode 100755
index cf56792..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_url.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_user.png
deleted file mode 100755
index e00eebe..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/metallic/images/icons/icon_fw-update.gif
deleted file mode 100755
index 52c18ac..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_fw-update.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_help.gif b/src/usr/local/www/themes/metallic/images/icons/icon_help.gif
deleted file mode 100644
index 84c84db..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_help.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/metallic/images/icons/icon_ifalias.gif
deleted file mode 100755
index 0c569a7..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_ifalias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_ifalias_d.gif
deleted file mode 100755
index faa84d4..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_ifalias_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/metallic/images/icons/icon_import_alias.gif
deleted file mode 100755
index d11a5f0..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_import_alias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_in.gif b/src/usr/local/www/themes/metallic/images/icons/icon_in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_in_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/metallic/images/icons/icon_info_pkg.gif
deleted file mode 100755
index cd3a532..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_info_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/metallic/images/icons/icon_interface_down.gif
deleted file mode 100755
index 0626655..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_interface_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/metallic/images/icons/icon_interface_up.gif
deleted file mode 100755
index 1449513..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_interface_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_left.gif b/src/usr/local/www/themes/metallic/images/icons/icon_left.gif
deleted file mode 100755
index 8effefe..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_left_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_left_d.gif
deleted file mode 100755
index c778014..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_left_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_left_mo.gif
deleted file mode 100755
index 84c6fa2..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_left_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_log.gif b/src/usr/local/www/themes/metallic/images/icons/icon_log.gif
deleted file mode 100755
index 4a1983a..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_log.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_log_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_log_d.gif
deleted file mode 100755
index d31bd9b..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_log_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_log_s.gif b/src/usr/local/www/themes/metallic/images/icons/icon_log_s.gif
deleted file mode 100755
index f9fda33..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_log_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_log_s_d.gif
deleted file mode 100755
index fb2c05f..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_log_s_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_logs.gif b/src/usr/local/www/themes/metallic/images/icons/icon_logs.gif
deleted file mode 100644
index afe0104..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_logs.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_match.gif b/src/usr/local/www/themes/metallic/images/icons/icon_match.gif
deleted file mode 100644
index 215571f..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_match.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_match_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_match_d.gif
deleted file mode 100644
index 6e4c364..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_match_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_minus.gif b/src/usr/local/www/themes/metallic/images/icons/icon_minus.gif
deleted file mode 100755
index 417544f..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_minus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_open.gif b/src/usr/local/www/themes/metallic/images/icons/icon_open.gif
deleted file mode 100755
index ac3da14..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_open.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_other.gif b/src/usr/local/www/themes/metallic/images/icons/icon_other.gif
deleted file mode 100755
index e6f780f..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_other.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_other_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_other_d.gif
deleted file mode 100755
index b08d970..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_other_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_out.gif b/src/usr/local/www/themes/metallic/images/icons/icon_out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_out_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_parp.gif b/src/usr/local/www/themes/metallic/images/icons/icon_parp.gif
deleted file mode 100755
index 96acaf3..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_parp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_parp_d.gif
deleted file mode 100755
index 7d7d00e..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_parp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_pass.gif b/src/usr/local/www/themes/metallic/images/icons/icon_pass.gif
deleted file mode 100755
index fe1bb0d..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_pass.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/metallic/images/icons/icon_pass_add.gif
deleted file mode 100755
index f7f4c20..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_pass_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_pass_d.gif
deleted file mode 100755
index 6adc431..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_pass_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_plus.gif b/src/usr/local/www/themes/metallic/images/icons/icon_plus.gif
deleted file mode 100755
index 2a94eeb..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_plus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/metallic/images/icons/icon_plus_bl.gif
deleted file mode 100755
index 8dcd7c0..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_plus_bl.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/metallic/images/icons/icon_plus_bl_p.gif
deleted file mode 100755
index 0c79849..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_plus_bl_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_plus_d.gif
deleted file mode 100755
index ebc7457..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_plus_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_plus_mo.gif
deleted file mode 100755
index 1c7ca08..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_plus_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/metallic/images/icons/icon_plus_p.gif
deleted file mode 100755
index eb41284..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_plus_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall.gif
deleted file mode 100755
index d78b867..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_d.gif
deleted file mode 100755
index 13658f7..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_mo.gif
deleted file mode 100755
index 90b576e..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg.gif
deleted file mode 100755
index 9aebb03..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_d.gif
deleted file mode 100755
index 4ab4992..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_mo.gif
deleted file mode 100755
index 7025d20..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml.gif
deleted file mode 100755
index 4542432..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_d.gif
deleted file mode 100755
index 8d3a68d..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_mo.gif
deleted file mode 100755
index 15e0aed..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reject.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reject.gif
deleted file mode 100755
index 5565cd6..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_reject.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reject_d.gif
deleted file mode 100755
index 6c09fae..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_reject_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_right.gif b/src/usr/local/www/themes/metallic/images/icons/icon_right.gif
deleted file mode 100755
index fdf2d8b..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_restart.gif
deleted file mode 100755
index e49fbd7..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_service_restart.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_restart_d.gif
deleted file mode 100755
index a5d6d7c..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_service_restart_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_running.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_running.gif
deleted file mode 100644
index 543fd56..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_service_running.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_start.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_start.gif
deleted file mode 100755
index 09bb58f..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_service_start.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_start_d.gif
deleted file mode 100755
index f58f111..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_service_start_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_status.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_status.gif
deleted file mode 100644
index a93bcfb..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_service_status.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_stop.gif
deleted file mode 100755
index 922addc..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_service_stop.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_stop_d.gif
deleted file mode 100755
index b4cfdea..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_service_stop_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_stopped.gif
deleted file mode 100644
index f93a25d..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_service_stopped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_services_restart_mo.gif
deleted file mode 100755
index a092b40..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_services_restart_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_services_start_mo.gif
deleted file mode 100755
index ecdb58f..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_services_start_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_services_stop_mo.gif
deleted file mode 100755
index c00e208..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_services_stop_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/metallic/images/icons/icon_system-group-grey.png
deleted file mode 100755
index d7b964d..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_system-group-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_system-group.png b/src/usr/local/www/themes/metallic/images/icons/icon_system-group.png
deleted file mode 100755
index 1c974f2..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_system-group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/metallic/images/icons/icon_system-user-grey.png
deleted file mode 100755
index 2f6047d..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_system-user-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_system-user.png b/src/usr/local/www/themes/metallic/images/icons/icon_system-user.png
deleted file mode 100755
index ef82156..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_system-user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/metallic/images/icons/icon_system_lock_screen.png
deleted file mode 100755
index 30f306d..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_system_lock_screen.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_system_logout.png b/src/usr/local/www/themes/metallic/images/icons/icon_system_logout.png
deleted file mode 100755
index 9bbb6c7..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_system_logout.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_trapped.gif b/src/usr/local/www/themes/metallic/images/icons/icon_trapped.gif
deleted file mode 100755
index ffeb2cd..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_trapped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/metallic/images/icons/icon_trapped_p.gif
deleted file mode 100755
index 6d46aaf..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_trapped_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/metallic/images/icons/icon_ts_rule.gif
deleted file mode 100755
index e15ab6c..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_ts_rule.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_ts_rule_d.gif
deleted file mode 100755
index f776281..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_ts_rule_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_up.gif b/src/usr/local/www/themes/metallic/images/icons/icon_up.gif
deleted file mode 100755
index 883c5a2..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_up_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_up_d.gif
deleted file mode 100755
index 0ddcce2..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_up_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_up_mo.gif
deleted file mode 100755
index 9f869a4..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_up_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_wlan.gif b/src/usr/local/www/themes/metallic/images/icons/icon_wlan.gif
deleted file mode 100755
index 1f0addc..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_wlan.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_wlan_d.gif
deleted file mode 100755
index 35bf580..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_wlan_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/metallic/images/icons/icon_wol_all.gif
deleted file mode 100755
index 2d22182..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_wol_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/metallic/images/icons/icon_wzd_nsaved.png
deleted file mode 100755
index 21cb27d..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_wzd_nsaved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/metallic/images/icons/icon_wzd_saved.png
deleted file mode 100755
index ab82946..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_wzd_saved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_x.gif b/src/usr/local/www/themes/metallic/images/icons/icon_x.gif
deleted file mode 100755
index 24e4d49..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_x_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_x_d.gif
deleted file mode 100755
index d2bfbc8..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_x_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_x_mo.gif
deleted file mode 100755
index da7b57c..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_x_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_x_p.gif b/src/usr/local/www/themes/metallic/images/icons/icon_x_p.gif
deleted file mode 100755
index 8828fa6..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/icon_x_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/in.gif b/src/usr/local/www/themes/metallic/images/icons/in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/in_d.gif b/src/usr/local/www/themes/metallic/images/icons/in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/out.gif b/src/usr/local/www/themes/metallic/images/icons/out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/out_d.gif b/src/usr/local/www/themes/metallic/images/icons/out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/metallic/images/icons/out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/log.png b/src/usr/local/www/themes/metallic/images/log.png
deleted file mode 100755
index 762ba80..0000000
--- a/src/usr/local/www/themes/metallic/images/log.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/logo.gif b/src/usr/local/www/themes/metallic/images/logo.gif
deleted file mode 100755
index 08638ff..0000000
--- a/src/usr/local/www/themes/metallic/images/logo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/logobig.jpg b/src/usr/local/www/themes/metallic/images/logobig.jpg
deleted file mode 100755
index 2ef196d..0000000
--- a/src/usr/local/www/themes/metallic/images/logobig.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/menu_down.gif b/src/usr/local/www/themes/metallic/images/menu_down.gif
deleted file mode 100755
index 137de8d..0000000
--- a/src/usr/local/www/themes/metallic/images/menu_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/menu_footer.gif b/src/usr/local/www/themes/metallic/images/menu_footer.gif
deleted file mode 100755
index d06faa4..0000000
--- a/src/usr/local/www/themes/metallic/images/menu_footer.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/menu_right.gif b/src/usr/local/www/themes/metallic/images/menu_right.gif
deleted file mode 100755
index 881327c..0000000
--- a/src/usr/local/www/themes/metallic/images/menu_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/metal_bgr.gif b/src/usr/local/www/themes/metallic/images/metal_bgr.gif
deleted file mode 100755
index a0ca6c8..0000000
--- a/src/usr/local/www/themes/metallic/images/metal_bgr.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/metal_bgr_red.gif b/src/usr/local/www/themes/metallic/images/metal_bgr_red.gif
deleted file mode 100755
index c4a1465..0000000
--- a/src/usr/local/www/themes/metallic/images/metal_bgr_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/bar_blue.gif b/src/usr/local/www/themes/metallic/images/misc/bar_blue.gif
deleted file mode 100755
index 741186a..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/bar_blue.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/bar_gray.gif b/src/usr/local/www/themes/metallic/images/misc/bar_gray.gif
deleted file mode 100755
index e86e245..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/bar_gray.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/bar_left.gif b/src/usr/local/www/themes/metallic/images/misc/bar_left.gif
deleted file mode 100755
index af751fa..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/bar_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/bar_right.gif b/src/usr/local/www/themes/metallic/images/misc/bar_right.gif
deleted file mode 100755
index ff12d9e..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/bar_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/metallic/images/misc/bullet_toggle_minus.png
deleted file mode 100755
index 37db2fd..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/bullet_toggle_minus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/metallic/images/misc/bullet_toggle_plus.png
deleted file mode 100755
index fba7af9..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/bullet_toggle_plus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/button.gif b/src/usr/local/www/themes/metallic/images/misc/button.gif
deleted file mode 100755
index e85dbb3..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/button.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/graph.png b/src/usr/local/www/themes/metallic/images/misc/graph.png
deleted file mode 100755
index 507ec75..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/graph.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/key_128.gif b/src/usr/local/www/themes/metallic/images/misc/key_128.gif
deleted file mode 100755
index ea5ae34..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/key_128.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/key_152.gif b/src/usr/local/www/themes/metallic/images/misc/key_152.gif
deleted file mode 100755
index 6c7fc03..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/key_152.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/key_256.gif b/src/usr/local/www/themes/metallic/images/misc/key_256.gif
deleted file mode 100755
index 3e1c377..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/key_256.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/key_64.gif b/src/usr/local/www/themes/metallic/images/misc/key_64.gif
deleted file mode 100755
index 87892bd..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/key_64.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/left_background.gif b/src/usr/local/www/themes/metallic/images/misc/left_background.gif
deleted file mode 100755
index 529d827..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/left_background.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/loader.gif b/src/usr/local/www/themes/metallic/images/misc/loader.gif
deleted file mode 100755
index 5d10ac3..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/loader_all.gif b/src/usr/local/www/themes/metallic/images/misc/loader_all.gif
deleted file mode 100755
index cb6bc0c..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/loader_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/loader_filter.gif b/src/usr/local/www/themes/metallic/images/misc/loader_filter.gif
deleted file mode 100755
index b838b17..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/loader_filter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/loader_tab.gif b/src/usr/local/www/themes/metallic/images/misc/loader_tab.gif
deleted file mode 100755
index 05bb04c..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/loader_tab.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/logon.png b/src/usr/local/www/themes/metallic/images/misc/logon.png
deleted file mode 100755
index baf8a9d..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/logon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/progress_bar.gif b/src/usr/local/www/themes/metallic/images/misc/progress_bar.gif
deleted file mode 100755
index 3b4aa52..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/progress_bar.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/rrd_error.png b/src/usr/local/www/themes/metallic/images/misc/rrd_error.png
deleted file mode 100755
index a79ecf3..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/rrd_error.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_alerter.gif b/src/usr/local/www/themes/metallic/images/misc/status_alerter.gif
deleted file mode 100755
index 7ff1e95..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/status_alerter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_carpmaster.gif b/src/usr/local/www/themes/metallic/images/misc/status_carpmaster.gif
deleted file mode 100755
index 2c32908..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/status_carpmaster.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_left.gif b/src/usr/local/www/themes/metallic/images/misc/status_left.gif
deleted file mode 100755
index b5a2930..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/status_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_page_loading.gif b/src/usr/local/www/themes/metallic/images/misc/status_page_loading.gif
deleted file mode 100755
index 067ef18..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/status_page_loading.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_reload_all.gif b/src/usr/local/www/themes/metallic/images/misc/status_reload_all.gif
deleted file mode 100755
index 72de6bd..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/status_reload_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_reload_filter.gif b/src/usr/local/www/themes/metallic/images/misc/status_reload_filter.gif
deleted file mode 100755
index d72761a..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/status_reload_filter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_right.gif b/src/usr/local/www/themes/metallic/images/misc/status_right.gif
deleted file mode 100755
index bf66fdb..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/status_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/tri_c.gif b/src/usr/local/www/themes/metallic/images/misc/tri_c.gif
deleted file mode 100755
index 317b758..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/tri_c.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/tri_c_black.gif b/src/usr/local/www/themes/metallic/images/misc/tri_c_black.gif
deleted file mode 100755
index 3d33d49..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/tri_c_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/tri_o.gif b/src/usr/local/www/themes/metallic/images/misc/tri_o.gif
deleted file mode 100755
index eb95c32..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/tri_o.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/tri_o_black.gif b/src/usr/local/www/themes/metallic/images/misc/tri_o_black.gif
deleted file mode 100755
index 4ed30d1..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/tri_o_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/widget_loader.gif b/src/usr/local/www/themes/metallic/images/misc/widget_loader.gif
deleted file mode 100755
index fad101f..0000000
--- a/src/usr/local/www/themes/metallic/images/misc/widget_loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/new_tab_menu.png b/src/usr/local/www/themes/metallic/images/new_tab_menu.png
deleted file mode 100755
index 4bdfcef..0000000
--- a/src/usr/local/www/themes/metallic/images/new_tab_menu.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/status.png b/src/usr/local/www/themes/metallic/images/status.png
deleted file mode 100755
index a3e368e..0000000
--- a/src/usr/local/www/themes/metallic/images/status.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/transparent.gif b/src/usr/local/www/themes/metallic/images/transparent.gif
deleted file mode 100755
index 89c5530..0000000
--- a/src/usr/local/www/themes/metallic/images/transparent.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/transparent_pixel.gif b/src/usr/local/www/themes/metallic/images/transparent_pixel.gif
deleted file mode 100755
index 35d42e8..0000000
--- a/src/usr/local/www/themes/metallic/images/transparent_pixel.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/blank.gif b/src/usr/local/www/themes/metallic/javascript/ie7/blank.gif
deleted file mode 100755
index a4fe2e6..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/blank.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-box-model.js
deleted file mode 100644
index 45543f6..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-box-model.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-core.js
deleted file mode 100644
index b11e2b1..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-core.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css-strict.js
deleted file mode 100644
index 4406d7a..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css-strict.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css2.js
deleted file mode 100644
index 7121c8e..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css2.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css3.js
deleted file mode 100644
index 86b24f5..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css3.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-fixed.js
deleted file mode 100644
index 4321cda..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-fixed.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-html4.js
deleted file mode 100644
index 4d2baa9..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-html4.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-ie5.js
deleted file mode 100644
index 707fa56..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-ie5.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite-p.js
deleted file mode 100644
index 3a66d19..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite.js
deleted file mode 100644
index 88c764f..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-png.js
deleted file mode 100644
index 7b8f2cf..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-png.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-server.css
deleted file mode 100644
index 47c7edd..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-server.css
+++ /dev/null
@@ -1,43 +0,0 @@
-body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
-body {margin: 8px; background: #333;}
-h1 {margin: 0;}
-h1 a:hover {background-color: transparent;}
-h2 {font-size: 1.75em;}
-h3 {font-size: 1.1em;}
-a:active {color: #ff0000;}
-a:link {color: #0a6cce;}
-a:visited {color: #0a6cce;}
-code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
- padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
-code.box {display: block; padding: 10px; margin: 0.5em 0;}
-ul {list-style-type: square;}
-dd {margin: .2em 0 .5em 1em;}
-dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
-dl.library dd {font-style: italic; margin-left: 3em;}
-dt {font-weight: bold;}
-dt.pack {color: brown;}
-a img {border-style: none;}
-hr {height: 1px; color: #000; border-style: solid;}
-hr.short {height: 2px; width: 100px;}
-div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
-hr {border-bottom-width: 0px;}
-div.header hr {color: #0a6cce; background-color: #0a6cce;}
-div.content {min-height: 100px;}
-div.footer hr {color: #898e79; background-color: #898e79; }
-div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
-a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
-div.footer a:hover {background-color: transparent; text-decoration: none;}
-div.header .menu {text-align: right;}
-div.footer {font-size: x-small; margin-top: 8px;}
-div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
-#license {margin-top: 5px; font-size: xx-small;}
-table {border-top: 1px solid #000; border-left: 1px solid #000;}
-th {background-color: #fff; text-align: left;}
-th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
-th.small {width: 100px;}
-th.medium {width: 200px;}
-th.large {width: 270px;}
-th.x-large {width: 408px;}
-table.fixed {table-layout: fixed;}
-span.comment {color: #666;}
-
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard-p.js
deleted file mode 100644
index 73e99ac..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard.js
deleted file mode 100644
index 2109905..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/test-trans.png b/src/usr/local/www/themes/metallic/javascript/ie7/test-trans.png
deleted file mode 100755
index e187e2c..0000000
--- a/src/usr/local/www/themes/metallic/javascript/ie7/test-trans.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/javascript/niftyjsCode.js b/src/usr/local/www/themes/metallic/javascript/niftyjsCode.js
deleted file mode 100644
index 75ef8b0..0000000
--- a/src/usr/local/www/themes/metallic/javascript/niftyjsCode.js
+++ /dev/null
@@ -1,174 +0,0 @@
-function NiftyCheck(){
-if(!document.getElementById || !document.createElement)
- return(false);
-isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
-if(Array.prototype.push==null){Array.prototype.push=function(){
- this[this.length]=arguments[0]; return(this.length);};}
-return(true);
-}
-
-function Rounded(selector,wich,bk,color,opt){
-var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
-
-if(color=="transparent"){
- cn=cn+"x";
- ecolor=bk;
- bk="transparent";
- }
-else if(opt && opt.indexOf("border")>=0){
- var optar=opt.split(" ");
- for(i=0;i<optar.length;i++)
- if(optar[i].indexOf("#")>=0) ecolor=optar[i];
- if(ecolor=="") ecolor="#666";
- cn+="e";
- edges=true;
- }
-else if(opt && opt.indexOf("smooth")>=0){
- cn+="a";
- ecolor=Mix(bk,color);
- }
-if(opt && opt.indexOf("small")>=0) cn+="s";
-prefixt=cn;
-prefixb=cn;
-if(wich.indexOf("all")>=0){t=true;b=true;}
-else if(wich.indexOf("top")>=0) t="true";
-else if(wich.indexOf("tl")>=0){
- t="true";
- if(wich.indexOf("tr")<0) prefixt+="l";
- }
-else if(wich.indexOf("tr")>=0){
- t="true";
- prefixt+="r";
- }
-if(wich.indexOf("bottom")>=0) b=true;
-else if(wich.indexOf("bl")>=0){
- b="true";
- if(wich.indexOf("br")<0) prefixb+="l";
- }
-else if(wich.indexOf("br")>=0){
- b="true";
- prefixb+="r";
- }
-var v=getElementsBySelector(selector);
-var l=v.length;
-for(i=0;i<l;i++){
- if(edges) AddBorder(v[i],ecolor);
- if(t) AddTop(v[i],bk,color,ecolor,prefixt);
- if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
- }
-}
-
-function AddBorder(el,bc){
-var i;
-if(!el.passed){
- if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
- var t=el.firstChild.nodeValue;
- el.removeChild(el.lastChild);
- var d=CreateEl("span");
- d.style.display="block";
- d.appendChild(document.createTextNode(t));
- el.appendChild(d);
- }
- for(i=0;i<el.childNodes.length;i++){
- if(el.childNodes[i].nodeType==1){
- el.childNodes[i].style.borderLeft="1px solid "+bc;
- el.childNodes[i].style.borderRight="1px solid "+bc;
- }
- }
- }
-el.passed=true;
-}
-
-function AddTop(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=1;i<=lim;i++){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingTop=0;
-el.insertBefore(d,el.firstChild);
-}
-
-function AddBottom(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=lim;i>0;i--){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingBottom=0;
-el.appendChild(d);
-}
-
-function CreateEl(x){
-if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
-else return(document.createElement(x));
-}
-
-function getElementsBySelector(selector){
-var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
-
-if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
- s=selector.split(" ");
- var fs=s[0].split("#");
- if(fs.length==1) return(objlist);
- f=document.getElementById(fs[1]);
- if(f) return(f.getElementsByTagName(s[1]));
- return(objlist);
- }
-if(selector.indexOf("#")>0){ //id selector like "tag#id"
- s=selector.split("#");
- tag=s[0];
- selid=s[1];
- }
-if(selid!=""){
- f=document.getElementById(selid);
- if(f) objlist.push(f);
- return(objlist);
- }
-if(selector.indexOf(".")>0){ //class selector like "tag.class"
- s=selector.split(".");
- tag=s[0];
- selclass=s[1];
- }
-var v=document.getElementsByTagName(tag); // tag selector like "tag"
-if(selclass=="")
- return(v);
-for(i=0;i<v.length;i++){
- if(v[i].className.indexOf(selclass)>=0){
- objlist.push(v[i]);
- }
- }
-return(objlist);
-}
-
-function Mix(c1,c2){
-var i,step1,step2,x,y,r=new Array(3);
-if(c1.length==4)step1=1;
-else step1=2;
-if(c2.length==4) step2=1;
-else step2=2;
-for(i=0;i<3;i++){
- x=parseInt(c1.substr(1+step1*i,step1),16);
- if(step1==1) x=16*x+x;
- y=parseInt(c2.substr(1+step2*i,step2),16);
- if(step2==1) y=16*y+y;
- r[i]=Math.floor((x*50+y*50)/100);
- }
-return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/metallic/loader.js b/src/usr/local/www/themes/metallic/loader.js
deleted file mode 100644
index 9b435d5..0000000
--- a/src/usr/local/www/themes/metallic/loader.js
+++ /dev/null
@@ -1,29 +0,0 @@
-//<![CDATA[
-var browser = '';
-var version = '';
-var entrance = '';
-var cond = '';
-
-// BROWSER?
-if (browser == '') {
- if (navigator.appName.indexOf('Microsoft') != -1)
- browser = 'IE';
- else if (navigator.appName.indexOf('Netscape') != -1)
- browser = 'Netscape';
- else
- browser = 'IE';
-}
-if (version == '') {
- version= navigator.appVersion;
- paren = version.indexOf('(');
- whole_version = navigator.appVersion.substring(0,paren-1);
- version = parseInt(whole_version);
-}
-
-if (browser == 'IE' && version < 7) {
- document.write('<script type="text/javascript" src="/themes/metallic/javascript/ie7/ie7-standard-p.js"></script>');
-}
-
-document.write('<script type="text/javascript" src="/themes/metallic/javascript/niftyjsCode.js"></script>');
-
-//]]>
diff --git a/src/usr/local/www/themes/metallic/login.css b/src/usr/local/www/themes/metallic/login.css
deleted file mode 100644
index f8abdfc..0000000
--- a/src/usr/local/www/themes/metallic/login.css
+++ /dev/null
@@ -1,1127 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #999999;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- background-position : center 0px;
- background-color: #999999;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-
-#login {
-/* background: #cccccc; */
- background-color: transparent;
- border: 0px solid #cccccc;
- margin: 5em auto;
- padding: 0em;
- width: 400px;
-/* filter:alpha(opacity=60);
- -moz-opacity:0.6;
- -khtml-opacity: 0.6;
- opacity: 0.6; */
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
-/* background: #ffffff; */
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 400px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -420px;
- left: 70px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- top: -300px; */
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- left: 10px;
- top: -300px; */
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- text-align: center;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -20px;
- left: 170px;
-}
-
-/* loginerror box follows */
-
-#login #inputerrors {
- background-color: transparent;
- border: 0px solid #666666;
- margin: 5em auto;
- vertical-align: middle;
- padding: 0em;
- width: 330px;
- height: 50px;
- position: relative;
- top: -370px;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/metallic/new_tab_menu.css b/src/usr/local/www/themes/metallic/new_tab_menu.css
deleted file mode 100644
index 04c4cf2..0000000
--- a/src/usr/local/www/themes/metallic/new_tab_menu.css
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- new_tab_menu.css
- part of pfSense
- Copyright (C) 2010-2011 Robert Zelaya
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
-
- Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
- The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
-
- <tr>
- <td>
- <?php
- $tab_array_indent = 0; // move to the line in px
- $tab_array_space = 1; // space betwen lines in px
- $tab_array_char_limit = 82; // number or chr before the drop down box
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
-
-*/
-
-.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
-
-.newtabmenu li{float:left; margin-right:2px; text-align: center;}
-.newtabmenu a:link, .newtabmenu a:visited{
- background:url(images/new_tab_menu.png) right 45px;
- color:#ffffff; /* noactive font */
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- font-weight:bold;
- font-size:.9em;
- height:20px;
- line-height:20px;
- text-decoration:none;
-}
-.newtabmenu a span{
- background:url(images/new_tab_menu.png) left 45px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- height:20px;
- margin-right:7px;
- padding-left:7px;
-}
-.newtabmenu a:hover{
- background:url(images/new_tab_menu.png) right 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- color:#ffffff; /* hover over font */
-}
-.newtabmenu a:hover span{
- background:url(images/new_tab_menu.png) left 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
-}
-
-/* -------------------------------- */
-/* ACTIVE ELEMENTS */
-.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
- color:#000000; /* active font */
- background:url(images/new_tab_menu.png) right 0 no-repeat;
-}
-.newtabmenu_active a span, .newtabmenu_active a:hover span{
- background:url(images/new_tab_menu.png) left 0 no-repeat;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/metallic/no_big_logo b/src/usr/local/www/themes/metallic/no_big_logo
deleted file mode 100644
index 6e5c70d..0000000
--- a/src/usr/local/www/themes/metallic/no_big_logo
+++ /dev/null
@@ -1 +0,0 @@
-NO! DONT! \ No newline at end of file
diff --git a/src/usr/local/www/themes/metallic/rrdcolors.inc.php b/src/usr/local/www/themes/metallic/rrdcolors.inc.php
deleted file mode 100644
index dcb7a39..0000000
--- a/src/usr/local/www/themes/metallic/rrdcolors.inc.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/* $Id$ */
-/*
- rrdcolors.inc.php
- Part of pfSense
- Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/* This file is included by the RRD graphing page and sets the colors */
-
-/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* 95th Percentile Lines Out, In */
-$colortraffic95 = array('660000', 'FF0000');
-
-/* State Table pfrate, pfstates, pfnat, srcip, dstip */
-$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
-
-/* Processor Usage user, nice, system, int, processes */
-$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
-
-/* Memory Usage active, inact, free, cache, wire */
-$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
-
-/* MBUF Usage current, cache, total, max */
-$colormbuf = array('0080FF','00E344','FF0000','000000');
-
-/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
-$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
-$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
-/* Quality Graph Loss */
-$colorqualityloss = 'ee0000';
-
-/* Wireless Graph SNR, Rate, Channel*/
-/* Cellular Graph RSSI, */
-$colorwireless = array('333333','a83c3c','999999');
-
-/* SPAMD Times min area, avg area, max area, Time line */
-$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
-/* SPAMD Connections max area, min area, min line, max line, avg line */
-$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
-
-/* OpenVPN Users Online Users */
-$colorvpnusers = array('990000');
-
-/* Captive Portal Total Users Total Users */
-/* Captive Portal Concurrent Concurrent Users */
-$colorcaptiveportalusers = array('990000');
-
-?>
diff --git a/src/usr/local/www/themes/metallic/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/metallic/styles/jquery-ui-1.11.1.css
deleted file mode 100644
index 8a8c54f..0000000
--- a/src/usr/local/www/themes/metallic/styles/jquery-ui-1.11.1.css
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*! jQuery UI - v1.11.1 - 2014-09-22
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.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:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-clearfix {
- min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* 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: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.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: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- 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;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- min-height: 0; /* support: IE7 */
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
- position: absolute;
- left: .5em;
- top: 50%;
- margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-button {
- display: inline-block;
- position: relative;
- padding: 0;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
- width: 2.4em;
-}
-.ui-button-icons-only {
- width: 3.4em;
-}
-button.ui-button-icons-only {
- width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
- display: block;
- line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
- padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
- padding: .4em;
- text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
- padding-left: 2.1em;
- padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
- padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
- position: absolute;
- top: 50%;
- margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
- left: 50%;
- margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
- left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
- right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
- margin-right: 7px;
-}
-.ui-buttonset .ui-button {
- margin-left: 0;
- margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.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 {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.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,
-.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%;
- font-size: 0;
-}
-
-/* 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,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-.ui-dialog {
- overflow: hidden;
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
- width: 12px;
- height: 12px;
- right: -5px;
- bottom: -5px;
- background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: none;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- position: relative;
- margin: 0;
- padding: 3px 1em 3px .4em;
- cursor: pointer;
- min-height: 0; /* support: IE7 */
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-progressbar {
- height: 1em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
- background-color: #990000;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
- height: 100%;
- filter: alpha(opacity=25); /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- /* Support: IE7 */
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-button {
- display: inline-block;
- overflow: hidden;
- position: relative;
- text-decoration: none;
- cursor: pointer;
-}
-.ui-selectmenu-button span.ui-icon {
- right: 0.5em;
- left: auto;
- margin-top: -8px;
- position: absolute;
- top: 50%;
-}
-.ui-selectmenu-button span.ui-selectmenu-text {
- text-align: left;
- padding: 0.4em 2.1em 0.4em 1em;
- display: block;
- line-height: 1.4;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.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;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.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;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 22px;
-}
-.ui-spinner-button {
- width: 16px;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top: none;
- border-bottom: none;
- border-right: none;
-}
-/* vertically center icon */
-.ui-spinner .ui-icon {
- position: absolute;
- margin-top: -8px;
- top: 50%;
- left: 0;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
- /* need to fix icons sprite */
- background-position: -65px -16px;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
- -webkit-box-shadow: 0 0 5px #aaa;
- box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #aaaaaa;
- background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #bbbbbb;
- /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
- color: #444444;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #444444;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #cccccc;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #3383bb;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #3383bb;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #bbbbbb;
- background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #599fcf;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited {
- color: #599fcf;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #999999;
- background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #ffffff;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #ffffff;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
- color: #444444;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #444444;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #c0402a;
- background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
- color: #ffffff;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #ffffff;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #ffffff;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70); /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35); /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-state-default .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-active .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
-}
-.ui-state-highlight .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.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-on { background-position: -96px -144px; }
-.ui-icon-radio-off { 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-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.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-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 6px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
- opacity: .8;
- filter: Alpha(Opacity=80); /* support: IE8 */
-}
-.ui-widget-shadow {
- margin: -4px 0 0 -4px;
- padding: 4px;
- background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
- opacity: .6;
- filter: Alpha(Opacity=60); /* support: IE8 */
- border-radius: 0pxdow;
-}
diff --git a/src/usr/local/www/themes/nervecenter/all.css b/src/usr/local/www/themes/nervecenter/all.css
deleted file mode 100644
index ba0a5e4..0000000
--- a/src/usr/local/www/themes/nervecenter/all.css
+++ /dev/null
@@ -1,1301 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, sans-serif;
- font-size: 0.9em;
-
-}
-
-.nowrap { white-space: nowrap; }
-
-.infobox {
- width:100%;
-}
-
-.addgatewaybox {
- background-color: #990000;
- border-style: none none none none;
- width: 225px;
-}
-
-.infoboxsave {
- padding-right: 10px;
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-.inputerrorsleft {
- background-color: #990000;
- width: 36px;
-}
-
-.inputerrorsright {
- background-color: #FFD9D1;
- color: #000000;
- font-size: 11px;
- padding-left: 8px;
- padding-top: 6px;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 220px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 11px;
- font-family: "Trebuchet MS", sans-serif;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- background: url('images/background.gif') no-repeat;
- background-position : center 0px;
- background-color: #999999;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* style of disabled formelements */
-#wrap div {margin:1em 0}
-[disabled] {
- color:#666666;
- background:#eeeeee;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
- text-align: center;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- position: relative;
- top: -25px;
- left: 3px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- width: 80px;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 5px;
- margin-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listrborder {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-left: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- color: #FFFFFF;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #DDDDDD;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-/* style of disabled formelements */
-[disabled] {
- color:#666666;
- background:#eeeeee;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 6px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password, #password2 {
- font-size: small;
- width: 60%;
- padding-left: 19px;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-/* Widget CSS */
-.widgetsubheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #B1B1B1;
- padding-right: 6px;
- padding-left: 6px;
- color: #000000;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetdiv{
- margin:5px;
- padding: 5px;
- background:#CCCCCC;
-}
-.widgetconfigdiv{
- background:#BBBBBB;
- font-size: 11px;
- color: #000000;
- padding-right: 5px;
- padding-left: 5px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-div#log div.log-entry-mini {
- clear: both;
-}
-
-div#log div.log-entry-mini span {
- padding: 2px 2px 2px 2px;
- padding-left: 6px;
-}
-
-div#log span.log-action-mini-header,
-div#log span.log-time-mini-header,
-div#log span.log-interface-mini-header,
-div#log span.log-source-mini-header,
-div#log span.log-destination-mini-header,
-div#log span.log-protocol-mini-header {
- float: left;
- text-align: left;
- background-color: #B1B1B1;
- font-size: 12px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-time-mini,
-div#log span.log-interface-mini,
-div#log span.log-source-mini,
-div#log span.log-destination-mini,
-div#log span.log-protocol-mini {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 11px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-action-mini-header {
- width: 6%;
-}
-
-div#log span.log-time-mini,
-div#log span.log-time-mini-header {
- width: 19%;
-}
-
-div#log span.log-interface-mini,
-div#log span.log-interface-mini-header {
- width: 8%;
-}
-
-div#log span.log-source-mini,
-div#log span.log-source-mini-header {
- width: 23%;
-}
-
-div#log span.log-destination-mini,
-div#log span.log-destination-mini-header {
- width: 31%;
-}
-
-div#log span.log-protocol-mini,
-div#log span.log-protocol-mini-header {
- width: 8%;
- border-right: 1px solid #999;
-}
-
-/* Sortable tables */
-table.sortable thead {
- cursor: default;
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-
-/*thermal_sensors widget styles*/
-
-.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
-.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
-.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
- background-color: LimeGreen;
- border-top-width: 2px; border-top-color: Lime;
- border-left-width: 0px;
- border-right-width: 0px;
- border-bottom-width: 2px; border-bottom-color: Green;
-}
-.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
-.thermalSensorText { float: left; height: 20px; top: 3px; }
-.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
-
-.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-
-.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
-
-.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
-
-/* widget textarea styles - full width */
-.textarea_widget {
- width: 100%;
- resize:vertical;
- -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
- -moz-box-sizing: border-box; /* Firefox, other Gecko */
- box-sizing: border-box; /* IE 8+ */
-}
diff --git a/src/usr/local/www/themes/nervecenter/apple-touch-icon.png b/src/usr/local/www/themes/nervecenter/apple-touch-icon.png
deleted file mode 100755
index 7a4b975..0000000
--- a/src/usr/local/www/themes/nervecenter/apple-touch-icon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/bottom-loader.js b/src/usr/local/www/themes/nervecenter/bottom-loader.js
deleted file mode 100644
index a21f775..0000000
--- a/src/usr/local/www/themes/nervecenter/bottom-loader.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//<![CDATA[
-
- NiftyCheck();
- Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
- Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
- Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
- Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
- Rounded("div#topbox","all","#FFF","#990000","smooth");
-
-//]]>
diff --git a/src/usr/local/www/themes/nervecenter/favicon.ico b/src/usr/local/www/themes/nervecenter/favicon.ico
deleted file mode 100644
index 3440bf2..0000000
--- a/src/usr/local/www/themes/nervecenter/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/graphlink.css b/src/usr/local/www/themes/nervecenter/graphlink.css
deleted file mode 100644
index 13f65f0..0000000
--- a/src/usr/local/www/themes/nervecenter/graphlink.css
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- $Id$
-
- This file is part of the GraphLink software.
- GraphLink is distributed under the MIT License.
- Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
-*******************************************************************************/
-
-/**
- * Defines the background image used for the graph, as well as the actual data
- * locations.
- * Use padding-left and padding-top to align the data area correctly with your
- * background image.
- * Width and height should same as the dimensions of the image, minus the
- * padding values in both directions.
- */
-div.GraphLink {
- width: 212px;
- height: 60px;
- padding-left: 38px;
- padding-top: 10px;
- background-image: url(/themes/nervecenter/images/misc/graph.png);
- overflow: hidden;
-}
-
-/**
- * Defines the data display area. Modify to fit your background image.
- */
-div.GraphLinkData {
- width: 200px;
- height: 50px;
- overflow: hidden;
-}
-
-/**
- * Defines the look of one bar. Nothing to change here other than the color.
- */
-span.GraphLinkBar {
- background-color: #990000;
- height: 100%;
- float: left;
- overflow: hidden;
-}
diff --git a/src/usr/local/www/themes/nervecenter/images/alert_bgr.png b/src/usr/local/www/themes/nervecenter/images/alert_bgr.png
deleted file mode 100755
index 39901be..0000000
--- a/src/usr/local/www/themes/nervecenter/images/alert_bgr.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/background.gif b/src/usr/local/www/themes/nervecenter/images/background.gif
deleted file mode 100755
index bdfa5b3..0000000
--- a/src/usr/local/www/themes/nervecenter/images/background.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/background.png b/src/usr/local/www/themes/nervecenter/images/background.png
deleted file mode 100755
index e68893d..0000000
--- a/src/usr/local/www/themes/nervecenter/images/background.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/footer.png b/src/usr/local/www/themes/nervecenter/images/footer.png
deleted file mode 100755
index 90b1022..0000000
--- a/src/usr/local/www/themes/nervecenter/images/footer.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/header.png b/src/usr/local/www/themes/nervecenter/images/header.png
deleted file mode 100755
index 3b38584..0000000
--- a/src/usr/local/www/themes/nervecenter/images/header.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/help.png b/src/usr/local/www/themes/nervecenter/images/help.png
deleted file mode 100755
index 1de05e3..0000000
--- a/src/usr/local/www/themes/nervecenter/images/help.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/horizontal.gif b/src/usr/local/www/themes/nervecenter/images/horizontal.gif
deleted file mode 100755
index a280dcb..0000000
--- a/src/usr/local/www/themes/nervecenter/images/horizontal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/favicon.ico b/src/usr/local/www/themes/nervecenter/images/icons/favicon.ico
deleted file mode 100644
index 3440bf2..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_3g.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_3g.gif
deleted file mode 100755
index 46ccb92..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_3g.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_3g_inactive.gif
deleted file mode 100755
index cf983e4..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_3g_inactive.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_advanced.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_advanced.gif
deleted file mode 100755
index 3ede1ff..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_advanced.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_advanced_s.gif
deleted file mode 100755
index b233549..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_advanced_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_alert.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_alert.gif
deleted file mode 100755
index 7646941..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_alert.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_host.gif
deleted file mode 100755
index ad43e17..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_host.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_net.gif
deleted file mode 100755
index abd1b8b..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_net.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_port.gif
deleted file mode 100755
index 4acf2aa..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_port.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_url.gif
deleted file mode 100755
index 660571e..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_url.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_url_reload.gif
deleted file mode 100755
index 55c1c4a..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_url_reload.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_block.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_block.gif
deleted file mode 100755
index 670c968..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_block.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_block_add.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_block_add.gif
deleted file mode 100755
index eb726d6..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_block_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_block_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_block_d.gif
deleted file mode 100755
index e6345fe..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_block_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_cablenic.gif
deleted file mode 100755
index a071c66..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_cablenic.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_cal.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_cal.gif
deleted file mode 100755
index a9c7c87..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_cal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_cal_mo.gif
deleted file mode 100755
index 1647e2f..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_cal_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_carp.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_carp.gif
deleted file mode 100755
index 9454a82..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_carp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_carp_d.gif
deleted file mode 100755
index 2ba8db2..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_carp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_chain.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_chain.png
deleted file mode 100644
index 12db07a..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_chain.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_check.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_check.gif
deleted file mode 100755
index 393674d..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_check.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_green.gif
deleted file mode 100755
index e171ba8..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_green.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_grey.gif
deleted file mode 100755
index 00c865a..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_grey.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_red.gif
deleted file mode 100755
index 7b412ee..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_close.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_close.gif
deleted file mode 100755
index e0f86a7..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_close.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_configure.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_configure.gif
deleted file mode 100755
index 7182e0d..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_configure.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_down.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_down.gif
deleted file mode 100755
index b71a9c5..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_down_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_down_d.gif
deleted file mode 100755
index 70a7473..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_down_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_down_mo.gif
deleted file mode 100755
index 584587a..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_down_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_e.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_e.gif
deleted file mode 100755
index 2950800..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_e.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_e_mo.gif
deleted file mode 100755
index 9ba5738..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_e_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_error.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_error.gif
deleted file mode 100755
index e0fa659..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_error.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_exclam.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_exclam.gif
deleted file mode 100755
index 36c2ec7..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_exclam.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_de.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_de.png
deleted file mode 100755
index 069cbbe..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_de.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_en.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_en.png
deleted file mode 100755
index bd7f9a5..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_en.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_es.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_es.png
deleted file mode 100755
index 434776c..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_es.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_pt_BR.png
deleted file mode 100755
index f786349..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_pt_BR.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_cert.png
deleted file mode 100755
index 48a34b6..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_cert.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_file.png
deleted file mode 100755
index 48a9ed2..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_file.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_group.png
deleted file mode 100755
index 7d929c0..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_host.png
deleted file mode 100755
index 867ef2c..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_host.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_imp.png
deleted file mode 100755
index f667cfc..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_imp.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_mail.png
deleted file mode 100755
index d2d4548..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_mail.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_pwd.png
deleted file mode 100755
index 06b53a1..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_pwd.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_search.png
deleted file mode 100755
index 33de926..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_search.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_time.png
deleted file mode 100755
index aa8300a..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_time.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_unknown.png
deleted file mode 100755
index 1857d0e..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_unknown.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_url.png
deleted file mode 100755
index cf56792..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_url.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_user.png
deleted file mode 100755
index e00eebe..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_fw-update.gif
deleted file mode 100755
index 52c18ac..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_fw-update.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_help.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_help.gif
deleted file mode 100644
index 84c84db..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_help.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_ifalias.gif
deleted file mode 100755
index 0c569a7..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_ifalias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_ifalias_d.gif
deleted file mode 100755
index faa84d4..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_ifalias_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_import_alias.gif
deleted file mode 100755
index d11a5f0..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_import_alias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_in.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_in_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_info_pkg.gif
deleted file mode 100755
index cd3a532..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_info_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_interface_down.gif
deleted file mode 100755
index 0626655..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_interface_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_interface_up.gif
deleted file mode 100755
index 1449513..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_interface_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_left.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_left.gif
deleted file mode 100755
index 8effefe..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_left_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_left_d.gif
deleted file mode 100755
index c778014..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_left_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_left_mo.gif
deleted file mode 100755
index 84c6fa2..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_left_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_log.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_log.gif
deleted file mode 100755
index 4a1983a..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_log.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_log_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_log_d.gif
deleted file mode 100755
index d31bd9b..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_log_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_log_s.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_log_s.gif
deleted file mode 100755
index f9fda33..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_log_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_log_s_d.gif
deleted file mode 100755
index fb2c05f..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_log_s_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_logs.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_logs.gif
deleted file mode 100644
index afe0104..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_logs.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_match.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_match.gif
deleted file mode 100644
index 215571f..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_match.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_match_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_match_d.gif
deleted file mode 100644
index 6e4c364..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_match_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_minus.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_minus.gif
deleted file mode 100755
index 417544f..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_minus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_open.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_open.gif
deleted file mode 100755
index ac3da14..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_open.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_other.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_other.gif
deleted file mode 100755
index e6f780f..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_other.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_other_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_other_d.gif
deleted file mode 100755
index b08d970..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_other_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_out.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_out_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_parp.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_parp.gif
deleted file mode 100755
index 96acaf3..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_parp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_parp_d.gif
deleted file mode 100755
index 7d7d00e..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_parp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_pass.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_pass.gif
deleted file mode 100755
index fe1bb0d..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_pass.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_pass_add.gif
deleted file mode 100755
index f7f4c20..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_pass_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_pass_d.gif
deleted file mode 100755
index 6adc431..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_pass_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus.gif
deleted file mode 100755
index 2a94eeb..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl.gif
deleted file mode 100755
index 8dcd7c0..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl_p.gif
deleted file mode 100755
index 0c79849..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_d.gif
deleted file mode 100755
index ebc7457..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_mo.gif
deleted file mode 100755
index 1c7ca08..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_p.gif
deleted file mode 100755
index eb41284..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall.gif
deleted file mode 100755
index d78b867..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_d.gif
deleted file mode 100755
index 13658f7..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_mo.gif
deleted file mode 100755
index 90b576e..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg.gif
deleted file mode 100755
index 9aebb03..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_d.gif
deleted file mode 100755
index 4ab4992..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_mo.gif
deleted file mode 100755
index 7025d20..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml.gif
deleted file mode 100755
index 4542432..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_d.gif
deleted file mode 100755
index 8d3a68d..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_mo.gif
deleted file mode 100755
index 15e0aed..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reject.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reject.gif
deleted file mode 100755
index 5565cd6..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_reject.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reject_d.gif
deleted file mode 100755
index 6c09fae..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_reject_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_right.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_right.gif
deleted file mode 100755
index fdf2d8b..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_restart.gif
deleted file mode 100755
index e49fbd7..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_restart.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_restart_d.gif
deleted file mode 100755
index a5d6d7c..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_restart_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_running.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_running.gif
deleted file mode 100644
index 543fd56..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_running.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_start.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_start.gif
deleted file mode 100755
index 09bb58f..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_start.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_start_d.gif
deleted file mode 100755
index f58f111..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_start_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_status.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_status.gif
deleted file mode 100644
index a93bcfb..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_status.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stop.gif
deleted file mode 100755
index 922addc..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stop.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stop_d.gif
deleted file mode 100755
index b4cfdea..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stop_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stopped.gif
deleted file mode 100644
index f93a25d..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stopped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_services_restart_mo.gif
deleted file mode 100755
index a092b40..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_services_restart_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_services_start_mo.gif
deleted file mode 100755
index ecdb58f..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_services_start_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_services_stop_mo.gif
deleted file mode 100755
index c00e208..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_services_stop_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_system-group-grey.png
deleted file mode 100755
index d7b964d..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_system-group-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_system-group.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_system-group.png
deleted file mode 100755
index 1c974f2..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_system-group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_system-user-grey.png
deleted file mode 100755
index 2f6047d..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_system-user-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_system-user.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_system-user.png
deleted file mode 100755
index ef82156..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_system-user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_system_lock_screen.png
deleted file mode 100755
index 30f306d..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_system_lock_screen.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_system_logout.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_system_logout.png
deleted file mode 100755
index 9bbb6c7..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_system_logout.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_trapped.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_trapped.gif
deleted file mode 100755
index ffeb2cd..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_trapped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_trapped_p.gif
deleted file mode 100755
index 6d46aaf..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_trapped_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule.gif
deleted file mode 100755
index e15ab6c..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule_d.gif
deleted file mode 100755
index f776281..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_up.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_up.gif
deleted file mode 100755
index 883c5a2..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_up_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_up_d.gif
deleted file mode 100755
index 0ddcce2..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_up_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_up_mo.gif
deleted file mode 100755
index 9f869a4..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_up_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_wlan.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_wlan.gif
deleted file mode 100755
index 1f0addc..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_wlan.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_wlan_d.gif
deleted file mode 100755
index 35bf580..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_wlan_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_wol_all.gif
deleted file mode 100755
index 2d22182..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_wol_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_wzd_nsaved.png
deleted file mode 100755
index 21cb27d..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_wzd_nsaved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_wzd_saved.png
deleted file mode 100755
index ab82946..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_wzd_saved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_x.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_x.gif
deleted file mode 100755
index 24e4d49..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_x_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_x_d.gif
deleted file mode 100755
index d2bfbc8..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_x_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_x_mo.gif
deleted file mode 100755
index da7b57c..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_x_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_x_p.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_x_p.gif
deleted file mode 100755
index 8828fa6..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/icon_x_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/in.gif b/src/usr/local/www/themes/nervecenter/images/icons/in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/in_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/out.gif b/src/usr/local/www/themes/nervecenter/images/icons/out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/out_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/nervecenter/images/icons/out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/log.png b/src/usr/local/www/themes/nervecenter/images/log.png
deleted file mode 100755
index 762ba80..0000000
--- a/src/usr/local/www/themes/nervecenter/images/log.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/logo.gif b/src/usr/local/www/themes/nervecenter/images/logo.gif
deleted file mode 100755
index a71ce5a..0000000
--- a/src/usr/local/www/themes/nervecenter/images/logo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/logobig.jpg b/src/usr/local/www/themes/nervecenter/images/logobig.jpg
deleted file mode 100755
index 2ef196d..0000000
--- a/src/usr/local/www/themes/nervecenter/images/logobig.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/menu_down.gif b/src/usr/local/www/themes/nervecenter/images/menu_down.gif
deleted file mode 100755
index 137de8d..0000000
--- a/src/usr/local/www/themes/nervecenter/images/menu_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/menu_footer.gif b/src/usr/local/www/themes/nervecenter/images/menu_footer.gif
deleted file mode 100755
index d06faa4..0000000
--- a/src/usr/local/www/themes/nervecenter/images/menu_footer.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/menu_right.gif b/src/usr/local/www/themes/nervecenter/images/menu_right.gif
deleted file mode 100755
index 881327c..0000000
--- a/src/usr/local/www/themes/nervecenter/images/menu_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/metal_bgr.gif b/src/usr/local/www/themes/nervecenter/images/metal_bgr.gif
deleted file mode 100755
index a0ca6c8..0000000
--- a/src/usr/local/www/themes/nervecenter/images/metal_bgr.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/metal_bgr_red.gif b/src/usr/local/www/themes/nervecenter/images/metal_bgr_red.gif
deleted file mode 100755
index c4a1465..0000000
--- a/src/usr/local/www/themes/nervecenter/images/metal_bgr_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/bar_blue.gif b/src/usr/local/www/themes/nervecenter/images/misc/bar_blue.gif
deleted file mode 100755
index 741186a..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/bar_blue.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/bar_gray.gif b/src/usr/local/www/themes/nervecenter/images/misc/bar_gray.gif
deleted file mode 100755
index e86e245..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/bar_gray.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/bar_left.gif b/src/usr/local/www/themes/nervecenter/images/misc/bar_left.gif
deleted file mode 100755
index af751fa..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/bar_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/bar_right.gif b/src/usr/local/www/themes/nervecenter/images/misc/bar_right.gif
deleted file mode 100755
index ff12d9e..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/bar_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_minus.png
deleted file mode 100755
index 37db2fd..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_minus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_plus.png
deleted file mode 100755
index fba7af9..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_plus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/button.gif b/src/usr/local/www/themes/nervecenter/images/misc/button.gif
deleted file mode 100755
index e85dbb3..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/button.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/graph.png b/src/usr/local/www/themes/nervecenter/images/misc/graph.png
deleted file mode 100755
index 507ec75..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/graph.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/key_128.gif b/src/usr/local/www/themes/nervecenter/images/misc/key_128.gif
deleted file mode 100755
index ea5ae34..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/key_128.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/key_152.gif b/src/usr/local/www/themes/nervecenter/images/misc/key_152.gif
deleted file mode 100755
index 6c7fc03..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/key_152.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/key_256.gif b/src/usr/local/www/themes/nervecenter/images/misc/key_256.gif
deleted file mode 100755
index 3e1c377..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/key_256.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/key_64.gif b/src/usr/local/www/themes/nervecenter/images/misc/key_64.gif
deleted file mode 100755
index 87892bd..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/key_64.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/left_background.gif b/src/usr/local/www/themes/nervecenter/images/misc/left_background.gif
deleted file mode 100755
index 529d827..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/left_background.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/loader.gif b/src/usr/local/www/themes/nervecenter/images/misc/loader.gif
deleted file mode 100755
index 5d10ac3..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/loader_all.gif b/src/usr/local/www/themes/nervecenter/images/misc/loader_all.gif
deleted file mode 100755
index cb6bc0c..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/loader_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/loader_filter.gif b/src/usr/local/www/themes/nervecenter/images/misc/loader_filter.gif
deleted file mode 100755
index b838b17..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/loader_filter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/loader_tab.gif b/src/usr/local/www/themes/nervecenter/images/misc/loader_tab.gif
deleted file mode 100755
index 05bb04c..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/loader_tab.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/logon.png b/src/usr/local/www/themes/nervecenter/images/misc/logon.png
deleted file mode 100755
index ec644ed..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/logon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/progress_bar.gif b/src/usr/local/www/themes/nervecenter/images/misc/progress_bar.gif
deleted file mode 100755
index 3b4aa52..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/progress_bar.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/rrd_error.png b/src/usr/local/www/themes/nervecenter/images/misc/rrd_error.png
deleted file mode 100755
index a79ecf3..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/rrd_error.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_alerter.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_alerter.gif
deleted file mode 100755
index 7ff1e95..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/status_alerter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_carpmaster.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_carpmaster.gif
deleted file mode 100755
index 2c32908..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/status_carpmaster.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_left.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_left.gif
deleted file mode 100755
index b5a2930..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/status_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_page_loading.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_page_loading.gif
deleted file mode 100755
index 067ef18..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/status_page_loading.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_reload_all.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_reload_all.gif
deleted file mode 100755
index 72de6bd..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/status_reload_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_reload_filter.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_reload_filter.gif
deleted file mode 100755
index d72761a..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/status_reload_filter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_right.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_right.gif
deleted file mode 100755
index bf66fdb..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/status_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/tri_c.gif b/src/usr/local/www/themes/nervecenter/images/misc/tri_c.gif
deleted file mode 100755
index 317b758..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/tri_c.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/tri_c_black.gif b/src/usr/local/www/themes/nervecenter/images/misc/tri_c_black.gif
deleted file mode 100755
index 309846e..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/tri_c_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/tri_o.gif b/src/usr/local/www/themes/nervecenter/images/misc/tri_o.gif
deleted file mode 100755
index eb95c32..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/tri_o.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/tri_o_black.gif b/src/usr/local/www/themes/nervecenter/images/misc/tri_o_black.gif
deleted file mode 100755
index f818f3b..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/tri_o_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/widget_loader.gif b/src/usr/local/www/themes/nervecenter/images/misc/widget_loader.gif
deleted file mode 100755
index ca35e2a..0000000
--- a/src/usr/local/www/themes/nervecenter/images/misc/widget_loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/new_tab_menu.png b/src/usr/local/www/themes/nervecenter/images/new_tab_menu.png
deleted file mode 100755
index 4bdfcef..0000000
--- a/src/usr/local/www/themes/nervecenter/images/new_tab_menu.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/status.png b/src/usr/local/www/themes/nervecenter/images/status.png
deleted file mode 100755
index a3e368e..0000000
--- a/src/usr/local/www/themes/nervecenter/images/status.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/transparent.gif b/src/usr/local/www/themes/nervecenter/images/transparent.gif
deleted file mode 100755
index 89c5530..0000000
--- a/src/usr/local/www/themes/nervecenter/images/transparent.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/transparent_pixel.gif b/src/usr/local/www/themes/nervecenter/images/transparent_pixel.gif
deleted file mode 100755
index 35d42e8..0000000
--- a/src/usr/local/www/themes/nervecenter/images/transparent_pixel.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/blank.gif b/src/usr/local/www/themes/nervecenter/javascript/ie7/blank.gif
deleted file mode 100755
index a4fe2e6..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/blank.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-box-model.js
deleted file mode 100644
index 45543f6..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-box-model.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-core.js
deleted file mode 100644
index b11e2b1..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-core.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css-strict.js
deleted file mode 100644
index 4406d7a..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css-strict.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css2.js
deleted file mode 100644
index 7121c8e..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css2.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css3.js
deleted file mode 100644
index 86b24f5..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css3.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-fixed.js
deleted file mode 100644
index 4321cda..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-fixed.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-html4.js
deleted file mode 100644
index 4d2baa9..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-html4.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-ie5.js
deleted file mode 100644
index 707fa56..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-ie5.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite-p.js
deleted file mode 100644
index 3a66d19..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite.js
deleted file mode 100644
index 88c764f..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-png.js
deleted file mode 100644
index 7b8f2cf..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-png.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-server.css
deleted file mode 100644
index 47c7edd..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-server.css
+++ /dev/null
@@ -1,43 +0,0 @@
-body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
-body {margin: 8px; background: #333;}
-h1 {margin: 0;}
-h1 a:hover {background-color: transparent;}
-h2 {font-size: 1.75em;}
-h3 {font-size: 1.1em;}
-a:active {color: #ff0000;}
-a:link {color: #0a6cce;}
-a:visited {color: #0a6cce;}
-code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
- padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
-code.box {display: block; padding: 10px; margin: 0.5em 0;}
-ul {list-style-type: square;}
-dd {margin: .2em 0 .5em 1em;}
-dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
-dl.library dd {font-style: italic; margin-left: 3em;}
-dt {font-weight: bold;}
-dt.pack {color: brown;}
-a img {border-style: none;}
-hr {height: 1px; color: #000; border-style: solid;}
-hr.short {height: 2px; width: 100px;}
-div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
-hr {border-bottom-width: 0px;}
-div.header hr {color: #0a6cce; background-color: #0a6cce;}
-div.content {min-height: 100px;}
-div.footer hr {color: #898e79; background-color: #898e79; }
-div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
-a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
-div.footer a:hover {background-color: transparent; text-decoration: none;}
-div.header .menu {text-align: right;}
-div.footer {font-size: x-small; margin-top: 8px;}
-div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
-#license {margin-top: 5px; font-size: xx-small;}
-table {border-top: 1px solid #000; border-left: 1px solid #000;}
-th {background-color: #fff; text-align: left;}
-th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
-th.small {width: 100px;}
-th.medium {width: 200px;}
-th.large {width: 270px;}
-th.x-large {width: 408px;}
-table.fixed {table-layout: fixed;}
-span.comment {color: #666;}
-
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard-p.js
deleted file mode 100644
index 73e99ac..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard.js
deleted file mode 100644
index 2109905..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/test-trans.png b/src/usr/local/www/themes/nervecenter/javascript/ie7/test-trans.png
deleted file mode 100755
index e187e2c..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/ie7/test-trans.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/img/grey-40.png b/src/usr/local/www/themes/nervecenter/javascript/img/grey-40.png
deleted file mode 100755
index 758b716..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/img/grey-40.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/img/submenu-off.gif b/src/usr/local/www/themes/nervecenter/javascript/img/submenu-off.gif
deleted file mode 100755
index ddcdcae..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/img/submenu-off.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/img/submenu-on.gif b/src/usr/local/www/themes/nervecenter/javascript/img/submenu-on.gif
deleted file mode 100755
index 7a58077..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/img/submenu-on.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/img/white-90.png b/src/usr/local/www/themes/nervecenter/javascript/img/white-90.png
deleted file mode 100755
index efc84b4..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/img/white-90.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/img/x.gif b/src/usr/local/www/themes/nervecenter/javascript/img/x.gif
deleted file mode 100755
index 5bfd67a..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/img/x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/niftyjsCode.js b/src/usr/local/www/themes/nervecenter/javascript/niftyjsCode.js
deleted file mode 100644
index e71ea14..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/niftyjsCode.js
+++ /dev/null
@@ -1,174 +0,0 @@
-function NiftyCheck(){
-if(!document.getElementById || !document.createElement)
- return(false);
-isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
-if(Array.prototype.push==null){Array.prototype.push=function(){
- this[this.length]=arguments[0]; return(this.length);};}
-return(true);
-}
-
-function Rounded(selector,wich,bk,color,opt){
-var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
-
-if(color=="transparent"){
- cn=cn+"x";
- ecolor=bk;
- bk="transparent";
- }
-else if(opt && opt.indexOf("border")>=0){
- var optar=opt.split(" ");
- for(i=0;i<optar.length;i++)
- if(optar[i].indexOf("#")>=0) ecolor=optar[i];
- if(ecolor=="") ecolor="#666";
- cn+="e";
- edges=true;
- }
-else if(opt && opt.indexOf("smooth")>=0){
- cn+="a";
- ecolor=Mix(bk,color);
- }
-if(opt && opt.indexOf("small")>=0) cn+="s";
-prefixt=cn;
-prefixb=cn;
-if(wich.indexOf("all")>=0){t=true;b=true;}
-else if(wich.indexOf("top")>=0) t="true";
-else if(wich.indexOf("tl")>=0){
- t="true";
- if(wich.indexOf("tr")<0) prefixt+="l";
- }
-else if(wich.indexOf("tr")>=0){
- t="true";
- prefixt+="r";
- }
-if(wich.indexOf("bottom")>=0) b=true;
-else if(wich.indexOf("bl")>=0){
- b="true";
- if(wich.indexOf("br")<0) prefixb+="l";
- }
-else if(wich.indexOf("br")>=0){
- b="true";
- prefixb+="r";
- }
-var v=getElementsBySelector(selector);
-var l=v.length;
-for(i=0;i<l;i++){
- if(edges) AddBorder(v[i],ecolor);
- if(t) AddTop(v[i],bk,color,ecolor,prefixt);
- if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
- }
-}
-
-function AddBorder(el,bc){
-var i;
-if(!el.passed){
- if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
- var t=el.firstChild.nodeValue;
- el.removeChild(el.lastChild);
- var d=CreateEl("span");
- d.style.display="block";
- d.appendChild(document.createTextNode(t));
- el.appendChild(d);
- }
- for(i=0;i<el.childNodes.length;i++){
- if(el.childNodes[i].nodeType==1){
- el.childNodes[i].style.borderLeft="1px solid "+bc;
- el.childNodes[i].style.borderRight="1px solid "+bc;
- }
- }
- }
-el.passed=true;
-}
-
-function AddTop(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=1;i<=lim;i++){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingTop=0;
-el.insertBefore(d,el.firstChild);
-}
-
-function AddBottom(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=lim;i>0;i--){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingBottom=0;
-el.appendChild(d);
-}
-
-function CreateEl(x){
-if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
-else return(document.createElement(x));
-}
-
-function getElementsBySelector(selector){
-var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
-
-if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
- s=selector.split(" ");
- var fs=s[0].split("#");
- if(fs.length==1) return(objlist);
- f=document.getElementById(fs[1]);
- if(f) return(f.getElementsByTagName(s[1]));
- return(objlist);
- }
-if(selector.indexOf("#")>0){ //id selector like "tag#id"
- s=selector.split("#");
- tag=s[0];
- selid=s[1];
- }
-if(selid!=""){
- f=document.getElementById(selid);
- if(f) objlist.push(f);
- return(objlist);
- }
-if(selector.indexOf(".")>0){ //class selector like "tag.class"
- s=selector.split(".");
- tag=s[0];
- selclass=s[1];
- }
-var v=document.getElementsByTagName(tag); // tag selector like "tag"
-if(selclass=="")
- return(v);
-for(i=0;i<v.length;i++){
- if(v[i].className.indexOf(selclass)>=0){
- objlist.push(v[i]);
- }
- }
-return(objlist);
-}
-
-function Mix(c1,c2){
-var i,step1,step2,x,y,r=new Array(3);
-if(c1.length==4)step1=1;
-else step1=2;
-if(c2.length==4) step2=1;
-else step2=2;
-for(i=0;i<3;i++){
- x=parseInt(c1.substr(1+step1*i,step1),16);
- if(step1==1) x=16*x+x;
- y=parseInt(c2.substr(1+step2*i,step2),16);
- if(step2==1) y=16*y+y;
- r[i]=Math.floor((x*50+y*50)/100);
- }
-return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/javascript/transmenu-body.php b/src/usr/local/www/themes/nervecenter/javascript/transmenu-body.php
deleted file mode 100644
index eea9235..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/transmenu-body.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/* $Id$ */
-/* ========================================================================== */
-/*
- transmenu-body.php
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-function nervecenterTransmenuGetBodyJS() {
- global $rootmenu;
-
- if (isset($rootmenu)) {
- return $rootmenu->getMenuJScript();
- } else if (empty($rootmenu)) {
- return "alert('No rootmenu object found.');";
- } else {
- return "alert('No JavaScript attached to rootmenu object.');";
- }
-}
-
-?>
diff --git a/src/usr/local/www/themes/nervecenter/javascript/transmenu-head.php b/src/usr/local/www/themes/nervecenter/javascript/transmenu-head.php
deleted file mode 100644
index 66e1952..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/transmenu-head.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/* $Id$ */
-/* ========================================================================== */
-/*
- transmenu-head.php
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-function nervecenterTransmenuGetHeadJS() {
- global $g, $rootmenu;
-
- $transmenu_stub =<<<EOD
- function tmenuinit() {
- //==========================================================================================
- // if supported, initialize TransMenus
- //==========================================================================================
- // Check isSupported() so that menus aren't accidentally sent to non-supporting browsers.
- // This is better than server-side checking because it will also catch browsers which would
- // normally support the menus but have javascript disabled.
- //
- // If supported, call initialize() and then hook whatever image rollover code you need to do
- // to the .onactivate and .ondeactivate events for each menu.
- //==========================================================================================
- if (TransMenu.isSupported()) {
- TransMenu.initialize();
-
- // hook all the highlight swapping of the main toolbar to menu activation/deactivation
- // instead of simple rollover to get the effect where the button stays hightlit until
- // the menu is closed.
- @@CHILD_JSCRIPT@@
- }
- } // end function
-EOD;
-
- if (empty($rootmenu)) {
- require_once("menudef.inc");
- }
-
- $childJScript = "";
- foreach ($rootmenu->getChildren() as $component) {
- $id = "mnua_" . str_replace(" ", "", strtolower($component->getID()));
-
- $childJScript .=<<<EOD
- {$id}.onactivate = function() { document.getElementById("{$id}").className = "hover"; };
- {$id}.ondeactivate = function() { document.getElementById("{$id}").className = ""; };
-
-EOD;
- }
-
- $transmenu_stub = basename($_SERVER['PHP_SELF']) != "wizard.php" ? str_replace("@@CHILD_JSCRIPT@@", $childJScript, $transmenu_stub) : "";
-
- return $transmenu_stub;
-}
-
-?>
diff --git a/src/usr/local/www/themes/nervecenter/javascript/transmenu.org b/src/usr/local/www/themes/nervecenter/javascript/transmenu.org
deleted file mode 100644
index 6c9e353..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/transmenu.org
+++ /dev/null
@@ -1,785 +0,0 @@
-/* =================================================================================================
- * TransMenu
- * March, 2003
- *
- * Customizable multi-level animated DHTML menus with transparency.
- *
- * Copyright 2003-2004, Aaron Boodman (www.youngpup.net)
- * =================================================================================================
- * "Can I use this?"
- *
- * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
- * out at: http://creativecommons.org/licenses/by/2.0/
- *
- * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
- * for writing it. You may not misrepresent yourself as the author of this code.
- * =================================================================================================
- * "It's kinda hard to read, though"
- *
- * The uncompressed, commented version of this script can be found at:
- * http://youngpup.net/projects/transMenus
- * =================================================================================================
- * updates:
- * 04.19.04 fixed cascade problem with menus nested greater than two levels.
- * 12.23.03 added hideCurrent for menu actuators with no menus. renamed to TransMenu.
- * 04.18.03 fixed render bug in IE 5.0 Mac by removing that browser from compatibility table ;)
- * also made gecko check a little more strict by specifying build no.
- * ============================================================================================== */
-
-
-
-//==================================================================================================
-// Configuration properties
-//==================================================================================================
-TransMenu.spacerGif = "themes/nervecenter/javascript/img/x.gif"; // path to a transparent spacer gif
-TransMenu.dingbatOn = "themes/nervecenter/javascript/img/submenu-on.gif"; // path to the active sub menu dingbat
-TransMenu.dingbatOff = "themes/nervecenter/javascript/img/submenu-off.gif"; // path to the inactive sub menu dingbat
-TransMenu.dingbatSize = 14; // size of the dingbat (square shape assumed)
-TransMenu.menuPadding = 5; // padding between menu border and items grid
-TransMenu.itemPadding = 3; // additional padding around each item
-TransMenu.shadowSize = 2; // size of shadow under menu
-TransMenu.shadowOffset = 3; // distance shadow should be offset from leading edge
-TransMenu.shadowColor = "#FF0000"; // color of shadow (transparency is set in CSS)
-TransMenu.shadowPng = "themes/nervecenter/javascript/img/grey-40.png"; // a PNG graphic to serve as the shadow for mac IE5
-TransMenu.backgroundColor = "#990000"; // color of the background (transparency set in CSS)
-TransMenu.backgroundPng = "themes/nervecenter/javascript/img/white-90.png"; // a PNG graphic to server as the background for mac IE5
-TransMenu.hideDelay = 1000; // number of milliseconds to wait before hiding a menu
-TransMenu.slideTime = 400; // number of milliseconds it takes to open and close a menu
-
-
-//==================================================================================================
-// Internal use properties
-//==================================================================================================
-TransMenu.reference = {topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};
-TransMenu.direction = {down:1,right:2};
-TransMenu.registry = [];
-TransMenu._maxZ = 100;
-
-
-
-//==================================================================================================
-// Static methods
-//==================================================================================================
-// supporting win ie5+, mac ie5.1+ and gecko >= mozilla 1.0
-TransMenu.isSupported = function() {
- var ua = navigator.userAgent.toLowerCase();
- var pf = navigator.platform.toLowerCase();
- var an = navigator.appName;
- var r = false;
-
- if (ua.indexOf("gecko") > -1 && navigator.productSub >= 20020605) r = true; // gecko >= moz 1.0
- else if (an == "Microsoft Internet Explorer") {
- if (document.getElementById) { // ie5.1+ mac,win
- if (pf.indexOf("mac") == 0) {
- r = /msie (\d(.\d*)?)/.test(ua) && Number(RegExp.$1) >= 5.1;
- }
- else r = true;
- }
- }
-
- return r;
-}
-
-// call this in onload once menus have been created
-TransMenu.initialize = function() {
- for (var i = 0, menu = null; menu = this.registry[i]; i++) {
- menu.initialize();
- }
-}
-
-// call this in document body to write out menu html
-TransMenu.renderAll = function() {
- var aMenuHtml = [];
- for (var i = 0, menu = null; menu = this.registry[i]; i++) {
- aMenuHtml[i] = menu.toString();
- }
- document.write(aMenuHtml.join(""));
-}
-
-//==================================================================================================
-// TransMenu constructor (only called internally)
-//==================================================================================================
-// oActuator : The thing that causes the menu to be shown when it is mousedover. Either a
-// reference to an HTML element, or a TransMenuItem from an existing menu.
-// iDirection : The direction to slide out. One of TransMenu.direction.
-// iLeft : Left pixel offset of menu from actuator
-// iTop : Top pixel offset of menu from actuator
-// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
-// parentMenuSet : Menuset this menu will be added to.
-//==================================================================================================
-function TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, parentMenuSet) {
- // public methods
- this.addItem = addItem;
- this.addMenu = addMenu;
- this.toString = toString;
- this.initialize = initialize;
- this.isOpen = false;
- this.show = show;
- this.hide = hide;
- this.items = [];
-
- // events
- this.onactivate = new Function(); // when the menu starts to slide open
- this.ondeactivate = new Function(); // when the menu finishes sliding closed
- this.onmouseover = new Function(); // when the menu has been moused over
- this.onqueue = new Function(); // hack .. when the menu sets a timer to be closed a little while in the future
- this.ondequeue = new Function();
-
- // initialization
- this.index = TransMenu.registry.length;
- TransMenu.registry[this.index] = this;
-
- var id = "TransMenu" + this.index;
- var contentHeight = null;
- var contentWidth = null;
- var childMenuSet = null;
- var animating = false;
- var childMenus = [];
- var slideAccel = -1;
- var elmCache = null;
- var ready = false;
- var _this = this;
- var a = null;
-
- var pos = iDirection == TransMenu.direction.down ? "top" : "left";
- var dim = null;
-
- // private and public method implimentations
- function addItem(sText, sUrl) {
- var item = new TransMenuItem(sText, sUrl, this);
- item._index = this.items.length;
- this.items[item._index] = item;
- }
-
- function addMenu(oMenuItem) {
- if (!oMenuItem.parentMenu == this) throw new Error("Cannot add a menu here");
-
- if (childMenuSet == null) childMenuSet = new TransMenuSet(TransMenu.direction.right, -5, 2, TransMenu.reference.topRight);
-
- var m = childMenuSet.addMenu(oMenuItem);
-
- childMenus[oMenuItem._index] = m;
- m.onmouseover = child_mouseover;
- m.ondeactivate = child_deactivate;
- m.onqueue = child_queue;
- m.ondequeue = child_dequeue;
-
- return m;
- }
-
- function initialize() {
- initCache();
- initEvents();
- initSize();
- ready = true;
- }
-
- function show() {
- //dbg_dump("show");
- if (ready) {
- _this.isOpen = true;
- animating = true;
- setContainerPos();
- elmCache["clip"].style.visibility = "visible";
- elmCache["clip"].style.zIndex = TransMenu._maxZ++;
- //dbg_dump("maxZ: " + TransMenu._maxZ);
- slideStart();
- _this.onactivate();
- }
- }
-
- function hide() {
- if (ready) {
- _this.isOpen = false;
- animating = true;
-
- for (var i = 0, item = null; item = elmCache.item[i]; i++)
- dehighlight(item);
-
- if (childMenuSet) childMenuSet.hide();
-
- slideStart();
- _this.ondeactivate();
- }
- }
-
- function setContainerPos() {
- var sub = oActuator.constructor == TransMenuItem;
- var act = sub ? oActuator.parentMenu.elmCache["item"][oActuator._index] : oActuator;
- var el = act;
-
- var x = 0;
- var y = 0;
-
-
- var minX = 0;
- var maxX = (window.innerWidth ? window.innerWidth : document.body.clientWidth) - parseInt(elmCache["clip"].style.width);
- var minY = 0;
- var maxY = (window.innerHeight ? window.innerHeight : document.body.clientHeight) - parseInt(elmCache["clip"].style.height);
-
- // add up all offsets... subtract any scroll offset
- while (sub ? el.parentNode.className.indexOf("transMenu") == -1 : el.offsetParent) {
- x += el.offsetLeft;
- y += el.offsetTop;
-
- if (el.scrollLeft) x -= el.scrollLeft;
- if (el.scrollTop) y -= el.scrollTop;
-
- el = el.offsetParent;
- }
-
- if (oActuator.constructor == TransMenuItem) {
- x += parseInt(el.parentNode.style.left);
- y += parseInt(el.parentNode.style.top);
- }
-
- switch (iReferencePoint) {
- case TransMenu.reference.topLeft:
- break;
- case TransMenu.reference.topRight:
- x += act.offsetWidth;
- break;
- case TransMenu.reference.bottomLeft:
- y += act.offsetHeight;
- break;
- case TransMenu.reference.bottomRight:
- x += act.offsetWidth;
- y += act.offsetHeight;
- break;
- }
-
- x += iLeft;
- y += iTop;
-
- x = Math.max(Math.min(x, maxX), minX);
- y = Math.max(Math.min(y, maxY), minY);
-
- elmCache["clip"].style.left = x + "px";
- elmCache["clip"].style.top = y + "px";
- }
-
- function slideStart() {
- var x0 = parseInt(elmCache["content"].style[pos]);
- var x1 = _this.isOpen ? 0 : -dim;
-
- if (a != null) a.stop();
- a = new Accelimation(x0, x1, TransMenu.slideTime, slideAccel);
-
- a.onframe = slideFrame;
- a.onend = slideEnd;
-
- a.start();
- }
-
- function slideFrame(x) {
- elmCache["content"].style[pos] = x + "px";
- }
-
- function slideEnd() {
- if (!_this.isOpen) elmCache["clip"].style.visibility = "hidden";
- animating = false;
- }
-
- function initSize() {
- // everything is based off the size of the items table...
- var ow = elmCache["items"].offsetWidth;
- var oh = elmCache["items"].offsetHeight;
- var ua = navigator.userAgent.toLowerCase();
-
- // clipping container should be ow/oh + the size of the shadow
- elmCache["clip"].style.width = ow + TransMenu.shadowSize + 2 + "px";
- elmCache["clip"].style.height = oh + TransMenu.shadowSize + 2 + "px";
-
- // same with content...
- elmCache["content"].style.width = ow + TransMenu.shadowSize + "px";
- elmCache["content"].style.height = oh + TransMenu.shadowSize + "px";
-
- contentHeight = oh + TransMenu.shadowSize;
- contentWidth = ow + TransMenu.shadowSize;
-
- dim = iDirection == TransMenu.direction.down ? contentHeight : contentWidth;
-
- // set initially closed
- elmCache["content"].style[pos] = -dim - TransMenu.shadowSize + "px";
- elmCache["clip"].style.visibility = "hidden";
-
- // if *not* mac/ie 5
- if (ua.indexOf("mac") == -1 || ua.indexOf("gecko") > -1) {
- // set background div to offset size
- elmCache["background"].style.width = ow + "px";
- elmCache["background"].style.height = oh + "px";
- elmCache["background"].style.backgroundColor = TransMenu.backgroundColor;
-
- // shadow left starts at offset left and is offsetHeight pixels high
- elmCache["shadowRight"].style.left = ow + "px";
- elmCache["shadowRight"].style.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize) + "px";
- elmCache["shadowRight"].style.backgroundColor = TransMenu.shadowColor;
-
- // shadow bottom starts at offset height and is offsetWidth - shadowOffset
- // pixels wide (we don't want the bottom and right shadows to overlap or we
- // get an extra bright bottom-right corner)
- elmCache["shadowBottom"].style.top = oh + "px";
- elmCache["shadowBottom"].style.width = ow - TransMenu.shadowOffset + "px";
- elmCache["shadowBottom"].style.backgroundColor = TransMenu.shadowColor;
- }
- // mac ie is a little different because we use a PNG for the transparency
- else {
- // set background div to offset size
- elmCache["background"].firstChild.src = TransMenu.backgroundPng;
- elmCache["background"].firstChild.width = ow;
- elmCache["background"].firstChild.height = oh;
-
- // shadow left starts at offset left and is offsetHeight pixels high
- elmCache["shadowRight"].firstChild.src = TransMenu.shadowPng;
- elmCache["shadowRight"].style.left = ow + "px";
- elmCache["shadowRight"].firstChild.width = TransMenu.shadowSize;
- elmCache["shadowRight"].firstChild.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize);
-
- // shadow bottom starts at offset height and is offsetWidth - shadowOffset
- // pixels wide (we don't want the bottom and right shadows to overlap or we
- // get an extra bright bottom-right corner)
- elmCache["shadowBottom"].firstChild.src = TransMenu.shadowPng;
- elmCache["shadowBottom"].style.top = oh + "px";
- elmCache["shadowBottom"].firstChild.height = TransMenu.shadowSize;
- elmCache["shadowBottom"].firstChild.width = ow - TransMenu.shadowOffset;
- }
- }
-
- function initCache() {
- var menu = document.getElementById(id);
- var all = menu.all ? menu.all : menu.getElementsByTagName("*"); // IE/win doesn't support * syntax, but does have the document.all thing
-
- elmCache = {};
- elmCache["clip"] = menu;
- elmCache["item"] = [];
-
- for (var i = 0, elm = null; elm = all[i]; i++) {
- switch (elm.className) {
- case "items":
- case "content":
- case "background":
- case "shadowRight":
- case "shadowBottom":
- elmCache[elm.className] = elm;
- break;
- case "item":
- elm._index = elmCache["item"].length;
- elmCache["item"][elm._index] = elm;
- break;
- }
- }
-
- // hack!
- _this.elmCache = elmCache;
- }
-
- function initEvents() {
- // hook item mouseover
- for (var i = 0, item = null; item = elmCache.item[i]; i++) {
- item.onmouseover = item_mouseover;
- item.onmouseout = item_mouseout;
- item.onclick = item_click;
- }
-
- // hook actuation
- if (typeof oActuator.tagName != "undefined") {
- oActuator.onmouseover = actuator_mouseover;
- oActuator.onmouseout = actuator_mouseout;
- }
-
- // hook menu mouseover
- elmCache["content"].onmouseover = content_mouseover;
- elmCache["content"].onmouseout = content_mouseout;
- }
-
- function highlight(oRow) {
- oRow.className = "item hover";
- if (childMenus[oRow._index])
- oRow.lastChild.firstChild.src = TransMenu.dingbatOn;
- }
-
- function dehighlight(oRow) {
- oRow.className = "item";
- if (childMenus[oRow._index])
- oRow.lastChild.firstChild.src = TransMenu.dingbatOff;
- }
-
- function item_mouseover() {
- if (!animating) {
- highlight(this);
-
- if (childMenus[this._index])
- childMenuSet.showMenu(childMenus[this._index]);
- else if (childMenuSet) childMenuSet.hide();
- }
- }
-
- function item_mouseout() {
- if (!animating) {
- if (childMenus[this._index])
- childMenuSet.hideMenu(childMenus[this._index]);
- else // otherwise child_deactivate will do this
- dehighlight(this);
- }
- }
-
- function item_click() {
- if (!animating) {
- if (_this.items[this._index].url)
- location.href = _this.items[this._index].url;
- }
- }
-
- function actuator_mouseover() {
- parentMenuSet.showMenu(_this);
- }
-
- function actuator_mouseout() {
- parentMenuSet.hideMenu(_this);
- }
-
- function content_mouseover() {
- if (!animating) {
- parentMenuSet.showMenu(_this);
- _this.onmouseover();
- }
- }
-
- function content_mouseout() {
- if (!animating) {
- parentMenuSet.hideMenu(_this);
- }
- }
-
- function child_mouseover() {
- if (!animating) {
- parentMenuSet.showMenu(_this);
- }
- }
-
- function child_deactivate() {
- for (var i = 0; i < childMenus.length; i++) {
- if (childMenus[i] == this) {
- dehighlight(elmCache["item"][i]);
- break;
- }
- }
- }
-
- function child_queue() {
- parentMenuSet.hideMenu(_this);
- }
-
- function child_dequeue() {
- parentMenuSet.showMenu(_this);
- }
-
- function toString() {
- var aHtml = [];
- var sClassName = "transMenu" + (oActuator.constructor != TransMenuItem ? " top" : "");
-
- for (var i = 0, item = null; item = this.items[i]; i++) {
- aHtml[i] = item.toString(childMenus[i]);
- }
-
- return '<div id="' + id + '" class="' + sClassName + '">' +
- '<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">' +
- '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr>' +
- aHtml.join('') +
- '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr></table>' +
- '<div class="shadowBottom"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '<div class="shadowRight"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '<div class="background"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '</div></div>';
- }
-}
-
-
-//==================================================================================================
-// TransMenuSet
-//==================================================================================================
-// iDirection : The direction to slide out. One of TransMenu.direction.
-// iLeft : Left pixel offset of menus from actuator
-// iTop : Top pixel offset of menus from actuator
-// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
-//==================================================================================================
-TransMenuSet.registry = [];
-
-function TransMenuSet(iDirection, iLeft, iTop, iReferencePoint) {
- // public methods
- this.addMenu = addMenu;
- this.showMenu = showMenu;
- this.hideMenu = hideMenu;
- this.hide = hide;
- this.hideCurrent = hideCurrent;
-
- // initialization
- var menus = [];
- var _this = this;
- var current = null;
-
- this.index = TransMenuSet.registry.length;
- TransMenuSet.registry[this.index] = this;
-
- // method implimentations...
- function addMenu(oActuator) {
- var m = new TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, this);
- menus[menus.length] = m;
- return m;
- }
-
- function showMenu(oMenu) {
- if (oMenu != current) {
- // close currently open menu
- if (current != null) hide(current);
-
- // set current menu to this one
- current = oMenu;
-
- // if this menu is closed, open it
- oMenu.show();
- }
- else {
- // hide pending calls to close this menu
- cancelHide(oMenu);
- }
- }
-
- function hideMenu(oMenu) {
- //dbg_dump("hideMenu a " + oMenu.index);
- if (current == oMenu && oMenu.isOpen) {
- //dbg_dump("hideMenu b " + oMenu.index);
- if (!oMenu.hideTimer) scheduleHide(oMenu);
- }
- }
-
- function scheduleHide(oMenu) {
- //dbg_dump("scheduleHide " + oMenu.index);
- oMenu.onqueue();
- oMenu.hideTimer = window.setTimeout("TransMenuSet.registry[" + _this.index + "].hide(TransMenu.registry[" + oMenu.index + "])", TransMenu.hideDelay);
- }
-
- function cancelHide(oMenu) {
- //dbg_dump("cancelHide " + oMenu.index);
- if (oMenu.hideTimer) {
- oMenu.ondequeue();
- window.clearTimeout(oMenu.hideTimer);
- oMenu.hideTimer = null;
- }
- }
-
- function hide(oMenu) {
- if (!oMenu && current) oMenu = current;
-
- if (oMenu && current == oMenu && oMenu.isOpen) {
- hideCurrent();
- }
- }
-
- function hideCurrent() {
- if (null != current) {
- cancelHide(current);
- current.hideTimer = null;
- current.hide();
- current = null;
- }
- }
-}
-
-//==================================================================================================
-// TransMenuItem (internal)
-// represents an item in a dropdown
-//==================================================================================================
-// sText : The item display text
-// sUrl : URL to load when the item is clicked
-// oParent : Menu this item is a part of
-//==================================================================================================
-function TransMenuItem(sText, sUrl, oParent) {
- this.toString = toString;
- this.text = sText;
- this.url = sUrl;
- this.parentMenu = oParent;
-
- function toString(bDingbat) {
- var sDingbat = bDingbat ? TransMenu.dingbatOff : TransMenu.spacerGif;
- var iEdgePadding = TransMenu.itemPadding + TransMenu.menuPadding;
- var sPaddingLeft = "padding:" + TransMenu.itemPadding + "px; padding-left:" + iEdgePadding + "px;"
- var sPaddingRight = "padding:" + TransMenu.itemPadding + "px; padding-right:" + iEdgePadding + "px;"
-
- return '<tr class="item"><td nowrap style="' + sPaddingLeft + '">' +
- sText + '</td><td width="14" style="' + sPaddingRight + '">' +
- '<img src="' + sDingbat + '" width="14" height="14"></td></tr>';
- }
-}
-
-
-
-
-
-
-//=====================================================================
-// Accel[erated] [an]imation object
-// change a property of an object over time in an accelerated fashion
-//=====================================================================
-// obj : reference to the object whose property you'd like to animate
-// prop : property you would like to change eg: "left"
-// to : final value of prop
-// time : time the animation should take to run
-// zip : optional. specify the zippiness of the acceleration. pick a
-// number between -1 and 1 where -1 is full decelerated, 1 is
-// full accelerated, and 0 is linear (no acceleration). default
-// is 0.
-// unit : optional. specify the units for use with prop. default is
-// "px".
-//=====================================================================
-// bezier functions lifted from the lib_animation.js file in the
-// 13th Parallel API. www.13thparallel.org
-//=====================================================================
-
-function Accelimation(from, to, time, zip) {
- if (typeof zip == "undefined") zip = 0;
- if (typeof unit == "undefined") unit = "px";
-
- this.x0 = from;
- this.x1 = to;
- this.dt = time;
- this.zip = -zip;
- this.unit = unit;
- this.timer = null;
- this.onend = new Function();
- this.onframe = new Function();
-}
-
-
-
-//=====================================================================
-// public methods
-//=====================================================================
-
-// after you create an accelimation, you call this to start it-a runnin'
-Accelimation.prototype.start = function() {
- this.t0 = new Date().getTime();
- this.t1 = this.t0 + this.dt;
- var dx = this.x1 - this.x0;
- this.c1 = this.x0 + ((1 + this.zip) * dx / 3);
- this.c2 = this.x0 + ((2 + this.zip) * dx / 3);
- Accelimation._add(this);
-}
-
-// and if you need to stop it early for some reason...
-Accelimation.prototype.stop = function() {
- Accelimation._remove(this);
-}
-
-
-
-//=====================================================================
-// private methods
-//=====================================================================
-
-// paints one frame. gets called by Accelimation._paintAll.
-Accelimation.prototype._paint = function(time) {
- if (time < this.t1) {
- var elapsed = time - this.t0;
- this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));
- }
- else this._end();
-}
-
-// ends the animation
-Accelimation.prototype._end = function() {
- Accelimation._remove(this);
- this.onframe(this.x1);
- this.onend();
-}
-
-
-
-
-//=====================================================================
-// static methods (all private)
-//=====================================================================
-
-// add a function to the list of ones to call periodically
-Accelimation._add = function(o) {
- var index = this.instances.length;
- this.instances[index] = o;
- // if this is the first one, start the engine
- if (this.instances.length == 1) {
- this.timerID = window.setInterval("Accelimation._paintAll()", this.targetRes);
- }
-}
-
-// remove a function from the list
-Accelimation._remove = function(o) {
- for (var i = 0; i < this.instances.length; i++) {
- if (o == this.instances[i]) {
- this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) );
- break;
- }
- }
- // if that was the last one, stop the engine
- if (this.instances.length == 0) {
- window.clearInterval(this.timerID);
- this.timerID = null;
- }
-}
-
-// "engine" - call each function in the list every so often
-Accelimation._paintAll = function() {
- var now = new Date().getTime();
- for (var i = 0; i < this.instances.length; i++) {
- this.instances[i]._paint(now);
- }
-}
-
-
-// Bezier functions:
-Accelimation._B1 = function(t) { return t*t*t }
-Accelimation._B2 = function(t) { return 3*t*t*(1-t) }
-Accelimation._B3 = function(t) { return 3*t*(1-t)*(1-t) }
-Accelimation._B4 = function(t) { return (1-t)*(1-t)*(1-t) }
-
-
-//Finds the coordinates of a point at a certain stage through a bezier curve
-Accelimation._getBezier = function(percent,startPos,endPos,control1,control2) {
- return endPos * this._B1(percent) + control2 * this._B2(percent) + control1 * this._B3(percent) + startPos * this._B4(percent);
-}
-
-
-//=====================================================================
-// static properties
-//=====================================================================
-
-Accelimation.instances = [];
-Accelimation.targetRes = 10;
-Accelimation.timerID = null;
-
-
-//=====================================================================
-// IE win memory cleanup
-//=====================================================================
-
-if (window.attachEvent) {
- var cearElementProps = [
- 'data',
- 'onmouseover',
- 'onmouseout',
- 'onmousedown',
- 'onmouseup',
- 'ondblclick',
- 'onclick',
- 'onselectstart',
- 'oncontextmenu'
- ];
-
- window.attachEvent("onunload", function() {
- var el;
- for(var d = document.all.length;d--;){
- el = document.all[d];
- for(var c = cearElementProps.length;c--;){
- el[cearElementProps[c]] = null;
- }
- }
- });
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/javascript/transmenuC.js b/src/usr/local/www/themes/nervecenter/javascript/transmenuC.js
deleted file mode 100644
index 88626c7..0000000
--- a/src/usr/local/www/themes/nervecenter/javascript/transmenuC.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/* =================================================================================================
- * TransMenu
- * March, 2003
- * Customizable multi-level animated DHTML menus with transparency.
- * =================================================================================================
- * "Can I use this?"
- *
- * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
- * out at: http://creativecommons.org/licenses/by/2.0/
- *
- * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
- * for writing it. You may not misrepresent yourself as the author of this code.
- * =================================================================================================
- * "It's kinda hard to read, though"
- *
- * The uncompressed, commented version of this script can be found at:
- * http://youngpup.net/projects/transMenus
- * ============================================================================================== */
-TransMenu.spacerGif="themes/nervecenter/javascript/img/x.gif";TransMenu.dingbatOn="themes/nervecenter/javascript/img/submenu-on.gif";TransMenu.dingbatOff="themes/nervecenter/javascript/img/submenu-off.gif";TransMenu.dingbatSize=14;TransMenu.menuPadding=5;TransMenu.itemPadding=3;TransMenu.shadowSize=2;TransMenu.shadowOffset=3;TransMenu.shadowColor="#000000";TransMenu.shadowPng="themes/nervecenter/javascript/img/grey-40.png";TransMenu.backgroundColor="#990000";TransMenu.backgroundPng="themes/nervecenter/javascript/img/white-90.png";TransMenu.hideDelay=1000;TransMenu.slideTime=400;TransMenu.reference={topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};TransMenu.direction={down:1,right:2};TransMenu.registry=[];TransMenu._maxZ=100;TransMenu.isSupported=function(){var ua=navigator.userAgent.toLowerCase();var pf=navigator.platform.toLowerCase();var an=navigator.appName;var r=false;if(ua.indexOf("gecko")>-1&&navigator.productSub>=20020605)r=true;else if(an=="Microsoft Internet Explorer"){if(document.getElementById){if(pf.indexOf("mac")==0){r=/msie (\d(.\d*)?)/.test(ua)&&Number(RegExp.$1)>=5.1;}
-else r=true;}}
-return r;}
-TransMenu.initialize=function(){for(var i=0,menu=null;menu=this.registry[i];i++){menu.initialize();}}
-TransMenu.renderAll=function(){var aMenuHtml=[];for(var i=0,menu=null;menu=this.registry[i];i++){aMenuHtml[i]=menu.toString();}
-document.write(aMenuHtml.join(""));}
-function TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,parentMenuSet){this.addItem=addItem;this.addMenu=addMenu;this.toString=toString;this.initialize=initialize;this.isOpen=false;this.show=show;this.hide=hide;this.items=[];this.onactivate=new Function();this.ondeactivate=new Function();this.onmouseover=new Function();this.onqueue=new Function();this.ondequeue=new Function();this.index=TransMenu.registry.length;TransMenu.registry[this.index]=this;var id="TransMenu"+this.index;var contentHeight=null;var contentWidth=null;var childMenuSet=null;var animating=false;var childMenus=[];var slideAccel=-1;var elmCache=null;var ready=false;var _this=this;var a=null;var pos=iDirection==TransMenu.direction.down?"top":"left";var dim=null;function addItem(sText,sUrl){var item=new TransMenuItem(sText,sUrl,this);item._index=this.items.length;this.items[item._index]=item;}
-function addMenu(oMenuItem){if(!oMenuItem.parentMenu==this)throw new Error("Cannot add a menu here");if(childMenuSet==null)childMenuSet=new TransMenuSet(TransMenu.direction.right,-5,2,TransMenu.reference.topRight);var m=childMenuSet.addMenu(oMenuItem);childMenus[oMenuItem._index]=m;m.onmouseover=child_mouseover;m.ondeactivate=child_deactivate;m.onqueue=child_queue;m.ondequeue=child_dequeue;return m;}
-function initialize(){initCache();initEvents();initSize();ready=true;}
-function show(){if(ready){_this.isOpen=true;animating=true;setContainerPos();elmCache["clip"].style.visibility="visible";elmCache["clip"].style.zIndex=TransMenu._maxZ++;slideStart();_this.onactivate();}}
-function hide(){if(ready){_this.isOpen=false;animating=true;for(var i=0,item=null;item=elmCache.item[i];i++)dehighlight(item);if(childMenuSet)childMenuSet.hide();slideStart();_this.ondeactivate();}}
-function setContainerPos(){var sub=oActuator.constructor==TransMenuItem;var act=sub?oActuator.parentMenu.elmCache["item"][oActuator._index]:oActuator;var el=act;var x=0;var y=0;var minX=0;var maxX=(window.innerWidth?window.innerWidth:document.body.clientWidth)-parseInt(elmCache["clip"].style.width);var minY=0;var maxY=(window.innerHeight?window.innerHeight:document.body.clientHeight)-parseInt(elmCache["clip"].style.height);while(sub?el.parentNode.className.indexOf("transMenu")==-1:el.offsetParent){x+=el.offsetLeft;y+=el.offsetTop;if(el.scrollLeft)x-=el.scrollLeft;if(el.scrollTop)y-=el.scrollTop;el=el.offsetParent;}
-if(oActuator.constructor==TransMenuItem){x+=parseInt(el.parentNode.style.left);y+=parseInt(el.parentNode.style.top);}
-switch(iReferencePoint){case TransMenu.reference.topLeft:break;case TransMenu.reference.topRight:x+=act.offsetWidth;break;case TransMenu.reference.bottomLeft:y+=act.offsetHeight;break;case TransMenu.reference.bottomRight:x+=act.offsetWidth;y+=act.offsetHeight;break;}
-x+=iLeft;y+=iTop;x=Math.max(Math.min(x,maxX),minX);y=Math.max(Math.min(y,maxY),minY);elmCache["clip"].style.left=x+"px";elmCache["clip"].style.top=y+"px";}
-function slideStart(){var x0=parseInt(elmCache["content"].style[pos]);var x1=_this.isOpen?0:-dim;if(a!=null)a.stop();a=new Accelimation(x0,x1,TransMenu.slideTime,slideAccel);a.onframe=slideFrame;a.onend=slideEnd;a.start();}
-function slideFrame(x){elmCache["content"].style[pos]=x+"px";}
-function slideEnd(){if(!_this.isOpen)elmCache["clip"].style.visibility="hidden";animating=false;}
-function initSize(){var ow=elmCache["items"].offsetWidth;var oh=elmCache["items"].offsetHeight;var ua=navigator.userAgent.toLowerCase();elmCache["clip"].style.width=ow+TransMenu.shadowSize+2+"px";elmCache["clip"].style.height=oh+TransMenu.shadowSize+2+"px";elmCache["content"].style.width=ow+TransMenu.shadowSize+"px";elmCache["content"].style.height=oh+TransMenu.shadowSize+"px";contentHeight=oh+TransMenu.shadowSize;contentWidth=ow+TransMenu.shadowSize;dim=iDirection==TransMenu.direction.down?contentHeight:contentWidth;elmCache["content"].style[pos]=-dim-TransMenu.shadowSize+"px";elmCache["clip"].style.visibility="hidden";if(ua.indexOf("mac")==-1||ua.indexOf("gecko")>-1){elmCache["background"].style.width=ow+"px";elmCache["background"].style.height=oh+"px";elmCache["background"].style.backgroundColor=TransMenu.backgroundColor;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].style.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize)+"px";elmCache["shadowRight"].style.backgroundColor=TransMenu.shadowColor;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].style.width=ow-TransMenu.shadowOffset+"px";elmCache["shadowBottom"].style.backgroundColor=TransMenu.shadowColor;}
-else{elmCache["background"].firstChild.src=TransMenu.backgroundPng;elmCache["background"].firstChild.width=ow;elmCache["background"].firstChild.height=oh;elmCache["shadowRight"].firstChild.src=TransMenu.shadowPng;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].firstChild.width=TransMenu.shadowSize;elmCache["shadowRight"].firstChild.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize);elmCache["shadowBottom"].firstChild.src=TransMenu.shadowPng;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].firstChild.height=TransMenu.shadowSize;elmCache["shadowBottom"].firstChild.width=ow-TransMenu.shadowOffset;}}
-function initCache(){var menu=document.getElementById(id);var all=menu.all?menu.all:menu.getElementsByTagName("*");elmCache={};elmCache["clip"]=menu;elmCache["item"]=[];for(var i=0,elm=null;elm=all[i];i++){switch(elm.className){case"items":case"content":case"background":case"shadowRight":case"shadowBottom":elmCache[elm.className]=elm;break;case"item":elm._index=elmCache["item"].length;elmCache["item"][elm._index]=elm;break;}}
-_this.elmCache=elmCache;}
-function initEvents(){for(var i=0,item=null;item=elmCache.item[i];i++){item.onmouseover=item_mouseover;item.onmouseout=item_mouseout;item.onclick=item_click;}
-if(typeof oActuator.tagName!="undefined"){oActuator.onmouseover=actuator_mouseover;oActuator.onmouseout=actuator_mouseout;}
-elmCache["content"].onmouseover=content_mouseover;elmCache["content"].onmouseout=content_mouseout;}
-function highlight(oRow){oRow.className="item hover";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOn;}
-function dehighlight(oRow){oRow.className="item";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOff;}
-function item_mouseover(){if(!animating){highlight(this);if(childMenus[this._index])childMenuSet.showMenu(childMenus[this._index]);else if(childMenuSet)childMenuSet.hide();}}
-function item_mouseout(){if(!animating){if(childMenus[this._index])childMenuSet.hideMenu(childMenus[this._index]);else dehighlight(this);}}
-function item_click(){if(!animating){if(_this.items[this._index].url)location.href=_this.items[this._index].url;}}
-function actuator_mouseover(){parentMenuSet.showMenu(_this);}
-function actuator_mouseout(){parentMenuSet.hideMenu(_this);}
-function content_mouseover(){if(!animating){parentMenuSet.showMenu(_this);_this.onmouseover();}}
-function content_mouseout(){if(!animating){parentMenuSet.hideMenu(_this);}}
-function child_mouseover(){if(!animating){parentMenuSet.showMenu(_this);}}
-function child_deactivate(){for(var i=0;i<childMenus.length;i++){if(childMenus[i]==this){dehighlight(elmCache["item"][i]);break;}}}
-function child_queue(){parentMenuSet.hideMenu(_this);}
-function child_dequeue(){parentMenuSet.showMenu(_this);}
-function toString(){var aHtml=[];var sClassName="transMenu"+(oActuator.constructor!=TransMenuItem?" top":"");for(var i=0,item=null;item=this.items[i];i++){aHtml[i]=item.toString(childMenus[i]);}
-return'<div id="'+id+'" class="'+sClassName+'">'+'<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">'+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr>'+aHtml.join('')+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr></table>'+'<div class="shadowBottom"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="shadowRight"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="background"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'</div></div>';}}
-TransMenuSet.registry=[];function TransMenuSet(iDirection,iLeft,iTop,iReferencePoint){this.addMenu=addMenu;this.showMenu=showMenu;this.hideMenu=hideMenu;this.hide=hide;this.hideCurrent=hideCurrent;var menus=[];var _this=this;var current=null;this.index=TransMenuSet.registry.length;TransMenuSet.registry[this.index]=this;function addMenu(oActuator){var m=new TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,this);menus[menus.length]=m;return m;}
-function showMenu(oMenu){if(oMenu!=current){if(current!=null)hide(current);current=oMenu;oMenu.show();}
-else{cancelHide(oMenu);}}
-function hideMenu(oMenu){if(current==oMenu&&oMenu.isOpen){if(!oMenu.hideTimer)scheduleHide(oMenu);}}
-function scheduleHide(oMenu){oMenu.onqueue();oMenu.hideTimer=window.setTimeout("TransMenuSet.registry["+_this.index+"].hide(TransMenu.registry["+oMenu.index+"])",TransMenu.hideDelay);}
-function cancelHide(oMenu){if(oMenu.hideTimer){oMenu.ondequeue();window.clearTimeout(oMenu.hideTimer);oMenu.hideTimer=null;}}
-function hide(oMenu){if(!oMenu&&current)oMenu=current;if(oMenu&&current==oMenu&&oMenu.isOpen){hideCurrent();}}
-function hideCurrent(){if (null != current){cancelHide(current);current.hideTimer=null;current.hide();current=null;}}}
-function TransMenuItem(sText,sUrl,oParent){this.toString=toString;this.text=sText;this.url=sUrl;this.parentMenu=oParent;function toString(bDingbat){var sDingbat=bDingbat?TransMenu.dingbatOff:TransMenu.spacerGif;var iEdgePadding=TransMenu.itemPadding+TransMenu.menuPadding;var sPaddingLeft="padding:"+TransMenu.itemPadding+"px; padding-left:"+iEdgePadding+"px;"
-var sPaddingRight="padding:"+TransMenu.itemPadding+"px; padding-right:"+iEdgePadding+"px;"
-return'<tr class="item"><td nowrap style="'+sPaddingLeft+'">'+sText+'</td><td width="14" style="'+sPaddingRight+'">'+'<img src="'+sDingbat+'" width="14" height="14"></td></tr>';}}
-function Accelimation(from,to,time,zip){if(typeof zip=="undefined")zip=0;if(typeof unit=="undefined")unit="px";this.x0=from;this.x1=to;this.dt=time;this.zip=-zip;this.unit=unit;this.timer=null;this.onend=new Function();this.onframe=new Function();}
-Accelimation.prototype.start=function(){this.t0=new Date().getTime();this.t1=this.t0+this.dt;var dx=this.x1-this.x0;this.c1=this.x0+((1+this.zip)*dx/3);this.c2=this.x0+((2+this.zip)*dx/3);Accelimation._add(this);}
-Accelimation.prototype.stop=function(){Accelimation._remove(this);}
-Accelimation.prototype._paint=function(time){if(time<this.t1){var elapsed=time-this.t0;this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));}
-else this._end();}
-Accelimation.prototype._end=function(){Accelimation._remove(this);this.onframe(this.x1);this.onend();}
-Accelimation._add=function(o){var index=this.instances.length;this.instances[index]=o;if(this.instances.length==1){this.timerID=window.setInterval("Accelimation._paintAll()",this.targetRes);}}
-Accelimation._remove=function(o){for(var i=0;i<this.instances.length;i++){if(o==this.instances[i]){this.instances=this.instances.slice(0,i).concat(this.instances.slice(i+1));break;}}
-if(this.instances.length==0){window.clearInterval(this.timerID);this.timerID=null;}}
-Accelimation._paintAll=function(){var now=new Date().getTime();for(var i=0;i<this.instances.length;i++){this.instances[i]._paint(now);}}
-Accelimation._B1=function(t){return t*t*t}
-Accelimation._B2=function(t){return 3*t*t*(1-t)}
-Accelimation._B3=function(t){return 3*t*(1-t)*(1-t)}
-Accelimation._B4=function(t){return(1-t)*(1-t)*(1-t)}
-Accelimation._getBezier=function(percent,startPos,endPos,control1,control2){return endPos*this._B1(percent)+control2*this._B2(percent)+control1*this._B3(percent)+startPos*this._B4(percent);}
-Accelimation.instances=[];Accelimation.targetRes=10;Accelimation.timerID=null;
-if(window.attachEvent){var cearElementProps=['data','onmouseover','onmouseout','onmousedown','onmouseup','ondblclick','onclick','onselectstart','oncontextmenu'];window.attachEvent("onunload", function() {var el;for(var d=document.all.length;d--;){el=document.all[d];for(var c=cearElementProps.length;c--;){el[cearElementProps[c]] = null;}}});} \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/jsevents/body.def b/src/usr/local/www/themes/nervecenter/jsevents/body.def
deleted file mode 100644
index 501d548..0000000
--- a/src/usr/local/www/themes/nervecenter/jsevents/body.def
+++ /dev/null
@@ -1,7 +0,0 @@
-# Format: <event_name>=<jsfunction_name> !<forbidden_page_0>,<forbidden_page_1>...<forbidden_page_n>
-# where: forbidden pages are those pages that should *not* use
-# the particular JavaScript function within the JS event
-# specified below.
-# $Id$
-#
-onload=tmenuinit(); !wizard.php \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/loader.js b/src/usr/local/www/themes/nervecenter/loader.js
deleted file mode 100644
index 491e874..0000000
--- a/src/usr/local/www/themes/nervecenter/loader.js
+++ /dev/null
@@ -1,29 +0,0 @@
-//<![CDATA[
-var browser = '';
-var version = '';
-var entrance = '';
-var cond = '';
-
-// BROWSER?
-if (browser == '') {
- if (navigator.appName.indexOf('Microsoft') != -1)
- browser = 'IE';
- else if (navigator.appName.indexOf('Netscape') != -1)
- browser = 'Netscape';
- else
- browser = 'IE';
-}
-if (version == '') {
- version= navigator.appVersion;
- paren = version.indexOf('(');
- whole_version = navigator.appVersion.substring(0,paren-1);
- version = parseInt(whole_version);
-}
-
-if (browser == 'IE' && version < 7) {
- document.write('<script type="text/javascript" src="/themes/nervecenter/javascript/ie7/ie7-standard-p.js"></script>');
-}
-
-document.write('<script type="text/javascript" src="/themes/nervecenter/javascript/niftyjsCode.js"></script>');
-
-//]]>
diff --git a/src/usr/local/www/themes/nervecenter/login.css b/src/usr/local/www/themes/nervecenter/login.css
deleted file mode 100644
index f8abdfc..0000000
--- a/src/usr/local/www/themes/nervecenter/login.css
+++ /dev/null
@@ -1,1127 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #999999;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- background-position : center 0px;
- background-color: #999999;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-
-#login {
-/* background: #cccccc; */
- background-color: transparent;
- border: 0px solid #cccccc;
- margin: 5em auto;
- padding: 0em;
- width: 400px;
-/* filter:alpha(opacity=60);
- -moz-opacity:0.6;
- -khtml-opacity: 0.6;
- opacity: 0.6; */
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
-/* background: #ffffff; */
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 400px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -420px;
- left: 70px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- top: -300px; */
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- left: 10px;
- top: -300px; */
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- text-align: center;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -20px;
- left: 170px;
-}
-
-/* loginerror box follows */
-
-#login #inputerrors {
- background-color: transparent;
- border: 0px solid #666666;
- margin: 5em auto;
- vertical-align: middle;
- padding: 0em;
- width: 330px;
- height: 50px;
- position: relative;
- top: -370px;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/menu.inc b/src/usr/local/www/themes/nervecenter/menu.inc
deleted file mode 100644
index a274410..0000000
--- a/src/usr/local/www/themes/nervecenter/menu.inc
+++ /dev/null
@@ -1,177 +0,0 @@
-<?php
-/* $Id$ */
-/* ========================================================================== */
-/*
- menu.inc
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-require("menu.inc");
-
-define("TMENU_STUB", "
- // set up drop downs anywhere in the body of the page. I think the bottom of the page is better..
- // but you can experiment with effect on loadtime.
- if (TransMenu.isSupported()) {
-
- //==================================================================================================
- // create a set of dropdowns
- //==================================================================================================
- // the first param should always be down, as it is here
- //
- // The second and third param are the top and left offset positions of the menus from their actuators
- // respectively. To make a menu appear a little to the left and bottom of an actuator, you could use
- // something like -5, 5
- //
- // The last parameter can be .topLeft, .bottomLeft, .topRight, or .bottomRight to inidicate the corner
- // of the actuator from which to measure the offset positions above. Here we are saying we want the
- // menu to appear directly below the bottom left corner of the actuator
- //==================================================================================================
- var ms = new TransMenuSet(TransMenu.direction.down, 1, 0, TransMenu.reference.bottomLeft);
-
- //==================================================================================================
- // create a dropdown menu
- //==================================================================================================
- // the first parameter should be the HTML element which will act actuator for the menu
- //==================================================================================================
-
- @@MENU_DEFINITIONS@@
-
- //==================================================================================================
- // write drop downs into page
- //==================================================================================================
- // this method writes all the HTML for the menus into the page with document.write(). It must be
- // called within the body of the HTML page.
- //==================================================================================================
- TransMenu.renderAll();
- }
-");
-
-class NervecenterMenu extends Menu {
- private $menuJScript = "NOT-SET";
- private $menuJScriptEvents = "NOT-SET";
- private $menuID = "NOT-SET";
-
- public function __construct($identification = "", $filename = "", Component $c = NULL) {
- parent::__construct($identification, $filename, $c);
-
- $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
- $this->menuID = $id;
-
- if ($this->hasParent()) {
- $this->menuJScript = "\tvar {$id} = ms.addMenu(document.getElementById('{$id}'));\n";
- }
- } // end __construct
-
- public function getMenuID() {
- return $this->menuID;
- }
-
- public function setMenuID($myMenuID) {
- $this->menuID = $myMenuID;
- }
-
- public function getMenuJScript() {
- $childJScript = "";
- foreach ($this->getChildren() as $component) {
- $childJScript .= $component->getMenuJScript();
- }
-
- if (! $this->hasParent()) {
- $this->menuJScript = str_replace("@@MENU_DEFINITIONS@@", $childJScript, TMENU_STUB);
- } else {
- $this->menuJScript .= "\n$childJScript\n";
- }
-
- return $this->menuJScript;
- }
-
- public function getMenuJScriptEvents() {
- return $this->menuJScriptEvents;
- }
-
- public function __toString() {
- if (! $this->hasParent()) {
- $menuMarkup =<<<EOD
- <div id="menu">
- @@CHILD_ELEMENTS@@
- </div>
-
-EOD;
- } else {
- $name = gettext($this->getID());
- $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
-
- $menuMarkup =<<<EOD
- <a id="{$id}" href="#">{$name}</a>
- @@CHILD_ELEMENTS@@
-EOD;
- }
-
- $childMarkup = "";
- foreach ($this->getChildren() as $component) {
- $childMarkup .= $component;
- }
-
- $menuMarkup = str_replace("@@CHILD_ELEMENTS@@", $childMarkup, $menuMarkup);
-
- return $menuMarkup;
- }
-}
-
-class NervecenterMenuItem extends MenuItem {
- private $menuJScript = "NOT-SET";
- private $menuJScriptEvents = "NOT-SET";
-
- public function __construct($identification = "", $filename = "", $href = "", Component $c = NULL) {
- parent::__construct($identification, $filename, $href, $c);
-
- $href = $this->getHref() <> "" ? $this->getHref() : "{$this->getFile()}";
- $name = gettext($this->getID());
- $file = $this->getFile();
-
- $this->menuJScript = $this->check_access("{$file}", "\t{$this->getParent()->getMenuID()}.addItem('{$name}', '{$href}');\n");
- }
-
- public function getMenuJScript() {
- return $this->menuJScript;
- }
-
- public function getMenuJScriptEvents() {
- return $this->menuJScriptEvents;
- }
-
- public function __toString() {
- return "";
- }
-}
-
-?>
diff --git a/src/usr/local/www/themes/nervecenter/new_tab_menu.css b/src/usr/local/www/themes/nervecenter/new_tab_menu.css
deleted file mode 100644
index 04c4cf2..0000000
--- a/src/usr/local/www/themes/nervecenter/new_tab_menu.css
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- new_tab_menu.css
- part of pfSense
- Copyright (C) 2010-2011 Robert Zelaya
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
-
- Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
- The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
-
- <tr>
- <td>
- <?php
- $tab_array_indent = 0; // move to the line in px
- $tab_array_space = 1; // space betwen lines in px
- $tab_array_char_limit = 82; // number or chr before the drop down box
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
-
-*/
-
-.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
-
-.newtabmenu li{float:left; margin-right:2px; text-align: center;}
-.newtabmenu a:link, .newtabmenu a:visited{
- background:url(images/new_tab_menu.png) right 45px;
- color:#ffffff; /* noactive font */
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- font-weight:bold;
- font-size:.9em;
- height:20px;
- line-height:20px;
- text-decoration:none;
-}
-.newtabmenu a span{
- background:url(images/new_tab_menu.png) left 45px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- height:20px;
- margin-right:7px;
- padding-left:7px;
-}
-.newtabmenu a:hover{
- background:url(images/new_tab_menu.png) right 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- color:#ffffff; /* hover over font */
-}
-.newtabmenu a:hover span{
- background:url(images/new_tab_menu.png) left 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
-}
-
-/* -------------------------------- */
-/* ACTIVE ELEMENTS */
-.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
- color:#000000; /* active font */
- background:url(images/new_tab_menu.png) right 0 no-repeat;
-}
-.newtabmenu_active a span, .newtabmenu_active a:hover span{
- background:url(images/new_tab_menu.png) left 0 no-repeat;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/no_big_logo b/src/usr/local/www/themes/nervecenter/no_big_logo
deleted file mode 100644
index 6e5c70d..0000000
--- a/src/usr/local/www/themes/nervecenter/no_big_logo
+++ /dev/null
@@ -1 +0,0 @@
-NO! DONT! \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/rrdcolors.inc.php b/src/usr/local/www/themes/nervecenter/rrdcolors.inc.php
deleted file mode 100644
index dcb7a39..0000000
--- a/src/usr/local/www/themes/nervecenter/rrdcolors.inc.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/* $Id$ */
-/*
- rrdcolors.inc.php
- Part of pfSense
- Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/* This file is included by the RRD graphing page and sets the colors */
-
-/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* 95th Percentile Lines Out, In */
-$colortraffic95 = array('660000', 'FF0000');
-
-/* State Table pfrate, pfstates, pfnat, srcip, dstip */
-$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
-
-/* Processor Usage user, nice, system, int, processes */
-$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
-
-/* Memory Usage active, inact, free, cache, wire */
-$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
-
-/* MBUF Usage current, cache, total, max */
-$colormbuf = array('0080FF','00E344','FF0000','000000');
-
-/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
-$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
-$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
-/* Quality Graph Loss */
-$colorqualityloss = 'ee0000';
-
-/* Wireless Graph SNR, Rate, Channel*/
-/* Cellular Graph RSSI, */
-$colorwireless = array('333333','a83c3c','999999');
-
-/* SPAMD Times min area, avg area, max area, Time line */
-$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
-/* SPAMD Connections max area, min area, min line, max line, avg line */
-$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
-
-/* OpenVPN Users Online Users */
-$colorvpnusers = array('990000');
-
-/* Captive Portal Total Users Total Users */
-/* Captive Portal Concurrent Concurrent Users */
-$colorcaptiveportalusers = array('990000');
-
-?>
diff --git a/src/usr/local/www/themes/nervecenter/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/nervecenter/styles/jquery-ui-1.11.1.css
deleted file mode 100644
index 8a8c54f..0000000
--- a/src/usr/local/www/themes/nervecenter/styles/jquery-ui-1.11.1.css
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*! jQuery UI - v1.11.1 - 2014-09-22
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.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:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-clearfix {
- min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* 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: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.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: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- 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;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- min-height: 0; /* support: IE7 */
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
- position: absolute;
- left: .5em;
- top: 50%;
- margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-button {
- display: inline-block;
- position: relative;
- padding: 0;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
- width: 2.4em;
-}
-.ui-button-icons-only {
- width: 3.4em;
-}
-button.ui-button-icons-only {
- width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
- display: block;
- line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
- padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
- padding: .4em;
- text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
- padding-left: 2.1em;
- padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
- padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
- position: absolute;
- top: 50%;
- margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
- left: 50%;
- margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
- left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
- right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
- margin-right: 7px;
-}
-.ui-buttonset .ui-button {
- margin-left: 0;
- margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.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 {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.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,
-.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%;
- font-size: 0;
-}
-
-/* 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,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-.ui-dialog {
- overflow: hidden;
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
- width: 12px;
- height: 12px;
- right: -5px;
- bottom: -5px;
- background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: none;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- position: relative;
- margin: 0;
- padding: 3px 1em 3px .4em;
- cursor: pointer;
- min-height: 0; /* support: IE7 */
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-progressbar {
- height: 1em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
- background-color: #990000;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
- height: 100%;
- filter: alpha(opacity=25); /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- /* Support: IE7 */
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-button {
- display: inline-block;
- overflow: hidden;
- position: relative;
- text-decoration: none;
- cursor: pointer;
-}
-.ui-selectmenu-button span.ui-icon {
- right: 0.5em;
- left: auto;
- margin-top: -8px;
- position: absolute;
- top: 50%;
-}
-.ui-selectmenu-button span.ui-selectmenu-text {
- text-align: left;
- padding: 0.4em 2.1em 0.4em 1em;
- display: block;
- line-height: 1.4;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.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;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.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;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 22px;
-}
-.ui-spinner-button {
- width: 16px;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top: none;
- border-bottom: none;
- border-right: none;
-}
-/* vertically center icon */
-.ui-spinner .ui-icon {
- position: absolute;
- margin-top: -8px;
- top: 50%;
- left: 0;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
- /* need to fix icons sprite */
- background-position: -65px -16px;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
- -webkit-box-shadow: 0 0 5px #aaa;
- box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #aaaaaa;
- background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #bbbbbb;
- /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
- color: #444444;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #444444;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #cccccc;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #3383bb;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #3383bb;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #bbbbbb;
- background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #599fcf;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited {
- color: #599fcf;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #999999;
- background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #ffffff;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #ffffff;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
- color: #444444;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #444444;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #c0402a;
- background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
- color: #ffffff;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #ffffff;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #ffffff;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70); /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35); /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-state-default .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-active .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
-}
-.ui-state-highlight .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.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-on { background-position: -96px -144px; }
-.ui-icon-radio-off { 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-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.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-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 6px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
- opacity: .8;
- filter: Alpha(Opacity=80); /* support: IE8 */
-}
-.ui-widget-shadow {
- margin: -4px 0 0 -4px;
- padding: 4px;
- background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
- opacity: .6;
- filter: Alpha(Opacity=60); /* support: IE8 */
- border-radius: 0pxdow;
-}
diff --git a/src/usr/local/www/themes/nervecenter/styles/menustyles.css b/src/usr/local/www/themes/nervecenter/styles/menustyles.css
deleted file mode 100644
index 06b3c7a..0000000
--- a/src/usr/local/www/themes/nervecenter/styles/menustyles.css
+++ /dev/null
@@ -1,44 +0,0 @@
-#navigation {
- /* border:1px solid black; */
- width: 98%;
- vertical-align: middle;
- height: 16px;
- padding-top: 4px;
- }
-
-#menu {
- /* background: #990000; */
- /* border-bottom:1px solid white; */
- padding: 0 0 0 0;
- width: 98%;
- vertical-align: middle;
- height: 16px;
- }
-#menu a {
- padding: 2px 28px 4px 28px;
- text-decoration: none;
- font-weight: bold;
- font-size: 1.0em;
- color: #FFFFFF;
- width: 08%;
- height: 16px;
- }
-#menu a.hover {
- background: #AF2020;
- }
-#menu span {
- display: none;
- }
-
-#subnav {
- font-size: 10px;
- margin-bottom: 2em;
- }
-#subnav a {
- color: #FF0000; /* #FB3B00; */
- margin-right: 1em;
- }
-#subnav span {
- color: silver;
- margin-right: 1em;
- }
diff --git a/src/usr/local/www/themes/nervecenter/styles/transmenu.css b/src/usr/local/www/themes/nervecenter/styles/transmenu.css
deleted file mode 100644
index f683574..0000000
--- a/src/usr/local/www/themes/nervecenter/styles/transmenu.css
+++ /dev/null
@@ -1,75 +0,0 @@
-/* this is the clipping region for the menu. it's width and height get set by script, depending on the size of the items table */
-.transMenu {
- position:absolute;
- overflow:hidden;
- left:-1000px;
- top:-1000px;
- }
-
-/* this is the main container for the menu itself. it's width and height get set by script, depending on the size of the items table */
-.transMenu .content {
- position:absolute;
- }
-
-/* this table comprises all menu items. each TR is one item. It is relatively positioned so that the shadow and background transparent divs can be positioned underneath it */
-.transMenu .items {
- position:relative;
- left:0px; top:0px;
- z-index:2;
- }
-
-.transMenu.top .items {
- border-top:none;
- }
-
-/* each TR.item is one menu item */
-.transMenu .item {
- color: #FFFFFF; /* #336; */
- font-size: 1.1em;
- font-weight: normal;
- font-family:sans-serif;
- text-decoration:none;
- /* this is a hack for mac/ie5, whom incorrectly cascades the border properties of the parent table to each row */
- border:none;
- cursor:pointer;
- cursor:hand;
- }
-
-/* this DIV is the semi-transparent white background of each menu. the -moz-opacity is a proprietary way to get transparency in mozilla, the filter is for IE/windows 5.0+. */
-/* we set the background color in script because ie mac does not use it; that browser only uses a semi-transparent white PNG that the spacer gif inside this DIV is replaced by */
-.transMenu .background {
- position:absolute;
- left:0px; top:0px;
- z-index:1;
- -moz-opacity:.8;
- filter:alpha(opacity=80);
- }
-
-/* same concept as .background, but this is the sliver of shadow on the right of the menu. It's left, height, and background are set by script. In IE5/mac, it uses a PNG */
-.transMenu .shadowRight {
- position:absolute;
- z-index:3;
- top:3px; width:2px;
- -moz-opacity:.4;
- filter:alpha(opacity=40);
- }
-
-/* same concept as .background, but this is the sliver of shadow on the bottom of the menu. It's top, width, and background are set by script. In IE5/mac, it uses a PNG */
-.transMenu .shadowBottom {
- position:absolute;
- z-index:1;
- left:3px; height:2px;
- -moz-opacity:.4;
- filter:alpha(opacity=40);
- }
-
-/* this is the class that is used when the mouse is over an item. script sets the row to this class when required. */
-.transMenu .item.hover {
- background:#fdfdfd;
- color:black;
- }
-
-/* this is either the dingbat that indicates there is a submenu, or a spacer gif in it's place. We give it extra margin to create some space between the text and the dingbat */
-.transMenu .item img {
- margin-left:10px;
- } \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/wizard.css b/src/usr/local/www/themes/nervecenter/wizard.css
deleted file mode 100644
index a2d31d5..0000000
--- a/src/usr/local/www/themes/nervecenter/wizard.css
+++ /dev/null
@@ -1,1060 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.nowrap { white-space: nowrap; }
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #999999;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- /* background: url('images/background.png') no-repeat; */
- background-position : center 0px;
- background-color: #999999;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
diff --git a/src/usr/local/www/themes/pfsense-dropdown/all.css b/src/usr/local/www/themes/pfsense-dropdown/all.css
deleted file mode 100644
index 3fa0630..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/all.css
+++ /dev/null
@@ -1,1028 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-}
-
-.nowrap { white-space: nowrap; }
-
-.addgatewaybox {
- background-color: #990000;
- border-style: none none none none;
- width: 225px;
-}
-
-.infobox {
- width:100%;
-}
-
-.infoboxsave {
- padding-right: 10px;
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-.inputerrorsleft {
- background-color: #990000;
- width: 36px;
- text-align: center;
-}
-
-.inputerrorsright {
- background-color: #FFD9D1;
- color: #000000;
- font-size: 11px;
- padding-left: 8px;
- padding-top: 6px;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-
-form input {
- font-size: 1.1em;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 220px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 11px;
- font-family: "Trebuchet MS", sans-serif;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- background-color: #ffffff;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
-
-}
-
-#header {
- height: 70px;
- width: 800px;
-}
-#header-left {
- position: relative;
- background: url('images/logo.gif') no-repeat;
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
- background-color: #fff;
-}
-#header-right {
- position: relative;
- background: url('images/header.gif') no-repeat;
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-
-#header-right .container .left {
- position: relative;
- top: 32px;
- left: 9px;
- font-size: 1.8em;
-}
-
-#header-right .container .right {
- position: relative;
- top: -8px;
- left: 195px;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.gif') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
-}
-
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: bold;
- font: Verdana;
- text-align: center;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-
-
-#content {
- border-top: 1px solid #FFFFFF;
- margin-top: 0px;
- padding-top: 0px;
- width: 800px;
-}
-
-#left {
- width: 800px;
- height: 25px;
- margin-bottom: 5px;
-}
-#right {
- width: 770px;
- margin-left: 5px;
- margin-right: 5px;
- margin-top: 4px;
- padding-top: 1px;
- padding-bottom: 15px;
- padding-left: 10px;
- padding-right: 10px;
- border-left: 1px solid #000000;
- border-right: 1px solid #000000;
-}
-
-#footer {
- position: relative;
- top: 3px;
- padding: 0px;
- margin: 6px;
- margin-left: 0px;
- margin-top: 2px;
- width: 800px;
- background-color: #990000;
- text-align: center;
- color: #ffffff;
- font-size: 0.75em;
- clear: both;
- margin-bottom: 20px;
- z-index: 0;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- background: url('images/menu.gif') no-repeat;
- /* width: 693px; */
- width: 800px;
- padding: 0px;
- height: 28px;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
- z-index: 10;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- width: 6.2em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
- text-align: center;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: 0px;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- padding: 0em 0 1em 0;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: hand;
-}
-#navigation ul li:hover {
- cursor: hand;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: underline;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #000;
- background-color: #000;
- color: #FFF;
-}
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: underline;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
-
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #FFFFFF;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listrborder {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-left: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- color: #FFFFFF;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #DDDDDD;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password, #password2 {
- font-size: small;
- width: 60%;
- padding-left: 19px;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-
-/* Widget CSS */
-.widgetsubheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #B1B1B1;
- padding-right: 6px;
- padding-left: 6px;
- color: #000000;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetdiv{
- margin:5px;
- padding: 5px;
- background:#CCCCCC;
-}
-.widgetconfigdiv{
- background:#BBBBBB;
- font-size: 11px;
- color: #000000;
- padding-right: 5px;
- padding-left: 5px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-div#log div.log-entry-mini {
- clear: both;
-}
-
-div#log div.log-entry-mini span {
- padding: 2px 2px 2px 2px;
- padding-left: 6px;
-}
-
-div#log span.log-action-mini-header,
-div#log span.log-time-mini-header,
-div#log span.log-interface-mini-header,
-div#log span.log-source-mini-header,
-div#log span.log-destination-mini-header,
-div#log span.log-protocol-mini-header {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 12px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-time-mini,
-div#log span.log-interface-mini,
-div#log span.log-source-mini,
-div#log span.log-destination-mini,
-div#log span.log-protocol-mini {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 11px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-action-mini-header {
- width: 6%;
-}
-
-div#log span.log-time-mini,
-div#log span.log-time-mini-header {
- width: 19%;
-}
-
-div#log span.log-interface-mini,
-div#log span.log-interface-mini-header {
- width: 8%;
-}
-
-div#log span.log-source-mini,
-div#log span.log-source-mini-header {
- width: 23%;
-}
-
-div#log span.log-destination-mini,
-div#log span.log-destination-mini-header {
- width: 31%;
-}
-
-div#log span.log-protocol-mini,
-div#log span.log-protocol-mini-header {
- width: 8%;
- border-right: 1px solid #999;
-}
-
-/* Sortable tables */
-table.sortable thead {
- cursor: default;
-<!-- background-color: #EEEEEE;-->
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-/*thermal_sensors widget styles*/
-
-.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
-.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
-.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
- background-color: LimeGreen;
- border-top-width: 2px; border-top-color: Lime;
- border-left-width: 0px;
- border-right-width: 0px;
- border-bottom-width: 2px; border-bottom-color: Green;
-}
-.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
-.thermalSensorText { float: left; height: 20px; top: 3px; }
-.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
-
-.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-
-.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
-
-.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
-
-/* widget textarea styles - full width */
-.textarea_widget {
- width: 100%;
- resize:vertical;
- -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
- -moz-box-sizing: border-box; /* Firefox, other Gecko */
- box-sizing: border-box; /* IE 8+ */
-}
diff --git a/src/usr/local/www/themes/pfsense-dropdown/apple-touch-icon.png b/src/usr/local/www/themes/pfsense-dropdown/apple-touch-icon.png
deleted file mode 100755
index 7a4b975..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/apple-touch-icon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/bottom-loader.js b/src/usr/local/www/themes/pfsense-dropdown/bottom-loader.js
deleted file mode 100644
index fad206e..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/bottom-loader.js
+++ /dev/null
@@ -1,11 +0,0 @@
-//<![CDATA[
-
-NiftyCheck();
-Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
-Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
-Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
-Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
-Rounded("div#topbox","all","#FFF","#990000","smooth");
-Rounded("div#footer","bl br tl tr","#FFF","#990000","smooth");
-
-//]]>
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/alert_bgr.gif b/src/usr/local/www/themes/pfsense-dropdown/images/alert_bgr.gif
deleted file mode 100755
index 2a5c000..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/alert_bgr.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/header-alert.gif b/src/usr/local/www/themes/pfsense-dropdown/images/header-alert.gif
deleted file mode 100755
index 02eca2b..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/header-alert.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/header.gif b/src/usr/local/www/themes/pfsense-dropdown/images/header.gif
deleted file mode 100755
index 6f29ec9..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/header.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/help.png b/src/usr/local/www/themes/pfsense-dropdown/images/help.png
deleted file mode 100755
index 1de05e3..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/help.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/favicon.ico b/src/usr/local/www/themes/pfsense-dropdown/images/icons/favicon.ico
deleted file mode 100644
index 3440bf2..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g.gif
deleted file mode 100755
index 46ccb92..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g_inactive.gif
deleted file mode 100755
index cf983e4..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g_inactive.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced.gif
deleted file mode 100755
index 3ede1ff..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced_s.gif
deleted file mode 100755
index b233549..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alert.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alert.gif
deleted file mode 100755
index 2f69355..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alert.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_host.gif
deleted file mode 100644
index ad43e17..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_host.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_net.gif
deleted file mode 100644
index abd1b8b..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_net.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_port.gif
deleted file mode 100644
index 4acf2aa..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_port.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url.gif
deleted file mode 100644
index 660571e..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url_reload.gif
deleted file mode 100644
index 55c1c4a..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url_reload.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block.gif
deleted file mode 100755
index 670c968..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_add.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_add.gif
deleted file mode 100755
index eb726d6..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_d.gif
deleted file mode 100755
index e6345fe..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cablenic.gif
deleted file mode 100755
index a071c66..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cablenic.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal.gif
deleted file mode 100755
index a9c7c87..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal_mo.gif
deleted file mode 100755
index 1647e2f..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp.gif
deleted file mode 100755
index 9454a82..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp_d.gif
deleted file mode 100755
index 2ba8db2..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_chain.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_chain.png
deleted file mode 100644
index 12db07a..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_chain.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_check.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_check.gif
deleted file mode 100755
index 393674d..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_check.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_green.gif
deleted file mode 100755
index e171ba8..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_green.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_grey.gif
deleted file mode 100755
index 00c865a..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_grey.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_red.gif
deleted file mode 100755
index 7b412ee..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_close.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_close.gif
deleted file mode 100755
index e0f86a7..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_close.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_configure.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_configure.gif
deleted file mode 100755
index 7182e0d..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_configure.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down.gif
deleted file mode 100755
index b71a9c5..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_d.gif
deleted file mode 100755
index 70a7473..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_mo.gif
deleted file mode 100755
index 584587a..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e.gif
deleted file mode 100755
index 2950800..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e_mo.gif
deleted file mode 100755
index 9ba5738..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_error.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_error.gif
deleted file mode 100755
index e0fa659..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_error.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_exclam.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_exclam.gif
deleted file mode 100755
index 36c2ec7..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_exclam.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_de.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_de.png
deleted file mode 100644
index 069cbbe..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_de.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_en.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_en.png
deleted file mode 100644
index bd7f9a5..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_en.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_es.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_es.png
deleted file mode 100644
index 434776c..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_es.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_pt_BR.png
deleted file mode 100644
index f786349..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_pt_BR.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_cert.png
deleted file mode 100644
index 48a34b6..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_cert.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_file.png
deleted file mode 100644
index 48a9ed2..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_file.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_group.png
deleted file mode 100644
index 7d929c0..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_host.png
deleted file mode 100644
index 867ef2c..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_host.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_imp.png
deleted file mode 100644
index f667cfc..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_imp.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_mail.png
deleted file mode 100644
index d2d4548..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_mail.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_pwd.png
deleted file mode 100644
index 06b53a1..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_pwd.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_search.png
deleted file mode 100644
index 33de926..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_search.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_time.png
deleted file mode 100644
index aa8300a..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_time.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_unknown.png
deleted file mode 100644
index 1857d0e..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_unknown.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_url.png
deleted file mode 100644
index cf56792..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_url.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_user.png
deleted file mode 100644
index e00eebe..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_fw-update.gif
deleted file mode 100755
index 52c18ac..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_fw-update.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_help.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_help.gif
deleted file mode 100644
index 84c84db..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_help.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias.gif
deleted file mode 100644
index 0c569a7..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias_d.gif
deleted file mode 100644
index faa84d4..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_import_alias.gif
deleted file mode 100755
index d11a5f0..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_import_alias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_info_pkg.gif
deleted file mode 100644
index cd3a532..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_info_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_down.gif
deleted file mode 100755
index 0626655..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_up.gif
deleted file mode 100755
index 1449513..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left.gif
deleted file mode 100755
index 8effefe..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_d.gif
deleted file mode 100755
index c778014..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_mo.gif
deleted file mode 100755
index 84c6fa2..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log.gif
deleted file mode 100755
index 4a1983a..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_d.gif
deleted file mode 100755
index d31bd9b..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s.gif
deleted file mode 100755
index f9fda33..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s_d.gif
deleted file mode 100755
index fb2c05f..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_logs.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_logs.gif
deleted file mode 100644
index afe0104..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_logs.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match.gif
deleted file mode 100644
index 215571f..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match_d.gif
deleted file mode 100644
index 6e4c364..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_minus.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_minus.gif
deleted file mode 100755
index 417544f..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_minus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_open.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_open.gif
deleted file mode 100755
index ac3da14..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_open.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other.gif
deleted file mode 100755
index e6f780f..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other_d.gif
deleted file mode 100755
index b08d970..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp.gif
deleted file mode 100755
index 96acaf3..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp_d.gif
deleted file mode 100755
index 7d7d00e..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass.gif
deleted file mode 100755
index fe1bb0d..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_add.gif
deleted file mode 100755
index f7f4c20..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_d.gif
deleted file mode 100755
index 6adc431..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus.gif
deleted file mode 100755
index 2a94eeb..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl.gif
deleted file mode 100644
index 8dcd7c0..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl_p.gif
deleted file mode 100644
index 0c79849..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_d.gif
deleted file mode 100755
index ebc7457..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_mo.gif
deleted file mode 100755
index 1c7ca08..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_p.gif
deleted file mode 100644
index eb41284..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall.gif
deleted file mode 100755
index d78b867..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_d.gif
deleted file mode 100755
index 13658f7..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_mo.gif
deleted file mode 100755
index 90b576e..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg.gif
deleted file mode 100755
index 9aebb03..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_d.gif
deleted file mode 100755
index 4ab4992..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_mo.gif
deleted file mode 100755
index 7025d20..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml.gif
deleted file mode 100755
index 4542432..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_d.gif
deleted file mode 100755
index 8d3a68d..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_mo.gif
deleted file mode 100755
index 15e0aed..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject.gif
deleted file mode 100755
index 5565cd6..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject_d.gif
deleted file mode 100755
index 6c09fae..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_right.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_right.gif
deleted file mode 100755
index fdf2d8b..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart.gif
deleted file mode 100755
index e49fbd7..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart_d.gif
deleted file mode 100755
index a5d6d7c..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_running.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_running.gif
deleted file mode 100644
index 543fd56..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_running.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start.gif
deleted file mode 100755
index 09bb58f..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start_d.gif
deleted file mode 100755
index f58f111..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_status.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_status.gif
deleted file mode 100644
index a93bcfb..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_status.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop.gif
deleted file mode 100755
index 922addc..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop_d.gif
deleted file mode 100755
index b4cfdea..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stopped.gif
deleted file mode 100644
index f93a25d..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stopped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_restart_mo.gif
deleted file mode 100755
index a092b40..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_restart_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_start_mo.gif
deleted file mode 100755
index ecdb58f..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_start_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_stop_mo.gif
deleted file mode 100755
index c00e208..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_stop_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group-grey.png
deleted file mode 100644
index d7b964d..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group.png
deleted file mode 100644
index 1c974f2..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user-grey.png
deleted file mode 100644
index 2f6047d..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user.png
deleted file mode 100644
index ef82156..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_lock_screen.png
deleted file mode 100644
index 30f306d..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_lock_screen.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_logout.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_logout.png
deleted file mode 100644
index 9bbb6c7..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_logout.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped.gif
deleted file mode 100644
index ffeb2cd..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped_p.gif
deleted file mode 100755
index 6d46aaf..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule.gif
deleted file mode 100755
index e15ab6c..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule_d.gif
deleted file mode 100755
index f776281..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up.gif
deleted file mode 100755
index 883c5a2..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_d.gif
deleted file mode 100755
index 0ddcce2..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_mo.gif
deleted file mode 100755
index 9f869a4..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan.gif
deleted file mode 100755
index 1f0addc..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan_d.gif
deleted file mode 100755
index 35bf580..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wol_all.gif
deleted file mode 100755
index c77a978..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wol_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_nsaved.png
deleted file mode 100644
index 21cb27d..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_nsaved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_saved.png
deleted file mode 100644
index ab82946..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_saved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x.gif
deleted file mode 100755
index 24e4d49..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_d.gif
deleted file mode 100755
index d2bfbc8..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_mo.gif
deleted file mode 100755
index da7b57c..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_p.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_p.gif
deleted file mode 100755
index 8828fa6..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/in.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/in.gif
deleted file mode 100644
index f1da771..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/in_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/in_d.gif
deleted file mode 100644
index 18e26be..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/out.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/out.gif
deleted file mode 100644
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/out_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/out_d.gif
deleted file mode 100644
index 879f1da..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/icons/out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/log.png b/src/usr/local/www/themes/pfsense-dropdown/images/log.png
deleted file mode 100755
index 762ba80..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/log.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/logo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/logo.gif
deleted file mode 100755
index 553cbd5..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/logo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/logobig.jpg b/src/usr/local/www/themes/pfsense-dropdown/images/logobig.jpg
deleted file mode 100755
index 2ef196d..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/logobig.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/menu.gif b/src/usr/local/www/themes/pfsense-dropdown/images/menu.gif
deleted file mode 100755
index 7269210..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/menu.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_blue.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_blue.gif
deleted file mode 100755
index 741186a..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_blue.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_gray.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_gray.gif
deleted file mode 100755
index e86e245..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_gray.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_left.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_left.gif
deleted file mode 100755
index af751fa..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_right.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_right.gif
deleted file mode 100755
index ff12d9e..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/button.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/button.gif
deleted file mode 100755
index e85dbb3..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/button.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_128.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_128.gif
deleted file mode 100755
index ea5ae34..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_128.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_152.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_152.gif
deleted file mode 100755
index 6c7fc03..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_152.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_256.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_256.gif
deleted file mode 100755
index 3e1c377..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_256.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_64.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_64.gif
deleted file mode 100755
index 87892bd..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_64.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/left_background.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/left_background.gif
deleted file mode 100755
index 529d827..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/left_background.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/loader.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/loader.gif
deleted file mode 100755
index 5d10ac3..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/loader_tab.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/loader_tab.gif
deleted file mode 100755
index 05bb04c..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/loader_tab.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/logon.png b/src/usr/local/www/themes/pfsense-dropdown/images/misc/logon.png
deleted file mode 100755
index baf8a9d..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/logon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/progress_bar.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/progress_bar.gif
deleted file mode 100755
index 3b4aa52..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/progress_bar.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/rrd_error.png b/src/usr/local/www/themes/pfsense-dropdown/images/misc/rrd_error.png
deleted file mode 100755
index a79ecf3..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/rrd_error.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c.gif
deleted file mode 100755
index 317b758..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c_black.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c_black.gif
deleted file mode 100755
index 309846e..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o.gif
deleted file mode 100755
index eb95c32..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o_black.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o_black.gif
deleted file mode 100755
index f818f3b..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/widget_loader.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/widget_loader.gif
deleted file mode 100755
index fad101f..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/misc/widget_loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/new_tab_menu.png b/src/usr/local/www/themes/pfsense-dropdown/images/new_tab_menu.png
deleted file mode 100755
index 4bdfcef..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/new_tab_menu.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/status.png b/src/usr/local/www/themes/pfsense-dropdown/images/status.png
deleted file mode 100755
index a3e368e..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/status.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/transparent.gif b/src/usr/local/www/themes/pfsense-dropdown/images/transparent.gif
deleted file mode 100755
index 89c5530..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/transparent.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/transparent_pixel.gif b/src/usr/local/www/themes/pfsense-dropdown/images/transparent_pixel.gif
deleted file mode 100755
index 35d42e8..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/images/transparent_pixel.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/blank.gif b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/blank.gif
deleted file mode 100755
index a4fe2e6..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/blank.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-box-model.js
deleted file mode 100644
index 45543f6..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-box-model.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-core.js
deleted file mode 100644
index b11e2b1..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-core.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css-strict.js
deleted file mode 100644
index 4406d7a..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css-strict.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css2.js
deleted file mode 100644
index 7121c8e..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css2.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css3.js
deleted file mode 100644
index 86b24f5..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css3.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-fixed.js
deleted file mode 100644
index 4321cda..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-fixed.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-html4.js
deleted file mode 100644
index 4d2baa9..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-html4.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-ie5.js
deleted file mode 100644
index 707fa56..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-ie5.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite-p.js
deleted file mode 100644
index 3a66d19..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite.js
deleted file mode 100644
index 88c764f..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-png.js
deleted file mode 100644
index 7b8f2cf..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-png.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-server.css
deleted file mode 100644
index 47c7edd..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-server.css
+++ /dev/null
@@ -1,43 +0,0 @@
-body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
-body {margin: 8px; background: #333;}
-h1 {margin: 0;}
-h1 a:hover {background-color: transparent;}
-h2 {font-size: 1.75em;}
-h3 {font-size: 1.1em;}
-a:active {color: #ff0000;}
-a:link {color: #0a6cce;}
-a:visited {color: #0a6cce;}
-code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
- padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
-code.box {display: block; padding: 10px; margin: 0.5em 0;}
-ul {list-style-type: square;}
-dd {margin: .2em 0 .5em 1em;}
-dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
-dl.library dd {font-style: italic; margin-left: 3em;}
-dt {font-weight: bold;}
-dt.pack {color: brown;}
-a img {border-style: none;}
-hr {height: 1px; color: #000; border-style: solid;}
-hr.short {height: 2px; width: 100px;}
-div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
-hr {border-bottom-width: 0px;}
-div.header hr {color: #0a6cce; background-color: #0a6cce;}
-div.content {min-height: 100px;}
-div.footer hr {color: #898e79; background-color: #898e79; }
-div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
-a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
-div.footer a:hover {background-color: transparent; text-decoration: none;}
-div.header .menu {text-align: right;}
-div.footer {font-size: x-small; margin-top: 8px;}
-div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
-#license {margin-top: 5px; font-size: xx-small;}
-table {border-top: 1px solid #000; border-left: 1px solid #000;}
-th {background-color: #fff; text-align: left;}
-th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
-th.small {width: 100px;}
-th.medium {width: 200px;}
-th.large {width: 270px;}
-th.x-large {width: 408px;}
-table.fixed {table-layout: fixed;}
-span.comment {color: #666;}
-
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard-p.js
deleted file mode 100644
index 73e99ac..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard.js
deleted file mode 100644
index 2109905..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/test-trans.png b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/test-trans.png
deleted file mode 100755
index e187e2c..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/test-trans.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/niftyjsCode.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/niftyjsCode.js
deleted file mode 100644
index 75ef8b0..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/javascript/niftyjsCode.js
+++ /dev/null
@@ -1,174 +0,0 @@
-function NiftyCheck(){
-if(!document.getElementById || !document.createElement)
- return(false);
-isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
-if(Array.prototype.push==null){Array.prototype.push=function(){
- this[this.length]=arguments[0]; return(this.length);};}
-return(true);
-}
-
-function Rounded(selector,wich,bk,color,opt){
-var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
-
-if(color=="transparent"){
- cn=cn+"x";
- ecolor=bk;
- bk="transparent";
- }
-else if(opt && opt.indexOf("border")>=0){
- var optar=opt.split(" ");
- for(i=0;i<optar.length;i++)
- if(optar[i].indexOf("#")>=0) ecolor=optar[i];
- if(ecolor=="") ecolor="#666";
- cn+="e";
- edges=true;
- }
-else if(opt && opt.indexOf("smooth")>=0){
- cn+="a";
- ecolor=Mix(bk,color);
- }
-if(opt && opt.indexOf("small")>=0) cn+="s";
-prefixt=cn;
-prefixb=cn;
-if(wich.indexOf("all")>=0){t=true;b=true;}
-else if(wich.indexOf("top")>=0) t="true";
-else if(wich.indexOf("tl")>=0){
- t="true";
- if(wich.indexOf("tr")<0) prefixt+="l";
- }
-else if(wich.indexOf("tr")>=0){
- t="true";
- prefixt+="r";
- }
-if(wich.indexOf("bottom")>=0) b=true;
-else if(wich.indexOf("bl")>=0){
- b="true";
- if(wich.indexOf("br")<0) prefixb+="l";
- }
-else if(wich.indexOf("br")>=0){
- b="true";
- prefixb+="r";
- }
-var v=getElementsBySelector(selector);
-var l=v.length;
-for(i=0;i<l;i++){
- if(edges) AddBorder(v[i],ecolor);
- if(t) AddTop(v[i],bk,color,ecolor,prefixt);
- if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
- }
-}
-
-function AddBorder(el,bc){
-var i;
-if(!el.passed){
- if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
- var t=el.firstChild.nodeValue;
- el.removeChild(el.lastChild);
- var d=CreateEl("span");
- d.style.display="block";
- d.appendChild(document.createTextNode(t));
- el.appendChild(d);
- }
- for(i=0;i<el.childNodes.length;i++){
- if(el.childNodes[i].nodeType==1){
- el.childNodes[i].style.borderLeft="1px solid "+bc;
- el.childNodes[i].style.borderRight="1px solid "+bc;
- }
- }
- }
-el.passed=true;
-}
-
-function AddTop(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=1;i<=lim;i++){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingTop=0;
-el.insertBefore(d,el.firstChild);
-}
-
-function AddBottom(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=lim;i>0;i--){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingBottom=0;
-el.appendChild(d);
-}
-
-function CreateEl(x){
-if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
-else return(document.createElement(x));
-}
-
-function getElementsBySelector(selector){
-var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
-
-if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
- s=selector.split(" ");
- var fs=s[0].split("#");
- if(fs.length==1) return(objlist);
- f=document.getElementById(fs[1]);
- if(f) return(f.getElementsByTagName(s[1]));
- return(objlist);
- }
-if(selector.indexOf("#")>0){ //id selector like "tag#id"
- s=selector.split("#");
- tag=s[0];
- selid=s[1];
- }
-if(selid!=""){
- f=document.getElementById(selid);
- if(f) objlist.push(f);
- return(objlist);
- }
-if(selector.indexOf(".")>0){ //class selector like "tag.class"
- s=selector.split(".");
- tag=s[0];
- selclass=s[1];
- }
-var v=document.getElementsByTagName(tag); // tag selector like "tag"
-if(selclass=="")
- return(v);
-for(i=0;i<v.length;i++){
- if(v[i].className.indexOf(selclass)>=0){
- objlist.push(v[i]);
- }
- }
-return(objlist);
-}
-
-function Mix(c1,c2){
-var i,step1,step2,x,y,r=new Array(3);
-if(c1.length==4)step1=1;
-else step1=2;
-if(c2.length==4) step2=1;
-else step2=2;
-for(i=0;i<3;i++){
- x=parseInt(c1.substr(1+step1*i,step1),16);
- if(step1==1) x=16*x+x;
- y=parseInt(c2.substr(1+step2*i,step2),16);
- if(step2==1) y=16*y+y;
- r[i]=Math.floor((x*50+y*50)/100);
- }
-return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense-dropdown/loader.js b/src/usr/local/www/themes/pfsense-dropdown/loader.js
deleted file mode 100644
index e8612db..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/loader.js
+++ /dev/null
@@ -1,29 +0,0 @@
-//<![CDATA[
-var browser = '';
-var version = '';
-var entrance = '';
-var cond = '';
-
-// BROWSER?
-if (browser == '') {
- if (navigator.appName.indexOf('Microsoft') != -1)
- browser = 'IE';
- else if (navigator.appName.indexOf('Netscape') != -1)
- browser = 'Netscape';
- else
- browser = 'IE';
-}
-if (version == '') {
- version= navigator.appVersion;
- paren = version.indexOf('(');
- whole_version = navigator.appVersion.substring(0,paren-1);
- version = parseInt(whole_version);
-}
-
-if (browser == 'IE' && version < 7) {
- document.write('<script type="text/javascript" src="/themes/pfsense-dropdown/javascript/ie7/ie7-standard-p.js"></script>');
-}
-
-document.write('<script type="text/javascript" src="/themes/pfsense-dropdown/javascript/niftyjsCode.js"></script>');
-
-//]]>
diff --git a/src/usr/local/www/themes/pfsense-dropdown/login.css b/src/usr/local/www/themes/pfsense-dropdown/login.css
deleted file mode 100644
index f8abdfc..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/login.css
+++ /dev/null
@@ -1,1127 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #999999;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- background-position : center 0px;
- background-color: #999999;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-
-#login {
-/* background: #cccccc; */
- background-color: transparent;
- border: 0px solid #cccccc;
- margin: 5em auto;
- padding: 0em;
- width: 400px;
-/* filter:alpha(opacity=60);
- -moz-opacity:0.6;
- -khtml-opacity: 0.6;
- opacity: 0.6; */
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
-/* background: #ffffff; */
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 400px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -420px;
- left: 70px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- top: -300px; */
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- left: 10px;
- top: -300px; */
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- text-align: center;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -20px;
- left: 170px;
-}
-
-/* loginerror box follows */
-
-#login #inputerrors {
- background-color: transparent;
- border: 0px solid #666666;
- margin: 5em auto;
- vertical-align: middle;
- padding: 0em;
- width: 330px;
- height: 50px;
- position: relative;
- top: -370px;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense-dropdown/new_tab_menu.css b/src/usr/local/www/themes/pfsense-dropdown/new_tab_menu.css
deleted file mode 100644
index 04c4cf2..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/new_tab_menu.css
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- new_tab_menu.css
- part of pfSense
- Copyright (C) 2010-2011 Robert Zelaya
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
-
- Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
- The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
-
- <tr>
- <td>
- <?php
- $tab_array_indent = 0; // move to the line in px
- $tab_array_space = 1; // space betwen lines in px
- $tab_array_char_limit = 82; // number or chr before the drop down box
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
-
-*/
-
-.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
-
-.newtabmenu li{float:left; margin-right:2px; text-align: center;}
-.newtabmenu a:link, .newtabmenu a:visited{
- background:url(images/new_tab_menu.png) right 45px;
- color:#ffffff; /* noactive font */
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- font-weight:bold;
- font-size:.9em;
- height:20px;
- line-height:20px;
- text-decoration:none;
-}
-.newtabmenu a span{
- background:url(images/new_tab_menu.png) left 45px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- height:20px;
- margin-right:7px;
- padding-left:7px;
-}
-.newtabmenu a:hover{
- background:url(images/new_tab_menu.png) right 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- color:#ffffff; /* hover over font */
-}
-.newtabmenu a:hover span{
- background:url(images/new_tab_menu.png) left 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
-}
-
-/* -------------------------------- */
-/* ACTIVE ELEMENTS */
-.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
- color:#000000; /* active font */
- background:url(images/new_tab_menu.png) right 0 no-repeat;
-}
-.newtabmenu_active a span, .newtabmenu_active a:hover span{
- background:url(images/new_tab_menu.png) left 0 no-repeat;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense-dropdown/rrdcolors.inc.php b/src/usr/local/www/themes/pfsense-dropdown/rrdcolors.inc.php
deleted file mode 100644
index dcb7a39..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/rrdcolors.inc.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/* $Id$ */
-/*
- rrdcolors.inc.php
- Part of pfSense
- Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/* This file is included by the RRD graphing page and sets the colors */
-
-/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* 95th Percentile Lines Out, In */
-$colortraffic95 = array('660000', 'FF0000');
-
-/* State Table pfrate, pfstates, pfnat, srcip, dstip */
-$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
-
-/* Processor Usage user, nice, system, int, processes */
-$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
-
-/* Memory Usage active, inact, free, cache, wire */
-$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
-
-/* MBUF Usage current, cache, total, max */
-$colormbuf = array('0080FF','00E344','FF0000','000000');
-
-/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
-$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
-$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
-/* Quality Graph Loss */
-$colorqualityloss = 'ee0000';
-
-/* Wireless Graph SNR, Rate, Channel*/
-/* Cellular Graph RSSI, */
-$colorwireless = array('333333','a83c3c','999999');
-
-/* SPAMD Times min area, avg area, max area, Time line */
-$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
-/* SPAMD Connections max area, min area, min line, max line, avg line */
-$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
-
-/* OpenVPN Users Online Users */
-$colorvpnusers = array('990000');
-
-/* Captive Portal Total Users Total Users */
-/* Captive Portal Concurrent Concurrent Users */
-$colorcaptiveportalusers = array('990000');
-
-?>
diff --git a/src/usr/local/www/themes/pfsense-dropdown/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/pfsense-dropdown/styles/jquery-ui-1.11.1.css
deleted file mode 100644
index 8a8c54f..0000000
--- a/src/usr/local/www/themes/pfsense-dropdown/styles/jquery-ui-1.11.1.css
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*! jQuery UI - v1.11.1 - 2014-09-22
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.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:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-clearfix {
- min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* 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: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.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: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- 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;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- min-height: 0; /* support: IE7 */
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
- position: absolute;
- left: .5em;
- top: 50%;
- margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-button {
- display: inline-block;
- position: relative;
- padding: 0;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
- width: 2.4em;
-}
-.ui-button-icons-only {
- width: 3.4em;
-}
-button.ui-button-icons-only {
- width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
- display: block;
- line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
- padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
- padding: .4em;
- text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
- padding-left: 2.1em;
- padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
- padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
- position: absolute;
- top: 50%;
- margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
- left: 50%;
- margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
- left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
- right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
- margin-right: 7px;
-}
-.ui-buttonset .ui-button {
- margin-left: 0;
- margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.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 {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.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,
-.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%;
- font-size: 0;
-}
-
-/* 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,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-.ui-dialog {
- overflow: hidden;
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
- width: 12px;
- height: 12px;
- right: -5px;
- bottom: -5px;
- background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: none;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- position: relative;
- margin: 0;
- padding: 3px 1em 3px .4em;
- cursor: pointer;
- min-height: 0; /* support: IE7 */
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-progressbar {
- height: 1em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
- background-color: #990000;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
- height: 100%;
- filter: alpha(opacity=25); /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- /* Support: IE7 */
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-button {
- display: inline-block;
- overflow: hidden;
- position: relative;
- text-decoration: none;
- cursor: pointer;
-}
-.ui-selectmenu-button span.ui-icon {
- right: 0.5em;
- left: auto;
- margin-top: -8px;
- position: absolute;
- top: 50%;
-}
-.ui-selectmenu-button span.ui-selectmenu-text {
- text-align: left;
- padding: 0.4em 2.1em 0.4em 1em;
- display: block;
- line-height: 1.4;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.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;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.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;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 22px;
-}
-.ui-spinner-button {
- width: 16px;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top: none;
- border-bottom: none;
- border-right: none;
-}
-/* vertically center icon */
-.ui-spinner .ui-icon {
- position: absolute;
- margin-top: -8px;
- top: 50%;
- left: 0;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
- /* need to fix icons sprite */
- background-position: -65px -16px;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
- -webkit-box-shadow: 0 0 5px #aaa;
- box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #aaaaaa;
- background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #bbbbbb;
- /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
- color: #444444;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #444444;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #cccccc;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #3383bb;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #3383bb;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #bbbbbb;
- background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #599fcf;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited {
- color: #599fcf;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #999999;
- background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #ffffff;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #ffffff;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
- color: #444444;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #444444;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #c0402a;
- background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
- color: #ffffff;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #ffffff;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #ffffff;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70); /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35); /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-state-default .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-active .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
-}
-.ui-state-highlight .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.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-on { background-position: -96px -144px; }
-.ui-icon-radio-off { 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-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.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-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 6px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
- opacity: .8;
- filter: Alpha(Opacity=80); /* support: IE8 */
-}
-.ui-widget-shadow {
- margin: -4px 0 0 -4px;
- padding: 4px;
- background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
- opacity: .6;
- filter: Alpha(Opacity=60); /* support: IE8 */
- border-radius: 0pxdow;
-}
diff --git a/src/usr/local/www/themes/pfsense/all.css b/src/usr/local/www/themes/pfsense/all.css
deleted file mode 100644
index 372c4b2..0000000
--- a/src/usr/local/www/themes/pfsense/all.css
+++ /dev/null
@@ -1,1036 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-}
-
-.nowrap { white-space: nowrap; }
-
-.addgatewaybox {
- background-color: #990000;
- border-style: none none none none;
- width: 225px;
-}
-
-.infobox {
- width:100%;
-}
-
-.infoboxsave {
- padding-right: 10px;
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-.inputerrorsleft {
- background-color: #990000;
- width: 36px;
- text-align: center;
-}
-
-.inputerrorsright {
- background-color: #FFD9D1;
- color: #000000;
- font-size: 11px;
- padding-left: 8px;
- padding-top: 6px;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-
-form input {
- font-size: 1.1em;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 11px;
- font-family: "Trebuchet MS", sans-serif;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- background-color: #ffffff;
-}
-
-/* ID Based CSS Definitions */
-
-#notices {
- width: 795px;
- background-color: #E1E4B8;
- border: 1px solid #000000;
- padding: 0px;
- margin-bottom: 5px;
-}
-#notices ul {
- margin: 0px;
- padding: 5px;
- padding-top: 3px;
- list-style: none;
-}
-
-#header {
- height: 70px;
- width: 900px;
-}
-#header-left {
- position: relative;
- background: url('images/logo.gif') no-repeat;
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
- background-color: #fff;
-}
-#header-right {
- position: relative;
- background: url('images/header.gif') no-repeat;
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-
-#header-right .container .left {
- position: relative;
- top: 32px;
- left: 9px;
- font-size: 1.8em;
-}
-
-#header-right .container .right {
- position: relative;
- float: right;
- top: -9px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.gif') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: bold;
- font: Verdana;
- text-align: center;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-
-
-
-#content {
- border-top: 1px solid #FFFFFF;
- margin-top: 0px;
- padding-top: 0px;
- width: 900px;
-}
-
-#footer {
- position: relative;
- top: 10px;
- padding: 0px;
- margin: 6px;
- width: 900px;
- background-color: #990000;
- text-align: center;
- color: #ffffff;
- font-size: 0.75em;
- clear: both;
- margin-bottom: 20px;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-#left {
- width: 150px;
- float: left;
-}
-#right {
- /*margin-left: 171px;*/
- margin-left: 170px;
- margin-top: 5px;
- width: 720px;
-}
-
-
-
-#navigation {
- position: relative;
- background-color: #000000;
- top: 0px;
- left: 5px;
- width: 157px;
- padding-top: 6px;
- margin-left: 1px;
- color: #fff;
- padding-bottom: 6px;
- padding-right: 0px;
-}
-
-#navigation ul {
- margin: 0px;
- padding: 0px;
- width: 100%;
-}
-
-#navigation ul li {
- display: block;
- padding-left: 10px;
-}
-
-#navigation ul li div {
- margin-top: 2px;
-}
-
-#navigation ul li div {
- font-weight: bold;
-}
-
-#navigation ul li div .small,
-#navigation ul li div .small:hover {
- font-weight: normal;
- font-size: 0.79em;
-}
-
-#navigation ul li a {
- padding-left: 0.5em;
- padding-right: 0.5em;
- padding-top: 0.2em;
- padding-bottom: 0.2em;
- height: 1.2em;
- line-height: 1.2em;
- color: #fff;
- text-decoration: none;
- width: 61px;
- font-size: 0.9em;
- text-align: center;
-}
-
-#navigation ul li a:hover {
- color: #fff;
- text-decoration: underline;
- font-size: 0.9em;
-}
-
-
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
-
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #FFFFFF;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listrborder {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-left: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- color: #FFFFFF;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #DDDDDD;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-
-/* Widget CSS */
-.widgetsubheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #B1B1B1;
- padding-right: 6px;
- padding-left: 6px;
- color: #000000;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetdiv{
- margin:5px;
- padding: 5px;
- background:#CCCCCC;
-}
-.widgetconfigdiv{
- background:#BBBBBB;
- font-size: 11px;
- color: #000000;
- padding-right: 5px;
- padding-left: 5px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-div#log div.log-entry-mini {
- clear: both;
-}
-
-div#log div.log-entry-mini span {
- padding: 2px 2px 2px 2px;
- padding-left: 6px;
-}
-
-div#log span.log-action-mini-header,
-div#log span.log-time-mini-header,
-div#log span.log-interface-mini-header,
-div#log span.log-source-mini-header,
-div#log span.log-destination-mini-header,
-div#log span.log-protocol-mini-header {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 12px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-time-mini,
-div#log span.log-interface-mini,
-div#log span.log-source-mini,
-div#log span.log-destination-mini,
-div#log span.log-protocol-mini {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 11px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-action-mini-header {
- width: 6%;
-}
-
-div#log span.log-time-mini,
-div#log span.log-time-mini-header {
- width: 19%;
-}
-
-div#log span.log-interface-mini,
-div#log span.log-interface-mini-header {
- width: 8%;
-}
-
-div#log span.log-source-mini,
-div#log span.log-source-mini-header {
- width: 23%;
-}
-
-div#log span.log-destination-mini,
-div#log span.log-destination-mini-header {
- width: 31%;
-}
-
-div#log span.log-protocol-mini,
-div#log span.log-protocol-mini-header {
- width: 8%;
- border-right: 1px solid #999;
-}
-
-/* loginscreen items follow */
-
-#login {
-/* background: #cccccc; */
- background-color: #ffffff;
- border-left: 4px dotted #990000;
-/* border: 0px solid #990000; */
- margin: 5em auto;
- padding: 0em;
-/* width: 300px; */
- width: 300px;
- height: 300px;
-/* filter:alpha(opacity=60);
- -moz-opacity:0.6;
- -khtml-opacity: 0.6;
- opacity: 0.6; */
-}
-
-#login h1 {
- background: url(images/logo.gif) no-repeat top left;
-/* background: #ffffff; */
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 300px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -420px;
-/* left: 70px; */
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- top: -300px; */
-}
-
-#login #username, #password, #password2 {
- font-size: small;
- width: 60%;
- padding-left: 19px;
- padding: 3px;
- margin: 0em;
-
-
-/* text-indent: 10px;
- position: relative;
- left: 10px;
- top: -300px; */
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- text-align: center;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -20px;
- left: 120px;
-}
-
-/* loginerror box follows */
-
-#login #inputerrors {
- background-color: transparent;
- border: 0px solid #666666;
- margin: 5em auto;
- vertical-align: middle;
- padding: 0em;
- width: 300px;
- height: 50px;
- position: relative;
- left: 0px;
- top: -117px;
-}
-
-/* Sortable tables */
-table.sortable thead {
- cursor: default;
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-/*thermal_sensors widget styles*/
-
-.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
-.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
-.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
- background-color: LimeGreen;
- border-top-width: 2px; border-top-color: Lime;
- border-left-width: 0px;
- border-right-width: 0px;
- border-bottom-width: 2px; border-bottom-color: Green;
-}
-.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
-.thermalSensorText { float: left; height: 20px; top: 3px; }
-.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
-
-.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-
-.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
-
-.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
-
-/* widget textarea styles - full width */
-.textarea_widget {
- width: 100%;
- resize:vertical;
- -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
- -moz-box-sizing: border-box; /* Firefox, other Gecko */
- box-sizing: border-box; /* IE 8+ */
-}
diff --git a/src/usr/local/www/themes/pfsense/apple-touch-icon.png b/src/usr/local/www/themes/pfsense/apple-touch-icon.png
deleted file mode 100755
index 7a4b975..0000000
--- a/src/usr/local/www/themes/pfsense/apple-touch-icon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/bottom-loader.js b/src/usr/local/www/themes/pfsense/bottom-loader.js
deleted file mode 100644
index 8251766..0000000
--- a/src/usr/local/www/themes/pfsense/bottom-loader.js
+++ /dev/null
@@ -1,12 +0,0 @@
-//<![CDATA[
-
-NiftyCheck();
-Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
-Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
-Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
-Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
-Rounded("div#topbox","all","#FFF","#990000","smooth");
-Rounded("div#navigation","top bottom","#FFFFFF","#000000","smooth");
-Rounded("div#footer","bl br tl tr]","#FFF","#990000","smooth");
-
-//]]>
diff --git a/src/usr/local/www/themes/pfsense/images/alert_bgr.gif b/src/usr/local/www/themes/pfsense/images/alert_bgr.gif
deleted file mode 100755
index 2a5c000..0000000
--- a/src/usr/local/www/themes/pfsense/images/alert_bgr.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/header-alert.gif b/src/usr/local/www/themes/pfsense/images/header-alert.gif
deleted file mode 100755
index 02eca2b..0000000
--- a/src/usr/local/www/themes/pfsense/images/header-alert.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/header.gif b/src/usr/local/www/themes/pfsense/images/header.gif
deleted file mode 100755
index 01cfcef..0000000
--- a/src/usr/local/www/themes/pfsense/images/header.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/help.png b/src/usr/local/www/themes/pfsense/images/help.png
deleted file mode 100755
index 1de05e3..0000000
--- a/src/usr/local/www/themes/pfsense/images/help.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/favicon.ico b/src/usr/local/www/themes/pfsense/images/icons/favicon.ico
deleted file mode 100644
index 3440bf2..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_3g.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_3g.gif
deleted file mode 100755
index 46ccb92..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_3g.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_3g_inactive.gif
deleted file mode 100755
index cf983e4..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_3g_inactive.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_advanced.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_advanced.gif
deleted file mode 100755
index 3ede1ff..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_advanced.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_advanced_s.gif
deleted file mode 100755
index b233549..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_advanced_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_alert.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_alert.gif
deleted file mode 100755
index 2f69355..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_alert.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_host.gif
deleted file mode 100644
index ad43e17..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_host.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_net.gif
deleted file mode 100644
index abd1b8b..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_net.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_port.gif
deleted file mode 100644
index 4acf2aa..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_port.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_url.gif
deleted file mode 100644
index 660571e..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_url.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_url_reload.gif
deleted file mode 100644
index 55c1c4a..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_url_reload.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_block.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_block.gif
deleted file mode 100755
index 670c968..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_block.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_block_add.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_block_add.gif
deleted file mode 100755
index eb726d6..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_block_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_block_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_block_d.gif
deleted file mode 100755
index e6345fe..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_block_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_cablenic.gif
deleted file mode 100755
index a071c66..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_cablenic.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_cal.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_cal.gif
deleted file mode 100755
index a9c7c87..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_cal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_cal_mo.gif
deleted file mode 100755
index 1647e2f..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_cal_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_carp.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_carp.gif
deleted file mode 100755
index 9454a82..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_carp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_carp_d.gif
deleted file mode 100755
index 2ba8db2..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_carp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_chain.png b/src/usr/local/www/themes/pfsense/images/icons/icon_chain.png
deleted file mode 100644
index 12db07a..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_chain.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_check.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_check.gif
deleted file mode 100755
index 393674d..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_check.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_clock_green.gif
deleted file mode 100755
index e171ba8..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_clock_green.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_clock_grey.gif
deleted file mode 100755
index 00c865a..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_clock_grey.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_clock_red.gif
deleted file mode 100755
index 7b412ee..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_clock_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_close.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_close.gif
deleted file mode 100755
index e0f86a7..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_close.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_configure.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_configure.gif
deleted file mode 100755
index 7182e0d..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_configure.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_down.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_down.gif
deleted file mode 100755
index b71a9c5..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_down_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_down_d.gif
deleted file mode 100755
index 70a7473..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_down_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_down_mo.gif
deleted file mode 100755
index 584587a..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_down_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_e.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_e.gif
deleted file mode 100755
index 2950800..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_e.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_e_mo.gif
deleted file mode 100755
index 9ba5738..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_e_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_error.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_error.gif
deleted file mode 100755
index e0fa659..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_error.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_exclam.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_exclam.gif
deleted file mode 100755
index 36c2ec7..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_exclam.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_flag_de.png b/src/usr/local/www/themes/pfsense/images/icons/icon_flag_de.png
deleted file mode 100644
index 069cbbe..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_flag_de.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_flag_en.png b/src/usr/local/www/themes/pfsense/images/icons/icon_flag_en.png
deleted file mode 100644
index bd7f9a5..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_flag_en.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_flag_es.png b/src/usr/local/www/themes/pfsense/images/icons/icon_flag_es.png
deleted file mode 100644
index 434776c..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_flag_es.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/pfsense/images/icons/icon_flag_pt_BR.png
deleted file mode 100644
index f786349..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_flag_pt_BR.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_cert.png
deleted file mode 100644
index 48a34b6..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_cert.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_file.png
deleted file mode 100644
index 48a9ed2..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_file.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_group.png
deleted file mode 100644
index 7d929c0..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_host.png
deleted file mode 100644
index 867ef2c..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_host.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_imp.png
deleted file mode 100644
index f667cfc..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_imp.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_mail.png
deleted file mode 100644
index d2d4548..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_mail.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_pwd.png
deleted file mode 100644
index 06b53a1..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_pwd.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_search.png
deleted file mode 100644
index 33de926..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_search.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_time.png
deleted file mode 100644
index aa8300a..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_time.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_unknown.png
deleted file mode 100644
index 1857d0e..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_unknown.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_url.png
deleted file mode 100644
index cf56792..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_url.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_user.png
deleted file mode 100644
index e00eebe..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_fw-update.gif
deleted file mode 100755
index 52c18ac..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_fw-update.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_help.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_help.gif
deleted file mode 100644
index 84c84db..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_help.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_ifalias.gif
deleted file mode 100644
index 0c569a7..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_ifalias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_ifalias_d.gif
deleted file mode 100644
index faa84d4..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_ifalias_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_import_alias.gif
deleted file mode 100755
index d11a5f0..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_import_alias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_in.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_in_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_info_pkg.gif
deleted file mode 100755
index cd3a532..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_info_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_interface_down.gif
deleted file mode 100755
index 0626655..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_interface_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_interface_up.gif
deleted file mode 100755
index 1449513..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_interface_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_left.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_left.gif
deleted file mode 100755
index 8effefe..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_left_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_left_d.gif
deleted file mode 100755
index c778014..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_left_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_left_mo.gif
deleted file mode 100755
index 84c6fa2..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_left_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_log.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_log.gif
deleted file mode 100755
index 4a1983a..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_log.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_log_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_log_d.gif
deleted file mode 100755
index d31bd9b..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_log_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_log_s.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_log_s.gif
deleted file mode 100755
index f9fda33..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_log_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_log_s_d.gif
deleted file mode 100755
index fb2c05f..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_log_s_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_logs.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_logs.gif
deleted file mode 100644
index afe0104..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_logs.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_match.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_match.gif
deleted file mode 100644
index 215571f..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_match.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_match_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_match_d.gif
deleted file mode 100644
index 6e4c364..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_match_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_minus.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_minus.gif
deleted file mode 100755
index 417544f..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_minus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_open.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_open.gif
deleted file mode 100755
index ac3da14..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_open.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_other.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_other.gif
deleted file mode 100755
index e6f780f..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_other.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_other_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_other_d.gif
deleted file mode 100755
index b08d970..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_other_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_out.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_out_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_parp.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_parp.gif
deleted file mode 100755
index 96acaf3..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_parp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_parp_d.gif
deleted file mode 100755
index 7d7d00e..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_parp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_pass.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_pass.gif
deleted file mode 100755
index fe1bb0d..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_pass.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_pass_add.gif
deleted file mode 100755
index f7f4c20..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_pass_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_pass_d.gif
deleted file mode 100755
index 6adc431..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_pass_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_plus.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_plus.gif
deleted file mode 100755
index 2a94eeb..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_plus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl.gif
deleted file mode 100644
index 8dcd7c0..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl_p.gif
deleted file mode 100644
index 0c79849..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_d.gif
deleted file mode 100755
index ebc7457..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_mo.gif
deleted file mode 100755
index 1c7ca08..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_p.gif
deleted file mode 100644
index eb41284..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall.gif
deleted file mode 100755
index d78b867..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_d.gif
deleted file mode 100755
index 13658f7..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_mo.gif
deleted file mode 100755
index 90b576e..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg.gif
deleted file mode 100755
index 9aebb03..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_d.gif
deleted file mode 100755
index 4ab4992..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_mo.gif
deleted file mode 100755
index 7025d20..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml.gif
deleted file mode 100755
index 4542432..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_d.gif
deleted file mode 100755
index 8d3a68d..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_mo.gif
deleted file mode 100755
index 15e0aed..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reject.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reject.gif
deleted file mode 100755
index 5565cd6..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_reject.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reject_d.gif
deleted file mode 100755
index 6c09fae..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_reject_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_right.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_right.gif
deleted file mode 100755
index fdf2d8b..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_restart.gif
deleted file mode 100755
index e49fbd7..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_service_restart.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_restart_d.gif
deleted file mode 100755
index a5d6d7c..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_service_restart_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_running.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_running.gif
deleted file mode 100644
index 543fd56..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_service_running.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_start.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_start.gif
deleted file mode 100755
index 09bb58f..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_service_start.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_start_d.gif
deleted file mode 100755
index f58f111..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_service_start_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_status.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_status.gif
deleted file mode 100644
index a93bcfb..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_service_status.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_stop.gif
deleted file mode 100755
index 922addc..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_service_stop.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_stop_d.gif
deleted file mode 100755
index b4cfdea..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_service_stop_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_stopped.gif
deleted file mode 100644
index f93a25d..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_service_stopped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_services_restart_mo.gif
deleted file mode 100755
index a092b40..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_services_restart_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_services_start_mo.gif
deleted file mode 100755
index ecdb58f..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_services_start_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_services_stop_mo.gif
deleted file mode 100755
index c00e208..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_services_stop_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/pfsense/images/icons/icon_system-group-grey.png
deleted file mode 100644
index d7b964d..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_system-group-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_system-group.png b/src/usr/local/www/themes/pfsense/images/icons/icon_system-group.png
deleted file mode 100644
index 1c974f2..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_system-group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/pfsense/images/icons/icon_system-user-grey.png
deleted file mode 100644
index 2f6047d..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_system-user-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_system-user.png b/src/usr/local/www/themes/pfsense/images/icons/icon_system-user.png
deleted file mode 100644
index ef82156..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_system-user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/pfsense/images/icons/icon_system_lock_screen.png
deleted file mode 100644
index 30f306d..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_system_lock_screen.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_system_logout.png b/src/usr/local/www/themes/pfsense/images/icons/icon_system_logout.png
deleted file mode 100644
index 9bbb6c7..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_system_logout.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_trapped.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_trapped.gif
deleted file mode 100644
index ffeb2cd..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_trapped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_trapped_p.gif
deleted file mode 100755
index 6d46aaf..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_trapped_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_ts_rule.gif
deleted file mode 100755
index e15ab6c..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_ts_rule.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_ts_rule_d.gif
deleted file mode 100755
index f776281..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_ts_rule_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_up.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_up.gif
deleted file mode 100755
index 883c5a2..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_up_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_up_d.gif
deleted file mode 100755
index 0ddcce2..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_up_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_up_mo.gif
deleted file mode 100755
index 9f869a4..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_up_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_wlan.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_wlan.gif
deleted file mode 100755
index 1f0addc..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_wlan.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_wlan_d.gif
deleted file mode 100755
index 35bf580..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_wlan_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_wol_all.gif
deleted file mode 100755
index 2d22182..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_wol_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/pfsense/images/icons/icon_wzd_nsaved.png
deleted file mode 100644
index 21cb27d..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_wzd_nsaved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/pfsense/images/icons/icon_wzd_saved.png
deleted file mode 100644
index ab82946..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_wzd_saved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_x.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_x.gif
deleted file mode 100755
index 24e4d49..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_x_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_x_d.gif
deleted file mode 100755
index d2bfbc8..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_x_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_x_mo.gif
deleted file mode 100755
index da7b57c..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_x_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_x_p.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_x_p.gif
deleted file mode 100755
index 8828fa6..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/icon_x_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/in.gif b/src/usr/local/www/themes/pfsense/images/icons/in.gif
deleted file mode 100644
index f1da771..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/in_d.gif b/src/usr/local/www/themes/pfsense/images/icons/in_d.gif
deleted file mode 100644
index 18e26be..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/out.gif b/src/usr/local/www/themes/pfsense/images/icons/out.gif
deleted file mode 100644
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/out_d.gif b/src/usr/local/www/themes/pfsense/images/icons/out_d.gif
deleted file mode 100644
index 879f1da..0000000
--- a/src/usr/local/www/themes/pfsense/images/icons/out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/log.png b/src/usr/local/www/themes/pfsense/images/log.png
deleted file mode 100755
index 762ba80..0000000
--- a/src/usr/local/www/themes/pfsense/images/log.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/logo.gif b/src/usr/local/www/themes/pfsense/images/logo.gif
deleted file mode 100755
index 553cbd5..0000000
--- a/src/usr/local/www/themes/pfsense/images/logo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/logobig.jpg b/src/usr/local/www/themes/pfsense/images/logobig.jpg
deleted file mode 100755
index 2ef196d..0000000
--- a/src/usr/local/www/themes/pfsense/images/logobig.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/bar_blue.gif b/src/usr/local/www/themes/pfsense/images/misc/bar_blue.gif
deleted file mode 100755
index 741186a..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/bar_blue.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/bar_gray.gif b/src/usr/local/www/themes/pfsense/images/misc/bar_gray.gif
deleted file mode 100755
index e86e245..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/bar_gray.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/bar_left.gif b/src/usr/local/www/themes/pfsense/images/misc/bar_left.gif
deleted file mode 100755
index af751fa..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/bar_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/bar_right.gif b/src/usr/local/www/themes/pfsense/images/misc/bar_right.gif
deleted file mode 100755
index ff12d9e..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/bar_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/button.gif b/src/usr/local/www/themes/pfsense/images/misc/button.gif
deleted file mode 100755
index e85dbb3..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/button.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/key_128.gif b/src/usr/local/www/themes/pfsense/images/misc/key_128.gif
deleted file mode 100755
index ea5ae34..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/key_128.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/key_152.gif b/src/usr/local/www/themes/pfsense/images/misc/key_152.gif
deleted file mode 100755
index 6c7fc03..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/key_152.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/key_256.gif b/src/usr/local/www/themes/pfsense/images/misc/key_256.gif
deleted file mode 100755
index 3e1c377..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/key_256.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/key_64.gif b/src/usr/local/www/themes/pfsense/images/misc/key_64.gif
deleted file mode 100755
index 87892bd..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/key_64.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/left_background.gif b/src/usr/local/www/themes/pfsense/images/misc/left_background.gif
deleted file mode 100755
index 529d827..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/left_background.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/loader.gif b/src/usr/local/www/themes/pfsense/images/misc/loader.gif
deleted file mode 100755
index 5d10ac3..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/loader_tab.gif b/src/usr/local/www/themes/pfsense/images/misc/loader_tab.gif
deleted file mode 100755
index 05bb04c..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/loader_tab.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/logon.png b/src/usr/local/www/themes/pfsense/images/misc/logon.png
deleted file mode 100755
index baf8a9d..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/logon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/progress_bar.gif b/src/usr/local/www/themes/pfsense/images/misc/progress_bar.gif
deleted file mode 100755
index 3b4aa52..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/progress_bar.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/rrd_error.png b/src/usr/local/www/themes/pfsense/images/misc/rrd_error.png
deleted file mode 100755
index a79ecf3..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/rrd_error.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/tri_c.gif b/src/usr/local/www/themes/pfsense/images/misc/tri_c.gif
deleted file mode 100755
index 317b758..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/tri_c.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/tri_c_black.gif b/src/usr/local/www/themes/pfsense/images/misc/tri_c_black.gif
deleted file mode 100755
index 309846e..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/tri_c_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/tri_o.gif b/src/usr/local/www/themes/pfsense/images/misc/tri_o.gif
deleted file mode 100755
index eb95c32..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/tri_o.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/tri_o_black.gif b/src/usr/local/www/themes/pfsense/images/misc/tri_o_black.gif
deleted file mode 100755
index f818f3b..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/tri_o_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/widget_loader.gif b/src/usr/local/www/themes/pfsense/images/misc/widget_loader.gif
deleted file mode 100755
index fad101f..0000000
--- a/src/usr/local/www/themes/pfsense/images/misc/widget_loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/new_tab_menu.png b/src/usr/local/www/themes/pfsense/images/new_tab_menu.png
deleted file mode 100755
index 4bdfcef..0000000
--- a/src/usr/local/www/themes/pfsense/images/new_tab_menu.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/status.png b/src/usr/local/www/themes/pfsense/images/status.png
deleted file mode 100755
index a3e368e..0000000
--- a/src/usr/local/www/themes/pfsense/images/status.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/transparent.gif b/src/usr/local/www/themes/pfsense/images/transparent.gif
deleted file mode 100755
index 89c5530..0000000
--- a/src/usr/local/www/themes/pfsense/images/transparent.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/transparent_pixel.gif b/src/usr/local/www/themes/pfsense/images/transparent_pixel.gif
deleted file mode 100755
index 35d42e8..0000000
--- a/src/usr/local/www/themes/pfsense/images/transparent_pixel.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/javascript/niftyjsCode.js b/src/usr/local/www/themes/pfsense/javascript/niftyjsCode.js
deleted file mode 100644
index 75ef8b0..0000000
--- a/src/usr/local/www/themes/pfsense/javascript/niftyjsCode.js
+++ /dev/null
@@ -1,174 +0,0 @@
-function NiftyCheck(){
-if(!document.getElementById || !document.createElement)
- return(false);
-isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
-if(Array.prototype.push==null){Array.prototype.push=function(){
- this[this.length]=arguments[0]; return(this.length);};}
-return(true);
-}
-
-function Rounded(selector,wich,bk,color,opt){
-var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
-
-if(color=="transparent"){
- cn=cn+"x";
- ecolor=bk;
- bk="transparent";
- }
-else if(opt && opt.indexOf("border")>=0){
- var optar=opt.split(" ");
- for(i=0;i<optar.length;i++)
- if(optar[i].indexOf("#")>=0) ecolor=optar[i];
- if(ecolor=="") ecolor="#666";
- cn+="e";
- edges=true;
- }
-else if(opt && opt.indexOf("smooth")>=0){
- cn+="a";
- ecolor=Mix(bk,color);
- }
-if(opt && opt.indexOf("small")>=0) cn+="s";
-prefixt=cn;
-prefixb=cn;
-if(wich.indexOf("all")>=0){t=true;b=true;}
-else if(wich.indexOf("top")>=0) t="true";
-else if(wich.indexOf("tl")>=0){
- t="true";
- if(wich.indexOf("tr")<0) prefixt+="l";
- }
-else if(wich.indexOf("tr")>=0){
- t="true";
- prefixt+="r";
- }
-if(wich.indexOf("bottom")>=0) b=true;
-else if(wich.indexOf("bl")>=0){
- b="true";
- if(wich.indexOf("br")<0) prefixb+="l";
- }
-else if(wich.indexOf("br")>=0){
- b="true";
- prefixb+="r";
- }
-var v=getElementsBySelector(selector);
-var l=v.length;
-for(i=0;i<l;i++){
- if(edges) AddBorder(v[i],ecolor);
- if(t) AddTop(v[i],bk,color,ecolor,prefixt);
- if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
- }
-}
-
-function AddBorder(el,bc){
-var i;
-if(!el.passed){
- if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
- var t=el.firstChild.nodeValue;
- el.removeChild(el.lastChild);
- var d=CreateEl("span");
- d.style.display="block";
- d.appendChild(document.createTextNode(t));
- el.appendChild(d);
- }
- for(i=0;i<el.childNodes.length;i++){
- if(el.childNodes[i].nodeType==1){
- el.childNodes[i].style.borderLeft="1px solid "+bc;
- el.childNodes[i].style.borderRight="1px solid "+bc;
- }
- }
- }
-el.passed=true;
-}
-
-function AddTop(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=1;i<=lim;i++){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingTop=0;
-el.insertBefore(d,el.firstChild);
-}
-
-function AddBottom(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=lim;i>0;i--){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingBottom=0;
-el.appendChild(d);
-}
-
-function CreateEl(x){
-if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
-else return(document.createElement(x));
-}
-
-function getElementsBySelector(selector){
-var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
-
-if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
- s=selector.split(" ");
- var fs=s[0].split("#");
- if(fs.length==1) return(objlist);
- f=document.getElementById(fs[1]);
- if(f) return(f.getElementsByTagName(s[1]));
- return(objlist);
- }
-if(selector.indexOf("#")>0){ //id selector like "tag#id"
- s=selector.split("#");
- tag=s[0];
- selid=s[1];
- }
-if(selid!=""){
- f=document.getElementById(selid);
- if(f) objlist.push(f);
- return(objlist);
- }
-if(selector.indexOf(".")>0){ //class selector like "tag.class"
- s=selector.split(".");
- tag=s[0];
- selclass=s[1];
- }
-var v=document.getElementsByTagName(tag); // tag selector like "tag"
-if(selclass=="")
- return(v);
-for(i=0;i<v.length;i++){
- if(v[i].className.indexOf(selclass)>=0){
- objlist.push(v[i]);
- }
- }
-return(objlist);
-}
-
-function Mix(c1,c2){
-var i,step1,step2,x,y,r=new Array(3);
-if(c1.length==4)step1=1;
-else step1=2;
-if(c2.length==4) step2=1;
-else step2=2;
-for(i=0;i<3;i++){
- x=parseInt(c1.substr(1+step1*i,step1),16);
- if(step1==1) x=16*x+x;
- y=parseInt(c2.substr(1+step2*i,step2),16);
- if(step2==1) y=16*y+y;
- r[i]=Math.floor((x*50+y*50)/100);
- }
-return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense/loader.js b/src/usr/local/www/themes/pfsense/loader.js
deleted file mode 100644
index 2fc9b78..0000000
--- a/src/usr/local/www/themes/pfsense/loader.js
+++ /dev/null
@@ -1,30 +0,0 @@
-//<![CDATA[
-var browser = '';
-var version = '';
-var entrance = '';
-var cond = '';
-
-// BROWSER?
-if (browser == '') {
- if (navigator.appName.indexOf('Microsoft') != -1)
- browser = 'IE';
- else if (navigator.appName.indexOf('Netscape') != -1)
- browser = 'Netscape';
- else
- browser = 'IE';
-}
-
-if (version == '') {
- version= navigator.appVersion;
- paren = version.indexOf('(');
- whole_version = navigator.appVersion.substring(0,paren-1);
- version = parseInt(whole_version);
-}
-
-if (browser == 'IE' && version < 7) {
- document.write('<script type="text/javascript" src="/themes/metallic/javascript/ie7/ie7-standard-p.js"></script>');
-}
-
-document.write('<script type="text/javascript" src="/themes/pfsense/javascript/niftyjsCode.js"></script>');
-
-//]]>
diff --git a/src/usr/local/www/themes/pfsense/login.css b/src/usr/local/www/themes/pfsense/login.css
deleted file mode 100644
index f8abdfc..0000000
--- a/src/usr/local/www/themes/pfsense/login.css
+++ /dev/null
@@ -1,1127 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #999999;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- background-position : center 0px;
- background-color: #999999;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-
-#login {
-/* background: #cccccc; */
- background-color: transparent;
- border: 0px solid #cccccc;
- margin: 5em auto;
- padding: 0em;
- width: 400px;
-/* filter:alpha(opacity=60);
- -moz-opacity:0.6;
- -khtml-opacity: 0.6;
- opacity: 0.6; */
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
-/* background: #ffffff; */
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 400px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -420px;
- left: 70px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- top: -300px; */
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- left: 10px;
- top: -300px; */
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- text-align: center;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -20px;
- left: 170px;
-}
-
-/* loginerror box follows */
-
-#login #inputerrors {
- background-color: transparent;
- border: 0px solid #666666;
- margin: 5em auto;
- vertical-align: middle;
- padding: 0em;
- width: 330px;
- height: 50px;
- position: relative;
- top: -370px;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense/new_tab_menu.css b/src/usr/local/www/themes/pfsense/new_tab_menu.css
deleted file mode 100644
index 04c4cf2..0000000
--- a/src/usr/local/www/themes/pfsense/new_tab_menu.css
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- new_tab_menu.css
- part of pfSense
- Copyright (C) 2010-2011 Robert Zelaya
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
-
- Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
- The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
-
- <tr>
- <td>
- <?php
- $tab_array_indent = 0; // move to the line in px
- $tab_array_space = 1; // space betwen lines in px
- $tab_array_char_limit = 82; // number or chr before the drop down box
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
-
-*/
-
-.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
-
-.newtabmenu li{float:left; margin-right:2px; text-align: center;}
-.newtabmenu a:link, .newtabmenu a:visited{
- background:url(images/new_tab_menu.png) right 45px;
- color:#ffffff; /* noactive font */
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- font-weight:bold;
- font-size:.9em;
- height:20px;
- line-height:20px;
- text-decoration:none;
-}
-.newtabmenu a span{
- background:url(images/new_tab_menu.png) left 45px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- height:20px;
- margin-right:7px;
- padding-left:7px;
-}
-.newtabmenu a:hover{
- background:url(images/new_tab_menu.png) right 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- color:#ffffff; /* hover over font */
-}
-.newtabmenu a:hover span{
- background:url(images/new_tab_menu.png) left 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
-}
-
-/* -------------------------------- */
-/* ACTIVE ELEMENTS */
-.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
- color:#000000; /* active font */
- background:url(images/new_tab_menu.png) right 0 no-repeat;
-}
-.newtabmenu_active a span, .newtabmenu_active a:hover span{
- background:url(images/new_tab_menu.png) left 0 no-repeat;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense/rrdcolors.inc.php b/src/usr/local/www/themes/pfsense/rrdcolors.inc.php
deleted file mode 100644
index dcb7a39..0000000
--- a/src/usr/local/www/themes/pfsense/rrdcolors.inc.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/* $Id$ */
-/*
- rrdcolors.inc.php
- Part of pfSense
- Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/* This file is included by the RRD graphing page and sets the colors */
-
-/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* 95th Percentile Lines Out, In */
-$colortraffic95 = array('660000', 'FF0000');
-
-/* State Table pfrate, pfstates, pfnat, srcip, dstip */
-$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
-
-/* Processor Usage user, nice, system, int, processes */
-$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
-
-/* Memory Usage active, inact, free, cache, wire */
-$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
-
-/* MBUF Usage current, cache, total, max */
-$colormbuf = array('0080FF','00E344','FF0000','000000');
-
-/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
-$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
-$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
-/* Quality Graph Loss */
-$colorqualityloss = 'ee0000';
-
-/* Wireless Graph SNR, Rate, Channel*/
-/* Cellular Graph RSSI, */
-$colorwireless = array('333333','a83c3c','999999');
-
-/* SPAMD Times min area, avg area, max area, Time line */
-$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
-/* SPAMD Connections max area, min area, min line, max line, avg line */
-$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
-
-/* OpenVPN Users Online Users */
-$colorvpnusers = array('990000');
-
-/* Captive Portal Total Users Total Users */
-/* Captive Portal Concurrent Concurrent Users */
-$colorcaptiveportalusers = array('990000');
-
-?>
diff --git a/src/usr/local/www/themes/pfsense/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/pfsense/styles/jquery-ui-1.11.1.css
deleted file mode 100644
index 8a8c54f..0000000
--- a/src/usr/local/www/themes/pfsense/styles/jquery-ui-1.11.1.css
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*! jQuery UI - v1.11.1 - 2014-09-22
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.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:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-clearfix {
- min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* 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: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.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: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- 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;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- min-height: 0; /* support: IE7 */
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
- position: absolute;
- left: .5em;
- top: 50%;
- margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-button {
- display: inline-block;
- position: relative;
- padding: 0;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
- width: 2.4em;
-}
-.ui-button-icons-only {
- width: 3.4em;
-}
-button.ui-button-icons-only {
- width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
- display: block;
- line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
- padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
- padding: .4em;
- text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
- padding-left: 2.1em;
- padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
- padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
- position: absolute;
- top: 50%;
- margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
- left: 50%;
- margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
- left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
- right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
- margin-right: 7px;
-}
-.ui-buttonset .ui-button {
- margin-left: 0;
- margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.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 {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.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,
-.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%;
- font-size: 0;
-}
-
-/* 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,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-.ui-dialog {
- overflow: hidden;
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
- width: 12px;
- height: 12px;
- right: -5px;
- bottom: -5px;
- background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: none;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- position: relative;
- margin: 0;
- padding: 3px 1em 3px .4em;
- cursor: pointer;
- min-height: 0; /* support: IE7 */
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-progressbar {
- height: 1em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
- background-color: #990000;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
- height: 100%;
- filter: alpha(opacity=25); /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- /* Support: IE7 */
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-button {
- display: inline-block;
- overflow: hidden;
- position: relative;
- text-decoration: none;
- cursor: pointer;
-}
-.ui-selectmenu-button span.ui-icon {
- right: 0.5em;
- left: auto;
- margin-top: -8px;
- position: absolute;
- top: 50%;
-}
-.ui-selectmenu-button span.ui-selectmenu-text {
- text-align: left;
- padding: 0.4em 2.1em 0.4em 1em;
- display: block;
- line-height: 1.4;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.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;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.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;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 22px;
-}
-.ui-spinner-button {
- width: 16px;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top: none;
- border-bottom: none;
- border-right: none;
-}
-/* vertically center icon */
-.ui-spinner .ui-icon {
- position: absolute;
- margin-top: -8px;
- top: 50%;
- left: 0;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
- /* need to fix icons sprite */
- background-position: -65px -16px;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
- -webkit-box-shadow: 0 0 5px #aaa;
- box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #aaaaaa;
- background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #bbbbbb;
- /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
- color: #444444;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #444444;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #cccccc;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #3383bb;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #3383bb;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #bbbbbb;
- background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #599fcf;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited {
- color: #599fcf;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #999999;
- background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #ffffff;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #ffffff;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
- color: #444444;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #444444;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #c0402a;
- background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
- color: #ffffff;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #ffffff;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #ffffff;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70); /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35); /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-state-default .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-active .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
-}
-.ui-state-highlight .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.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-on { background-position: -96px -144px; }
-.ui-icon-radio-off { 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-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.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-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 6px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
- opacity: .8;
- filter: Alpha(Opacity=80); /* support: IE8 */
-}
-.ui-widget-shadow {
- margin: -4px 0 0 -4px;
- padding: 4px;
- background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
- opacity: .6;
- filter: Alpha(Opacity=60); /* support: IE8 */
- border-radius: 0pxdow;
-}
diff --git a/src/usr/local/www/themes/pfsense_ng/all.css b/src/usr/local/www/themes/pfsense_ng/all.css
deleted file mode 100644
index 39beb77..0000000
--- a/src/usr/local/www/themes/pfsense_ng/all.css
+++ /dev/null
@@ -1,1414 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, sans-serif;
- font-size: 0.9em;
-
-}
-
-.nowrap { white-space: nowrap; }
-
-.addgatewaybox {
- background-color: #990000;
- border-style: none none none none;
- width: 225px;
-}
-
-.infobox {
- width:100%;
-}
-
-.infoboxsave {
- padding-right: 10px;
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-.inputerrorsleft {
- background-color: #990000;
- width: 36px;
-}
-
-.inputerrorsright {
- background-color: #FFD9D1;
- color: #000000;
- font-size: 11px;
- padding-left: 8px;
- padding-top: 6px;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 220px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 11px;
- font-family: "Trebuchet MS", sans-serif;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- align: left;
- background: url('images/background.jpg') no-repeat;
- background-position : left 0px;
- background-attachment: fixed;
- background-color: #7f7f7f;
-}
-a:link {
- color: #550000;
-}
-
-a:visited {
- color: #550000;
-}
-
-a:active {
- color: #550000;
-}
-
-a:hover {
- color: #550000;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* style of disabled formelements */
-#wrap div {margin:1em 0}
-[disabled] {
- color:#666666;
- background:#eeeeee;
-}
-
-/* ID Based CSS Definitions */
-/* margin: 0px auto makes the content centered, margin 0px 0px makes it aligned to the left */
-#wrapper {
- width: 810px;
- margin: 0px 0px;
-/* left: 0px; */
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 40px;
- width: 810px;
- position: fixed;
- left: 0;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 40px;
- width: 80px;
- left: 0px;
- top:0px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 0px;
- left: 0px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 30px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-/* for forcing an alert run the following command from diagnostics>command, php command:
-file_notice("blah", "blah blah...testing my new theme...");
-*/
-
-#header-right .container .right #alerts {
- position: fixed;
- background: url('images/alert_bgr.png') no-repeat;
- height: 40px;
- width: 400px;
- top: 0px;
- left: 810px;
- z-index: 2;
- padding-top: 1px;
- padding-left: 10px;
- margin: 0px;
-}
-
-#header-right .container .right #hostname {
- position: fixed;
- background: url('images/hostname.png') no-repeat;
- height: 40px;
- width: 400px;
- z-index: 1;
- padding-right: 5px;
- margin: 0px;
- top: 0px;
- left: 810px;
- font-size: 12px;
- color: #000000;
- font-weight: bold;
- padding-left: 40px;
- padding-top: 2px;
- text-align: left;
-}
-
-
-
-
-table#marquee {
- position: relative;
- top: -4px;
- left: 15px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 350px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
-/* font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff; */
- font-size: 12px;
- font-weight: normal;
- font-style: italic;
- color: #000000;
- padding-left: 30px;
- padding-top: 2px;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 330px;
- height: 16px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-#content {
- position: relative;
- top: 0px;
- left: 75px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 50px;
- padding-left: 20px;
- width: 840px;
- background-color: #ffffff;
- background: url('images/horizontal.png') repeat-y;
-}
-
-
-/* try to abuse left as a fadeout at the end of the page */
-#left {
- width: 810px;
- height: 1px;
-}
-
-#right {
- position: relative;
- top: -10px;
- left: 0px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 20px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 90px;
- min-height: 400px;
-
-}
-
-#footer {
- position: relative;
-/* margin-bottom: 5px; */
- background: url('images/footer.png') no-repeat;
-/* top: -100px; */
- bottom: 0px;
- left: 75px;
-/* width: 1210px; */
- width: 840px;
- height: 60px;
- color: #000000;
- text-align: center;
- font-size: 0.9em;
- padding-top: 10px;
- padding-left: 10px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-
-}
-
-/* Style the List */
-#navigation {
- position: fixed;
- top: 0px;
- left: 100px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
- margin-left: 10px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- padding-right: 20px;
- top: 0px;
-}
-
-/* Text mainmenubar */
-#navigation ul li div {
- background-image: url(images/mainmenu-right.gif);
- background-position: 2% 50%;
- background-repeat: no-repeat;
- padding-top:0px;
- font-size: 12px;
- font-weight: normal;
- color: #ffffff;
- text-align: left;
- padding-left: 13px;
- height: 13px;
-}
-
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- font-weight: normal;
- margin-top: 1px;
- padding-top: 5px;
- background: #850000;
- border: 0px;
- /* transparent */
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=95);
- -moz-opacity: 0.95;
- -khtml-opacity: 0.95;
- opacity: 0.95;
- /* borders */
- border-bottom-right-radius: 0px;
- border-bottom-left-radius: 6px;
- border-top-left-radius: 6px;
- border-top-right-radius: 6px;
- /* Mozilla */
- -moz-border-radius-bottomright: 0px;
- -moz-border-radius-bottomleft: 6px;
- -moz-border-radius-topright: 6px;
- -moz-border-radius-topleft: 6px;
- /* WebKit */
- -webkit-border-bottom-right-radius: 0px;
- -webkit-border-bottom-left-radius: 6px;
- -webkit-border-top-right-radius: 6px;
- -webkit-border-top-left-radius: 6px;
- /* Shadow Effect */
- box-shadow: 5px 5px 10px #000000;
- -webkit-box-shadow: 5px 5px 10px #000000;
- -moz-box-shadow: 5px 5px 10px #000000;
- /* Vertical menu max size */
- /* max-height: 259px; /
- /* Horizontal menu max size */
- max-width: 128px;
- overflow-x: hidden;
- overflow-y: auto;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
- background-image: url(images/mainmenu-down.gif);
- background-position: 5% 50%;
- background-repeat: no-repeat;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #000000;
-}
-/* dropdownmenu */
-#navigation ul li ul li {
- border: 0px solid #850000;
- width: 128px;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #850000;
- /* borders */
- border-bottom-right-radius: 0px;
- border-bottom-left-radius: 3px;
- border-top-left-radius: 3px;
- border-top-right-radius: 3px;
- /* Mozilla */
- -moz-border-radius-bottomright: 0px;
- -moz-border-radius-bottomleft: 3px;
- -moz-border-radius-topright: 3px;
- -moz-border-radius-topleft: 3px;
- /* WebKit */
- -webkit-border-bottom-right-radius: 0px;
- -webkit-border-bottom-left-radius: 3px;
- -webkit-border-top-right-radius: 3px;
- -webkit-border-top-left-radius: 3px;
-}
-/* last element in dropdown menu*/
-#navigation ul li ul li:last-child {
- margin-bottom: 5px;
-}
-#navigation ul li ul li:hover {
- margin-left: 5px;
- background-color: #666666;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=95);
- -moz-opacity: 0.95;
- -khtml-opacity: 0.95;
- opacity: 0.95;
-}
-
-/* textcolor in dropdownmenu */
-#navigation li li a {
- display: block;
- padding-left: 8px;
- padding-right: 8px;
- color: #ffffff;
- font-size: 11px;
- font-weight: normal;
- text-align: left;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-}
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
- background-color: transparent;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listrborder {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-left: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- color: #FFFFFF;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #DDDDDD;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-/* style of disabled formelements */
-[disabled] {
- color:#666666;
- background:#eeeeee;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 6px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password, #password2 {
- font-size: small;
- width: 60%;
- padding-left: 19px;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-/* Widget CSS */
-.widgetsubheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #B1B1B1;
- padding-right: 6px;
- padding-left: 6px;
- color: #000000;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetdiv{
- margin:5px;
- padding: 5px;
- background:#CCCCCC;
-}
-.widgetconfigdiv{
- background:#BBBBBB;
- font-size: 11px;
- color: #000000;
- padding-right: 5px;
- padding-left: 5px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-div#log div.log-entry-mini {
- clear: both;
-}
-
-div#log div.log-entry-mini span {
- padding: 2px 2px 2px 2px;
- padding-left: 6px;
-}
-
-div#log span.log-action-mini-header,
-div#log span.log-time-mini-header,
-div#log span.log-interface-mini-header,
-div#log span.log-source-mini-header,
-div#log span.log-destination-mini-header,
-div#log span.log-protocol-mini-header {
- float: left;
- text-align: left;
- background-color: #B1B1B1;
- font-size: 12px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-time-mini,
-div#log span.log-interface-mini,
-div#log span.log-source-mini,
-div#log span.log-destination-mini,
-div#log span.log-protocol-mini {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 11px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-action-mini-header {
- width: 6%;
-}
-
-div#log span.log-time-mini,
-div#log span.log-time-mini-header {
- width: 19%;
-}
-
-div#log span.log-interface-mini,
-div#log span.log-interface-mini-header {
- width: 8%;
-}
-
-div#log span.log-source-mini,
-div#log span.log-source-mini-header {
- width: 23%;
-}
-
-div#log span.log-destination-mini,
-div#log span.log-destination-mini-header {
- width: 31%;
-}
-
-div#log span.log-protocol-mini,
-div#log span.log-protocol-mini-header {
- width: 8%;
- border-right: 1px solid #999;
-}
-
-/* Sortable tables */
-table.sortable thead {
- cursor: default;
- /* background-color: #EEEEEE; this causing light gray rectangles to the right of many tables in gui */
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-
-/*thermal_sensors widget styles*/
-
-.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
-.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
-.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
- background-color: LimeGreen;
- border-top-width: 2px; border-top-color: Lime;
- border-left-width: 0px;
- border-right-width: 0px;
- border-bottom-width: 2px; border-bottom-color: Green;
-}
-.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
-.thermalSensorText { float: left; height: 20px; top: 3px; }
-.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
-
-.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-
-.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
-
-.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
-
-/* widget textarea styles - full width */
-.textarea_widget {
- width: 100%;
- resize:vertical;
- -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
- -moz-box-sizing: border-box; /* Firefox, other Gecko */
- box-sizing: border-box; /* IE 8+ */
-}
diff --git a/src/usr/local/www/themes/pfsense_ng/apple-touch-icon.png b/src/usr/local/www/themes/pfsense_ng/apple-touch-icon.png
deleted file mode 100755
index 7a4b975..0000000
--- a/src/usr/local/www/themes/pfsense_ng/apple-touch-icon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/bottom-loader.js b/src/usr/local/www/themes/pfsense_ng/bottom-loader.js
deleted file mode 100644
index a21f775..0000000
--- a/src/usr/local/www/themes/pfsense_ng/bottom-loader.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//<![CDATA[
-
- NiftyCheck();
- Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
- Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
- Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
- Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
- Rounded("div#topbox","all","#FFF","#990000","smooth");
-
-//]]>
diff --git a/src/usr/local/www/themes/pfsense_ng/favicon.ico b/src/usr/local/www/themes/pfsense_ng/favicon.ico
deleted file mode 100644
index 3440bf2..0000000
--- a/src/usr/local/www/themes/pfsense_ng/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/graphlink.css b/src/usr/local/www/themes/pfsense_ng/graphlink.css
deleted file mode 100644
index 521059e..0000000
--- a/src/usr/local/www/themes/pfsense_ng/graphlink.css
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- $Id: graphlink.css,v 1.2.2.1 2007/01/17 18:43:30 sullrich Exp $
-
- This file is part of the GraphLink software.
- GraphLink is distributed under the MIT License.
- Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
-*******************************************************************************/
-
-/**
- * Defines the background image used for the graph, as well as the actual data
- * locations.
- * Use padding-left and padding-top to align the data area correctly with your
- * background image.
- * Width and height should same as the dimensions of the image, minus the
- * padding values in both directions.
- */
-div.GraphLink {
- width: 212px;
- height: 60px;
- padding-left: 38px;
- padding-top: 10px;
- background-image: url(/themes/nervecenter/images/misc/graph.png);
- overflow: hidden;
-}
-
-/**
- * Defines the data display area. Modify to fit your background image.
- */
-div.GraphLinkData {
- width: 200px;
- height: 50px;
- overflow: hidden;
-}
-
-/**
- * Defines the look of one bar. Nothing to change here other than the color.
- */
-span.GraphLinkBar {
- background-color: #990000;
- height: 100%;
- float: left;
- overflow: hidden;
-}
diff --git a/src/usr/local/www/themes/pfsense_ng/images/alert_bgr.png b/src/usr/local/www/themes/pfsense_ng/images/alert_bgr.png
deleted file mode 100755
index 5a8ac81..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/alert_bgr.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/alerter.png b/src/usr/local/www/themes/pfsense_ng/images/alerter.png
deleted file mode 100755
index e026bfe..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/alerter.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/background.jpg b/src/usr/local/www/themes/pfsense_ng/images/background.jpg
deleted file mode 100755
index ebdff47..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/background.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/footer.png b/src/usr/local/www/themes/pfsense_ng/images/footer.png
deleted file mode 100755
index b10002b..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/footer.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/header.png b/src/usr/local/www/themes/pfsense_ng/images/header.png
deleted file mode 100755
index 6f8128c..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/header.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/help.png b/src/usr/local/www/themes/pfsense_ng/images/help.png
deleted file mode 100755
index 1de05e3..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/help.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/horizontal.png b/src/usr/local/www/themes/pfsense_ng/images/horizontal.png
deleted file mode 100755
index f098bb3..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/horizontal.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/hostname.png b/src/usr/local/www/themes/pfsense_ng/images/hostname.png
deleted file mode 100755
index cd79f5c..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/hostname.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/favicon.ico b/src/usr/local/www/themes/pfsense_ng/images/icons/favicon.ico
deleted file mode 100644
index 3440bf2..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_3g.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_3g.gif
deleted file mode 100755
index 46ccb92..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_3g.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_3g_inactive.gif
deleted file mode 100755
index cf983e4..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_3g_inactive.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced.gif
deleted file mode 100755
index 3ede1ff..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced_s.gif
deleted file mode 100755
index b233549..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alert.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alert.gif
deleted file mode 100755
index 7646941..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alert.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_host.gif
deleted file mode 100755
index ad43e17..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_host.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_net.gif
deleted file mode 100755
index abd1b8b..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_net.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_port.gif
deleted file mode 100755
index 4acf2aa..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_port.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url.gif
deleted file mode 100755
index 660571e..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url_reload.gif
deleted file mode 100755
index 55c1c4a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url_reload.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block.gif
deleted file mode 100755
index 670c968..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block_add.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block_add.gif
deleted file mode 100755
index eb726d6..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block_d.gif
deleted file mode 100755
index e6345fe..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cablenic.gif
deleted file mode 100755
index a071c66..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cablenic.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cal.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cal.gif
deleted file mode 100755
index a9c7c87..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cal_mo.gif
deleted file mode 100755
index 1647e2f..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cal_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_carp.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_carp.gif
deleted file mode 100755
index 9454a82..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_carp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_carp_d.gif
deleted file mode 100755
index 2ba8db2..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_carp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_chain.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_chain.png
deleted file mode 100755
index 12db07a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_chain.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_check.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_check.gif
deleted file mode 100755
index 393674d..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_check.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_green.gif
deleted file mode 100755
index e171ba8..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_green.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_grey.gif
deleted file mode 100755
index 00c865a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_grey.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_red.gif
deleted file mode 100755
index 7b412ee..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_close.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_close.gif
deleted file mode 100755
index e0f86a7..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_close.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_configure.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_configure.gif
deleted file mode 100755
index 7182e0d..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_configure.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down.gif
deleted file mode 100755
index b71a9c5..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down_d.gif
deleted file mode 100755
index 70a7473..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down_mo.gif
deleted file mode 100755
index 584587a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_e.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_e.gif
deleted file mode 100755
index 2950800..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_e.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_e_mo.gif
deleted file mode 100755
index 9ba5738..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_e_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_error.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_error.gif
deleted file mode 100755
index e0fa659..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_error.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_exclam.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_exclam.gif
deleted file mode 100755
index 36c2ec7..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_exclam.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_de.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_de.png
deleted file mode 100755
index 069cbbe..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_de.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_en.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_en.png
deleted file mode 100755
index bd7f9a5..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_en.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_es.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_es.png
deleted file mode 100755
index 434776c..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_es.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_pt_BR.png
deleted file mode 100755
index f786349..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_pt_BR.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_cert.png
deleted file mode 100755
index 48a34b6..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_cert.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_file.png
deleted file mode 100755
index 48a9ed2..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_file.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_group.png
deleted file mode 100755
index 7d929c0..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_host.png
deleted file mode 100755
index 867ef2c..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_host.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_imp.png
deleted file mode 100755
index f667cfc..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_imp.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_mail.png
deleted file mode 100755
index d2d4548..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_mail.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_pwd.png
deleted file mode 100755
index 06b53a1..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_pwd.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_search.png
deleted file mode 100755
index 33de926..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_search.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_time.png
deleted file mode 100755
index aa8300a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_time.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_unknown.png
deleted file mode 100755
index 1857d0e..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_unknown.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_url.png
deleted file mode 100755
index cf56792..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_url.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_user.png
deleted file mode 100755
index e00eebe..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_fw-update.gif
deleted file mode 100755
index 52c18ac..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_fw-update.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_help.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_help.gif
deleted file mode 100644
index 84c84db..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_help.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias.gif
deleted file mode 100755
index 0c569a7..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias_d.gif
deleted file mode 100755
index faa84d4..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_import_alias.gif
deleted file mode 100755
index d11a5f0..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_import_alias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_in.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_in_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_info_pkg.gif
deleted file mode 100755
index cd3a532..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_info_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_down.gif
deleted file mode 100755
index 0626655..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_up.gif
deleted file mode 100755
index 1449513..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left.gif
deleted file mode 100755
index 8effefe..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left_d.gif
deleted file mode 100755
index c778014..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left_mo.gif
deleted file mode 100755
index 84c6fa2..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log.gif
deleted file mode 100755
index 4a1983a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_d.gif
deleted file mode 100755
index d31bd9b..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s.gif
deleted file mode 100755
index f9fda33..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s_d.gif
deleted file mode 100755
index fb2c05f..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_logs.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_logs.gif
deleted file mode 100644
index afe0104..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_logs.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_match.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_match.gif
deleted file mode 100644
index 215571f..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_match.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_match_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_match_d.gif
deleted file mode 100644
index 6e4c364..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_match_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_minus.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_minus.gif
deleted file mode 100755
index 417544f..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_minus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_open.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_open.gif
deleted file mode 100755
index ac3da14..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_open.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_other.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_other.gif
deleted file mode 100755
index e6f780f..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_other.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_other_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_other_d.gif
deleted file mode 100755
index b08d970..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_other_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_out.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_out_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_parp.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_parp.gif
deleted file mode 100755
index 96acaf3..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_parp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_parp_d.gif
deleted file mode 100755
index 7d7d00e..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_parp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass.gif
deleted file mode 100755
index fe1bb0d..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_add.gif
deleted file mode 100755
index f7f4c20..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_d.gif
deleted file mode 100755
index 6adc431..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus.gif
deleted file mode 100755
index 2a94eeb..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl.gif
deleted file mode 100755
index 8dcd7c0..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl_p.gif
deleted file mode 100755
index 0c79849..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_d.gif
deleted file mode 100755
index ebc7457..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_mo.gif
deleted file mode 100755
index 1c7ca08..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_p.gif
deleted file mode 100755
index eb41284..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall.gif
deleted file mode 100755
index d78b867..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_d.gif
deleted file mode 100755
index 13658f7..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_mo.gif
deleted file mode 100755
index 90b576e..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg.gif
deleted file mode 100755
index 9aebb03..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_d.gif
deleted file mode 100755
index 4ab4992..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_mo.gif
deleted file mode 100755
index 7025d20..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml.gif
deleted file mode 100755
index 4542432..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_d.gif
deleted file mode 100755
index 8d3a68d..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_mo.gif
deleted file mode 100755
index 15e0aed..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reject.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reject.gif
deleted file mode 100755
index 5565cd6..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reject.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reject_d.gif
deleted file mode 100755
index 6c09fae..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reject_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_right.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_right.gif
deleted file mode 100755
index fdf2d8b..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart.gif
deleted file mode 100755
index e49fbd7..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart_d.gif
deleted file mode 100755
index a5d6d7c..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_running.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_running.gif
deleted file mode 100644
index 543fd56..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_running.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start.gif
deleted file mode 100755
index 09bb58f..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start_d.gif
deleted file mode 100755
index f58f111..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_status.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_status.gif
deleted file mode 100644
index a93bcfb..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_status.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop.gif
deleted file mode 100755
index 922addc..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop_d.gif
deleted file mode 100755
index b4cfdea..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stopped.gif
deleted file mode 100644
index f93a25d..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stopped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_restart_mo.gif
deleted file mode 100755
index a092b40..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_restart_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_start_mo.gif
deleted file mode 100755
index ecdb58f..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_start_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_stop_mo.gif
deleted file mode 100755
index c00e208..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_stop_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group-grey.png
deleted file mode 100755
index d7b964d..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group.png
deleted file mode 100755
index 1c974f2..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user-grey.png
deleted file mode 100755
index 2f6047d..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user.png
deleted file mode 100755
index ef82156..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system_lock_screen.png
deleted file mode 100755
index 30f306d..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system_lock_screen.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system_logout.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system_logout.png
deleted file mode 100755
index 9bbb6c7..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system_logout.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped.gif
deleted file mode 100755
index ffeb2cd..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped_p.gif
deleted file mode 100755
index 6d46aaf..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule.gif
deleted file mode 100755
index e15ab6c..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule_d.gif
deleted file mode 100755
index f776281..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up.gif
deleted file mode 100755
index 883c5a2..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up_d.gif
deleted file mode 100755
index 0ddcce2..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up_mo.gif
deleted file mode 100755
index 9f869a4..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan.gif
deleted file mode 100755
index 1f0addc..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan_d.gif
deleted file mode 100755
index 35bf580..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wol_all.gif
deleted file mode 100755
index 2d22182..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wol_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_nsaved.png
deleted file mode 100755
index 21cb27d..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_nsaved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_saved.png
deleted file mode 100755
index ab82946..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_saved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x.gif
deleted file mode 100755
index 24e4d49..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_d.gif
deleted file mode 100755
index d2bfbc8..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_mo.gif
deleted file mode 100755
index da7b57c..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_p.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_p.gif
deleted file mode 100755
index 8828fa6..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/in.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/in_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/out.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/out_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/icons/out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/log.png b/src/usr/local/www/themes/pfsense_ng/images/log.png
deleted file mode 100755
index 762ba80..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/log.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/logo.gif b/src/usr/local/www/themes/pfsense_ng/images/logo.gif
deleted file mode 100755
index e5da95c..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/logo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/logobig.jpg b/src/usr/local/www/themes/pfsense_ng/images/logobig.jpg
deleted file mode 100755
index 2ef196d..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/logobig.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/mainmenu-down.gif b/src/usr/local/www/themes/pfsense_ng/images/mainmenu-down.gif
deleted file mode 100755
index e59432a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/mainmenu-down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/mainmenu-right.gif b/src/usr/local/www/themes/pfsense_ng/images/mainmenu-right.gif
deleted file mode 100755
index 14298a1..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/mainmenu-right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/mainmenuitem.gif b/src/usr/local/www/themes/pfsense_ng/images/mainmenuitem.gif
deleted file mode 100755
index 6e97478..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/mainmenuitem.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/menu-dot.gif b/src/usr/local/www/themes/pfsense_ng/images/menu-dot.gif
deleted file mode 100755
index c76609b..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/menu-dot.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/menu_footer.gif b/src/usr/local/www/themes/pfsense_ng/images/menu_footer.gif
deleted file mode 100755
index d06faa4..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/menu_footer.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/menu_right.gif b/src/usr/local/www/themes/pfsense_ng/images/menu_right.gif
deleted file mode 100755
index 881327c..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/menu_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/menubgr.png b/src/usr/local/www/themes/pfsense_ng/images/menubgr.png
deleted file mode 100755
index 45e0ec7..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/menubgr.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/menubgr_footer.png b/src/usr/local/www/themes/pfsense_ng/images/menubgr_footer.png
deleted file mode 100755
index fdff49f..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/menubgr_footer.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/menubgr_highlight.png b/src/usr/local/www/themes/pfsense_ng/images/menubgr_highlight.png
deleted file mode 100755
index 05f4832..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/menubgr_highlight.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/bar_blue.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/bar_blue.gif
deleted file mode 100755
index 741186a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/bar_blue.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/bar_gray.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/bar_gray.gif
deleted file mode 100755
index e86e245..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/bar_gray.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/bar_left.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/bar_left.gif
deleted file mode 100755
index af751fa..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/bar_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/bar_right.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/bar_right.gif
deleted file mode 100755
index ff12d9e..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/bar_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_minus.png
deleted file mode 100755
index 37db2fd..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_minus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_plus.png
deleted file mode 100755
index fba7af9..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_plus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/button.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/button.gif
deleted file mode 100755
index e85dbb3..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/button.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/graph.png b/src/usr/local/www/themes/pfsense_ng/images/misc/graph.png
deleted file mode 100755
index 507ec75..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/graph.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/key_128.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/key_128.gif
deleted file mode 100755
index ea5ae34..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/key_128.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/key_152.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/key_152.gif
deleted file mode 100755
index 6c7fc03..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/key_152.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/key_256.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/key_256.gif
deleted file mode 100755
index 3e1c377..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/key_256.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/key_64.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/key_64.gif
deleted file mode 100755
index 87892bd..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/key_64.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/left_background.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/left_background.gif
deleted file mode 100755
index 529d827..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/left_background.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/loader.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/loader.gif
deleted file mode 100755
index 5d10ac3..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/loader_all.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/loader_all.gif
deleted file mode 100755
index cb6bc0c..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/loader_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/loader_filter.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/loader_filter.gif
deleted file mode 100755
index b838b17..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/loader_filter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/loader_tab.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/loader_tab.gif
deleted file mode 100755
index 05bb04c..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/loader_tab.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/logon.png b/src/usr/local/www/themes/pfsense_ng/images/misc/logon.png
deleted file mode 100755
index 98aa37a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/logon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/progress_bar.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/progress_bar.gif
deleted file mode 100755
index 3b4aa52..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/progress_bar.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/rrd_error.png b/src/usr/local/www/themes/pfsense_ng/images/misc/rrd_error.png
deleted file mode 100755
index a79ecf3..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/rrd_error.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_alerter.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_alerter.gif
deleted file mode 100755
index 7ff1e95..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/status_alerter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_carpmaster.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_carpmaster.gif
deleted file mode 100755
index 2c32908..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/status_carpmaster.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_left.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_left.gif
deleted file mode 100755
index b5a2930..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/status_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_page_loading.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_page_loading.gif
deleted file mode 100755
index 067ef18..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/status_page_loading.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_reload_all.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_reload_all.gif
deleted file mode 100755
index 72de6bd..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/status_reload_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_reload_filter.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_reload_filter.gif
deleted file mode 100755
index d72761a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/status_reload_filter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_right.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_right.gif
deleted file mode 100755
index bf66fdb..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/status_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/tri_c.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/tri_c.gif
deleted file mode 100755
index 317b758..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/tri_c.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/tri_c_black.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/tri_c_black.gif
deleted file mode 100755
index 309846e..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/tri_c_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/tri_o.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/tri_o.gif
deleted file mode 100755
index eb95c32..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/tri_o.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/tri_o_black.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/tri_o_black.gif
deleted file mode 100755
index f818f3b..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/tri_o_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/widget_loader.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/widget_loader.gif
deleted file mode 100755
index ca35e2a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/misc/widget_loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/new_tab_menu.png b/src/usr/local/www/themes/pfsense_ng/images/new_tab_menu.png
deleted file mode 100755
index 4bdfcef..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/new_tab_menu.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/status.png b/src/usr/local/www/themes/pfsense_ng/images/status.png
deleted file mode 100755
index a3e368e..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/status.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/transparent.gif b/src/usr/local/www/themes/pfsense_ng/images/transparent.gif
deleted file mode 100755
index 89c5530..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/transparent.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/transparent_pixel.gif b/src/usr/local/www/themes/pfsense_ng/images/transparent_pixel.gif
deleted file mode 100755
index 35d42e8..0000000
--- a/src/usr/local/www/themes/pfsense_ng/images/transparent_pixel.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/blank.gif b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/blank.gif
deleted file mode 100755
index a4fe2e6..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/blank.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-box-model.js
deleted file mode 100644
index 45543f6..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-box-model.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-core.js
deleted file mode 100644
index b11e2b1..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-core.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css-strict.js
deleted file mode 100644
index 4406d7a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css-strict.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css2.js
deleted file mode 100644
index 7121c8e..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css2.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css3.js
deleted file mode 100644
index 86b24f5..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css3.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-fixed.js
deleted file mode 100644
index 4321cda..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-fixed.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-html4.js
deleted file mode 100644
index 4d2baa9..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-html4.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-ie5.js
deleted file mode 100644
index 707fa56..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-ie5.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite-p.js
deleted file mode 100644
index dd62a21..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite.js
deleted file mode 100644
index 88c764f..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-png.js
deleted file mode 100644
index 7b8f2cf..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-png.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-server.css
deleted file mode 100644
index 47c7edd..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-server.css
+++ /dev/null
@@ -1,43 +0,0 @@
-body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
-body {margin: 8px; background: #333;}
-h1 {margin: 0;}
-h1 a:hover {background-color: transparent;}
-h2 {font-size: 1.75em;}
-h3 {font-size: 1.1em;}
-a:active {color: #ff0000;}
-a:link {color: #0a6cce;}
-a:visited {color: #0a6cce;}
-code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
- padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
-code.box {display: block; padding: 10px; margin: 0.5em 0;}
-ul {list-style-type: square;}
-dd {margin: .2em 0 .5em 1em;}
-dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
-dl.library dd {font-style: italic; margin-left: 3em;}
-dt {font-weight: bold;}
-dt.pack {color: brown;}
-a img {border-style: none;}
-hr {height: 1px; color: #000; border-style: solid;}
-hr.short {height: 2px; width: 100px;}
-div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
-hr {border-bottom-width: 0px;}
-div.header hr {color: #0a6cce; background-color: #0a6cce;}
-div.content {min-height: 100px;}
-div.footer hr {color: #898e79; background-color: #898e79; }
-div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
-a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
-div.footer a:hover {background-color: transparent; text-decoration: none;}
-div.header .menu {text-align: right;}
-div.footer {font-size: x-small; margin-top: 8px;}
-div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
-#license {margin-top: 5px; font-size: xx-small;}
-table {border-top: 1px solid #000; border-left: 1px solid #000;}
-th {background-color: #fff; text-align: left;}
-th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
-th.small {width: 100px;}
-th.medium {width: 200px;}
-th.large {width: 270px;}
-th.x-large {width: 408px;}
-table.fixed {table-layout: fixed;}
-span.comment {color: #666;}
-
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard-p.js
deleted file mode 100644
index 73e99ac..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard.js
deleted file mode 100644
index 2109905..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/test-trans.png b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/test-trans.png
deleted file mode 100755
index e187e2c..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/test-trans.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/img/grey-40.png b/src/usr/local/www/themes/pfsense_ng/javascript/img/grey-40.png
deleted file mode 100755
index 758b716..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/img/grey-40.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/img/submenu-off.gif b/src/usr/local/www/themes/pfsense_ng/javascript/img/submenu-off.gif
deleted file mode 100755
index ddcdcae..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/img/submenu-off.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/img/submenu-on.gif b/src/usr/local/www/themes/pfsense_ng/javascript/img/submenu-on.gif
deleted file mode 100755
index 7a58077..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/img/submenu-on.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/img/white-90.png b/src/usr/local/www/themes/pfsense_ng/javascript/img/white-90.png
deleted file mode 100755
index efc84b4..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/img/white-90.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/img/x.gif b/src/usr/local/www/themes/pfsense_ng/javascript/img/x.gif
deleted file mode 100755
index 5bfd67a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/img/x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/niftyjsCode.js b/src/usr/local/www/themes/pfsense_ng/javascript/niftyjsCode.js
deleted file mode 100644
index e71ea14..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/niftyjsCode.js
+++ /dev/null
@@ -1,174 +0,0 @@
-function NiftyCheck(){
-if(!document.getElementById || !document.createElement)
- return(false);
-isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
-if(Array.prototype.push==null){Array.prototype.push=function(){
- this[this.length]=arguments[0]; return(this.length);};}
-return(true);
-}
-
-function Rounded(selector,wich,bk,color,opt){
-var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
-
-if(color=="transparent"){
- cn=cn+"x";
- ecolor=bk;
- bk="transparent";
- }
-else if(opt && opt.indexOf("border")>=0){
- var optar=opt.split(" ");
- for(i=0;i<optar.length;i++)
- if(optar[i].indexOf("#")>=0) ecolor=optar[i];
- if(ecolor=="") ecolor="#666";
- cn+="e";
- edges=true;
- }
-else if(opt && opt.indexOf("smooth")>=0){
- cn+="a";
- ecolor=Mix(bk,color);
- }
-if(opt && opt.indexOf("small")>=0) cn+="s";
-prefixt=cn;
-prefixb=cn;
-if(wich.indexOf("all")>=0){t=true;b=true;}
-else if(wich.indexOf("top")>=0) t="true";
-else if(wich.indexOf("tl")>=0){
- t="true";
- if(wich.indexOf("tr")<0) prefixt+="l";
- }
-else if(wich.indexOf("tr")>=0){
- t="true";
- prefixt+="r";
- }
-if(wich.indexOf("bottom")>=0) b=true;
-else if(wich.indexOf("bl")>=0){
- b="true";
- if(wich.indexOf("br")<0) prefixb+="l";
- }
-else if(wich.indexOf("br")>=0){
- b="true";
- prefixb+="r";
- }
-var v=getElementsBySelector(selector);
-var l=v.length;
-for(i=0;i<l;i++){
- if(edges) AddBorder(v[i],ecolor);
- if(t) AddTop(v[i],bk,color,ecolor,prefixt);
- if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
- }
-}
-
-function AddBorder(el,bc){
-var i;
-if(!el.passed){
- if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
- var t=el.firstChild.nodeValue;
- el.removeChild(el.lastChild);
- var d=CreateEl("span");
- d.style.display="block";
- d.appendChild(document.createTextNode(t));
- el.appendChild(d);
- }
- for(i=0;i<el.childNodes.length;i++){
- if(el.childNodes[i].nodeType==1){
- el.childNodes[i].style.borderLeft="1px solid "+bc;
- el.childNodes[i].style.borderRight="1px solid "+bc;
- }
- }
- }
-el.passed=true;
-}
-
-function AddTop(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=1;i<=lim;i++){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingTop=0;
-el.insertBefore(d,el.firstChild);
-}
-
-function AddBottom(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=lim;i>0;i--){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingBottom=0;
-el.appendChild(d);
-}
-
-function CreateEl(x){
-if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
-else return(document.createElement(x));
-}
-
-function getElementsBySelector(selector){
-var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
-
-if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
- s=selector.split(" ");
- var fs=s[0].split("#");
- if(fs.length==1) return(objlist);
- f=document.getElementById(fs[1]);
- if(f) return(f.getElementsByTagName(s[1]));
- return(objlist);
- }
-if(selector.indexOf("#")>0){ //id selector like "tag#id"
- s=selector.split("#");
- tag=s[0];
- selid=s[1];
- }
-if(selid!=""){
- f=document.getElementById(selid);
- if(f) objlist.push(f);
- return(objlist);
- }
-if(selector.indexOf(".")>0){ //class selector like "tag.class"
- s=selector.split(".");
- tag=s[0];
- selclass=s[1];
- }
-var v=document.getElementsByTagName(tag); // tag selector like "tag"
-if(selclass=="")
- return(v);
-for(i=0;i<v.length;i++){
- if(v[i].className.indexOf(selclass)>=0){
- objlist.push(v[i]);
- }
- }
-return(objlist);
-}
-
-function Mix(c1,c2){
-var i,step1,step2,x,y,r=new Array(3);
-if(c1.length==4)step1=1;
-else step1=2;
-if(c2.length==4) step2=1;
-else step2=2;
-for(i=0;i<3;i++){
- x=parseInt(c1.substr(1+step1*i,step1),16);
- if(step1==1) x=16*x+x;
- y=parseInt(c2.substr(1+step2*i,step2),16);
- if(step2==1) y=16*y+y;
- r[i]=Math.floor((x*50+y*50)/100);
- }
-return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/transmenu-body.php b/src/usr/local/www/themes/pfsense_ng/javascript/transmenu-body.php
deleted file mode 100644
index afb7090..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/transmenu-body.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/* $Id: transmenu-body.php,v 1.1.2.1 2007/01/17 18:43:47 sullrich Exp $ */
-/* ========================================================================== */
-/*
- transmenu-body.php
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-function nervecenterTransmenuGetBodyJS() {
- global $rootmenu;
-
- if (isset($rootmenu)) {
- return $rootmenu->getMenuJScript();
- } else if (empty($rootmenu)) {
- return "alert('No rootmenu object found.');";
- } else {
- return "alert('No JavaScript attached to rootmenu object.');";
- }
-}
-
-?>
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/transmenu-head.php b/src/usr/local/www/themes/pfsense_ng/javascript/transmenu-head.php
deleted file mode 100644
index afc6402..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/transmenu-head.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/* $Id: transmenu-head.php,v 1.2.2.1 2007/01/17 18:43:47 sullrich Exp $ */
-/* ========================================================================== */
-/*
- transmenu-head.php
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-function nervecenterTransmenuGetHeadJS() {
- global $g, $rootmenu;
-
- $transmenu_stub =<<<EOD
- function tmenuinit() {
- //==========================================================================================
- // if supported, initialize TransMenus
- //==========================================================================================
- // Check isSupported() so that menus aren't accidentally sent to non-supporting browsers.
- // This is better than server-side checking because it will also catch browsers which would
- // normally support the menus but have javascript disabled.
- //
- // If supported, call initialize() and then hook whatever image rollover code you need to do
- // to the .onactivate and .ondeactivate events for each menu.
- //==========================================================================================
- if (TransMenu.isSupported()) {
- TransMenu.initialize();
-
- // hook all the highlight swapping of the main toolbar to menu activation/deactivation
- // instead of simple rollover to get the effect where the button stays hightlit until
- // the menu is closed.
- @@CHILD_JSCRIPT@@
- }
- } // end function
-EOD;
-
- if (empty($rootmenu)) {
- require_once("menudef.inc");
- }
-
- $childJScript = "";
- foreach ($rootmenu->getChildren() as $component) {
- $id = "mnua_" . str_replace(" ", "", strtolower($component->getID()));
-
- $childJScript .=<<<EOD
- {$id}.onactivate = function() { document.getElementById("{$id}").className = "hover"; };
- {$id}.ondeactivate = function() { document.getElementById("{$id}").className = ""; };
-
-EOD;
- }
-
- $transmenu_stub = basename($_SERVER['PHP_SELF']) != "wizard.php" ? str_replace("@@CHILD_JSCRIPT@@", $childJScript, $transmenu_stub) : "";
-
- return $transmenu_stub;
-}
-
-?>
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/transmenu.org b/src/usr/local/www/themes/pfsense_ng/javascript/transmenu.org
deleted file mode 100644
index 6c9e353..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/transmenu.org
+++ /dev/null
@@ -1,785 +0,0 @@
-/* =================================================================================================
- * TransMenu
- * March, 2003
- *
- * Customizable multi-level animated DHTML menus with transparency.
- *
- * Copyright 2003-2004, Aaron Boodman (www.youngpup.net)
- * =================================================================================================
- * "Can I use this?"
- *
- * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
- * out at: http://creativecommons.org/licenses/by/2.0/
- *
- * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
- * for writing it. You may not misrepresent yourself as the author of this code.
- * =================================================================================================
- * "It's kinda hard to read, though"
- *
- * The uncompressed, commented version of this script can be found at:
- * http://youngpup.net/projects/transMenus
- * =================================================================================================
- * updates:
- * 04.19.04 fixed cascade problem with menus nested greater than two levels.
- * 12.23.03 added hideCurrent for menu actuators with no menus. renamed to TransMenu.
- * 04.18.03 fixed render bug in IE 5.0 Mac by removing that browser from compatibility table ;)
- * also made gecko check a little more strict by specifying build no.
- * ============================================================================================== */
-
-
-
-//==================================================================================================
-// Configuration properties
-//==================================================================================================
-TransMenu.spacerGif = "themes/nervecenter/javascript/img/x.gif"; // path to a transparent spacer gif
-TransMenu.dingbatOn = "themes/nervecenter/javascript/img/submenu-on.gif"; // path to the active sub menu dingbat
-TransMenu.dingbatOff = "themes/nervecenter/javascript/img/submenu-off.gif"; // path to the inactive sub menu dingbat
-TransMenu.dingbatSize = 14; // size of the dingbat (square shape assumed)
-TransMenu.menuPadding = 5; // padding between menu border and items grid
-TransMenu.itemPadding = 3; // additional padding around each item
-TransMenu.shadowSize = 2; // size of shadow under menu
-TransMenu.shadowOffset = 3; // distance shadow should be offset from leading edge
-TransMenu.shadowColor = "#FF0000"; // color of shadow (transparency is set in CSS)
-TransMenu.shadowPng = "themes/nervecenter/javascript/img/grey-40.png"; // a PNG graphic to serve as the shadow for mac IE5
-TransMenu.backgroundColor = "#990000"; // color of the background (transparency set in CSS)
-TransMenu.backgroundPng = "themes/nervecenter/javascript/img/white-90.png"; // a PNG graphic to server as the background for mac IE5
-TransMenu.hideDelay = 1000; // number of milliseconds to wait before hiding a menu
-TransMenu.slideTime = 400; // number of milliseconds it takes to open and close a menu
-
-
-//==================================================================================================
-// Internal use properties
-//==================================================================================================
-TransMenu.reference = {topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};
-TransMenu.direction = {down:1,right:2};
-TransMenu.registry = [];
-TransMenu._maxZ = 100;
-
-
-
-//==================================================================================================
-// Static methods
-//==================================================================================================
-// supporting win ie5+, mac ie5.1+ and gecko >= mozilla 1.0
-TransMenu.isSupported = function() {
- var ua = navigator.userAgent.toLowerCase();
- var pf = navigator.platform.toLowerCase();
- var an = navigator.appName;
- var r = false;
-
- if (ua.indexOf("gecko") > -1 && navigator.productSub >= 20020605) r = true; // gecko >= moz 1.0
- else if (an == "Microsoft Internet Explorer") {
- if (document.getElementById) { // ie5.1+ mac,win
- if (pf.indexOf("mac") == 0) {
- r = /msie (\d(.\d*)?)/.test(ua) && Number(RegExp.$1) >= 5.1;
- }
- else r = true;
- }
- }
-
- return r;
-}
-
-// call this in onload once menus have been created
-TransMenu.initialize = function() {
- for (var i = 0, menu = null; menu = this.registry[i]; i++) {
- menu.initialize();
- }
-}
-
-// call this in document body to write out menu html
-TransMenu.renderAll = function() {
- var aMenuHtml = [];
- for (var i = 0, menu = null; menu = this.registry[i]; i++) {
- aMenuHtml[i] = menu.toString();
- }
- document.write(aMenuHtml.join(""));
-}
-
-//==================================================================================================
-// TransMenu constructor (only called internally)
-//==================================================================================================
-// oActuator : The thing that causes the menu to be shown when it is mousedover. Either a
-// reference to an HTML element, or a TransMenuItem from an existing menu.
-// iDirection : The direction to slide out. One of TransMenu.direction.
-// iLeft : Left pixel offset of menu from actuator
-// iTop : Top pixel offset of menu from actuator
-// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
-// parentMenuSet : Menuset this menu will be added to.
-//==================================================================================================
-function TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, parentMenuSet) {
- // public methods
- this.addItem = addItem;
- this.addMenu = addMenu;
- this.toString = toString;
- this.initialize = initialize;
- this.isOpen = false;
- this.show = show;
- this.hide = hide;
- this.items = [];
-
- // events
- this.onactivate = new Function(); // when the menu starts to slide open
- this.ondeactivate = new Function(); // when the menu finishes sliding closed
- this.onmouseover = new Function(); // when the menu has been moused over
- this.onqueue = new Function(); // hack .. when the menu sets a timer to be closed a little while in the future
- this.ondequeue = new Function();
-
- // initialization
- this.index = TransMenu.registry.length;
- TransMenu.registry[this.index] = this;
-
- var id = "TransMenu" + this.index;
- var contentHeight = null;
- var contentWidth = null;
- var childMenuSet = null;
- var animating = false;
- var childMenus = [];
- var slideAccel = -1;
- var elmCache = null;
- var ready = false;
- var _this = this;
- var a = null;
-
- var pos = iDirection == TransMenu.direction.down ? "top" : "left";
- var dim = null;
-
- // private and public method implimentations
- function addItem(sText, sUrl) {
- var item = new TransMenuItem(sText, sUrl, this);
- item._index = this.items.length;
- this.items[item._index] = item;
- }
-
- function addMenu(oMenuItem) {
- if (!oMenuItem.parentMenu == this) throw new Error("Cannot add a menu here");
-
- if (childMenuSet == null) childMenuSet = new TransMenuSet(TransMenu.direction.right, -5, 2, TransMenu.reference.topRight);
-
- var m = childMenuSet.addMenu(oMenuItem);
-
- childMenus[oMenuItem._index] = m;
- m.onmouseover = child_mouseover;
- m.ondeactivate = child_deactivate;
- m.onqueue = child_queue;
- m.ondequeue = child_dequeue;
-
- return m;
- }
-
- function initialize() {
- initCache();
- initEvents();
- initSize();
- ready = true;
- }
-
- function show() {
- //dbg_dump("show");
- if (ready) {
- _this.isOpen = true;
- animating = true;
- setContainerPos();
- elmCache["clip"].style.visibility = "visible";
- elmCache["clip"].style.zIndex = TransMenu._maxZ++;
- //dbg_dump("maxZ: " + TransMenu._maxZ);
- slideStart();
- _this.onactivate();
- }
- }
-
- function hide() {
- if (ready) {
- _this.isOpen = false;
- animating = true;
-
- for (var i = 0, item = null; item = elmCache.item[i]; i++)
- dehighlight(item);
-
- if (childMenuSet) childMenuSet.hide();
-
- slideStart();
- _this.ondeactivate();
- }
- }
-
- function setContainerPos() {
- var sub = oActuator.constructor == TransMenuItem;
- var act = sub ? oActuator.parentMenu.elmCache["item"][oActuator._index] : oActuator;
- var el = act;
-
- var x = 0;
- var y = 0;
-
-
- var minX = 0;
- var maxX = (window.innerWidth ? window.innerWidth : document.body.clientWidth) - parseInt(elmCache["clip"].style.width);
- var minY = 0;
- var maxY = (window.innerHeight ? window.innerHeight : document.body.clientHeight) - parseInt(elmCache["clip"].style.height);
-
- // add up all offsets... subtract any scroll offset
- while (sub ? el.parentNode.className.indexOf("transMenu") == -1 : el.offsetParent) {
- x += el.offsetLeft;
- y += el.offsetTop;
-
- if (el.scrollLeft) x -= el.scrollLeft;
- if (el.scrollTop) y -= el.scrollTop;
-
- el = el.offsetParent;
- }
-
- if (oActuator.constructor == TransMenuItem) {
- x += parseInt(el.parentNode.style.left);
- y += parseInt(el.parentNode.style.top);
- }
-
- switch (iReferencePoint) {
- case TransMenu.reference.topLeft:
- break;
- case TransMenu.reference.topRight:
- x += act.offsetWidth;
- break;
- case TransMenu.reference.bottomLeft:
- y += act.offsetHeight;
- break;
- case TransMenu.reference.bottomRight:
- x += act.offsetWidth;
- y += act.offsetHeight;
- break;
- }
-
- x += iLeft;
- y += iTop;
-
- x = Math.max(Math.min(x, maxX), minX);
- y = Math.max(Math.min(y, maxY), minY);
-
- elmCache["clip"].style.left = x + "px";
- elmCache["clip"].style.top = y + "px";
- }
-
- function slideStart() {
- var x0 = parseInt(elmCache["content"].style[pos]);
- var x1 = _this.isOpen ? 0 : -dim;
-
- if (a != null) a.stop();
- a = new Accelimation(x0, x1, TransMenu.slideTime, slideAccel);
-
- a.onframe = slideFrame;
- a.onend = slideEnd;
-
- a.start();
- }
-
- function slideFrame(x) {
- elmCache["content"].style[pos] = x + "px";
- }
-
- function slideEnd() {
- if (!_this.isOpen) elmCache["clip"].style.visibility = "hidden";
- animating = false;
- }
-
- function initSize() {
- // everything is based off the size of the items table...
- var ow = elmCache["items"].offsetWidth;
- var oh = elmCache["items"].offsetHeight;
- var ua = navigator.userAgent.toLowerCase();
-
- // clipping container should be ow/oh + the size of the shadow
- elmCache["clip"].style.width = ow + TransMenu.shadowSize + 2 + "px";
- elmCache["clip"].style.height = oh + TransMenu.shadowSize + 2 + "px";
-
- // same with content...
- elmCache["content"].style.width = ow + TransMenu.shadowSize + "px";
- elmCache["content"].style.height = oh + TransMenu.shadowSize + "px";
-
- contentHeight = oh + TransMenu.shadowSize;
- contentWidth = ow + TransMenu.shadowSize;
-
- dim = iDirection == TransMenu.direction.down ? contentHeight : contentWidth;
-
- // set initially closed
- elmCache["content"].style[pos] = -dim - TransMenu.shadowSize + "px";
- elmCache["clip"].style.visibility = "hidden";
-
- // if *not* mac/ie 5
- if (ua.indexOf("mac") == -1 || ua.indexOf("gecko") > -1) {
- // set background div to offset size
- elmCache["background"].style.width = ow + "px";
- elmCache["background"].style.height = oh + "px";
- elmCache["background"].style.backgroundColor = TransMenu.backgroundColor;
-
- // shadow left starts at offset left and is offsetHeight pixels high
- elmCache["shadowRight"].style.left = ow + "px";
- elmCache["shadowRight"].style.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize) + "px";
- elmCache["shadowRight"].style.backgroundColor = TransMenu.shadowColor;
-
- // shadow bottom starts at offset height and is offsetWidth - shadowOffset
- // pixels wide (we don't want the bottom and right shadows to overlap or we
- // get an extra bright bottom-right corner)
- elmCache["shadowBottom"].style.top = oh + "px";
- elmCache["shadowBottom"].style.width = ow - TransMenu.shadowOffset + "px";
- elmCache["shadowBottom"].style.backgroundColor = TransMenu.shadowColor;
- }
- // mac ie is a little different because we use a PNG for the transparency
- else {
- // set background div to offset size
- elmCache["background"].firstChild.src = TransMenu.backgroundPng;
- elmCache["background"].firstChild.width = ow;
- elmCache["background"].firstChild.height = oh;
-
- // shadow left starts at offset left and is offsetHeight pixels high
- elmCache["shadowRight"].firstChild.src = TransMenu.shadowPng;
- elmCache["shadowRight"].style.left = ow + "px";
- elmCache["shadowRight"].firstChild.width = TransMenu.shadowSize;
- elmCache["shadowRight"].firstChild.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize);
-
- // shadow bottom starts at offset height and is offsetWidth - shadowOffset
- // pixels wide (we don't want the bottom and right shadows to overlap or we
- // get an extra bright bottom-right corner)
- elmCache["shadowBottom"].firstChild.src = TransMenu.shadowPng;
- elmCache["shadowBottom"].style.top = oh + "px";
- elmCache["shadowBottom"].firstChild.height = TransMenu.shadowSize;
- elmCache["shadowBottom"].firstChild.width = ow - TransMenu.shadowOffset;
- }
- }
-
- function initCache() {
- var menu = document.getElementById(id);
- var all = menu.all ? menu.all : menu.getElementsByTagName("*"); // IE/win doesn't support * syntax, but does have the document.all thing
-
- elmCache = {};
- elmCache["clip"] = menu;
- elmCache["item"] = [];
-
- for (var i = 0, elm = null; elm = all[i]; i++) {
- switch (elm.className) {
- case "items":
- case "content":
- case "background":
- case "shadowRight":
- case "shadowBottom":
- elmCache[elm.className] = elm;
- break;
- case "item":
- elm._index = elmCache["item"].length;
- elmCache["item"][elm._index] = elm;
- break;
- }
- }
-
- // hack!
- _this.elmCache = elmCache;
- }
-
- function initEvents() {
- // hook item mouseover
- for (var i = 0, item = null; item = elmCache.item[i]; i++) {
- item.onmouseover = item_mouseover;
- item.onmouseout = item_mouseout;
- item.onclick = item_click;
- }
-
- // hook actuation
- if (typeof oActuator.tagName != "undefined") {
- oActuator.onmouseover = actuator_mouseover;
- oActuator.onmouseout = actuator_mouseout;
- }
-
- // hook menu mouseover
- elmCache["content"].onmouseover = content_mouseover;
- elmCache["content"].onmouseout = content_mouseout;
- }
-
- function highlight(oRow) {
- oRow.className = "item hover";
- if (childMenus[oRow._index])
- oRow.lastChild.firstChild.src = TransMenu.dingbatOn;
- }
-
- function dehighlight(oRow) {
- oRow.className = "item";
- if (childMenus[oRow._index])
- oRow.lastChild.firstChild.src = TransMenu.dingbatOff;
- }
-
- function item_mouseover() {
- if (!animating) {
- highlight(this);
-
- if (childMenus[this._index])
- childMenuSet.showMenu(childMenus[this._index]);
- else if (childMenuSet) childMenuSet.hide();
- }
- }
-
- function item_mouseout() {
- if (!animating) {
- if (childMenus[this._index])
- childMenuSet.hideMenu(childMenus[this._index]);
- else // otherwise child_deactivate will do this
- dehighlight(this);
- }
- }
-
- function item_click() {
- if (!animating) {
- if (_this.items[this._index].url)
- location.href = _this.items[this._index].url;
- }
- }
-
- function actuator_mouseover() {
- parentMenuSet.showMenu(_this);
- }
-
- function actuator_mouseout() {
- parentMenuSet.hideMenu(_this);
- }
-
- function content_mouseover() {
- if (!animating) {
- parentMenuSet.showMenu(_this);
- _this.onmouseover();
- }
- }
-
- function content_mouseout() {
- if (!animating) {
- parentMenuSet.hideMenu(_this);
- }
- }
-
- function child_mouseover() {
- if (!animating) {
- parentMenuSet.showMenu(_this);
- }
- }
-
- function child_deactivate() {
- for (var i = 0; i < childMenus.length; i++) {
- if (childMenus[i] == this) {
- dehighlight(elmCache["item"][i]);
- break;
- }
- }
- }
-
- function child_queue() {
- parentMenuSet.hideMenu(_this);
- }
-
- function child_dequeue() {
- parentMenuSet.showMenu(_this);
- }
-
- function toString() {
- var aHtml = [];
- var sClassName = "transMenu" + (oActuator.constructor != TransMenuItem ? " top" : "");
-
- for (var i = 0, item = null; item = this.items[i]; i++) {
- aHtml[i] = item.toString(childMenus[i]);
- }
-
- return '<div id="' + id + '" class="' + sClassName + '">' +
- '<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">' +
- '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr>' +
- aHtml.join('') +
- '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr></table>' +
- '<div class="shadowBottom"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '<div class="shadowRight"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '<div class="background"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '</div></div>';
- }
-}
-
-
-//==================================================================================================
-// TransMenuSet
-//==================================================================================================
-// iDirection : The direction to slide out. One of TransMenu.direction.
-// iLeft : Left pixel offset of menus from actuator
-// iTop : Top pixel offset of menus from actuator
-// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
-//==================================================================================================
-TransMenuSet.registry = [];
-
-function TransMenuSet(iDirection, iLeft, iTop, iReferencePoint) {
- // public methods
- this.addMenu = addMenu;
- this.showMenu = showMenu;
- this.hideMenu = hideMenu;
- this.hide = hide;
- this.hideCurrent = hideCurrent;
-
- // initialization
- var menus = [];
- var _this = this;
- var current = null;
-
- this.index = TransMenuSet.registry.length;
- TransMenuSet.registry[this.index] = this;
-
- // method implimentations...
- function addMenu(oActuator) {
- var m = new TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, this);
- menus[menus.length] = m;
- return m;
- }
-
- function showMenu(oMenu) {
- if (oMenu != current) {
- // close currently open menu
- if (current != null) hide(current);
-
- // set current menu to this one
- current = oMenu;
-
- // if this menu is closed, open it
- oMenu.show();
- }
- else {
- // hide pending calls to close this menu
- cancelHide(oMenu);
- }
- }
-
- function hideMenu(oMenu) {
- //dbg_dump("hideMenu a " + oMenu.index);
- if (current == oMenu && oMenu.isOpen) {
- //dbg_dump("hideMenu b " + oMenu.index);
- if (!oMenu.hideTimer) scheduleHide(oMenu);
- }
- }
-
- function scheduleHide(oMenu) {
- //dbg_dump("scheduleHide " + oMenu.index);
- oMenu.onqueue();
- oMenu.hideTimer = window.setTimeout("TransMenuSet.registry[" + _this.index + "].hide(TransMenu.registry[" + oMenu.index + "])", TransMenu.hideDelay);
- }
-
- function cancelHide(oMenu) {
- //dbg_dump("cancelHide " + oMenu.index);
- if (oMenu.hideTimer) {
- oMenu.ondequeue();
- window.clearTimeout(oMenu.hideTimer);
- oMenu.hideTimer = null;
- }
- }
-
- function hide(oMenu) {
- if (!oMenu && current) oMenu = current;
-
- if (oMenu && current == oMenu && oMenu.isOpen) {
- hideCurrent();
- }
- }
-
- function hideCurrent() {
- if (null != current) {
- cancelHide(current);
- current.hideTimer = null;
- current.hide();
- current = null;
- }
- }
-}
-
-//==================================================================================================
-// TransMenuItem (internal)
-// represents an item in a dropdown
-//==================================================================================================
-// sText : The item display text
-// sUrl : URL to load when the item is clicked
-// oParent : Menu this item is a part of
-//==================================================================================================
-function TransMenuItem(sText, sUrl, oParent) {
- this.toString = toString;
- this.text = sText;
- this.url = sUrl;
- this.parentMenu = oParent;
-
- function toString(bDingbat) {
- var sDingbat = bDingbat ? TransMenu.dingbatOff : TransMenu.spacerGif;
- var iEdgePadding = TransMenu.itemPadding + TransMenu.menuPadding;
- var sPaddingLeft = "padding:" + TransMenu.itemPadding + "px; padding-left:" + iEdgePadding + "px;"
- var sPaddingRight = "padding:" + TransMenu.itemPadding + "px; padding-right:" + iEdgePadding + "px;"
-
- return '<tr class="item"><td nowrap style="' + sPaddingLeft + '">' +
- sText + '</td><td width="14" style="' + sPaddingRight + '">' +
- '<img src="' + sDingbat + '" width="14" height="14"></td></tr>';
- }
-}
-
-
-
-
-
-
-//=====================================================================
-// Accel[erated] [an]imation object
-// change a property of an object over time in an accelerated fashion
-//=====================================================================
-// obj : reference to the object whose property you'd like to animate
-// prop : property you would like to change eg: "left"
-// to : final value of prop
-// time : time the animation should take to run
-// zip : optional. specify the zippiness of the acceleration. pick a
-// number between -1 and 1 where -1 is full decelerated, 1 is
-// full accelerated, and 0 is linear (no acceleration). default
-// is 0.
-// unit : optional. specify the units for use with prop. default is
-// "px".
-//=====================================================================
-// bezier functions lifted from the lib_animation.js file in the
-// 13th Parallel API. www.13thparallel.org
-//=====================================================================
-
-function Accelimation(from, to, time, zip) {
- if (typeof zip == "undefined") zip = 0;
- if (typeof unit == "undefined") unit = "px";
-
- this.x0 = from;
- this.x1 = to;
- this.dt = time;
- this.zip = -zip;
- this.unit = unit;
- this.timer = null;
- this.onend = new Function();
- this.onframe = new Function();
-}
-
-
-
-//=====================================================================
-// public methods
-//=====================================================================
-
-// after you create an accelimation, you call this to start it-a runnin'
-Accelimation.prototype.start = function() {
- this.t0 = new Date().getTime();
- this.t1 = this.t0 + this.dt;
- var dx = this.x1 - this.x0;
- this.c1 = this.x0 + ((1 + this.zip) * dx / 3);
- this.c2 = this.x0 + ((2 + this.zip) * dx / 3);
- Accelimation._add(this);
-}
-
-// and if you need to stop it early for some reason...
-Accelimation.prototype.stop = function() {
- Accelimation._remove(this);
-}
-
-
-
-//=====================================================================
-// private methods
-//=====================================================================
-
-// paints one frame. gets called by Accelimation._paintAll.
-Accelimation.prototype._paint = function(time) {
- if (time < this.t1) {
- var elapsed = time - this.t0;
- this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));
- }
- else this._end();
-}
-
-// ends the animation
-Accelimation.prototype._end = function() {
- Accelimation._remove(this);
- this.onframe(this.x1);
- this.onend();
-}
-
-
-
-
-//=====================================================================
-// static methods (all private)
-//=====================================================================
-
-// add a function to the list of ones to call periodically
-Accelimation._add = function(o) {
- var index = this.instances.length;
- this.instances[index] = o;
- // if this is the first one, start the engine
- if (this.instances.length == 1) {
- this.timerID = window.setInterval("Accelimation._paintAll()", this.targetRes);
- }
-}
-
-// remove a function from the list
-Accelimation._remove = function(o) {
- for (var i = 0; i < this.instances.length; i++) {
- if (o == this.instances[i]) {
- this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) );
- break;
- }
- }
- // if that was the last one, stop the engine
- if (this.instances.length == 0) {
- window.clearInterval(this.timerID);
- this.timerID = null;
- }
-}
-
-// "engine" - call each function in the list every so often
-Accelimation._paintAll = function() {
- var now = new Date().getTime();
- for (var i = 0; i < this.instances.length; i++) {
- this.instances[i]._paint(now);
- }
-}
-
-
-// Bezier functions:
-Accelimation._B1 = function(t) { return t*t*t }
-Accelimation._B2 = function(t) { return 3*t*t*(1-t) }
-Accelimation._B3 = function(t) { return 3*t*(1-t)*(1-t) }
-Accelimation._B4 = function(t) { return (1-t)*(1-t)*(1-t) }
-
-
-//Finds the coordinates of a point at a certain stage through a bezier curve
-Accelimation._getBezier = function(percent,startPos,endPos,control1,control2) {
- return endPos * this._B1(percent) + control2 * this._B2(percent) + control1 * this._B3(percent) + startPos * this._B4(percent);
-}
-
-
-//=====================================================================
-// static properties
-//=====================================================================
-
-Accelimation.instances = [];
-Accelimation.targetRes = 10;
-Accelimation.timerID = null;
-
-
-//=====================================================================
-// IE win memory cleanup
-//=====================================================================
-
-if (window.attachEvent) {
- var cearElementProps = [
- 'data',
- 'onmouseover',
- 'onmouseout',
- 'onmousedown',
- 'onmouseup',
- 'ondblclick',
- 'onclick',
- 'onselectstart',
- 'oncontextmenu'
- ];
-
- window.attachEvent("onunload", function() {
- var el;
- for(var d = document.all.length;d--;){
- el = document.all[d];
- for(var c = cearElementProps.length;c--;){
- el[cearElementProps[c]] = null;
- }
- }
- });
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/transmenuC.js b/src/usr/local/www/themes/pfsense_ng/javascript/transmenuC.js
deleted file mode 100644
index 88626c7..0000000
--- a/src/usr/local/www/themes/pfsense_ng/javascript/transmenuC.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/* =================================================================================================
- * TransMenu
- * March, 2003
- * Customizable multi-level animated DHTML menus with transparency.
- * =================================================================================================
- * "Can I use this?"
- *
- * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
- * out at: http://creativecommons.org/licenses/by/2.0/
- *
- * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
- * for writing it. You may not misrepresent yourself as the author of this code.
- * =================================================================================================
- * "It's kinda hard to read, though"
- *
- * The uncompressed, commented version of this script can be found at:
- * http://youngpup.net/projects/transMenus
- * ============================================================================================== */
-TransMenu.spacerGif="themes/nervecenter/javascript/img/x.gif";TransMenu.dingbatOn="themes/nervecenter/javascript/img/submenu-on.gif";TransMenu.dingbatOff="themes/nervecenter/javascript/img/submenu-off.gif";TransMenu.dingbatSize=14;TransMenu.menuPadding=5;TransMenu.itemPadding=3;TransMenu.shadowSize=2;TransMenu.shadowOffset=3;TransMenu.shadowColor="#000000";TransMenu.shadowPng="themes/nervecenter/javascript/img/grey-40.png";TransMenu.backgroundColor="#990000";TransMenu.backgroundPng="themes/nervecenter/javascript/img/white-90.png";TransMenu.hideDelay=1000;TransMenu.slideTime=400;TransMenu.reference={topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};TransMenu.direction={down:1,right:2};TransMenu.registry=[];TransMenu._maxZ=100;TransMenu.isSupported=function(){var ua=navigator.userAgent.toLowerCase();var pf=navigator.platform.toLowerCase();var an=navigator.appName;var r=false;if(ua.indexOf("gecko")>-1&&navigator.productSub>=20020605)r=true;else if(an=="Microsoft Internet Explorer"){if(document.getElementById){if(pf.indexOf("mac")==0){r=/msie (\d(.\d*)?)/.test(ua)&&Number(RegExp.$1)>=5.1;}
-else r=true;}}
-return r;}
-TransMenu.initialize=function(){for(var i=0,menu=null;menu=this.registry[i];i++){menu.initialize();}}
-TransMenu.renderAll=function(){var aMenuHtml=[];for(var i=0,menu=null;menu=this.registry[i];i++){aMenuHtml[i]=menu.toString();}
-document.write(aMenuHtml.join(""));}
-function TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,parentMenuSet){this.addItem=addItem;this.addMenu=addMenu;this.toString=toString;this.initialize=initialize;this.isOpen=false;this.show=show;this.hide=hide;this.items=[];this.onactivate=new Function();this.ondeactivate=new Function();this.onmouseover=new Function();this.onqueue=new Function();this.ondequeue=new Function();this.index=TransMenu.registry.length;TransMenu.registry[this.index]=this;var id="TransMenu"+this.index;var contentHeight=null;var contentWidth=null;var childMenuSet=null;var animating=false;var childMenus=[];var slideAccel=-1;var elmCache=null;var ready=false;var _this=this;var a=null;var pos=iDirection==TransMenu.direction.down?"top":"left";var dim=null;function addItem(sText,sUrl){var item=new TransMenuItem(sText,sUrl,this);item._index=this.items.length;this.items[item._index]=item;}
-function addMenu(oMenuItem){if(!oMenuItem.parentMenu==this)throw new Error("Cannot add a menu here");if(childMenuSet==null)childMenuSet=new TransMenuSet(TransMenu.direction.right,-5,2,TransMenu.reference.topRight);var m=childMenuSet.addMenu(oMenuItem);childMenus[oMenuItem._index]=m;m.onmouseover=child_mouseover;m.ondeactivate=child_deactivate;m.onqueue=child_queue;m.ondequeue=child_dequeue;return m;}
-function initialize(){initCache();initEvents();initSize();ready=true;}
-function show(){if(ready){_this.isOpen=true;animating=true;setContainerPos();elmCache["clip"].style.visibility="visible";elmCache["clip"].style.zIndex=TransMenu._maxZ++;slideStart();_this.onactivate();}}
-function hide(){if(ready){_this.isOpen=false;animating=true;for(var i=0,item=null;item=elmCache.item[i];i++)dehighlight(item);if(childMenuSet)childMenuSet.hide();slideStart();_this.ondeactivate();}}
-function setContainerPos(){var sub=oActuator.constructor==TransMenuItem;var act=sub?oActuator.parentMenu.elmCache["item"][oActuator._index]:oActuator;var el=act;var x=0;var y=0;var minX=0;var maxX=(window.innerWidth?window.innerWidth:document.body.clientWidth)-parseInt(elmCache["clip"].style.width);var minY=0;var maxY=(window.innerHeight?window.innerHeight:document.body.clientHeight)-parseInt(elmCache["clip"].style.height);while(sub?el.parentNode.className.indexOf("transMenu")==-1:el.offsetParent){x+=el.offsetLeft;y+=el.offsetTop;if(el.scrollLeft)x-=el.scrollLeft;if(el.scrollTop)y-=el.scrollTop;el=el.offsetParent;}
-if(oActuator.constructor==TransMenuItem){x+=parseInt(el.parentNode.style.left);y+=parseInt(el.parentNode.style.top);}
-switch(iReferencePoint){case TransMenu.reference.topLeft:break;case TransMenu.reference.topRight:x+=act.offsetWidth;break;case TransMenu.reference.bottomLeft:y+=act.offsetHeight;break;case TransMenu.reference.bottomRight:x+=act.offsetWidth;y+=act.offsetHeight;break;}
-x+=iLeft;y+=iTop;x=Math.max(Math.min(x,maxX),minX);y=Math.max(Math.min(y,maxY),minY);elmCache["clip"].style.left=x+"px";elmCache["clip"].style.top=y+"px";}
-function slideStart(){var x0=parseInt(elmCache["content"].style[pos]);var x1=_this.isOpen?0:-dim;if(a!=null)a.stop();a=new Accelimation(x0,x1,TransMenu.slideTime,slideAccel);a.onframe=slideFrame;a.onend=slideEnd;a.start();}
-function slideFrame(x){elmCache["content"].style[pos]=x+"px";}
-function slideEnd(){if(!_this.isOpen)elmCache["clip"].style.visibility="hidden";animating=false;}
-function initSize(){var ow=elmCache["items"].offsetWidth;var oh=elmCache["items"].offsetHeight;var ua=navigator.userAgent.toLowerCase();elmCache["clip"].style.width=ow+TransMenu.shadowSize+2+"px";elmCache["clip"].style.height=oh+TransMenu.shadowSize+2+"px";elmCache["content"].style.width=ow+TransMenu.shadowSize+"px";elmCache["content"].style.height=oh+TransMenu.shadowSize+"px";contentHeight=oh+TransMenu.shadowSize;contentWidth=ow+TransMenu.shadowSize;dim=iDirection==TransMenu.direction.down?contentHeight:contentWidth;elmCache["content"].style[pos]=-dim-TransMenu.shadowSize+"px";elmCache["clip"].style.visibility="hidden";if(ua.indexOf("mac")==-1||ua.indexOf("gecko")>-1){elmCache["background"].style.width=ow+"px";elmCache["background"].style.height=oh+"px";elmCache["background"].style.backgroundColor=TransMenu.backgroundColor;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].style.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize)+"px";elmCache["shadowRight"].style.backgroundColor=TransMenu.shadowColor;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].style.width=ow-TransMenu.shadowOffset+"px";elmCache["shadowBottom"].style.backgroundColor=TransMenu.shadowColor;}
-else{elmCache["background"].firstChild.src=TransMenu.backgroundPng;elmCache["background"].firstChild.width=ow;elmCache["background"].firstChild.height=oh;elmCache["shadowRight"].firstChild.src=TransMenu.shadowPng;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].firstChild.width=TransMenu.shadowSize;elmCache["shadowRight"].firstChild.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize);elmCache["shadowBottom"].firstChild.src=TransMenu.shadowPng;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].firstChild.height=TransMenu.shadowSize;elmCache["shadowBottom"].firstChild.width=ow-TransMenu.shadowOffset;}}
-function initCache(){var menu=document.getElementById(id);var all=menu.all?menu.all:menu.getElementsByTagName("*");elmCache={};elmCache["clip"]=menu;elmCache["item"]=[];for(var i=0,elm=null;elm=all[i];i++){switch(elm.className){case"items":case"content":case"background":case"shadowRight":case"shadowBottom":elmCache[elm.className]=elm;break;case"item":elm._index=elmCache["item"].length;elmCache["item"][elm._index]=elm;break;}}
-_this.elmCache=elmCache;}
-function initEvents(){for(var i=0,item=null;item=elmCache.item[i];i++){item.onmouseover=item_mouseover;item.onmouseout=item_mouseout;item.onclick=item_click;}
-if(typeof oActuator.tagName!="undefined"){oActuator.onmouseover=actuator_mouseover;oActuator.onmouseout=actuator_mouseout;}
-elmCache["content"].onmouseover=content_mouseover;elmCache["content"].onmouseout=content_mouseout;}
-function highlight(oRow){oRow.className="item hover";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOn;}
-function dehighlight(oRow){oRow.className="item";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOff;}
-function item_mouseover(){if(!animating){highlight(this);if(childMenus[this._index])childMenuSet.showMenu(childMenus[this._index]);else if(childMenuSet)childMenuSet.hide();}}
-function item_mouseout(){if(!animating){if(childMenus[this._index])childMenuSet.hideMenu(childMenus[this._index]);else dehighlight(this);}}
-function item_click(){if(!animating){if(_this.items[this._index].url)location.href=_this.items[this._index].url;}}
-function actuator_mouseover(){parentMenuSet.showMenu(_this);}
-function actuator_mouseout(){parentMenuSet.hideMenu(_this);}
-function content_mouseover(){if(!animating){parentMenuSet.showMenu(_this);_this.onmouseover();}}
-function content_mouseout(){if(!animating){parentMenuSet.hideMenu(_this);}}
-function child_mouseover(){if(!animating){parentMenuSet.showMenu(_this);}}
-function child_deactivate(){for(var i=0;i<childMenus.length;i++){if(childMenus[i]==this){dehighlight(elmCache["item"][i]);break;}}}
-function child_queue(){parentMenuSet.hideMenu(_this);}
-function child_dequeue(){parentMenuSet.showMenu(_this);}
-function toString(){var aHtml=[];var sClassName="transMenu"+(oActuator.constructor!=TransMenuItem?" top":"");for(var i=0,item=null;item=this.items[i];i++){aHtml[i]=item.toString(childMenus[i]);}
-return'<div id="'+id+'" class="'+sClassName+'">'+'<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">'+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr>'+aHtml.join('')+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr></table>'+'<div class="shadowBottom"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="shadowRight"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="background"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'</div></div>';}}
-TransMenuSet.registry=[];function TransMenuSet(iDirection,iLeft,iTop,iReferencePoint){this.addMenu=addMenu;this.showMenu=showMenu;this.hideMenu=hideMenu;this.hide=hide;this.hideCurrent=hideCurrent;var menus=[];var _this=this;var current=null;this.index=TransMenuSet.registry.length;TransMenuSet.registry[this.index]=this;function addMenu(oActuator){var m=new TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,this);menus[menus.length]=m;return m;}
-function showMenu(oMenu){if(oMenu!=current){if(current!=null)hide(current);current=oMenu;oMenu.show();}
-else{cancelHide(oMenu);}}
-function hideMenu(oMenu){if(current==oMenu&&oMenu.isOpen){if(!oMenu.hideTimer)scheduleHide(oMenu);}}
-function scheduleHide(oMenu){oMenu.onqueue();oMenu.hideTimer=window.setTimeout("TransMenuSet.registry["+_this.index+"].hide(TransMenu.registry["+oMenu.index+"])",TransMenu.hideDelay);}
-function cancelHide(oMenu){if(oMenu.hideTimer){oMenu.ondequeue();window.clearTimeout(oMenu.hideTimer);oMenu.hideTimer=null;}}
-function hide(oMenu){if(!oMenu&&current)oMenu=current;if(oMenu&&current==oMenu&&oMenu.isOpen){hideCurrent();}}
-function hideCurrent(){if (null != current){cancelHide(current);current.hideTimer=null;current.hide();current=null;}}}
-function TransMenuItem(sText,sUrl,oParent){this.toString=toString;this.text=sText;this.url=sUrl;this.parentMenu=oParent;function toString(bDingbat){var sDingbat=bDingbat?TransMenu.dingbatOff:TransMenu.spacerGif;var iEdgePadding=TransMenu.itemPadding+TransMenu.menuPadding;var sPaddingLeft="padding:"+TransMenu.itemPadding+"px; padding-left:"+iEdgePadding+"px;"
-var sPaddingRight="padding:"+TransMenu.itemPadding+"px; padding-right:"+iEdgePadding+"px;"
-return'<tr class="item"><td nowrap style="'+sPaddingLeft+'">'+sText+'</td><td width="14" style="'+sPaddingRight+'">'+'<img src="'+sDingbat+'" width="14" height="14"></td></tr>';}}
-function Accelimation(from,to,time,zip){if(typeof zip=="undefined")zip=0;if(typeof unit=="undefined")unit="px";this.x0=from;this.x1=to;this.dt=time;this.zip=-zip;this.unit=unit;this.timer=null;this.onend=new Function();this.onframe=new Function();}
-Accelimation.prototype.start=function(){this.t0=new Date().getTime();this.t1=this.t0+this.dt;var dx=this.x1-this.x0;this.c1=this.x0+((1+this.zip)*dx/3);this.c2=this.x0+((2+this.zip)*dx/3);Accelimation._add(this);}
-Accelimation.prototype.stop=function(){Accelimation._remove(this);}
-Accelimation.prototype._paint=function(time){if(time<this.t1){var elapsed=time-this.t0;this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));}
-else this._end();}
-Accelimation.prototype._end=function(){Accelimation._remove(this);this.onframe(this.x1);this.onend();}
-Accelimation._add=function(o){var index=this.instances.length;this.instances[index]=o;if(this.instances.length==1){this.timerID=window.setInterval("Accelimation._paintAll()",this.targetRes);}}
-Accelimation._remove=function(o){for(var i=0;i<this.instances.length;i++){if(o==this.instances[i]){this.instances=this.instances.slice(0,i).concat(this.instances.slice(i+1));break;}}
-if(this.instances.length==0){window.clearInterval(this.timerID);this.timerID=null;}}
-Accelimation._paintAll=function(){var now=new Date().getTime();for(var i=0;i<this.instances.length;i++){this.instances[i]._paint(now);}}
-Accelimation._B1=function(t){return t*t*t}
-Accelimation._B2=function(t){return 3*t*t*(1-t)}
-Accelimation._B3=function(t){return 3*t*(1-t)*(1-t)}
-Accelimation._B4=function(t){return(1-t)*(1-t)*(1-t)}
-Accelimation._getBezier=function(percent,startPos,endPos,control1,control2){return endPos*this._B1(percent)+control2*this._B2(percent)+control1*this._B3(percent)+startPos*this._B4(percent);}
-Accelimation.instances=[];Accelimation.targetRes=10;Accelimation.timerID=null;
-if(window.attachEvent){var cearElementProps=['data','onmouseover','onmouseout','onmousedown','onmouseup','ondblclick','onclick','onselectstart','oncontextmenu'];window.attachEvent("onunload", function() {var el;for(var d=document.all.length;d--;){el=document.all[d];for(var c=cearElementProps.length;c--;){el[cearElementProps[c]] = null;}}});} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/jsevents/body.def b/src/usr/local/www/themes/pfsense_ng/jsevents/body.def
deleted file mode 100644
index df461e2..0000000
--- a/src/usr/local/www/themes/pfsense_ng/jsevents/body.def
+++ /dev/null
@@ -1,7 +0,0 @@
-# Format: <event_name>=<jsfunction_name> !<forbidden_page_0>,<forbidden_page_1>...<forbidden_page_n>
-# where: forbidden pages are those pages that should *not* use
-# the particular JavaScript function within the JS event
-# specified below.
-# $Id: body.def,v 1.2.2.1 2007/01/17 18:43:52 sullrich Exp $
-#
-onload=tmenuinit(); !wizard.php \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/loader.js b/src/usr/local/www/themes/pfsense_ng/loader.js
deleted file mode 100644
index ee215f3..0000000
--- a/src/usr/local/www/themes/pfsense_ng/loader.js
+++ /dev/null
@@ -1,36 +0,0 @@
-//<![CDATA[
-var browser = '';
-var version = '';
-var entrance = '';
-var cond = '';
-
-// BROWSER?
-if (browser == '') {
- if (navigator.appName.indexOf('Microsoft') != -1)
- browser = 'IE';
- else if (navigator.appName.indexOf('Netscape') != -1)
- browser = 'Netscape';
- else
- browser = 'IE';
-}
-if (version == '') {
- version= navigator.appVersion;
- paren = version.indexOf('(');
- whole_version = navigator.appVersion.substring(0,paren-1);
- version = parseInt(whole_version);
-}
-
-if (browser == 'IE' && version < 7) {
- document.write('<script type="text/javascript" src="/themes/pfsense_ng/javascript/ie7/ie7-standard-p.js"></script>');
-}
-
-document.write('<script type="text/javascript" src="/themes/pfsense_ng/javascript/niftyjsCode.js"></script>');
-
-// jQuery function to define dropdown menu size
-jQuery(document).ready(function () {
- var hwindow = '';
- hwindow = (jQuery(window).height()-35);
- // Force the size dropdown menu
- jQuery('#navigation ul li ul').css('max-height', hwindow);
-});
-//]]>
diff --git a/src/usr/local/www/themes/pfsense_ng/login.css b/src/usr/local/www/themes/pfsense_ng/login.css
deleted file mode 100644
index f8abdfc..0000000
--- a/src/usr/local/www/themes/pfsense_ng/login.css
+++ /dev/null
@@ -1,1127 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #999999;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- background-position : center 0px;
- background-color: #999999;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-
-#login {
-/* background: #cccccc; */
- background-color: transparent;
- border: 0px solid #cccccc;
- margin: 5em auto;
- padding: 0em;
- width: 400px;
-/* filter:alpha(opacity=60);
- -moz-opacity:0.6;
- -khtml-opacity: 0.6;
- opacity: 0.6; */
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
-/* background: #ffffff; */
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 400px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -420px;
- left: 70px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- top: -300px; */
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- left: 10px;
- top: -300px; */
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- text-align: center;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -20px;
- left: 170px;
-}
-
-/* loginerror box follows */
-
-#login #inputerrors {
- background-color: transparent;
- border: 0px solid #666666;
- margin: 5em auto;
- vertical-align: middle;
- padding: 0em;
- width: 330px;
- height: 50px;
- position: relative;
- top: -370px;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/menu.inc b/src/usr/local/www/themes/pfsense_ng/menu.inc
deleted file mode 100644
index d703daf..0000000
--- a/src/usr/local/www/themes/pfsense_ng/menu.inc
+++ /dev/null
@@ -1,177 +0,0 @@
-<?php
-/* $Id: menu.inc,v 1.3.2.1 2007/01/17 18:43:30 sullrich Exp $ */
-/* ========================================================================== */
-/*
- menu.inc
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-require("menu.inc");
-
-define("TMENU_STUB", "
- // set up drop downs anywhere in the body of the page. I think the bottom of the page is better..
- // but you can experiment with effect on loadtime.
- if (TransMenu.isSupported()) {
-
- //==================================================================================================
- // create a set of dropdowns
- //==================================================================================================
- // the first param should always be down, as it is here
- //
- // The second and third param are the top and left offset positions of the menus from their actuators
- // respectively. To make a menu appear a little to the left and bottom of an actuator, you could use
- // something like -5, 5
- //
- // The last parameter can be .topLeft, .bottomLeft, .topRight, or .bottomRight to inidicate the corner
- // of the actuator from which to measure the offset positions above. Here we are saying we want the
- // menu to appear directly below the bottom left corner of the actuator
- //==================================================================================================
- var ms = new TransMenuSet(TransMenu.direction.down, 1, 0, TransMenu.reference.bottomLeft);
-
- //==================================================================================================
- // create a dropdown menu
- //==================================================================================================
- // the first parameter should be the HTML element which will act actuator for the menu
- //==================================================================================================
-
- @@MENU_DEFINITIONS@@
-
- //==================================================================================================
- // write drop downs into page
- //==================================================================================================
- // this method writes all the HTML for the menus into the page with document.write(). It must be
- // called within the body of the HTML page.
- //==================================================================================================
- TransMenu.renderAll();
- }
-");
-
-class NervecenterMenu extends Menu {
- private $menuJScript = "NOT-SET";
- private $menuJScriptEvents = "NOT-SET";
- private $menuID = "NOT-SET";
-
- public function __construct($identification = "", $filename = "", Component $c = NULL) {
- parent::__construct($identification, $filename, $c);
-
- $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
- $this->menuID = $id;
-
- if ($this->hasParent()) {
- $this->menuJScript = "\tvar {$id} = ms.addMenu(document.getElementById('{$id}'));\n";
- }
- } // end __construct
-
- public function getMenuID() {
- return $this->menuID;
- }
-
- public function setMenuID($myMenuID) {
- $this->menuID = $myMenuID;
- }
-
- public function getMenuJScript() {
- $childJScript = "";
- foreach ($this->getChildren() as $component) {
- $childJScript .= $component->getMenuJScript();
- }
-
- if (! $this->hasParent()) {
- $this->menuJScript = str_replace("@@MENU_DEFINITIONS@@", $childJScript, TMENU_STUB);
- } else {
- $this->menuJScript .= "\n$childJScript\n";
- }
-
- return $this->menuJScript;
- }
-
- public function getMenuJScriptEvents() {
- return $this->menuJScriptEvents;
- }
-
- public function __toString() {
- if (! $this->hasParent()) {
- $menuMarkup =<<<EOD
- <div id="menu">
- @@CHILD_ELEMENTS@@
- </div>
-
-EOD;
- } else {
- $name = gettext($this->getID());
- $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
-
- $menuMarkup =<<<EOD
- <a id="{$id}" href="#">{$name}</a>
- @@CHILD_ELEMENTS@@
-EOD;
- }
-
- $childMarkup = "";
- foreach ($this->getChildren() as $component) {
- $childMarkup .= $component;
- }
-
- $menuMarkup = str_replace("@@CHILD_ELEMENTS@@", $childMarkup, $menuMarkup);
-
- return $menuMarkup;
- }
-}
-
-class NervecenterMenuItem extends MenuItem {
- private $menuJScript = "NOT-SET";
- private $menuJScriptEvents = "NOT-SET";
-
- public function __construct($identification = "", $filename = "", $href = "", Component $c = NULL) {
- parent::__construct($identification, $filename, $href, $c);
-
- $href = $this->getHref() <> "" ? $this->getHref() : "{$this->getFile()}";
- $name = gettext($this->getID());
- $file = $this->getFile();
-
- $this->menuJScript = $this->check_access("{$file}", "\t{$this->getParent()->getMenuID()}.addItem('{$name}', '{$href}');\n");
- }
-
- public function getMenuJScript() {
- return $this->menuJScript;
- }
-
- public function getMenuJScriptEvents() {
- return $this->menuJScriptEvents;
- }
-
- public function __toString() {
- return "";
- }
-}
-
-?>
diff --git a/src/usr/local/www/themes/pfsense_ng/new_tab_menu.css b/src/usr/local/www/themes/pfsense_ng/new_tab_menu.css
deleted file mode 100644
index 04c4cf2..0000000
--- a/src/usr/local/www/themes/pfsense_ng/new_tab_menu.css
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- new_tab_menu.css
- part of pfSense
- Copyright (C) 2010-2011 Robert Zelaya
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
-
- Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
- The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
-
- <tr>
- <td>
- <?php
- $tab_array_indent = 0; // move to the line in px
- $tab_array_space = 1; // space betwen lines in px
- $tab_array_char_limit = 82; // number or chr before the drop down box
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
-
-*/
-
-.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
-
-.newtabmenu li{float:left; margin-right:2px; text-align: center;}
-.newtabmenu a:link, .newtabmenu a:visited{
- background:url(images/new_tab_menu.png) right 45px;
- color:#ffffff; /* noactive font */
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- font-weight:bold;
- font-size:.9em;
- height:20px;
- line-height:20px;
- text-decoration:none;
-}
-.newtabmenu a span{
- background:url(images/new_tab_menu.png) left 45px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- height:20px;
- margin-right:7px;
- padding-left:7px;
-}
-.newtabmenu a:hover{
- background:url(images/new_tab_menu.png) right 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- color:#ffffff; /* hover over font */
-}
-.newtabmenu a:hover span{
- background:url(images/new_tab_menu.png) left 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
-}
-
-/* -------------------------------- */
-/* ACTIVE ELEMENTS */
-.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
- color:#000000; /* active font */
- background:url(images/new_tab_menu.png) right 0 no-repeat;
-}
-.newtabmenu_active a span, .newtabmenu_active a:hover span{
- background:url(images/new_tab_menu.png) left 0 no-repeat;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/no_big_logo b/src/usr/local/www/themes/pfsense_ng/no_big_logo
deleted file mode 100644
index 6e5c70d..0000000
--- a/src/usr/local/www/themes/pfsense_ng/no_big_logo
+++ /dev/null
@@ -1 +0,0 @@
-NO! DONT! \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/rrdcolors.inc.php b/src/usr/local/www/themes/pfsense_ng/rrdcolors.inc.php
deleted file mode 100644
index dcb7a39..0000000
--- a/src/usr/local/www/themes/pfsense_ng/rrdcolors.inc.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/* $Id$ */
-/*
- rrdcolors.inc.php
- Part of pfSense
- Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/* This file is included by the RRD graphing page and sets the colors */
-
-/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* 95th Percentile Lines Out, In */
-$colortraffic95 = array('660000', 'FF0000');
-
-/* State Table pfrate, pfstates, pfnat, srcip, dstip */
-$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
-
-/* Processor Usage user, nice, system, int, processes */
-$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
-
-/* Memory Usage active, inact, free, cache, wire */
-$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
-
-/* MBUF Usage current, cache, total, max */
-$colormbuf = array('0080FF','00E344','FF0000','000000');
-
-/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
-$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
-$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
-/* Quality Graph Loss */
-$colorqualityloss = 'ee0000';
-
-/* Wireless Graph SNR, Rate, Channel*/
-/* Cellular Graph RSSI, */
-$colorwireless = array('333333','a83c3c','999999');
-
-/* SPAMD Times min area, avg area, max area, Time line */
-$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
-/* SPAMD Connections max area, min area, min line, max line, avg line */
-$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
-
-/* OpenVPN Users Online Users */
-$colorvpnusers = array('990000');
-
-/* Captive Portal Total Users Total Users */
-/* Captive Portal Concurrent Concurrent Users */
-$colorcaptiveportalusers = array('990000');
-
-?>
diff --git a/src/usr/local/www/themes/pfsense_ng/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/pfsense_ng/styles/jquery-ui-1.11.1.css
deleted file mode 100644
index 8a8c54f..0000000
--- a/src/usr/local/www/themes/pfsense_ng/styles/jquery-ui-1.11.1.css
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*! jQuery UI - v1.11.1 - 2014-09-22
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.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:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-clearfix {
- min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* 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: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.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: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- 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;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- min-height: 0; /* support: IE7 */
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
- position: absolute;
- left: .5em;
- top: 50%;
- margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-button {
- display: inline-block;
- position: relative;
- padding: 0;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
- width: 2.4em;
-}
-.ui-button-icons-only {
- width: 3.4em;
-}
-button.ui-button-icons-only {
- width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
- display: block;
- line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
- padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
- padding: .4em;
- text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
- padding-left: 2.1em;
- padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
- padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
- position: absolute;
- top: 50%;
- margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
- left: 50%;
- margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
- left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
- right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
- margin-right: 7px;
-}
-.ui-buttonset .ui-button {
- margin-left: 0;
- margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.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 {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.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,
-.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%;
- font-size: 0;
-}
-
-/* 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,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-.ui-dialog {
- overflow: hidden;
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
- width: 12px;
- height: 12px;
- right: -5px;
- bottom: -5px;
- background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: none;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- position: relative;
- margin: 0;
- padding: 3px 1em 3px .4em;
- cursor: pointer;
- min-height: 0; /* support: IE7 */
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-progressbar {
- height: 1em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
- background-color: #990000;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
- height: 100%;
- filter: alpha(opacity=25); /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- /* Support: IE7 */
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-button {
- display: inline-block;
- overflow: hidden;
- position: relative;
- text-decoration: none;
- cursor: pointer;
-}
-.ui-selectmenu-button span.ui-icon {
- right: 0.5em;
- left: auto;
- margin-top: -8px;
- position: absolute;
- top: 50%;
-}
-.ui-selectmenu-button span.ui-selectmenu-text {
- text-align: left;
- padding: 0.4em 2.1em 0.4em 1em;
- display: block;
- line-height: 1.4;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.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;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.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;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 22px;
-}
-.ui-spinner-button {
- width: 16px;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top: none;
- border-bottom: none;
- border-right: none;
-}
-/* vertically center icon */
-.ui-spinner .ui-icon {
- position: absolute;
- margin-top: -8px;
- top: 50%;
- left: 0;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
- /* need to fix icons sprite */
- background-position: -65px -16px;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
- -webkit-box-shadow: 0 0 5px #aaa;
- box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #aaaaaa;
- background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #bbbbbb;
- /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
- color: #444444;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #444444;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #cccccc;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #3383bb;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #3383bb;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #bbbbbb;
- background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #599fcf;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited {
- color: #599fcf;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #999999;
- background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #ffffff;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #ffffff;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
- color: #444444;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #444444;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #c0402a;
- background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
- color: #ffffff;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #ffffff;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #ffffff;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70); /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35); /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-state-default .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-active .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
-}
-.ui-state-highlight .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.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-on { background-position: -96px -144px; }
-.ui-icon-radio-off { 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-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.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-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 6px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
- opacity: .8;
- filter: Alpha(Opacity=80); /* support: IE8 */
-}
-.ui-widget-shadow {
- margin: -4px 0 0 -4px;
- padding: 4px;
- background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
- opacity: .6;
- filter: Alpha(Opacity=60); /* support: IE8 */
- border-radius: 0pxdow;
-}
diff --git a/src/usr/local/www/themes/pfsense_ng/styles/menustyles.css b/src/usr/local/www/themes/pfsense_ng/styles/menustyles.css
deleted file mode 100644
index 06b3c7a..0000000
--- a/src/usr/local/www/themes/pfsense_ng/styles/menustyles.css
+++ /dev/null
@@ -1,44 +0,0 @@
-#navigation {
- /* border:1px solid black; */
- width: 98%;
- vertical-align: middle;
- height: 16px;
- padding-top: 4px;
- }
-
-#menu {
- /* background: #990000; */
- /* border-bottom:1px solid white; */
- padding: 0 0 0 0;
- width: 98%;
- vertical-align: middle;
- height: 16px;
- }
-#menu a {
- padding: 2px 28px 4px 28px;
- text-decoration: none;
- font-weight: bold;
- font-size: 1.0em;
- color: #FFFFFF;
- width: 08%;
- height: 16px;
- }
-#menu a.hover {
- background: #AF2020;
- }
-#menu span {
- display: none;
- }
-
-#subnav {
- font-size: 10px;
- margin-bottom: 2em;
- }
-#subnav a {
- color: #FF0000; /* #FB3B00; */
- margin-right: 1em;
- }
-#subnav span {
- color: silver;
- margin-right: 1em;
- }
diff --git a/src/usr/local/www/themes/pfsense_ng/styles/transmenu.css b/src/usr/local/www/themes/pfsense_ng/styles/transmenu.css
deleted file mode 100644
index f683574..0000000
--- a/src/usr/local/www/themes/pfsense_ng/styles/transmenu.css
+++ /dev/null
@@ -1,75 +0,0 @@
-/* this is the clipping region for the menu. it's width and height get set by script, depending on the size of the items table */
-.transMenu {
- position:absolute;
- overflow:hidden;
- left:-1000px;
- top:-1000px;
- }
-
-/* this is the main container for the menu itself. it's width and height get set by script, depending on the size of the items table */
-.transMenu .content {
- position:absolute;
- }
-
-/* this table comprises all menu items. each TR is one item. It is relatively positioned so that the shadow and background transparent divs can be positioned underneath it */
-.transMenu .items {
- position:relative;
- left:0px; top:0px;
- z-index:2;
- }
-
-.transMenu.top .items {
- border-top:none;
- }
-
-/* each TR.item is one menu item */
-.transMenu .item {
- color: #FFFFFF; /* #336; */
- font-size: 1.1em;
- font-weight: normal;
- font-family:sans-serif;
- text-decoration:none;
- /* this is a hack for mac/ie5, whom incorrectly cascades the border properties of the parent table to each row */
- border:none;
- cursor:pointer;
- cursor:hand;
- }
-
-/* this DIV is the semi-transparent white background of each menu. the -moz-opacity is a proprietary way to get transparency in mozilla, the filter is for IE/windows 5.0+. */
-/* we set the background color in script because ie mac does not use it; that browser only uses a semi-transparent white PNG that the spacer gif inside this DIV is replaced by */
-.transMenu .background {
- position:absolute;
- left:0px; top:0px;
- z-index:1;
- -moz-opacity:.8;
- filter:alpha(opacity=80);
- }
-
-/* same concept as .background, but this is the sliver of shadow on the right of the menu. It's left, height, and background are set by script. In IE5/mac, it uses a PNG */
-.transMenu .shadowRight {
- position:absolute;
- z-index:3;
- top:3px; width:2px;
- -moz-opacity:.4;
- filter:alpha(opacity=40);
- }
-
-/* same concept as .background, but this is the sliver of shadow on the bottom of the menu. It's top, width, and background are set by script. In IE5/mac, it uses a PNG */
-.transMenu .shadowBottom {
- position:absolute;
- z-index:1;
- left:3px; height:2px;
- -moz-opacity:.4;
- filter:alpha(opacity=40);
- }
-
-/* this is the class that is used when the mouse is over an item. script sets the row to this class when required. */
-.transMenu .item.hover {
- background:#fdfdfd;
- color:black;
- }
-
-/* this is either the dingbat that indicates there is a submenu, or a spacer gif in it's place. We give it extra margin to create some space between the text and the dingbat */
-.transMenu .item img {
- margin-left:10px;
- } \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/wizard.css b/src/usr/local/www/themes/pfsense_ng/wizard.css
deleted file mode 100644
index f2c9f3e..0000000
--- a/src/usr/local/www/themes/pfsense_ng/wizard.css
+++ /dev/null
@@ -1,1117 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.nowrap { white-space: nowrap; }
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #999999;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- /* background: url('images/background.png') no-repeat; */
- background-position : center 0px;
- background-color: #999999;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-.infobox {
- width:100%;
-}
-
-.infoboxsave {
- padding-right: 10px;
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-.inputerrorsleft {
- background-color: #990000;
- width: 36px;
-}
-
-.inputerrorsright {
- background-color: #FFD9D1;
- color: #000000;
- font-size: 11px;
- padding-left: 8px;
- padding-top: 6px;
-}
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/all.css b/src/usr/local/www/themes/pfsense_ng_fs/all.css
deleted file mode 100644
index 7286d1c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/all.css
+++ /dev/null
@@ -1,1375 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, sans-serif;
- font-size: 0.9em;
-
-}
-
-.nowrap { white-space: nowrap; }
-
-.addgatewaybox {
- background-color: #990000;
- border-style: none none none none;
- width: 225px;
-}
-
-.infobox {
- width:100%;
-}
-
-.infoboxsave {
- padding-right: 10px;
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-.inputerrorsleft {
- background-color: #990000;
- width: 36px;
-}
-
-.inputerrorsright {
- background-color: #FFD9D1;
- color: #000000;
- font-size: 11px;
- padding-left: 8px;
- padding-top: 6px;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 220px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 11px;
- font-family: "Trebuchet MS", sans-serif;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-a:link {
- color: #550000;
-}
-
-a:visited {
- color: #550000;
-}
-
-a:active {
- color: #550000;
-}
-
-a:hover {
- color: #550000;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* style of disabled formelements */
-#wrap div {margin:1em 0}
-[disabled] {
- color:#666666;
- background:#eeeeee;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 40px;
- width: 810px;
- position: fixed;
- left: 0;
- margin-bottom: 5px;
- z-index: 2;
- top: 0;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 40px;
- width: 80px;
- left: 0px;
- top:0px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 0px;
- left: 0px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 30px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-/* for forcing an alert run the following command from diagnostics>command, php command:
-file_notice("blah", "blah blah...testing my new theme...");
-*/
-
-#header-right .container .right #alerts {
- position: fixed;
- background: url('images/alert_bgr.png') no-repeat;
- height: 40px;
- width: 400px;
- top: 0px;
- left: 810px;
- z-index: 2;
- padding-top: 1px;
- padding-left: 10px;
- margin: 0px;
-}
-
-#header-right .container .right #hostname {
- position: fixed;
- background: url('images/hostname.png') no-repeat;
- height: 40px;
- width: 400px;
- z-index: 1;
- padding-right: 5px;
- margin: 0px;
- top: 0px;
- left: 810px;
- font-size: 12px;
- color: #000000;
- font-weight: bold;
- padding-left: 40px;
- padding-top: 2px;
- text-align: left;
-}
-
-
-
-
-table#marquee {
- position: relative;
- top: -4px;
- left: 15px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 350px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
-/* font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff; */
- font-size: 12px;
- font-weight: normal;
- font-style: italic;
- color: #000000;
- padding-left: 30px;
- padding-top: 2px;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 330px;
- height: 16px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-#content {
- padding-top: 50px;
- padding-right: 40px;
- padding-left: 40px;
-}
-
-
-/* try to abuse left as a fadeout at the end of the page */
-#left {
- width: 810px;
- height: 1px;
-}
-
-#right {
- padding: 10px;
- margin-bottom: 30px;
- font-size: 12px;
- font-weight: 200;
- line-height: 12px;
- color: inherit;
- background-color: #eeeeee;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-
-#footer {
- text-align: center;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-
-}
-
-/* Style the List */
-#navigation {
- position: fixed;
- top: 0px;
- left: 100px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
- margin-left: 10px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- padding-right: 20px;
- top: 0px;
-}
-
-/* Text mainmenubar */
-#navigation ul li div {
- background-image: url(images/mainmenu-right.gif);
- background-position: 2% 50%;
- background-repeat: no-repeat;
- padding-top:0px;
- font-size: 12px;
- font-weight: normal;
- color: #ffffff;
- text-align: left;
- padding-left: 13px;
- height: 13px;
-}
-
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- font-weight: normal;
- margin-top: 1px;
- padding-top: 5px;
- background: #850000;
- border: 0px;
- /* transparent */
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=95);
- -moz-opacity: 0.95;
- -khtml-opacity: 0.95;
- opacity: 0.95;
- /* borders */
- border-bottom-right-radius: 0px;
- border-bottom-left-radius: 6px;
- border-top-left-radius: 6px;
- border-top-right-radius: 6px;
- /* Mozilla */
- -moz-border-radius-bottomright: 0px;
- -moz-border-radius-bottomleft: 6px;
- -moz-border-radius-topright: 6px;
- -moz-border-radius-topleft: 6px;
- /* WebKit */
- -webkit-border-bottom-right-radius: 0px;
- -webkit-border-bottom-left-radius: 6px;
- -webkit-border-top-right-radius: 6px;
- -webkit-border-top-left-radius: 6px;
- /* Shadow Effect */
- box-shadow: 5px 5px 10px #000000;
- -webkit-box-shadow: 5px 5px 10px #000000;
- -moz-box-shadow: 5px 5px 10px #000000;
- /* Vertical menu max size */
- /* max-height: 259px; /
- /* Horizontal menu max size */
- max-width: 128px;
- overflow-x: hidden;
- overflow-y: auto;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
- background-image: url(images/mainmenu-down.gif);
- background-position: 5% 50%;
- background-repeat: no-repeat;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #000000;
-}
-/* dropdownmenu */
-#navigation ul li ul li {
- border: 0px solid #850000;
- width: 128px;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #850000;
- /* borders */
- border-bottom-right-radius: 0px;
- border-bottom-left-radius: 3px;
- border-top-left-radius: 3px;
- border-top-right-radius: 3px;
- /* Mozilla */
- -moz-border-radius-bottomright: 0px;
- -moz-border-radius-bottomleft: 3px;
- -moz-border-radius-topright: 3px;
- -moz-border-radius-topleft: 3px;
- /* WebKit */
- -webkit-border-bottom-right-radius: 0px;
- -webkit-border-bottom-left-radius: 3px;
- -webkit-border-top-right-radius: 3px;
- -webkit-border-top-left-radius: 3px;
-}
-/* last element in dropdown menu*/
-#navigation ul li ul li:last-child {
- margin-bottom: 5px;
-}
-#navigation ul li ul li:hover {
- margin-left: 5px;
- background-color: #666666;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=95);
- -moz-opacity: 0.95;
- -khtml-opacity: 0.95;
- opacity: 0.95;
-}
-
-/* textcolor in dropdownmenu */
-#navigation li li a {
- display: block;
- padding-left: 8px;
- padding-right: 8px;
- color: #ffffff;
- font-size: 11px;
- font-weight: normal;
- text-align: left;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-}
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
- background-color: transparent;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listrborder {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-left: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- color: #FFFFFF;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #DDDDDD;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-/* style of disabled formelements */
-[disabled] {
- color:#666666;
- background:#eeeeee;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 6px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password, #password2 {
- font-size: small;
- width: 60%;
- padding-left: 19px;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-/* Widget CSS */
-.widgetsubheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #B1B1B1;
- padding-right: 6px;
- padding-left: 6px;
- color: #000000;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetdiv{
- margin:5px;
- padding: 5px;
- background:#CCCCCC;
-}
-.widgetconfigdiv{
- background:#BBBBBB;
- font-size: 11px;
- color: #000000;
- padding-right: 5px;
- padding-left: 5px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-div#log div.log-entry-mini {
- clear: both;
-}
-
-div#log div.log-entry-mini span {
- padding: 2px 2px 2px 2px;
- padding-left: 6px;
-}
-
-div#log span.log-action-mini-header,
-div#log span.log-time-mini-header,
-div#log span.log-interface-mini-header,
-div#log span.log-source-mini-header,
-div#log span.log-destination-mini-header,
-div#log span.log-protocol-mini-header {
- float: left;
- text-align: left;
- background-color: #B1B1B1;
- font-size: 12px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-time-mini,
-div#log span.log-interface-mini,
-div#log span.log-source-mini,
-div#log span.log-destination-mini,
-div#log span.log-protocol-mini {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 11px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-action-mini-header {
- width: 6%;
-}
-
-div#log span.log-time-mini,
-div#log span.log-time-mini-header {
- width: 19%;
-}
-
-div#log span.log-interface-mini,
-div#log span.log-interface-mini-header {
- width: 8%;
-}
-
-div#log span.log-source-mini,
-div#log span.log-source-mini-header {
- width: 23%;
-}
-
-div#log span.log-destination-mini,
-div#log span.log-destination-mini-header {
- width: 31%;
-}
-
-div#log span.log-protocol-mini,
-div#log span.log-protocol-mini-header {
- width: 8%;
- border-right: 1px solid #999;
-}
-
-/* Sortable tables */
-table.sortable thead {
- cursor: default;
- /* background-color: #EEEEEE; this causing light gray rectangles to the right of many tables in gui */
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-
-/*thermal_sensors widget styles*/
-
-.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
-.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
-.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
- background-color: LimeGreen;
- border-top-width: 2px; border-top-color: Lime;
- border-left-width: 0px;
- border-right-width: 0px;
- border-bottom-width: 2px; border-bottom-color: Green;
-}
-.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
-.thermalSensorText { float: left; height: 20px; top: 3px; }
-.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
-
-.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-
-.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
-
-.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
-
-/* widget textarea styles - full width */
-.textarea_widget {
- width: 100%;
- resize:vertical;
- -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
- -moz-box-sizing: border-box; /* Firefox, other Gecko */
- box-sizing: border-box; /* IE 8+ */
-}
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/apple-touch-icon.png b/src/usr/local/www/themes/pfsense_ng_fs/apple-touch-icon.png
deleted file mode 100755
index 7a4b975..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/apple-touch-icon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/bottom-loader.js b/src/usr/local/www/themes/pfsense_ng_fs/bottom-loader.js
deleted file mode 100644
index a21f775..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/bottom-loader.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//<![CDATA[
-
- NiftyCheck();
- Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
- Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
- Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
- Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
- Rounded("div#topbox","all","#FFF","#990000","smooth");
-
-//]]>
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/favicon.ico b/src/usr/local/www/themes/pfsense_ng_fs/favicon.ico
deleted file mode 100644
index 3440bf2..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/graphlink.css b/src/usr/local/www/themes/pfsense_ng_fs/graphlink.css
deleted file mode 100644
index 521059e..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/graphlink.css
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- $Id: graphlink.css,v 1.2.2.1 2007/01/17 18:43:30 sullrich Exp $
-
- This file is part of the GraphLink software.
- GraphLink is distributed under the MIT License.
- Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
-*******************************************************************************/
-
-/**
- * Defines the background image used for the graph, as well as the actual data
- * locations.
- * Use padding-left and padding-top to align the data area correctly with your
- * background image.
- * Width and height should same as the dimensions of the image, minus the
- * padding values in both directions.
- */
-div.GraphLink {
- width: 212px;
- height: 60px;
- padding-left: 38px;
- padding-top: 10px;
- background-image: url(/themes/nervecenter/images/misc/graph.png);
- overflow: hidden;
-}
-
-/**
- * Defines the data display area. Modify to fit your background image.
- */
-div.GraphLinkData {
- width: 200px;
- height: 50px;
- overflow: hidden;
-}
-
-/**
- * Defines the look of one bar. Nothing to change here other than the color.
- */
-span.GraphLinkBar {
- background-color: #990000;
- height: 100%;
- float: left;
- overflow: hidden;
-}
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/alert_bgr.png b/src/usr/local/www/themes/pfsense_ng_fs/images/alert_bgr.png
deleted file mode 100755
index 5a8ac81..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/alert_bgr.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/alerter.png b/src/usr/local/www/themes/pfsense_ng_fs/images/alerter.png
deleted file mode 100755
index e026bfe..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/alerter.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/background.jpg b/src/usr/local/www/themes/pfsense_ng_fs/images/background.jpg
deleted file mode 100755
index ebdff47..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/background.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/footer.png b/src/usr/local/www/themes/pfsense_ng_fs/images/footer.png
deleted file mode 100755
index b10002b..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/footer.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/header.png b/src/usr/local/www/themes/pfsense_ng_fs/images/header.png
deleted file mode 100755
index 6f8128c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/header.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/help.png b/src/usr/local/www/themes/pfsense_ng_fs/images/help.png
deleted file mode 100755
index 1de05e3..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/help.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/horizontal.png b/src/usr/local/www/themes/pfsense_ng_fs/images/horizontal.png
deleted file mode 100755
index f098bb3..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/horizontal.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/hostname.png b/src/usr/local/www/themes/pfsense_ng_fs/images/hostname.png
deleted file mode 100755
index cd79f5c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/hostname.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/favicon.ico b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/favicon.ico
deleted file mode 100644
index 3440bf2..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g.gif
deleted file mode 100755
index 46ccb92..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g_inactive.gif
deleted file mode 100755
index cf983e4..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g_inactive.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced.gif
deleted file mode 100755
index 3ede1ff..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced_s.gif
deleted file mode 100755
index b233549..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alert.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alert.gif
deleted file mode 100755
index 7646941..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alert.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_host.gif
deleted file mode 100755
index ad43e17..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_host.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_net.gif
deleted file mode 100755
index abd1b8b..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_net.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_port.gif
deleted file mode 100755
index 4acf2aa..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_port.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url.gif
deleted file mode 100755
index 660571e..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url_reload.gif
deleted file mode 100755
index 55c1c4a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url_reload.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block.gif
deleted file mode 100755
index 670c968..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_add.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_add.gif
deleted file mode 100755
index eb726d6..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_d.gif
deleted file mode 100755
index e6345fe..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cablenic.gif
deleted file mode 100755
index a071c66..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cablenic.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal.gif
deleted file mode 100755
index a9c7c87..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal_mo.gif
deleted file mode 100755
index 1647e2f..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp.gif
deleted file mode 100755
index 9454a82..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp_d.gif
deleted file mode 100755
index 2ba8db2..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_chain.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_chain.png
deleted file mode 100755
index 12db07a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_chain.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_check.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_check.gif
deleted file mode 100755
index 393674d..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_check.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_green.gif
deleted file mode 100755
index e171ba8..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_green.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_grey.gif
deleted file mode 100755
index 00c865a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_grey.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_red.gif
deleted file mode 100755
index 7b412ee..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_close.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_close.gif
deleted file mode 100755
index e0f86a7..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_close.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_configure.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_configure.gif
deleted file mode 100755
index 7182e0d..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_configure.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down.gif
deleted file mode 100755
index b71a9c5..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_d.gif
deleted file mode 100755
index 70a7473..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_mo.gif
deleted file mode 100755
index 584587a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e.gif
deleted file mode 100755
index 2950800..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e_mo.gif
deleted file mode 100755
index 9ba5738..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_error.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_error.gif
deleted file mode 100755
index e0fa659..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_error.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_exclam.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_exclam.gif
deleted file mode 100755
index 36c2ec7..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_exclam.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_de.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_de.png
deleted file mode 100755
index 069cbbe..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_de.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_en.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_en.png
deleted file mode 100755
index bd7f9a5..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_en.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_es.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_es.png
deleted file mode 100755
index 434776c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_es.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_pt_BR.png
deleted file mode 100755
index f786349..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_pt_BR.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_cert.png
deleted file mode 100755
index 48a34b6..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_cert.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_file.png
deleted file mode 100755
index 48a9ed2..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_file.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_group.png
deleted file mode 100755
index 7d929c0..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_host.png
deleted file mode 100755
index 867ef2c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_host.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_imp.png
deleted file mode 100755
index f667cfc..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_imp.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_mail.png
deleted file mode 100755
index d2d4548..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_mail.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_pwd.png
deleted file mode 100755
index 06b53a1..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_pwd.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_search.png
deleted file mode 100755
index 33de926..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_search.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_time.png
deleted file mode 100755
index aa8300a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_time.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_unknown.png
deleted file mode 100755
index 1857d0e..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_unknown.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_url.png
deleted file mode 100755
index cf56792..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_url.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_user.png
deleted file mode 100755
index e00eebe..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_fw-update.gif
deleted file mode 100755
index 52c18ac..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_fw-update.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_help.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_help.gif
deleted file mode 100644
index 84c84db..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_help.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias.gif
deleted file mode 100755
index 0c569a7..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias_d.gif
deleted file mode 100755
index faa84d4..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_import_alias.gif
deleted file mode 100755
index d11a5f0..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_import_alias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_info_pkg.gif
deleted file mode 100755
index cd3a532..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_info_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_down.gif
deleted file mode 100755
index 0626655..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_up.gif
deleted file mode 100755
index 1449513..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left.gif
deleted file mode 100755
index 8effefe..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_d.gif
deleted file mode 100755
index c778014..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_mo.gif
deleted file mode 100755
index 84c6fa2..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log.gif
deleted file mode 100755
index 4a1983a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_d.gif
deleted file mode 100755
index d31bd9b..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s.gif
deleted file mode 100755
index f9fda33..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s_d.gif
deleted file mode 100755
index fb2c05f..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_logs.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_logs.gif
deleted file mode 100644
index afe0104..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_logs.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match.gif
deleted file mode 100644
index 215571f..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match_d.gif
deleted file mode 100644
index 6e4c364..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_minus.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_minus.gif
deleted file mode 100755
index 417544f..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_minus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_open.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_open.gif
deleted file mode 100755
index ac3da14..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_open.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other.gif
deleted file mode 100755
index e6f780f..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other_d.gif
deleted file mode 100755
index b08d970..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp.gif
deleted file mode 100755
index 96acaf3..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp_d.gif
deleted file mode 100755
index 7d7d00e..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass.gif
deleted file mode 100755
index fe1bb0d..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_add.gif
deleted file mode 100755
index f7f4c20..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_d.gif
deleted file mode 100755
index 6adc431..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus.gif
deleted file mode 100755
index 2a94eeb..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl.gif
deleted file mode 100755
index 8dcd7c0..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl_p.gif
deleted file mode 100755
index 0c79849..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_d.gif
deleted file mode 100755
index ebc7457..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_mo.gif
deleted file mode 100755
index 1c7ca08..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_p.gif
deleted file mode 100755
index eb41284..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall.gif
deleted file mode 100755
index d78b867..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_d.gif
deleted file mode 100755
index 13658f7..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_mo.gif
deleted file mode 100755
index 90b576e..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg.gif
deleted file mode 100755
index 9aebb03..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_d.gif
deleted file mode 100755
index 4ab4992..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_mo.gif
deleted file mode 100755
index 7025d20..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml.gif
deleted file mode 100755
index 4542432..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_d.gif
deleted file mode 100755
index 8d3a68d..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_mo.gif
deleted file mode 100755
index 15e0aed..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject.gif
deleted file mode 100755
index 5565cd6..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject_d.gif
deleted file mode 100755
index 6c09fae..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_right.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_right.gif
deleted file mode 100755
index fdf2d8b..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart.gif
deleted file mode 100755
index e49fbd7..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart_d.gif
deleted file mode 100755
index a5d6d7c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_running.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_running.gif
deleted file mode 100644
index 543fd56..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_running.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start.gif
deleted file mode 100755
index 09bb58f..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start_d.gif
deleted file mode 100755
index f58f111..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_status.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_status.gif
deleted file mode 100644
index a93bcfb..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_status.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop.gif
deleted file mode 100755
index 922addc..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop_d.gif
deleted file mode 100755
index b4cfdea..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stopped.gif
deleted file mode 100644
index f93a25d..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stopped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_restart_mo.gif
deleted file mode 100755
index a092b40..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_restart_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_start_mo.gif
deleted file mode 100755
index ecdb58f..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_start_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_stop_mo.gif
deleted file mode 100755
index c00e208..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_stop_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group-grey.png
deleted file mode 100755
index d7b964d..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group.png
deleted file mode 100755
index 1c974f2..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user-grey.png
deleted file mode 100755
index 2f6047d..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user.png
deleted file mode 100755
index ef82156..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_lock_screen.png
deleted file mode 100755
index 30f306d..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_lock_screen.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_logout.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_logout.png
deleted file mode 100755
index 9bbb6c7..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_logout.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped.gif
deleted file mode 100755
index ffeb2cd..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped_p.gif
deleted file mode 100755
index 6d46aaf..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule.gif
deleted file mode 100755
index e15ab6c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule_d.gif
deleted file mode 100755
index f776281..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up.gif
deleted file mode 100755
index 883c5a2..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_d.gif
deleted file mode 100755
index 0ddcce2..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_mo.gif
deleted file mode 100755
index 9f869a4..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan.gif
deleted file mode 100755
index 1f0addc..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan_d.gif
deleted file mode 100755
index 35bf580..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wol_all.gif
deleted file mode 100755
index 2d22182..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wol_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_nsaved.png
deleted file mode 100755
index 21cb27d..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_nsaved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_saved.png
deleted file mode 100755
index ab82946..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_saved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x.gif
deleted file mode 100755
index 24e4d49..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_d.gif
deleted file mode 100755
index d2bfbc8..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_mo.gif
deleted file mode 100755
index da7b57c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_p.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_p.gif
deleted file mode 100755
index 8828fa6..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/in.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/in_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/out.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/out_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/log.png b/src/usr/local/www/themes/pfsense_ng_fs/images/log.png
deleted file mode 100755
index 762ba80..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/log.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/logo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/logo.gif
deleted file mode 100755
index e5da95c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/logo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/logobig.jpg b/src/usr/local/www/themes/pfsense_ng_fs/images/logobig.jpg
deleted file mode 100755
index 2ef196d..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/logobig.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-down.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-down.gif
deleted file mode 100755
index e59432a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-right.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-right.gif
deleted file mode 100755
index 14298a1..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenuitem.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenuitem.gif
deleted file mode 100755
index 6e97478..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenuitem.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/menu-dot.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/menu-dot.gif
deleted file mode 100755
index c76609b..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/menu-dot.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/menu_footer.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/menu_footer.gif
deleted file mode 100755
index d06faa4..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/menu_footer.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/menu_right.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/menu_right.gif
deleted file mode 100755
index 881327c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/menu_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr.png b/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr.png
deleted file mode 100755
index 45e0ec7..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr_footer.png b/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr_footer.png
deleted file mode 100755
index fdff49f..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr_footer.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr_highlight.png b/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr_highlight.png
deleted file mode 100755
index 05f4832..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr_highlight.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_blue.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_blue.gif
deleted file mode 100755
index 741186a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_blue.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_gray.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_gray.gif
deleted file mode 100755
index e86e245..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_gray.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_left.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_left.gif
deleted file mode 100755
index af751fa..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_right.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_right.gif
deleted file mode 100755
index ff12d9e..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_minus.png
deleted file mode 100755
index 37db2fd..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_minus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_plus.png
deleted file mode 100755
index fba7af9..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_plus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/button.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/button.gif
deleted file mode 100755
index e85dbb3..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/button.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/graph.png b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/graph.png
deleted file mode 100755
index 507ec75..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/graph.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_128.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_128.gif
deleted file mode 100755
index ea5ae34..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_128.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_152.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_152.gif
deleted file mode 100755
index 6c7fc03..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_152.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_256.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_256.gif
deleted file mode 100755
index 3e1c377..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_256.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_64.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_64.gif
deleted file mode 100755
index 87892bd..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_64.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/left_background.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/left_background.gif
deleted file mode 100755
index 529d827..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/left_background.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader.gif
deleted file mode 100755
index 5d10ac3..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_all.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_all.gif
deleted file mode 100755
index cb6bc0c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_filter.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_filter.gif
deleted file mode 100755
index b838b17..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_filter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_tab.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_tab.gif
deleted file mode 100755
index 05bb04c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_tab.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/logon.png b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/logon.png
deleted file mode 100755
index 98aa37a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/logon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/progress_bar.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/progress_bar.gif
deleted file mode 100755
index 3b4aa52..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/progress_bar.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/rrd_error.png b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/rrd_error.png
deleted file mode 100755
index a79ecf3..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/rrd_error.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_alerter.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_alerter.gif
deleted file mode 100755
index 7ff1e95..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_alerter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_carpmaster.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_carpmaster.gif
deleted file mode 100755
index 2c32908..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_carpmaster.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_left.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_left.gif
deleted file mode 100755
index b5a2930..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_page_loading.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_page_loading.gif
deleted file mode 100755
index 067ef18..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_page_loading.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_all.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_all.gif
deleted file mode 100755
index 72de6bd..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_filter.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_filter.gif
deleted file mode 100755
index d72761a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_filter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_right.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_right.gif
deleted file mode 100755
index bf66fdb..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c.gif
deleted file mode 100755
index 317b758..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c_black.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c_black.gif
deleted file mode 100755
index 309846e..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o.gif
deleted file mode 100755
index eb95c32..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o_black.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o_black.gif
deleted file mode 100755
index f818f3b..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/widget_loader.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/widget_loader.gif
deleted file mode 100755
index ca35e2a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/widget_loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/new_tab_menu.png b/src/usr/local/www/themes/pfsense_ng_fs/images/new_tab_menu.png
deleted file mode 100755
index 4bdfcef..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/new_tab_menu.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/status.png b/src/usr/local/www/themes/pfsense_ng_fs/images/status.png
deleted file mode 100755
index a3e368e..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/status.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/transparent.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/transparent.gif
deleted file mode 100755
index 89c5530..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/transparent.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/transparent_pixel.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/transparent_pixel.gif
deleted file mode 100755
index 35d42e8..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/images/transparent_pixel.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/blank.gif b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/blank.gif
deleted file mode 100755
index a4fe2e6..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/blank.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-box-model.js
deleted file mode 100644
index 45543f6..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-box-model.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-core.js
deleted file mode 100644
index b11e2b1..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-core.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css-strict.js
deleted file mode 100644
index 4406d7a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css-strict.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css2.js
deleted file mode 100644
index 7121c8e..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css2.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css3.js
deleted file mode 100644
index 86b24f5..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css3.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-fixed.js
deleted file mode 100644
index 4321cda..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-fixed.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-html4.js
deleted file mode 100644
index 4d2baa9..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-html4.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-ie5.js
deleted file mode 100644
index 707fa56..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-ie5.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite-p.js
deleted file mode 100644
index 3a66d19..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite.js
deleted file mode 100644
index 88c764f..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-png.js
deleted file mode 100644
index 7b8f2cf..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-png.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-server.css
deleted file mode 100644
index 47c7edd..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-server.css
+++ /dev/null
@@ -1,43 +0,0 @@
-body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
-body {margin: 8px; background: #333;}
-h1 {margin: 0;}
-h1 a:hover {background-color: transparent;}
-h2 {font-size: 1.75em;}
-h3 {font-size: 1.1em;}
-a:active {color: #ff0000;}
-a:link {color: #0a6cce;}
-a:visited {color: #0a6cce;}
-code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
- padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
-code.box {display: block; padding: 10px; margin: 0.5em 0;}
-ul {list-style-type: square;}
-dd {margin: .2em 0 .5em 1em;}
-dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
-dl.library dd {font-style: italic; margin-left: 3em;}
-dt {font-weight: bold;}
-dt.pack {color: brown;}
-a img {border-style: none;}
-hr {height: 1px; color: #000; border-style: solid;}
-hr.short {height: 2px; width: 100px;}
-div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
-hr {border-bottom-width: 0px;}
-div.header hr {color: #0a6cce; background-color: #0a6cce;}
-div.content {min-height: 100px;}
-div.footer hr {color: #898e79; background-color: #898e79; }
-div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
-a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
-div.footer a:hover {background-color: transparent; text-decoration: none;}
-div.header .menu {text-align: right;}
-div.footer {font-size: x-small; margin-top: 8px;}
-div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
-#license {margin-top: 5px; font-size: xx-small;}
-table {border-top: 1px solid #000; border-left: 1px solid #000;}
-th {background-color: #fff; text-align: left;}
-th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
-th.small {width: 100px;}
-th.medium {width: 200px;}
-th.large {width: 270px;}
-th.x-large {width: 408px;}
-table.fixed {table-layout: fixed;}
-span.comment {color: #666;}
-
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard-p.js
deleted file mode 100644
index 73e99ac..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard.js
deleted file mode 100644
index 2109905..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/test-trans.png b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/test-trans.png
deleted file mode 100755
index e187e2c..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/test-trans.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/grey-40.png b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/grey-40.png
deleted file mode 100755
index 758b716..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/grey-40.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-off.gif b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-off.gif
deleted file mode 100755
index ddcdcae..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-off.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-on.gif b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-on.gif
deleted file mode 100755
index 7a58077..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-on.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/white-90.png b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/white-90.png
deleted file mode 100755
index efc84b4..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/white-90.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/x.gif b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/x.gif
deleted file mode 100755
index 5bfd67a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/niftyjsCode.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/niftyjsCode.js
deleted file mode 100644
index e71ea14..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/niftyjsCode.js
+++ /dev/null
@@ -1,174 +0,0 @@
-function NiftyCheck(){
-if(!document.getElementById || !document.createElement)
- return(false);
-isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
-if(Array.prototype.push==null){Array.prototype.push=function(){
- this[this.length]=arguments[0]; return(this.length);};}
-return(true);
-}
-
-function Rounded(selector,wich,bk,color,opt){
-var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
-
-if(color=="transparent"){
- cn=cn+"x";
- ecolor=bk;
- bk="transparent";
- }
-else if(opt && opt.indexOf("border")>=0){
- var optar=opt.split(" ");
- for(i=0;i<optar.length;i++)
- if(optar[i].indexOf("#")>=0) ecolor=optar[i];
- if(ecolor=="") ecolor="#666";
- cn+="e";
- edges=true;
- }
-else if(opt && opt.indexOf("smooth")>=0){
- cn+="a";
- ecolor=Mix(bk,color);
- }
-if(opt && opt.indexOf("small")>=0) cn+="s";
-prefixt=cn;
-prefixb=cn;
-if(wich.indexOf("all")>=0){t=true;b=true;}
-else if(wich.indexOf("top")>=0) t="true";
-else if(wich.indexOf("tl")>=0){
- t="true";
- if(wich.indexOf("tr")<0) prefixt+="l";
- }
-else if(wich.indexOf("tr")>=0){
- t="true";
- prefixt+="r";
- }
-if(wich.indexOf("bottom")>=0) b=true;
-else if(wich.indexOf("bl")>=0){
- b="true";
- if(wich.indexOf("br")<0) prefixb+="l";
- }
-else if(wich.indexOf("br")>=0){
- b="true";
- prefixb+="r";
- }
-var v=getElementsBySelector(selector);
-var l=v.length;
-for(i=0;i<l;i++){
- if(edges) AddBorder(v[i],ecolor);
- if(t) AddTop(v[i],bk,color,ecolor,prefixt);
- if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
- }
-}
-
-function AddBorder(el,bc){
-var i;
-if(!el.passed){
- if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
- var t=el.firstChild.nodeValue;
- el.removeChild(el.lastChild);
- var d=CreateEl("span");
- d.style.display="block";
- d.appendChild(document.createTextNode(t));
- el.appendChild(d);
- }
- for(i=0;i<el.childNodes.length;i++){
- if(el.childNodes[i].nodeType==1){
- el.childNodes[i].style.borderLeft="1px solid "+bc;
- el.childNodes[i].style.borderRight="1px solid "+bc;
- }
- }
- }
-el.passed=true;
-}
-
-function AddTop(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=1;i<=lim;i++){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingTop=0;
-el.insertBefore(d,el.firstChild);
-}
-
-function AddBottom(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=lim;i>0;i--){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingBottom=0;
-el.appendChild(d);
-}
-
-function CreateEl(x){
-if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
-else return(document.createElement(x));
-}
-
-function getElementsBySelector(selector){
-var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
-
-if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
- s=selector.split(" ");
- var fs=s[0].split("#");
- if(fs.length==1) return(objlist);
- f=document.getElementById(fs[1]);
- if(f) return(f.getElementsByTagName(s[1]));
- return(objlist);
- }
-if(selector.indexOf("#")>0){ //id selector like "tag#id"
- s=selector.split("#");
- tag=s[0];
- selid=s[1];
- }
-if(selid!=""){
- f=document.getElementById(selid);
- if(f) objlist.push(f);
- return(objlist);
- }
-if(selector.indexOf(".")>0){ //class selector like "tag.class"
- s=selector.split(".");
- tag=s[0];
- selclass=s[1];
- }
-var v=document.getElementsByTagName(tag); // tag selector like "tag"
-if(selclass=="")
- return(v);
-for(i=0;i<v.length;i++){
- if(v[i].className.indexOf(selclass)>=0){
- objlist.push(v[i]);
- }
- }
-return(objlist);
-}
-
-function Mix(c1,c2){
-var i,step1,step2,x,y,r=new Array(3);
-if(c1.length==4)step1=1;
-else step1=2;
-if(c2.length==4) step2=1;
-else step2=2;
-for(i=0;i<3;i++){
- x=parseInt(c1.substr(1+step1*i,step1),16);
- if(step1==1) x=16*x+x;
- y=parseInt(c2.substr(1+step2*i,step2),16);
- if(step2==1) y=16*y+y;
- r[i]=Math.floor((x*50+y*50)/100);
- }
-return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-body.php b/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-body.php
deleted file mode 100644
index afb7090..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-body.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/* $Id: transmenu-body.php,v 1.1.2.1 2007/01/17 18:43:47 sullrich Exp $ */
-/* ========================================================================== */
-/*
- transmenu-body.php
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-function nervecenterTransmenuGetBodyJS() {
- global $rootmenu;
-
- if (isset($rootmenu)) {
- return $rootmenu->getMenuJScript();
- } else if (empty($rootmenu)) {
- return "alert('No rootmenu object found.');";
- } else {
- return "alert('No JavaScript attached to rootmenu object.');";
- }
-}
-
-?>
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-head.php b/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-head.php
deleted file mode 100644
index afc6402..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-head.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/* $Id: transmenu-head.php,v 1.2.2.1 2007/01/17 18:43:47 sullrich Exp $ */
-/* ========================================================================== */
-/*
- transmenu-head.php
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-function nervecenterTransmenuGetHeadJS() {
- global $g, $rootmenu;
-
- $transmenu_stub =<<<EOD
- function tmenuinit() {
- //==========================================================================================
- // if supported, initialize TransMenus
- //==========================================================================================
- // Check isSupported() so that menus aren't accidentally sent to non-supporting browsers.
- // This is better than server-side checking because it will also catch browsers which would
- // normally support the menus but have javascript disabled.
- //
- // If supported, call initialize() and then hook whatever image rollover code you need to do
- // to the .onactivate and .ondeactivate events for each menu.
- //==========================================================================================
- if (TransMenu.isSupported()) {
- TransMenu.initialize();
-
- // hook all the highlight swapping of the main toolbar to menu activation/deactivation
- // instead of simple rollover to get the effect where the button stays hightlit until
- // the menu is closed.
- @@CHILD_JSCRIPT@@
- }
- } // end function
-EOD;
-
- if (empty($rootmenu)) {
- require_once("menudef.inc");
- }
-
- $childJScript = "";
- foreach ($rootmenu->getChildren() as $component) {
- $id = "mnua_" . str_replace(" ", "", strtolower($component->getID()));
-
- $childJScript .=<<<EOD
- {$id}.onactivate = function() { document.getElementById("{$id}").className = "hover"; };
- {$id}.ondeactivate = function() { document.getElementById("{$id}").className = ""; };
-
-EOD;
- }
-
- $transmenu_stub = basename($_SERVER['PHP_SELF']) != "wizard.php" ? str_replace("@@CHILD_JSCRIPT@@", $childJScript, $transmenu_stub) : "";
-
- return $transmenu_stub;
-}
-
-?>
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu.org b/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu.org
deleted file mode 100644
index 6c9e353..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu.org
+++ /dev/null
@@ -1,785 +0,0 @@
-/* =================================================================================================
- * TransMenu
- * March, 2003
- *
- * Customizable multi-level animated DHTML menus with transparency.
- *
- * Copyright 2003-2004, Aaron Boodman (www.youngpup.net)
- * =================================================================================================
- * "Can I use this?"
- *
- * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
- * out at: http://creativecommons.org/licenses/by/2.0/
- *
- * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
- * for writing it. You may not misrepresent yourself as the author of this code.
- * =================================================================================================
- * "It's kinda hard to read, though"
- *
- * The uncompressed, commented version of this script can be found at:
- * http://youngpup.net/projects/transMenus
- * =================================================================================================
- * updates:
- * 04.19.04 fixed cascade problem with menus nested greater than two levels.
- * 12.23.03 added hideCurrent for menu actuators with no menus. renamed to TransMenu.
- * 04.18.03 fixed render bug in IE 5.0 Mac by removing that browser from compatibility table ;)
- * also made gecko check a little more strict by specifying build no.
- * ============================================================================================== */
-
-
-
-//==================================================================================================
-// Configuration properties
-//==================================================================================================
-TransMenu.spacerGif = "themes/nervecenter/javascript/img/x.gif"; // path to a transparent spacer gif
-TransMenu.dingbatOn = "themes/nervecenter/javascript/img/submenu-on.gif"; // path to the active sub menu dingbat
-TransMenu.dingbatOff = "themes/nervecenter/javascript/img/submenu-off.gif"; // path to the inactive sub menu dingbat
-TransMenu.dingbatSize = 14; // size of the dingbat (square shape assumed)
-TransMenu.menuPadding = 5; // padding between menu border and items grid
-TransMenu.itemPadding = 3; // additional padding around each item
-TransMenu.shadowSize = 2; // size of shadow under menu
-TransMenu.shadowOffset = 3; // distance shadow should be offset from leading edge
-TransMenu.shadowColor = "#FF0000"; // color of shadow (transparency is set in CSS)
-TransMenu.shadowPng = "themes/nervecenter/javascript/img/grey-40.png"; // a PNG graphic to serve as the shadow for mac IE5
-TransMenu.backgroundColor = "#990000"; // color of the background (transparency set in CSS)
-TransMenu.backgroundPng = "themes/nervecenter/javascript/img/white-90.png"; // a PNG graphic to server as the background for mac IE5
-TransMenu.hideDelay = 1000; // number of milliseconds to wait before hiding a menu
-TransMenu.slideTime = 400; // number of milliseconds it takes to open and close a menu
-
-
-//==================================================================================================
-// Internal use properties
-//==================================================================================================
-TransMenu.reference = {topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};
-TransMenu.direction = {down:1,right:2};
-TransMenu.registry = [];
-TransMenu._maxZ = 100;
-
-
-
-//==================================================================================================
-// Static methods
-//==================================================================================================
-// supporting win ie5+, mac ie5.1+ and gecko >= mozilla 1.0
-TransMenu.isSupported = function() {
- var ua = navigator.userAgent.toLowerCase();
- var pf = navigator.platform.toLowerCase();
- var an = navigator.appName;
- var r = false;
-
- if (ua.indexOf("gecko") > -1 && navigator.productSub >= 20020605) r = true; // gecko >= moz 1.0
- else if (an == "Microsoft Internet Explorer") {
- if (document.getElementById) { // ie5.1+ mac,win
- if (pf.indexOf("mac") == 0) {
- r = /msie (\d(.\d*)?)/.test(ua) && Number(RegExp.$1) >= 5.1;
- }
- else r = true;
- }
- }
-
- return r;
-}
-
-// call this in onload once menus have been created
-TransMenu.initialize = function() {
- for (var i = 0, menu = null; menu = this.registry[i]; i++) {
- menu.initialize();
- }
-}
-
-// call this in document body to write out menu html
-TransMenu.renderAll = function() {
- var aMenuHtml = [];
- for (var i = 0, menu = null; menu = this.registry[i]; i++) {
- aMenuHtml[i] = menu.toString();
- }
- document.write(aMenuHtml.join(""));
-}
-
-//==================================================================================================
-// TransMenu constructor (only called internally)
-//==================================================================================================
-// oActuator : The thing that causes the menu to be shown when it is mousedover. Either a
-// reference to an HTML element, or a TransMenuItem from an existing menu.
-// iDirection : The direction to slide out. One of TransMenu.direction.
-// iLeft : Left pixel offset of menu from actuator
-// iTop : Top pixel offset of menu from actuator
-// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
-// parentMenuSet : Menuset this menu will be added to.
-//==================================================================================================
-function TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, parentMenuSet) {
- // public methods
- this.addItem = addItem;
- this.addMenu = addMenu;
- this.toString = toString;
- this.initialize = initialize;
- this.isOpen = false;
- this.show = show;
- this.hide = hide;
- this.items = [];
-
- // events
- this.onactivate = new Function(); // when the menu starts to slide open
- this.ondeactivate = new Function(); // when the menu finishes sliding closed
- this.onmouseover = new Function(); // when the menu has been moused over
- this.onqueue = new Function(); // hack .. when the menu sets a timer to be closed a little while in the future
- this.ondequeue = new Function();
-
- // initialization
- this.index = TransMenu.registry.length;
- TransMenu.registry[this.index] = this;
-
- var id = "TransMenu" + this.index;
- var contentHeight = null;
- var contentWidth = null;
- var childMenuSet = null;
- var animating = false;
- var childMenus = [];
- var slideAccel = -1;
- var elmCache = null;
- var ready = false;
- var _this = this;
- var a = null;
-
- var pos = iDirection == TransMenu.direction.down ? "top" : "left";
- var dim = null;
-
- // private and public method implimentations
- function addItem(sText, sUrl) {
- var item = new TransMenuItem(sText, sUrl, this);
- item._index = this.items.length;
- this.items[item._index] = item;
- }
-
- function addMenu(oMenuItem) {
- if (!oMenuItem.parentMenu == this) throw new Error("Cannot add a menu here");
-
- if (childMenuSet == null) childMenuSet = new TransMenuSet(TransMenu.direction.right, -5, 2, TransMenu.reference.topRight);
-
- var m = childMenuSet.addMenu(oMenuItem);
-
- childMenus[oMenuItem._index] = m;
- m.onmouseover = child_mouseover;
- m.ondeactivate = child_deactivate;
- m.onqueue = child_queue;
- m.ondequeue = child_dequeue;
-
- return m;
- }
-
- function initialize() {
- initCache();
- initEvents();
- initSize();
- ready = true;
- }
-
- function show() {
- //dbg_dump("show");
- if (ready) {
- _this.isOpen = true;
- animating = true;
- setContainerPos();
- elmCache["clip"].style.visibility = "visible";
- elmCache["clip"].style.zIndex = TransMenu._maxZ++;
- //dbg_dump("maxZ: " + TransMenu._maxZ);
- slideStart();
- _this.onactivate();
- }
- }
-
- function hide() {
- if (ready) {
- _this.isOpen = false;
- animating = true;
-
- for (var i = 0, item = null; item = elmCache.item[i]; i++)
- dehighlight(item);
-
- if (childMenuSet) childMenuSet.hide();
-
- slideStart();
- _this.ondeactivate();
- }
- }
-
- function setContainerPos() {
- var sub = oActuator.constructor == TransMenuItem;
- var act = sub ? oActuator.parentMenu.elmCache["item"][oActuator._index] : oActuator;
- var el = act;
-
- var x = 0;
- var y = 0;
-
-
- var minX = 0;
- var maxX = (window.innerWidth ? window.innerWidth : document.body.clientWidth) - parseInt(elmCache["clip"].style.width);
- var minY = 0;
- var maxY = (window.innerHeight ? window.innerHeight : document.body.clientHeight) - parseInt(elmCache["clip"].style.height);
-
- // add up all offsets... subtract any scroll offset
- while (sub ? el.parentNode.className.indexOf("transMenu") == -1 : el.offsetParent) {
- x += el.offsetLeft;
- y += el.offsetTop;
-
- if (el.scrollLeft) x -= el.scrollLeft;
- if (el.scrollTop) y -= el.scrollTop;
-
- el = el.offsetParent;
- }
-
- if (oActuator.constructor == TransMenuItem) {
- x += parseInt(el.parentNode.style.left);
- y += parseInt(el.parentNode.style.top);
- }
-
- switch (iReferencePoint) {
- case TransMenu.reference.topLeft:
- break;
- case TransMenu.reference.topRight:
- x += act.offsetWidth;
- break;
- case TransMenu.reference.bottomLeft:
- y += act.offsetHeight;
- break;
- case TransMenu.reference.bottomRight:
- x += act.offsetWidth;
- y += act.offsetHeight;
- break;
- }
-
- x += iLeft;
- y += iTop;
-
- x = Math.max(Math.min(x, maxX), minX);
- y = Math.max(Math.min(y, maxY), minY);
-
- elmCache["clip"].style.left = x + "px";
- elmCache["clip"].style.top = y + "px";
- }
-
- function slideStart() {
- var x0 = parseInt(elmCache["content"].style[pos]);
- var x1 = _this.isOpen ? 0 : -dim;
-
- if (a != null) a.stop();
- a = new Accelimation(x0, x1, TransMenu.slideTime, slideAccel);
-
- a.onframe = slideFrame;
- a.onend = slideEnd;
-
- a.start();
- }
-
- function slideFrame(x) {
- elmCache["content"].style[pos] = x + "px";
- }
-
- function slideEnd() {
- if (!_this.isOpen) elmCache["clip"].style.visibility = "hidden";
- animating = false;
- }
-
- function initSize() {
- // everything is based off the size of the items table...
- var ow = elmCache["items"].offsetWidth;
- var oh = elmCache["items"].offsetHeight;
- var ua = navigator.userAgent.toLowerCase();
-
- // clipping container should be ow/oh + the size of the shadow
- elmCache["clip"].style.width = ow + TransMenu.shadowSize + 2 + "px";
- elmCache["clip"].style.height = oh + TransMenu.shadowSize + 2 + "px";
-
- // same with content...
- elmCache["content"].style.width = ow + TransMenu.shadowSize + "px";
- elmCache["content"].style.height = oh + TransMenu.shadowSize + "px";
-
- contentHeight = oh + TransMenu.shadowSize;
- contentWidth = ow + TransMenu.shadowSize;
-
- dim = iDirection == TransMenu.direction.down ? contentHeight : contentWidth;
-
- // set initially closed
- elmCache["content"].style[pos] = -dim - TransMenu.shadowSize + "px";
- elmCache["clip"].style.visibility = "hidden";
-
- // if *not* mac/ie 5
- if (ua.indexOf("mac") == -1 || ua.indexOf("gecko") > -1) {
- // set background div to offset size
- elmCache["background"].style.width = ow + "px";
- elmCache["background"].style.height = oh + "px";
- elmCache["background"].style.backgroundColor = TransMenu.backgroundColor;
-
- // shadow left starts at offset left and is offsetHeight pixels high
- elmCache["shadowRight"].style.left = ow + "px";
- elmCache["shadowRight"].style.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize) + "px";
- elmCache["shadowRight"].style.backgroundColor = TransMenu.shadowColor;
-
- // shadow bottom starts at offset height and is offsetWidth - shadowOffset
- // pixels wide (we don't want the bottom and right shadows to overlap or we
- // get an extra bright bottom-right corner)
- elmCache["shadowBottom"].style.top = oh + "px";
- elmCache["shadowBottom"].style.width = ow - TransMenu.shadowOffset + "px";
- elmCache["shadowBottom"].style.backgroundColor = TransMenu.shadowColor;
- }
- // mac ie is a little different because we use a PNG for the transparency
- else {
- // set background div to offset size
- elmCache["background"].firstChild.src = TransMenu.backgroundPng;
- elmCache["background"].firstChild.width = ow;
- elmCache["background"].firstChild.height = oh;
-
- // shadow left starts at offset left and is offsetHeight pixels high
- elmCache["shadowRight"].firstChild.src = TransMenu.shadowPng;
- elmCache["shadowRight"].style.left = ow + "px";
- elmCache["shadowRight"].firstChild.width = TransMenu.shadowSize;
- elmCache["shadowRight"].firstChild.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize);
-
- // shadow bottom starts at offset height and is offsetWidth - shadowOffset
- // pixels wide (we don't want the bottom and right shadows to overlap or we
- // get an extra bright bottom-right corner)
- elmCache["shadowBottom"].firstChild.src = TransMenu.shadowPng;
- elmCache["shadowBottom"].style.top = oh + "px";
- elmCache["shadowBottom"].firstChild.height = TransMenu.shadowSize;
- elmCache["shadowBottom"].firstChild.width = ow - TransMenu.shadowOffset;
- }
- }
-
- function initCache() {
- var menu = document.getElementById(id);
- var all = menu.all ? menu.all : menu.getElementsByTagName("*"); // IE/win doesn't support * syntax, but does have the document.all thing
-
- elmCache = {};
- elmCache["clip"] = menu;
- elmCache["item"] = [];
-
- for (var i = 0, elm = null; elm = all[i]; i++) {
- switch (elm.className) {
- case "items":
- case "content":
- case "background":
- case "shadowRight":
- case "shadowBottom":
- elmCache[elm.className] = elm;
- break;
- case "item":
- elm._index = elmCache["item"].length;
- elmCache["item"][elm._index] = elm;
- break;
- }
- }
-
- // hack!
- _this.elmCache = elmCache;
- }
-
- function initEvents() {
- // hook item mouseover
- for (var i = 0, item = null; item = elmCache.item[i]; i++) {
- item.onmouseover = item_mouseover;
- item.onmouseout = item_mouseout;
- item.onclick = item_click;
- }
-
- // hook actuation
- if (typeof oActuator.tagName != "undefined") {
- oActuator.onmouseover = actuator_mouseover;
- oActuator.onmouseout = actuator_mouseout;
- }
-
- // hook menu mouseover
- elmCache["content"].onmouseover = content_mouseover;
- elmCache["content"].onmouseout = content_mouseout;
- }
-
- function highlight(oRow) {
- oRow.className = "item hover";
- if (childMenus[oRow._index])
- oRow.lastChild.firstChild.src = TransMenu.dingbatOn;
- }
-
- function dehighlight(oRow) {
- oRow.className = "item";
- if (childMenus[oRow._index])
- oRow.lastChild.firstChild.src = TransMenu.dingbatOff;
- }
-
- function item_mouseover() {
- if (!animating) {
- highlight(this);
-
- if (childMenus[this._index])
- childMenuSet.showMenu(childMenus[this._index]);
- else if (childMenuSet) childMenuSet.hide();
- }
- }
-
- function item_mouseout() {
- if (!animating) {
- if (childMenus[this._index])
- childMenuSet.hideMenu(childMenus[this._index]);
- else // otherwise child_deactivate will do this
- dehighlight(this);
- }
- }
-
- function item_click() {
- if (!animating) {
- if (_this.items[this._index].url)
- location.href = _this.items[this._index].url;
- }
- }
-
- function actuator_mouseover() {
- parentMenuSet.showMenu(_this);
- }
-
- function actuator_mouseout() {
- parentMenuSet.hideMenu(_this);
- }
-
- function content_mouseover() {
- if (!animating) {
- parentMenuSet.showMenu(_this);
- _this.onmouseover();
- }
- }
-
- function content_mouseout() {
- if (!animating) {
- parentMenuSet.hideMenu(_this);
- }
- }
-
- function child_mouseover() {
- if (!animating) {
- parentMenuSet.showMenu(_this);
- }
- }
-
- function child_deactivate() {
- for (var i = 0; i < childMenus.length; i++) {
- if (childMenus[i] == this) {
- dehighlight(elmCache["item"][i]);
- break;
- }
- }
- }
-
- function child_queue() {
- parentMenuSet.hideMenu(_this);
- }
-
- function child_dequeue() {
- parentMenuSet.showMenu(_this);
- }
-
- function toString() {
- var aHtml = [];
- var sClassName = "transMenu" + (oActuator.constructor != TransMenuItem ? " top" : "");
-
- for (var i = 0, item = null; item = this.items[i]; i++) {
- aHtml[i] = item.toString(childMenus[i]);
- }
-
- return '<div id="' + id + '" class="' + sClassName + '">' +
- '<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">' +
- '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr>' +
- aHtml.join('') +
- '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr></table>' +
- '<div class="shadowBottom"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '<div class="shadowRight"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '<div class="background"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '</div></div>';
- }
-}
-
-
-//==================================================================================================
-// TransMenuSet
-//==================================================================================================
-// iDirection : The direction to slide out. One of TransMenu.direction.
-// iLeft : Left pixel offset of menus from actuator
-// iTop : Top pixel offset of menus from actuator
-// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
-//==================================================================================================
-TransMenuSet.registry = [];
-
-function TransMenuSet(iDirection, iLeft, iTop, iReferencePoint) {
- // public methods
- this.addMenu = addMenu;
- this.showMenu = showMenu;
- this.hideMenu = hideMenu;
- this.hide = hide;
- this.hideCurrent = hideCurrent;
-
- // initialization
- var menus = [];
- var _this = this;
- var current = null;
-
- this.index = TransMenuSet.registry.length;
- TransMenuSet.registry[this.index] = this;
-
- // method implimentations...
- function addMenu(oActuator) {
- var m = new TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, this);
- menus[menus.length] = m;
- return m;
- }
-
- function showMenu(oMenu) {
- if (oMenu != current) {
- // close currently open menu
- if (current != null) hide(current);
-
- // set current menu to this one
- current = oMenu;
-
- // if this menu is closed, open it
- oMenu.show();
- }
- else {
- // hide pending calls to close this menu
- cancelHide(oMenu);
- }
- }
-
- function hideMenu(oMenu) {
- //dbg_dump("hideMenu a " + oMenu.index);
- if (current == oMenu && oMenu.isOpen) {
- //dbg_dump("hideMenu b " + oMenu.index);
- if (!oMenu.hideTimer) scheduleHide(oMenu);
- }
- }
-
- function scheduleHide(oMenu) {
- //dbg_dump("scheduleHide " + oMenu.index);
- oMenu.onqueue();
- oMenu.hideTimer = window.setTimeout("TransMenuSet.registry[" + _this.index + "].hide(TransMenu.registry[" + oMenu.index + "])", TransMenu.hideDelay);
- }
-
- function cancelHide(oMenu) {
- //dbg_dump("cancelHide " + oMenu.index);
- if (oMenu.hideTimer) {
- oMenu.ondequeue();
- window.clearTimeout(oMenu.hideTimer);
- oMenu.hideTimer = null;
- }
- }
-
- function hide(oMenu) {
- if (!oMenu && current) oMenu = current;
-
- if (oMenu && current == oMenu && oMenu.isOpen) {
- hideCurrent();
- }
- }
-
- function hideCurrent() {
- if (null != current) {
- cancelHide(current);
- current.hideTimer = null;
- current.hide();
- current = null;
- }
- }
-}
-
-//==================================================================================================
-// TransMenuItem (internal)
-// represents an item in a dropdown
-//==================================================================================================
-// sText : The item display text
-// sUrl : URL to load when the item is clicked
-// oParent : Menu this item is a part of
-//==================================================================================================
-function TransMenuItem(sText, sUrl, oParent) {
- this.toString = toString;
- this.text = sText;
- this.url = sUrl;
- this.parentMenu = oParent;
-
- function toString(bDingbat) {
- var sDingbat = bDingbat ? TransMenu.dingbatOff : TransMenu.spacerGif;
- var iEdgePadding = TransMenu.itemPadding + TransMenu.menuPadding;
- var sPaddingLeft = "padding:" + TransMenu.itemPadding + "px; padding-left:" + iEdgePadding + "px;"
- var sPaddingRight = "padding:" + TransMenu.itemPadding + "px; padding-right:" + iEdgePadding + "px;"
-
- return '<tr class="item"><td nowrap style="' + sPaddingLeft + '">' +
- sText + '</td><td width="14" style="' + sPaddingRight + '">' +
- '<img src="' + sDingbat + '" width="14" height="14"></td></tr>';
- }
-}
-
-
-
-
-
-
-//=====================================================================
-// Accel[erated] [an]imation object
-// change a property of an object over time in an accelerated fashion
-//=====================================================================
-// obj : reference to the object whose property you'd like to animate
-// prop : property you would like to change eg: "left"
-// to : final value of prop
-// time : time the animation should take to run
-// zip : optional. specify the zippiness of the acceleration. pick a
-// number between -1 and 1 where -1 is full decelerated, 1 is
-// full accelerated, and 0 is linear (no acceleration). default
-// is 0.
-// unit : optional. specify the units for use with prop. default is
-// "px".
-//=====================================================================
-// bezier functions lifted from the lib_animation.js file in the
-// 13th Parallel API. www.13thparallel.org
-//=====================================================================
-
-function Accelimation(from, to, time, zip) {
- if (typeof zip == "undefined") zip = 0;
- if (typeof unit == "undefined") unit = "px";
-
- this.x0 = from;
- this.x1 = to;
- this.dt = time;
- this.zip = -zip;
- this.unit = unit;
- this.timer = null;
- this.onend = new Function();
- this.onframe = new Function();
-}
-
-
-
-//=====================================================================
-// public methods
-//=====================================================================
-
-// after you create an accelimation, you call this to start it-a runnin'
-Accelimation.prototype.start = function() {
- this.t0 = new Date().getTime();
- this.t1 = this.t0 + this.dt;
- var dx = this.x1 - this.x0;
- this.c1 = this.x0 + ((1 + this.zip) * dx / 3);
- this.c2 = this.x0 + ((2 + this.zip) * dx / 3);
- Accelimation._add(this);
-}
-
-// and if you need to stop it early for some reason...
-Accelimation.prototype.stop = function() {
- Accelimation._remove(this);
-}
-
-
-
-//=====================================================================
-// private methods
-//=====================================================================
-
-// paints one frame. gets called by Accelimation._paintAll.
-Accelimation.prototype._paint = function(time) {
- if (time < this.t1) {
- var elapsed = time - this.t0;
- this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));
- }
- else this._end();
-}
-
-// ends the animation
-Accelimation.prototype._end = function() {
- Accelimation._remove(this);
- this.onframe(this.x1);
- this.onend();
-}
-
-
-
-
-//=====================================================================
-// static methods (all private)
-//=====================================================================
-
-// add a function to the list of ones to call periodically
-Accelimation._add = function(o) {
- var index = this.instances.length;
- this.instances[index] = o;
- // if this is the first one, start the engine
- if (this.instances.length == 1) {
- this.timerID = window.setInterval("Accelimation._paintAll()", this.targetRes);
- }
-}
-
-// remove a function from the list
-Accelimation._remove = function(o) {
- for (var i = 0; i < this.instances.length; i++) {
- if (o == this.instances[i]) {
- this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) );
- break;
- }
- }
- // if that was the last one, stop the engine
- if (this.instances.length == 0) {
- window.clearInterval(this.timerID);
- this.timerID = null;
- }
-}
-
-// "engine" - call each function in the list every so often
-Accelimation._paintAll = function() {
- var now = new Date().getTime();
- for (var i = 0; i < this.instances.length; i++) {
- this.instances[i]._paint(now);
- }
-}
-
-
-// Bezier functions:
-Accelimation._B1 = function(t) { return t*t*t }
-Accelimation._B2 = function(t) { return 3*t*t*(1-t) }
-Accelimation._B3 = function(t) { return 3*t*(1-t)*(1-t) }
-Accelimation._B4 = function(t) { return (1-t)*(1-t)*(1-t) }
-
-
-//Finds the coordinates of a point at a certain stage through a bezier curve
-Accelimation._getBezier = function(percent,startPos,endPos,control1,control2) {
- return endPos * this._B1(percent) + control2 * this._B2(percent) + control1 * this._B3(percent) + startPos * this._B4(percent);
-}
-
-
-//=====================================================================
-// static properties
-//=====================================================================
-
-Accelimation.instances = [];
-Accelimation.targetRes = 10;
-Accelimation.timerID = null;
-
-
-//=====================================================================
-// IE win memory cleanup
-//=====================================================================
-
-if (window.attachEvent) {
- var cearElementProps = [
- 'data',
- 'onmouseover',
- 'onmouseout',
- 'onmousedown',
- 'onmouseup',
- 'ondblclick',
- 'onclick',
- 'onselectstart',
- 'oncontextmenu'
- ];
-
- window.attachEvent("onunload", function() {
- var el;
- for(var d = document.all.length;d--;){
- el = document.all[d];
- for(var c = cearElementProps.length;c--;){
- el[cearElementProps[c]] = null;
- }
- }
- });
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenuC.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenuC.js
deleted file mode 100644
index 88626c7..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenuC.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/* =================================================================================================
- * TransMenu
- * March, 2003
- * Customizable multi-level animated DHTML menus with transparency.
- * =================================================================================================
- * "Can I use this?"
- *
- * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
- * out at: http://creativecommons.org/licenses/by/2.0/
- *
- * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
- * for writing it. You may not misrepresent yourself as the author of this code.
- * =================================================================================================
- * "It's kinda hard to read, though"
- *
- * The uncompressed, commented version of this script can be found at:
- * http://youngpup.net/projects/transMenus
- * ============================================================================================== */
-TransMenu.spacerGif="themes/nervecenter/javascript/img/x.gif";TransMenu.dingbatOn="themes/nervecenter/javascript/img/submenu-on.gif";TransMenu.dingbatOff="themes/nervecenter/javascript/img/submenu-off.gif";TransMenu.dingbatSize=14;TransMenu.menuPadding=5;TransMenu.itemPadding=3;TransMenu.shadowSize=2;TransMenu.shadowOffset=3;TransMenu.shadowColor="#000000";TransMenu.shadowPng="themes/nervecenter/javascript/img/grey-40.png";TransMenu.backgroundColor="#990000";TransMenu.backgroundPng="themes/nervecenter/javascript/img/white-90.png";TransMenu.hideDelay=1000;TransMenu.slideTime=400;TransMenu.reference={topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};TransMenu.direction={down:1,right:2};TransMenu.registry=[];TransMenu._maxZ=100;TransMenu.isSupported=function(){var ua=navigator.userAgent.toLowerCase();var pf=navigator.platform.toLowerCase();var an=navigator.appName;var r=false;if(ua.indexOf("gecko")>-1&&navigator.productSub>=20020605)r=true;else if(an=="Microsoft Internet Explorer"){if(document.getElementById){if(pf.indexOf("mac")==0){r=/msie (\d(.\d*)?)/.test(ua)&&Number(RegExp.$1)>=5.1;}
-else r=true;}}
-return r;}
-TransMenu.initialize=function(){for(var i=0,menu=null;menu=this.registry[i];i++){menu.initialize();}}
-TransMenu.renderAll=function(){var aMenuHtml=[];for(var i=0,menu=null;menu=this.registry[i];i++){aMenuHtml[i]=menu.toString();}
-document.write(aMenuHtml.join(""));}
-function TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,parentMenuSet){this.addItem=addItem;this.addMenu=addMenu;this.toString=toString;this.initialize=initialize;this.isOpen=false;this.show=show;this.hide=hide;this.items=[];this.onactivate=new Function();this.ondeactivate=new Function();this.onmouseover=new Function();this.onqueue=new Function();this.ondequeue=new Function();this.index=TransMenu.registry.length;TransMenu.registry[this.index]=this;var id="TransMenu"+this.index;var contentHeight=null;var contentWidth=null;var childMenuSet=null;var animating=false;var childMenus=[];var slideAccel=-1;var elmCache=null;var ready=false;var _this=this;var a=null;var pos=iDirection==TransMenu.direction.down?"top":"left";var dim=null;function addItem(sText,sUrl){var item=new TransMenuItem(sText,sUrl,this);item._index=this.items.length;this.items[item._index]=item;}
-function addMenu(oMenuItem){if(!oMenuItem.parentMenu==this)throw new Error("Cannot add a menu here");if(childMenuSet==null)childMenuSet=new TransMenuSet(TransMenu.direction.right,-5,2,TransMenu.reference.topRight);var m=childMenuSet.addMenu(oMenuItem);childMenus[oMenuItem._index]=m;m.onmouseover=child_mouseover;m.ondeactivate=child_deactivate;m.onqueue=child_queue;m.ondequeue=child_dequeue;return m;}
-function initialize(){initCache();initEvents();initSize();ready=true;}
-function show(){if(ready){_this.isOpen=true;animating=true;setContainerPos();elmCache["clip"].style.visibility="visible";elmCache["clip"].style.zIndex=TransMenu._maxZ++;slideStart();_this.onactivate();}}
-function hide(){if(ready){_this.isOpen=false;animating=true;for(var i=0,item=null;item=elmCache.item[i];i++)dehighlight(item);if(childMenuSet)childMenuSet.hide();slideStart();_this.ondeactivate();}}
-function setContainerPos(){var sub=oActuator.constructor==TransMenuItem;var act=sub?oActuator.parentMenu.elmCache["item"][oActuator._index]:oActuator;var el=act;var x=0;var y=0;var minX=0;var maxX=(window.innerWidth?window.innerWidth:document.body.clientWidth)-parseInt(elmCache["clip"].style.width);var minY=0;var maxY=(window.innerHeight?window.innerHeight:document.body.clientHeight)-parseInt(elmCache["clip"].style.height);while(sub?el.parentNode.className.indexOf("transMenu")==-1:el.offsetParent){x+=el.offsetLeft;y+=el.offsetTop;if(el.scrollLeft)x-=el.scrollLeft;if(el.scrollTop)y-=el.scrollTop;el=el.offsetParent;}
-if(oActuator.constructor==TransMenuItem){x+=parseInt(el.parentNode.style.left);y+=parseInt(el.parentNode.style.top);}
-switch(iReferencePoint){case TransMenu.reference.topLeft:break;case TransMenu.reference.topRight:x+=act.offsetWidth;break;case TransMenu.reference.bottomLeft:y+=act.offsetHeight;break;case TransMenu.reference.bottomRight:x+=act.offsetWidth;y+=act.offsetHeight;break;}
-x+=iLeft;y+=iTop;x=Math.max(Math.min(x,maxX),minX);y=Math.max(Math.min(y,maxY),minY);elmCache["clip"].style.left=x+"px";elmCache["clip"].style.top=y+"px";}
-function slideStart(){var x0=parseInt(elmCache["content"].style[pos]);var x1=_this.isOpen?0:-dim;if(a!=null)a.stop();a=new Accelimation(x0,x1,TransMenu.slideTime,slideAccel);a.onframe=slideFrame;a.onend=slideEnd;a.start();}
-function slideFrame(x){elmCache["content"].style[pos]=x+"px";}
-function slideEnd(){if(!_this.isOpen)elmCache["clip"].style.visibility="hidden";animating=false;}
-function initSize(){var ow=elmCache["items"].offsetWidth;var oh=elmCache["items"].offsetHeight;var ua=navigator.userAgent.toLowerCase();elmCache["clip"].style.width=ow+TransMenu.shadowSize+2+"px";elmCache["clip"].style.height=oh+TransMenu.shadowSize+2+"px";elmCache["content"].style.width=ow+TransMenu.shadowSize+"px";elmCache["content"].style.height=oh+TransMenu.shadowSize+"px";contentHeight=oh+TransMenu.shadowSize;contentWidth=ow+TransMenu.shadowSize;dim=iDirection==TransMenu.direction.down?contentHeight:contentWidth;elmCache["content"].style[pos]=-dim-TransMenu.shadowSize+"px";elmCache["clip"].style.visibility="hidden";if(ua.indexOf("mac")==-1||ua.indexOf("gecko")>-1){elmCache["background"].style.width=ow+"px";elmCache["background"].style.height=oh+"px";elmCache["background"].style.backgroundColor=TransMenu.backgroundColor;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].style.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize)+"px";elmCache["shadowRight"].style.backgroundColor=TransMenu.shadowColor;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].style.width=ow-TransMenu.shadowOffset+"px";elmCache["shadowBottom"].style.backgroundColor=TransMenu.shadowColor;}
-else{elmCache["background"].firstChild.src=TransMenu.backgroundPng;elmCache["background"].firstChild.width=ow;elmCache["background"].firstChild.height=oh;elmCache["shadowRight"].firstChild.src=TransMenu.shadowPng;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].firstChild.width=TransMenu.shadowSize;elmCache["shadowRight"].firstChild.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize);elmCache["shadowBottom"].firstChild.src=TransMenu.shadowPng;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].firstChild.height=TransMenu.shadowSize;elmCache["shadowBottom"].firstChild.width=ow-TransMenu.shadowOffset;}}
-function initCache(){var menu=document.getElementById(id);var all=menu.all?menu.all:menu.getElementsByTagName("*");elmCache={};elmCache["clip"]=menu;elmCache["item"]=[];for(var i=0,elm=null;elm=all[i];i++){switch(elm.className){case"items":case"content":case"background":case"shadowRight":case"shadowBottom":elmCache[elm.className]=elm;break;case"item":elm._index=elmCache["item"].length;elmCache["item"][elm._index]=elm;break;}}
-_this.elmCache=elmCache;}
-function initEvents(){for(var i=0,item=null;item=elmCache.item[i];i++){item.onmouseover=item_mouseover;item.onmouseout=item_mouseout;item.onclick=item_click;}
-if(typeof oActuator.tagName!="undefined"){oActuator.onmouseover=actuator_mouseover;oActuator.onmouseout=actuator_mouseout;}
-elmCache["content"].onmouseover=content_mouseover;elmCache["content"].onmouseout=content_mouseout;}
-function highlight(oRow){oRow.className="item hover";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOn;}
-function dehighlight(oRow){oRow.className="item";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOff;}
-function item_mouseover(){if(!animating){highlight(this);if(childMenus[this._index])childMenuSet.showMenu(childMenus[this._index]);else if(childMenuSet)childMenuSet.hide();}}
-function item_mouseout(){if(!animating){if(childMenus[this._index])childMenuSet.hideMenu(childMenus[this._index]);else dehighlight(this);}}
-function item_click(){if(!animating){if(_this.items[this._index].url)location.href=_this.items[this._index].url;}}
-function actuator_mouseover(){parentMenuSet.showMenu(_this);}
-function actuator_mouseout(){parentMenuSet.hideMenu(_this);}
-function content_mouseover(){if(!animating){parentMenuSet.showMenu(_this);_this.onmouseover();}}
-function content_mouseout(){if(!animating){parentMenuSet.hideMenu(_this);}}
-function child_mouseover(){if(!animating){parentMenuSet.showMenu(_this);}}
-function child_deactivate(){for(var i=0;i<childMenus.length;i++){if(childMenus[i]==this){dehighlight(elmCache["item"][i]);break;}}}
-function child_queue(){parentMenuSet.hideMenu(_this);}
-function child_dequeue(){parentMenuSet.showMenu(_this);}
-function toString(){var aHtml=[];var sClassName="transMenu"+(oActuator.constructor!=TransMenuItem?" top":"");for(var i=0,item=null;item=this.items[i];i++){aHtml[i]=item.toString(childMenus[i]);}
-return'<div id="'+id+'" class="'+sClassName+'">'+'<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">'+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr>'+aHtml.join('')+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr></table>'+'<div class="shadowBottom"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="shadowRight"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="background"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'</div></div>';}}
-TransMenuSet.registry=[];function TransMenuSet(iDirection,iLeft,iTop,iReferencePoint){this.addMenu=addMenu;this.showMenu=showMenu;this.hideMenu=hideMenu;this.hide=hide;this.hideCurrent=hideCurrent;var menus=[];var _this=this;var current=null;this.index=TransMenuSet.registry.length;TransMenuSet.registry[this.index]=this;function addMenu(oActuator){var m=new TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,this);menus[menus.length]=m;return m;}
-function showMenu(oMenu){if(oMenu!=current){if(current!=null)hide(current);current=oMenu;oMenu.show();}
-else{cancelHide(oMenu);}}
-function hideMenu(oMenu){if(current==oMenu&&oMenu.isOpen){if(!oMenu.hideTimer)scheduleHide(oMenu);}}
-function scheduleHide(oMenu){oMenu.onqueue();oMenu.hideTimer=window.setTimeout("TransMenuSet.registry["+_this.index+"].hide(TransMenu.registry["+oMenu.index+"])",TransMenu.hideDelay);}
-function cancelHide(oMenu){if(oMenu.hideTimer){oMenu.ondequeue();window.clearTimeout(oMenu.hideTimer);oMenu.hideTimer=null;}}
-function hide(oMenu){if(!oMenu&&current)oMenu=current;if(oMenu&&current==oMenu&&oMenu.isOpen){hideCurrent();}}
-function hideCurrent(){if (null != current){cancelHide(current);current.hideTimer=null;current.hide();current=null;}}}
-function TransMenuItem(sText,sUrl,oParent){this.toString=toString;this.text=sText;this.url=sUrl;this.parentMenu=oParent;function toString(bDingbat){var sDingbat=bDingbat?TransMenu.dingbatOff:TransMenu.spacerGif;var iEdgePadding=TransMenu.itemPadding+TransMenu.menuPadding;var sPaddingLeft="padding:"+TransMenu.itemPadding+"px; padding-left:"+iEdgePadding+"px;"
-var sPaddingRight="padding:"+TransMenu.itemPadding+"px; padding-right:"+iEdgePadding+"px;"
-return'<tr class="item"><td nowrap style="'+sPaddingLeft+'">'+sText+'</td><td width="14" style="'+sPaddingRight+'">'+'<img src="'+sDingbat+'" width="14" height="14"></td></tr>';}}
-function Accelimation(from,to,time,zip){if(typeof zip=="undefined")zip=0;if(typeof unit=="undefined")unit="px";this.x0=from;this.x1=to;this.dt=time;this.zip=-zip;this.unit=unit;this.timer=null;this.onend=new Function();this.onframe=new Function();}
-Accelimation.prototype.start=function(){this.t0=new Date().getTime();this.t1=this.t0+this.dt;var dx=this.x1-this.x0;this.c1=this.x0+((1+this.zip)*dx/3);this.c2=this.x0+((2+this.zip)*dx/3);Accelimation._add(this);}
-Accelimation.prototype.stop=function(){Accelimation._remove(this);}
-Accelimation.prototype._paint=function(time){if(time<this.t1){var elapsed=time-this.t0;this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));}
-else this._end();}
-Accelimation.prototype._end=function(){Accelimation._remove(this);this.onframe(this.x1);this.onend();}
-Accelimation._add=function(o){var index=this.instances.length;this.instances[index]=o;if(this.instances.length==1){this.timerID=window.setInterval("Accelimation._paintAll()",this.targetRes);}}
-Accelimation._remove=function(o){for(var i=0;i<this.instances.length;i++){if(o==this.instances[i]){this.instances=this.instances.slice(0,i).concat(this.instances.slice(i+1));break;}}
-if(this.instances.length==0){window.clearInterval(this.timerID);this.timerID=null;}}
-Accelimation._paintAll=function(){var now=new Date().getTime();for(var i=0;i<this.instances.length;i++){this.instances[i]._paint(now);}}
-Accelimation._B1=function(t){return t*t*t}
-Accelimation._B2=function(t){return 3*t*t*(1-t)}
-Accelimation._B3=function(t){return 3*t*(1-t)*(1-t)}
-Accelimation._B4=function(t){return(1-t)*(1-t)*(1-t)}
-Accelimation._getBezier=function(percent,startPos,endPos,control1,control2){return endPos*this._B1(percent)+control2*this._B2(percent)+control1*this._B3(percent)+startPos*this._B4(percent);}
-Accelimation.instances=[];Accelimation.targetRes=10;Accelimation.timerID=null;
-if(window.attachEvent){var cearElementProps=['data','onmouseover','onmouseout','onmousedown','onmouseup','ondblclick','onclick','onselectstart','oncontextmenu'];window.attachEvent("onunload", function() {var el;for(var d=document.all.length;d--;){el=document.all[d];for(var c=cearElementProps.length;c--;){el[cearElementProps[c]] = null;}}});} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/jsevents/body.def b/src/usr/local/www/themes/pfsense_ng_fs/jsevents/body.def
deleted file mode 100644
index df461e2..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/jsevents/body.def
+++ /dev/null
@@ -1,7 +0,0 @@
-# Format: <event_name>=<jsfunction_name> !<forbidden_page_0>,<forbidden_page_1>...<forbidden_page_n>
-# where: forbidden pages are those pages that should *not* use
-# the particular JavaScript function within the JS event
-# specified below.
-# $Id: body.def,v 1.2.2.1 2007/01/17 18:43:52 sullrich Exp $
-#
-onload=tmenuinit(); !wizard.php \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/loader.js b/src/usr/local/www/themes/pfsense_ng_fs/loader.js
deleted file mode 100644
index c8ebe60..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/loader.js
+++ /dev/null
@@ -1,294 +0,0 @@
-//<![CDATA[
-var browser = '';
-var version = '';
-var entrance = '';
-var cond = '';
-
-// BROWSER?
-if (browser == '')
-{
- if (navigator.appName.indexOf('Microsoft') != -1)
- browser = 'IE';
- else if (navigator.appName.indexOf('Netscape') != -1)
- browser = 'Netscape';
- else
- browser = 'IE';
-}
-if (version == '')
-{
- version= navigator.appVersion;
- paren = version.indexOf('(');
- whole_version = navigator.appVersion.substring(0,paren-1);
- version = parseInt(whole_version);
-}
-
-if (browser == 'IE' && version < 7)
- document.write('<script type="text/javascript" src="/themes/pfsense_ng/javascript/ie7/ie7-standard-p.js"></script>');
-
-document.write('<script type="text/javascript" src="/themes/pfsense_ng/javascript/niftyjsCode.js"></script>');
-
-///////////////////////////////////////////
-// jQuery code for columns / widgets part 1
-///////////////////////////////////////////
-
-var noCols = 2;
-var printed3 = false;
-var printed4 = false;
-var printed5 = false;
-var printed6 = false;
-var printed7 = false;
-var printed8 = false;
-var printed9 = false;
-var printed10 = false;
-var id;
-var noColsOnLoad = noCols; // holds a reference to the number of displayed columns on load
-var existing =[]; // array to hold each columns contents
-var specifiedColWidth = 350; // width of columns for resizing
-
-///////////////////////////////////////////
-// jQuery Widget functions
-///////////////////////////////////////////
-
-// function to connect all columns to each other to allow jQuery interaction (drag and droppable)
-function connectColumns()
-{
- jQuery('.ui-sortable').sortable({connectWith: '.ui-sortable', dropOnEmpty: true, handle: '.widgetheader', change: showSave});
-}
-
-// function to add columns due to a window resize
-function resizeAddColumns()
-{
- if(noColsOnLoad > noCols) // if a column has previously been deleted
- {
- var maxCols = maxColsToDisplay(); // the maximum we can display
-
- if(noColsOnLoad < maxCols) // if the number of columns on load is less then the maximum number of columns we can display
- maxCols = noColsOnLoad; // change the maximum number of columns as we do not want to display them all
- if( (maxCols - noCols) > 0 ) // if we need to add more columns
- {
- replaceColumn();
-
- for(var i=noCols; i<maxCols; i++)
- {
- var addCols = i +1;
- jQuery('#col' + (i).toString() ).after("<div id=\"col" + addCols + "\" style=\"float: left; padding-bottom: 40px\" class=\"ui-sortable\"> </div>");
- jQuery(existing[i]).appendTo('#col' + addCols ); // append onLoad contents
- }
- noCols = maxCols;
- for(var i=noCols; i<noColsOnLoad ; i++)
- {
- jQuery(existing[i]).appendTo('#col' + maxCols ); // append widgets from stored array to columns
- }
- correctWidgetDisplay(noCols);
- connectColumns();
- showSave();
- }
- }
-}
-
-
-// function to remove columns due to a window resize
-function resizeRmColumns()
-{
- if( noCols > 1 ) // keep at least 1 column displayed at all times
- {
- var maxCols = maxColsToDisplay();
- var noColsToDel = noCols - maxCols;
-
- if(noColsToDel>0) // if columns need deleteing
- {
- for(var i=(noCols-noColsToDel); i<noColsOnLoad; i++)
- {
- jQuery(existing[i]).appendTo('#col' + maxCols ); // append widgets from stored array to columns
- }
- for(var i=0; i<noColsToDel; i++ )
- {
- var del = noCols -i;
- jQuery('#col' + del ).remove(); // remove columns
- }
- noCols = maxCols;
- correctWidgetDisplay(noCols);
- showSave();
- }
- }
-};
-
-
-// functions to removes the highest value column current displayed and replaces it with the same column number on load ie before any resizing took place
-function replaceColumn()
-{
- var tmpReplace = noCols -1;
- jQuery('#col' + noCols ).remove();
-
- // prepend column1 as we can't add it AFTER a column as none will exist
- if(tmpReplace==0)
- jQuery("#niftyOutter").prepend("<div id=\"col1\" style=\"float: left; padding-bottom: 40px\" class=\"ui-sortable\"> </div>");
- else
- jQuery('#col' + (tmpReplace).toString() ).after("<div id=\"col" + noCols + "\" style=\"float: left; padding-bottom: 40px\" class=\"ui-sortable\"> </div>");
- jQuery(existing[tmpReplace]).appendTo('#col' + noCols);
-}
-
-
-// function to calculate & return the maximum number of columns we can display
-function maxColsToDisplay()
-{
- var niftyWidth = jQuery('#niftyOutter.fakeClass').width();
- return Math.round(niftyWidth / specifiedColWidth);
-}
-
-// function to amend the widget width
-function correctWidgetDisplay(noCols)
-{
- var percent = ( 100 / noCols ) - 0.1;
- var percentStr = percent.toString() + '%';
-
- // set all column widths
- jQuery('.ui-sortable').width(percentStr);
-}
-
-// function to insert a new column we can place content into (from saved state)
-function printColumn(newNum)
-{
- if(newNum > noCols)
- {
- noCols = newNum;
- noColsOnLoad = noCols;
- }
-
- document.write("</div><div id=\"col" + newNum + "\" style=\"float:left; padding-bottom:40px\" class=\"ui-sortable\">");
- correctWidgetDisplay(noCols);
- connectColumns();
-}
-
-// function to create the columns
-function createColumn(colPos)
-{
- if (colpos == "col3" && printed3 == false){
- printColumn(3);
- printed3=true;
- }
- else if (colpos == "col4" && printed4 == false){
- printColumn(4);
- printed4=true;
- }
- else if (colpos == "col5" && printed5 == false){
- printColumn(5);
- printed5=true;
- }
- else if (colpos == "col6" && printed6 == false){
- printColumn(6);
- printed6=true;
- }
- else if (colpos == "col7" && printed7 == false){
- printColumn(7);
- printed7=true;
- }
- else if (colpos == "col8" && printed8 == false){
- printColumn(8);
- printed8=true;
- }
- else if (colpos == "col9" && printed9 == false){
- printColumn(9);
- printed9=true;
- }
- else if (colpos == "col10" && printed10 == false){
- printColumn(10);
- printed10=true;
- }
-}
-
-// function which is called when the broswer window is resized
-jQuery( window ).resize(function()
-{
- // stop resize firing twice: http://stackoverflow.com/questions/4298612/jquery-how-to-call-resize-event-only-once-its-finished-resizing
- clearTimeout(id);
- id = setTimeout(finishedResizing, 500);
-});
-
-// function called after the browser has finished resizing
-function finishedResizing()
-{
- var colWidth = jQuery("#col1").width();
- if( colWidth < specifiedColWidth ) // Columns width is too small to display all the columns properly so we delete some columns and resize the remaining columns
- resizeRmColumns(); // Check if we can delete any columns
- else if( colWidth > specifiedColWidth ) // Columns width COULD display more columns properly
- resizeAddColumns(); // Check if we can add any columns
-}
-
-///////////////// end widget code part 1 /////////////////////////
-
-// jQuery function to define dropdown menu size
-jQuery(document).ready(function ()
-{
- var hwindow = '';
- hwindow = (jQuery(window).height()-35);
- // Force the size dropdown menu
- jQuery('#navigation ul li ul').css('max-height', hwindow);
-
- ///////////////////////////////////////////
- // jQuery code for columns / widgets part 2
- ///////////////////////////////////////////
-
- // insert add/delete column buttons
- jQuery('<br /><br /><div id=\"columnModifier\"><div style=\"float:left\"><div id =\"addCol\" style=\"float:left\"><img src=\"./themes/pfsense_ng_fs/images/icons/icon_plus.gif\" style=\"cursor:pointer\" alt=\"Click here to add a column\"/></div>&nbsp;Add column&nbsp;</div><div style=\"float:left\"><div id =\"delCol\" style=\"float:left\"><img src=\"./themes/pfsense_ng_fs/images/icons/icon_x.gif\" style=\"cursor:pointer\" alt=\"Click here to delete a column\"/></div>&nbsp;Delete column</div><div id=\"columnWarningText\" style=\"float:left; margin-left:5em\"></div><br /><br />').insertBefore('#niftyOutter.fakeClass');
-
- if ( jQuery('#columnModifier').length > 0 ) // only perform resizing on the dashboard page
- {
- // correct the css for column 2
- jQuery('#col2').css("float","left");
-
- // Make a copy of the current state of columns on page load
- for ( var i = 1; i <= noCols; i = i + 1 )
- {
- var contents = jQuery('#col' + i ).html();
- existing.push( contents );
- }
-
- finishedResizing(); // on page load correct display of columns to fit
- }
-
- // on click add a new column and change column widths
- jQuery('#addCol').click(function()
- {
- var maxCols = maxColsToDisplay();
- if( (noCols < maxCols) && (noCols < 10) )
- {
- var colAfter = noCols;
- noCols++;
-
- // insert new column
- jQuery('#col' + (colAfter).toString() ).after("<div id=\"col" + noCols + "\" style=\"float: left; padding-bottom: 40px\" class=\"ui-sortable\"> </div>");
-
- correctWidgetDisplay(noCols);
- connectColumns();
- }
- else
- jQuery('#columnWarningText').html('<b>Maximum number of columns reached for the current window size</b>').show().delay(1000).fadeOut(1000);
- });
-
- // on click delete a columns and change column widths
- jQuery('#delCol').click(function()
- {
- if( noCols > 1 )
- {
- var colToDel = noCols;
- noCols -= 1;
-
- correctWidgetDisplay(noCols);
-
- // get column contents before deletion
- var colContent = jQuery('#col' + colToDel ).html();
-
- // remove column
- jQuery('#col' + colToDel ).remove();
-
- // append deleted columns content to preceeding column
- jQuery(colContent).appendTo('#col' + noCols );
-
- showSave();
- }
- else
- jQuery('#columnWarningText').html('<b>Minimum number of columns reached for the current window size</b>').show().delay(1000).fadeOut(1000);
- });
-});
-//]]>
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/login.css b/src/usr/local/www/themes/pfsense_ng_fs/login.css
deleted file mode 100644
index f8abdfc..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/login.css
+++ /dev/null
@@ -1,1127 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #999999;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- background-position : center 0px;
- background-color: #999999;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-
-#login {
-/* background: #cccccc; */
- background-color: transparent;
- border: 0px solid #cccccc;
- margin: 5em auto;
- padding: 0em;
- width: 400px;
-/* filter:alpha(opacity=60);
- -moz-opacity:0.6;
- -khtml-opacity: 0.6;
- opacity: 0.6; */
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
-/* background: #ffffff; */
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 400px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -420px;
- left: 70px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- top: -300px; */
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- left: 10px;
- top: -300px; */
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- text-align: center;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -20px;
- left: 170px;
-}
-
-/* loginerror box follows */
-
-#login #inputerrors {
- background-color: transparent;
- border: 0px solid #666666;
- margin: 5em auto;
- vertical-align: middle;
- padding: 0em;
- width: 330px;
- height: 50px;
- position: relative;
- top: -370px;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/menu.inc b/src/usr/local/www/themes/pfsense_ng_fs/menu.inc
deleted file mode 100644
index d703daf..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/menu.inc
+++ /dev/null
@@ -1,177 +0,0 @@
-<?php
-/* $Id: menu.inc,v 1.3.2.1 2007/01/17 18:43:30 sullrich Exp $ */
-/* ========================================================================== */
-/*
- menu.inc
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-require("menu.inc");
-
-define("TMENU_STUB", "
- // set up drop downs anywhere in the body of the page. I think the bottom of the page is better..
- // but you can experiment with effect on loadtime.
- if (TransMenu.isSupported()) {
-
- //==================================================================================================
- // create a set of dropdowns
- //==================================================================================================
- // the first param should always be down, as it is here
- //
- // The second and third param are the top and left offset positions of the menus from their actuators
- // respectively. To make a menu appear a little to the left and bottom of an actuator, you could use
- // something like -5, 5
- //
- // The last parameter can be .topLeft, .bottomLeft, .topRight, or .bottomRight to inidicate the corner
- // of the actuator from which to measure the offset positions above. Here we are saying we want the
- // menu to appear directly below the bottom left corner of the actuator
- //==================================================================================================
- var ms = new TransMenuSet(TransMenu.direction.down, 1, 0, TransMenu.reference.bottomLeft);
-
- //==================================================================================================
- // create a dropdown menu
- //==================================================================================================
- // the first parameter should be the HTML element which will act actuator for the menu
- //==================================================================================================
-
- @@MENU_DEFINITIONS@@
-
- //==================================================================================================
- // write drop downs into page
- //==================================================================================================
- // this method writes all the HTML for the menus into the page with document.write(). It must be
- // called within the body of the HTML page.
- //==================================================================================================
- TransMenu.renderAll();
- }
-");
-
-class NervecenterMenu extends Menu {
- private $menuJScript = "NOT-SET";
- private $menuJScriptEvents = "NOT-SET";
- private $menuID = "NOT-SET";
-
- public function __construct($identification = "", $filename = "", Component $c = NULL) {
- parent::__construct($identification, $filename, $c);
-
- $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
- $this->menuID = $id;
-
- if ($this->hasParent()) {
- $this->menuJScript = "\tvar {$id} = ms.addMenu(document.getElementById('{$id}'));\n";
- }
- } // end __construct
-
- public function getMenuID() {
- return $this->menuID;
- }
-
- public function setMenuID($myMenuID) {
- $this->menuID = $myMenuID;
- }
-
- public function getMenuJScript() {
- $childJScript = "";
- foreach ($this->getChildren() as $component) {
- $childJScript .= $component->getMenuJScript();
- }
-
- if (! $this->hasParent()) {
- $this->menuJScript = str_replace("@@MENU_DEFINITIONS@@", $childJScript, TMENU_STUB);
- } else {
- $this->menuJScript .= "\n$childJScript\n";
- }
-
- return $this->menuJScript;
- }
-
- public function getMenuJScriptEvents() {
- return $this->menuJScriptEvents;
- }
-
- public function __toString() {
- if (! $this->hasParent()) {
- $menuMarkup =<<<EOD
- <div id="menu">
- @@CHILD_ELEMENTS@@
- </div>
-
-EOD;
- } else {
- $name = gettext($this->getID());
- $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
-
- $menuMarkup =<<<EOD
- <a id="{$id}" href="#">{$name}</a>
- @@CHILD_ELEMENTS@@
-EOD;
- }
-
- $childMarkup = "";
- foreach ($this->getChildren() as $component) {
- $childMarkup .= $component;
- }
-
- $menuMarkup = str_replace("@@CHILD_ELEMENTS@@", $childMarkup, $menuMarkup);
-
- return $menuMarkup;
- }
-}
-
-class NervecenterMenuItem extends MenuItem {
- private $menuJScript = "NOT-SET";
- private $menuJScriptEvents = "NOT-SET";
-
- public function __construct($identification = "", $filename = "", $href = "", Component $c = NULL) {
- parent::__construct($identification, $filename, $href, $c);
-
- $href = $this->getHref() <> "" ? $this->getHref() : "{$this->getFile()}";
- $name = gettext($this->getID());
- $file = $this->getFile();
-
- $this->menuJScript = $this->check_access("{$file}", "\t{$this->getParent()->getMenuID()}.addItem('{$name}', '{$href}');\n");
- }
-
- public function getMenuJScript() {
- return $this->menuJScript;
- }
-
- public function getMenuJScriptEvents() {
- return $this->menuJScriptEvents;
- }
-
- public function __toString() {
- return "";
- }
-}
-
-?>
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/new_tab_menu.css b/src/usr/local/www/themes/pfsense_ng_fs/new_tab_menu.css
deleted file mode 100644
index 04c4cf2..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/new_tab_menu.css
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- new_tab_menu.css
- part of pfSense
- Copyright (C) 2010-2011 Robert Zelaya
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
-
- Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
- The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
-
- <tr>
- <td>
- <?php
- $tab_array_indent = 0; // move to the line in px
- $tab_array_space = 1; // space betwen lines in px
- $tab_array_char_limit = 82; // number or chr before the drop down box
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
-
-*/
-
-.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
-
-.newtabmenu li{float:left; margin-right:2px; text-align: center;}
-.newtabmenu a:link, .newtabmenu a:visited{
- background:url(images/new_tab_menu.png) right 45px;
- color:#ffffff; /* noactive font */
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- font-weight:bold;
- font-size:.9em;
- height:20px;
- line-height:20px;
- text-decoration:none;
-}
-.newtabmenu a span{
- background:url(images/new_tab_menu.png) left 45px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- height:20px;
- margin-right:7px;
- padding-left:7px;
-}
-.newtabmenu a:hover{
- background:url(images/new_tab_menu.png) right 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- color:#ffffff; /* hover over font */
-}
-.newtabmenu a:hover span{
- background:url(images/new_tab_menu.png) left 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
-}
-
-/* -------------------------------- */
-/* ACTIVE ELEMENTS */
-.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
- color:#000000; /* active font */
- background:url(images/new_tab_menu.png) right 0 no-repeat;
-}
-.newtabmenu_active a span, .newtabmenu_active a:hover span{
- background:url(images/new_tab_menu.png) left 0 no-repeat;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/no_big_logo b/src/usr/local/www/themes/pfsense_ng_fs/no_big_logo
deleted file mode 100644
index 6e5c70d..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/no_big_logo
+++ /dev/null
@@ -1 +0,0 @@
-NO! DONT! \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/rrdcolors.inc.php b/src/usr/local/www/themes/pfsense_ng_fs/rrdcolors.inc.php
deleted file mode 100644
index dcb7a39..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/rrdcolors.inc.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/* $Id$ */
-/*
- rrdcolors.inc.php
- Part of pfSense
- Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/* This file is included by the RRD graphing page and sets the colors */
-
-/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* 95th Percentile Lines Out, In */
-$colortraffic95 = array('660000', 'FF0000');
-
-/* State Table pfrate, pfstates, pfnat, srcip, dstip */
-$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
-
-/* Processor Usage user, nice, system, int, processes */
-$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
-
-/* Memory Usage active, inact, free, cache, wire */
-$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
-
-/* MBUF Usage current, cache, total, max */
-$colormbuf = array('0080FF','00E344','FF0000','000000');
-
-/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
-$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
-$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
-/* Quality Graph Loss */
-$colorqualityloss = 'ee0000';
-
-/* Wireless Graph SNR, Rate, Channel*/
-/* Cellular Graph RSSI, */
-$colorwireless = array('333333','a83c3c','999999');
-
-/* SPAMD Times min area, avg area, max area, Time line */
-$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
-/* SPAMD Connections max area, min area, min line, max line, avg line */
-$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
-
-/* OpenVPN Users Online Users */
-$colorvpnusers = array('990000');
-
-/* Captive Portal Total Users Total Users */
-/* Captive Portal Concurrent Concurrent Users */
-$colorcaptiveportalusers = array('990000');
-
-?>
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/pfsense_ng_fs/styles/jquery-ui-1.11.1.css
deleted file mode 100644
index 8a8c54f..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/styles/jquery-ui-1.11.1.css
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*! jQuery UI - v1.11.1 - 2014-09-22
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.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:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-clearfix {
- min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* 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: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.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: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- 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;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- min-height: 0; /* support: IE7 */
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
- position: absolute;
- left: .5em;
- top: 50%;
- margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-button {
- display: inline-block;
- position: relative;
- padding: 0;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
- width: 2.4em;
-}
-.ui-button-icons-only {
- width: 3.4em;
-}
-button.ui-button-icons-only {
- width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
- display: block;
- line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
- padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
- padding: .4em;
- text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
- padding-left: 2.1em;
- padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
- padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
- position: absolute;
- top: 50%;
- margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
- left: 50%;
- margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
- left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
- right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
- margin-right: 7px;
-}
-.ui-buttonset .ui-button {
- margin-left: 0;
- margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.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 {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.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,
-.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%;
- font-size: 0;
-}
-
-/* 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,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-.ui-dialog {
- overflow: hidden;
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
- width: 12px;
- height: 12px;
- right: -5px;
- bottom: -5px;
- background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: none;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- position: relative;
- margin: 0;
- padding: 3px 1em 3px .4em;
- cursor: pointer;
- min-height: 0; /* support: IE7 */
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-progressbar {
- height: 1em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
- background-color: #990000;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
- height: 100%;
- filter: alpha(opacity=25); /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- /* Support: IE7 */
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-button {
- display: inline-block;
- overflow: hidden;
- position: relative;
- text-decoration: none;
- cursor: pointer;
-}
-.ui-selectmenu-button span.ui-icon {
- right: 0.5em;
- left: auto;
- margin-top: -8px;
- position: absolute;
- top: 50%;
-}
-.ui-selectmenu-button span.ui-selectmenu-text {
- text-align: left;
- padding: 0.4em 2.1em 0.4em 1em;
- display: block;
- line-height: 1.4;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.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;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.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;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 22px;
-}
-.ui-spinner-button {
- width: 16px;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top: none;
- border-bottom: none;
- border-right: none;
-}
-/* vertically center icon */
-.ui-spinner .ui-icon {
- position: absolute;
- margin-top: -8px;
- top: 50%;
- left: 0;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
- /* need to fix icons sprite */
- background-position: -65px -16px;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
- -webkit-box-shadow: 0 0 5px #aaa;
- box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #aaaaaa;
- background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #bbbbbb;
- /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
- color: #444444;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #444444;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #cccccc;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #3383bb;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #3383bb;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #bbbbbb;
- background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #599fcf;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited {
- color: #599fcf;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #999999;
- background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #ffffff;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #ffffff;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
- color: #444444;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #444444;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #c0402a;
- background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
- color: #ffffff;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #ffffff;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #ffffff;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70); /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35); /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-state-default .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-active .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
-}
-.ui-state-highlight .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.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-on { background-position: -96px -144px; }
-.ui-icon-radio-off { 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-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.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-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 6px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
- opacity: .8;
- filter: Alpha(Opacity=80); /* support: IE8 */
-}
-.ui-widget-shadow {
- margin: -4px 0 0 -4px;
- padding: 4px;
- background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
- opacity: .6;
- filter: Alpha(Opacity=60); /* support: IE8 */
- border-radius: 0pxdow;
-}
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/styles/menustyles.css b/src/usr/local/www/themes/pfsense_ng_fs/styles/menustyles.css
deleted file mode 100644
index 06b3c7a..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/styles/menustyles.css
+++ /dev/null
@@ -1,44 +0,0 @@
-#navigation {
- /* border:1px solid black; */
- width: 98%;
- vertical-align: middle;
- height: 16px;
- padding-top: 4px;
- }
-
-#menu {
- /* background: #990000; */
- /* border-bottom:1px solid white; */
- padding: 0 0 0 0;
- width: 98%;
- vertical-align: middle;
- height: 16px;
- }
-#menu a {
- padding: 2px 28px 4px 28px;
- text-decoration: none;
- font-weight: bold;
- font-size: 1.0em;
- color: #FFFFFF;
- width: 08%;
- height: 16px;
- }
-#menu a.hover {
- background: #AF2020;
- }
-#menu span {
- display: none;
- }
-
-#subnav {
- font-size: 10px;
- margin-bottom: 2em;
- }
-#subnav a {
- color: #FF0000; /* #FB3B00; */
- margin-right: 1em;
- }
-#subnav span {
- color: silver;
- margin-right: 1em;
- }
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/styles/transmenu.css b/src/usr/local/www/themes/pfsense_ng_fs/styles/transmenu.css
deleted file mode 100644
index f683574..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/styles/transmenu.css
+++ /dev/null
@@ -1,75 +0,0 @@
-/* this is the clipping region for the menu. it's width and height get set by script, depending on the size of the items table */
-.transMenu {
- position:absolute;
- overflow:hidden;
- left:-1000px;
- top:-1000px;
- }
-
-/* this is the main container for the menu itself. it's width and height get set by script, depending on the size of the items table */
-.transMenu .content {
- position:absolute;
- }
-
-/* this table comprises all menu items. each TR is one item. It is relatively positioned so that the shadow and background transparent divs can be positioned underneath it */
-.transMenu .items {
- position:relative;
- left:0px; top:0px;
- z-index:2;
- }
-
-.transMenu.top .items {
- border-top:none;
- }
-
-/* each TR.item is one menu item */
-.transMenu .item {
- color: #FFFFFF; /* #336; */
- font-size: 1.1em;
- font-weight: normal;
- font-family:sans-serif;
- text-decoration:none;
- /* this is a hack for mac/ie5, whom incorrectly cascades the border properties of the parent table to each row */
- border:none;
- cursor:pointer;
- cursor:hand;
- }
-
-/* this DIV is the semi-transparent white background of each menu. the -moz-opacity is a proprietary way to get transparency in mozilla, the filter is for IE/windows 5.0+. */
-/* we set the background color in script because ie mac does not use it; that browser only uses a semi-transparent white PNG that the spacer gif inside this DIV is replaced by */
-.transMenu .background {
- position:absolute;
- left:0px; top:0px;
- z-index:1;
- -moz-opacity:.8;
- filter:alpha(opacity=80);
- }
-
-/* same concept as .background, but this is the sliver of shadow on the right of the menu. It's left, height, and background are set by script. In IE5/mac, it uses a PNG */
-.transMenu .shadowRight {
- position:absolute;
- z-index:3;
- top:3px; width:2px;
- -moz-opacity:.4;
- filter:alpha(opacity=40);
- }
-
-/* same concept as .background, but this is the sliver of shadow on the bottom of the menu. It's top, width, and background are set by script. In IE5/mac, it uses a PNG */
-.transMenu .shadowBottom {
- position:absolute;
- z-index:1;
- left:3px; height:2px;
- -moz-opacity:.4;
- filter:alpha(opacity=40);
- }
-
-/* this is the class that is used when the mouse is over an item. script sets the row to this class when required. */
-.transMenu .item.hover {
- background:#fdfdfd;
- color:black;
- }
-
-/* this is either the dingbat that indicates there is a submenu, or a spacer gif in it's place. We give it extra margin to create some space between the text and the dingbat */
-.transMenu .item img {
- margin-left:10px;
- } \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/wizard.css b/src/usr/local/www/themes/pfsense_ng_fs/wizard.css
deleted file mode 100644
index f2c9f3e..0000000
--- a/src/usr/local/www/themes/pfsense_ng_fs/wizard.css
+++ /dev/null
@@ -1,1117 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.nowrap { white-space: nowrap; }
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #999999;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- /* background: url('images/background.png') no-repeat; */
- background-position : center 0px;
- background-color: #999999;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-.infobox {
- width:100%;
-}
-
-.infoboxsave {
- padding-right: 10px;
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-.inputerrorsleft {
- background-color: #990000;
- width: 36px;
-}
-
-.inputerrorsright {
- background-color: #FFD9D1;
- color: #000000;
- font-size: 11px;
- padding-left: 8px;
- padding-top: 6px;
-}
diff --git a/src/usr/local/www/themes/the_wall/all.css b/src/usr/local/www/themes/the_wall/all.css
deleted file mode 100644
index 35ddbd4..0000000
--- a/src/usr/local/www/themes/the_wall/all.css
+++ /dev/null
@@ -1,1308 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, sans-serif;
- font-size: 0.9em;
-
-}
-
-.nowrap { white-space: nowrap; }
-
-.addgatewaybox {
- background-color: #990000;
- border-style: none none none none;
- width: 225px;
-}
-
-.infobox {
- width:100%;
-}
-
-.infoboxsave {
- padding-right: 10px;
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-.inputerrorsleft {
- background-color: #990000;
- width: 36px;
- text-align: center;
-}
-
-.inputerrorsright {
- background-color: #FFD9D1;
- color: #000000;
- font-size: 11px;
- padding-left: 8px;
- padding-top: 6px;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 220px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 11px;
- font-family: "Trebuchet MS", sans-serif;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- background: url('images/background.jpg') repeat-x; background-attachment:fixed;
- background-position : center 0px;
- background-color: #999999;
-}
-
-a:link{color: #660000;}
-a:visited{color: #660000;}
-a:active{color: #660000;}
-a:hover{color: #660000;}
-
-
-
-
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 202px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 90px;
- width: 190px;
- z-index: 1;
- top: 55px;
- left: -5px;
- padding-top: 45px;
- padding-left: 0px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 128px;
- left: 230px;
- font-size: 14px;
- color: #000000;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -21px;
- left: -20px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 170px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.0em;
- font-weight: normal;
- font-family: Verdana;
- font-weight: bold;
- color: #000000;
- padding-left: 5px;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 170px;
- height: 16px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-#content {
- position: relative;
- top: -5px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background: url('images/horizontal.png') repeat-y;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -5px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- position: relative;
- top: -25px;
- left: 3px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 5px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- width: 80px;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-/* dropdownmenu mainitems textcolor */
-#navigation ul li {
- background-color: transparent;
- font-size:13px;
- color: #000000;
-}
-/* dropdownmenubackground */
-#navigation ul li ul li {
- border: 0px solid #999999;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #999999;
- color: #FFF;
- filter:alpha(opacity=90);
- -moz-opacity:0.9;
- -khtml-opacity: 0.9;
- opacity: 0.9;
-}
-#navigation ul li ul li:hover {
- background-color: #cccccc;
-}
-/* textcolor in dropdownmenu */
-#navigation li li a {
- display: block;
- padding-left: 5px;
- margin-right: 10px;
- color: #000000;
-}
-/* textcolor mouseover in dropdownmenu */
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
- color: #000000;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listrborder {
- background-color: #FFFFFF;
- border-left: 1px solid #999999;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- color: #FFFFFF;
- font-size: 11px;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 6px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #DDDDDD;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 6px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
- margin: 0px auto;
- background: url('images/background.jpg') repeat-x; background-attachment:fixed;
- background-position : center 0px;
- background-color: #999999;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password, #password2 {
- font-size: small;
- width: 60%;
- padding-left: 19px;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-/* Widget CSS */
-.widgetsubheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #B1B1B1;
- padding-right: 6px;
- padding-left: 6px;
- color: #000000;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetheader {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.widgetdiv{
- margin:5px;
- padding: 5px;
- background:#CCCCCC;
-}
-.widgetconfigdiv{
- background:#BBBBBB;
- font-size: 11px;
- color: #000000;
- padding-right: 5px;
- padding-left: 5px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-
-div#log div.log-entry-mini {
- clear: both;
-}
-
-div#log div.log-entry-mini span {
- padding: 2px 2px 2px 2px;
- padding-left: 6px;
-}
-
-div#log span.log-action-mini-header,
-div#log span.log-time-mini-header,
-div#log span.log-interface-mini-header,
-div#log span.log-source-mini-header,
-div#log span.log-destination-mini-header,
-div#log span.log-protocol-mini-header {
- float: left;
- text-align: left;
- background-color: #B1B1B1;
- font-size: 12px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-time-mini,
-div#log span.log-interface-mini,
-div#log span.log-source-mini,
-div#log span.log-destination-mini,
-div#log span.log-protocol-mini {
- float: left;
- text-align: left;
- background-color: #FFFFFF;
- font-size: 11px;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-action-mini,
-div#log span.log-action-mini-header {
- width: 6%;
-}
-
-div#log span.log-time-mini,
-div#log span.log-time-mini-header {
- width: 19%;
-}
-
-div#log span.log-interface-mini,
-div#log span.log-interface-mini-header {
- width: 8%;
-}
-
-div#log span.log-source-mini,
-div#log span.log-source-mini-header {
- width: 23%;
-}
-
-div#log span.log-destination-mini,
-div#log span.log-destination-mini-header {
- width: 31%;
-}
-
-div#log span.log-protocol-mini,
-div#log span.log-protocol-mini-header {
- width: 8%;
- border-right: 1px solid #999;
-}
-
-/* Sortable tables */
-table.sortable thead {
- cursor: default;
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-
-/*thermal_sensors widget styles*/
-
-.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
-.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
-.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
- background-color: LimeGreen;
- border-top-width: 2px; border-top-color: Lime;
- border-left-width: 0px;
- border-right-width: 0px;
- border-bottom-width: 2px; border-bottom-color: Green;
-}
-.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
-.thermalSensorText { float: left; height: 20px; top: 3px; }
-.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
-
-.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
-
-.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
-.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
-
-.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
-
-/* widget textarea styles - full width */
-.textarea_widget {
- width: 100%;
- resize:vertical;
- -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
- -moz-box-sizing: border-box; /* Firefox, other Gecko */
- box-sizing: border-box; /* IE 8+ */
-}
diff --git a/src/usr/local/www/themes/the_wall/apple-touch-icon.png b/src/usr/local/www/themes/the_wall/apple-touch-icon.png
deleted file mode 100755
index 7a4b975..0000000
--- a/src/usr/local/www/themes/the_wall/apple-touch-icon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/bottom-loader.js b/src/usr/local/www/themes/the_wall/bottom-loader.js
deleted file mode 100644
index a21f775..0000000
--- a/src/usr/local/www/themes/the_wall/bottom-loader.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//<![CDATA[
-
- NiftyCheck();
- Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
- Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
- Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
- Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
- Rounded("div#topbox","all","#FFF","#990000","smooth");
-
-//]]>
diff --git a/src/usr/local/www/themes/the_wall/favicon.ico b/src/usr/local/www/themes/the_wall/favicon.ico
deleted file mode 100644
index 3440bf2..0000000
--- a/src/usr/local/www/themes/the_wall/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/graphlink.css b/src/usr/local/www/themes/the_wall/graphlink.css
deleted file mode 100644
index 13f65f0..0000000
--- a/src/usr/local/www/themes/the_wall/graphlink.css
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- $Id$
-
- This file is part of the GraphLink software.
- GraphLink is distributed under the MIT License.
- Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
-*******************************************************************************/
-
-/**
- * Defines the background image used for the graph, as well as the actual data
- * locations.
- * Use padding-left and padding-top to align the data area correctly with your
- * background image.
- * Width and height should same as the dimensions of the image, minus the
- * padding values in both directions.
- */
-div.GraphLink {
- width: 212px;
- height: 60px;
- padding-left: 38px;
- padding-top: 10px;
- background-image: url(/themes/nervecenter/images/misc/graph.png);
- overflow: hidden;
-}
-
-/**
- * Defines the data display area. Modify to fit your background image.
- */
-div.GraphLinkData {
- width: 200px;
- height: 50px;
- overflow: hidden;
-}
-
-/**
- * Defines the look of one bar. Nothing to change here other than the color.
- */
-span.GraphLinkBar {
- background-color: #990000;
- height: 100%;
- float: left;
- overflow: hidden;
-}
diff --git a/src/usr/local/www/themes/the_wall/images/alert_bgr.png b/src/usr/local/www/themes/the_wall/images/alert_bgr.png
deleted file mode 100755
index b186db0..0000000
--- a/src/usr/local/www/themes/the_wall/images/alert_bgr.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/background.jpg b/src/usr/local/www/themes/the_wall/images/background.jpg
deleted file mode 100755
index cdd1df6..0000000
--- a/src/usr/local/www/themes/the_wall/images/background.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/footer.png b/src/usr/local/www/themes/the_wall/images/footer.png
deleted file mode 100755
index 399e0ff..0000000
--- a/src/usr/local/www/themes/the_wall/images/footer.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/header.png b/src/usr/local/www/themes/the_wall/images/header.png
deleted file mode 100755
index 25b813c..0000000
--- a/src/usr/local/www/themes/the_wall/images/header.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/help.png b/src/usr/local/www/themes/the_wall/images/help.png
deleted file mode 100755
index 1de05e3..0000000
--- a/src/usr/local/www/themes/the_wall/images/help.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/horizontal.gif b/src/usr/local/www/themes/the_wall/images/horizontal.gif
deleted file mode 100755
index a280dcb..0000000
--- a/src/usr/local/www/themes/the_wall/images/horizontal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/horizontal.png b/src/usr/local/www/themes/the_wall/images/horizontal.png
deleted file mode 100755
index e774028..0000000
--- a/src/usr/local/www/themes/the_wall/images/horizontal.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/favicon.ico b/src/usr/local/www/themes/the_wall/images/icons/favicon.ico
deleted file mode 100644
index 3440bf2..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_3g.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_3g.gif
deleted file mode 100755
index 46ccb92..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_3g.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_3g_inactive.gif
deleted file mode 100755
index cf983e4..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_3g_inactive.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_advanced.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_advanced.gif
deleted file mode 100755
index 3ede1ff..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_advanced.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_advanced_s.gif
deleted file mode 100755
index b233549..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_advanced_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_alert.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_alert.gif
deleted file mode 100755
index 7646941..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_alert.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_host.gif
deleted file mode 100755
index ad43e17..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_host.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_net.gif
deleted file mode 100755
index abd1b8b..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_net.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_port.gif
deleted file mode 100755
index 4acf2aa..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_port.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_url.gif
deleted file mode 100755
index 660571e..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_url.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_url_reload.gif
deleted file mode 100755
index 55c1c4a..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_url_reload.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_block.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_block.gif
deleted file mode 100755
index 670c968..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_block.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_block_add.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_block_add.gif
deleted file mode 100755
index eb726d6..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_block_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_block_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_block_d.gif
deleted file mode 100755
index e6345fe..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_block_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_cablenic.gif
deleted file mode 100755
index a071c66..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_cablenic.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_cal.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_cal.gif
deleted file mode 100755
index a9c7c87..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_cal.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_cal_mo.gif
deleted file mode 100755
index 1647e2f..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_cal_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_carp.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_carp.gif
deleted file mode 100755
index 9454a82..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_carp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_carp_d.gif
deleted file mode 100755
index 2ba8db2..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_carp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_chain.png b/src/usr/local/www/themes/the_wall/images/icons/icon_chain.png
deleted file mode 100644
index 12db07a..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_chain.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_check.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_check.gif
deleted file mode 100755
index 393674d..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_check.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_clock_green.gif
deleted file mode 100755
index e171ba8..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_clock_green.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_clock_grey.gif
deleted file mode 100755
index 00c865a..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_clock_grey.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_clock_red.gif
deleted file mode 100755
index 7b412ee..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_clock_red.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_close.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_close.gif
deleted file mode 100755
index e0f86a7..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_close.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_configure.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_configure.gif
deleted file mode 100755
index 7182e0d..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_configure.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_down.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_down.gif
deleted file mode 100755
index b71a9c5..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_down_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_down_d.gif
deleted file mode 100755
index 70a7473..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_down_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_down_mo.gif
deleted file mode 100755
index 584587a..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_down_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_e.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_e.gif
deleted file mode 100755
index 2950800..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_e.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_e_mo.gif
deleted file mode 100755
index 9ba5738..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_e_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_error.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_error.gif
deleted file mode 100755
index e0fa659..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_error.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_exclam.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_exclam.gif
deleted file mode 100755
index 36c2ec7..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_exclam.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_flag_de.png b/src/usr/local/www/themes/the_wall/images/icons/icon_flag_de.png
deleted file mode 100755
index 069cbbe..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_flag_de.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_flag_en.png b/src/usr/local/www/themes/the_wall/images/icons/icon_flag_en.png
deleted file mode 100755
index bd7f9a5..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_flag_en.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_flag_es.png b/src/usr/local/www/themes/the_wall/images/icons/icon_flag_es.png
deleted file mode 100755
index 434776c..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_flag_es.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/the_wall/images/icons/icon_flag_pt_BR.png
deleted file mode 100755
index f786349..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_flag_pt_BR.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_cert.png
deleted file mode 100755
index 48a34b6..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_cert.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_file.png
deleted file mode 100755
index 48a9ed2..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_file.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_group.png
deleted file mode 100755
index 7d929c0..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_host.png
deleted file mode 100755
index 867ef2c..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_host.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_imp.png
deleted file mode 100755
index f667cfc..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_imp.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_mail.png
deleted file mode 100755
index d2d4548..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_mail.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_pwd.png
deleted file mode 100755
index 06b53a1..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_pwd.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_search.png
deleted file mode 100755
index 33de926..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_search.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_time.png
deleted file mode 100755
index aa8300a..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_time.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_unknown.png
deleted file mode 100755
index 1857d0e..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_unknown.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_url.png
deleted file mode 100755
index cf56792..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_url.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_user.png
deleted file mode 100755
index e00eebe..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_fw-update.gif
deleted file mode 100755
index 52c18ac..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_fw-update.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_help.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_help.gif
deleted file mode 100644
index 84c84db..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_help.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_ifalias.gif
deleted file mode 100755
index 0c569a7..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_ifalias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_ifalias_d.gif
deleted file mode 100755
index faa84d4..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_ifalias_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_import_alias.gif
deleted file mode 100755
index d11a5f0..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_import_alias.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_in.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_in_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_info_pkg.gif
deleted file mode 100755
index cd3a532..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_info_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_interface_down.gif
deleted file mode 100755
index 0626655..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_interface_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_interface_up.gif
deleted file mode 100755
index 1449513..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_interface_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_left.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_left.gif
deleted file mode 100755
index 8effefe..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_left_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_left_d.gif
deleted file mode 100755
index c778014..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_left_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_left_mo.gif
deleted file mode 100755
index 84c6fa2..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_left_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_log.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_log.gif
deleted file mode 100755
index 4a1983a..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_log.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_log_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_log_d.gif
deleted file mode 100755
index d31bd9b..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_log_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_log_s.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_log_s.gif
deleted file mode 100755
index f9fda33..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_log_s.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_log_s_d.gif
deleted file mode 100755
index fb2c05f..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_log_s_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_logs.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_logs.gif
deleted file mode 100644
index afe0104..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_logs.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_match.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_match.gif
deleted file mode 100644
index 215571f..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_match.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_match_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_match_d.gif
deleted file mode 100644
index 6e4c364..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_match_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_minus.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_minus.gif
deleted file mode 100755
index 417544f..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_minus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_open.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_open.gif
deleted file mode 100755
index ac3da14..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_open.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_other.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_other.gif
deleted file mode 100755
index e6f780f..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_other.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_other_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_other_d.gif
deleted file mode 100755
index b08d970..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_other_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_out.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_out_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_parp.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_parp.gif
deleted file mode 100755
index 96acaf3..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_parp.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_parp_d.gif
deleted file mode 100755
index 7d7d00e..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_parp_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_pass.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_pass.gif
deleted file mode 100755
index fe1bb0d..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_pass.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_pass_add.gif
deleted file mode 100755
index f7f4c20..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_pass_add.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_pass_d.gif
deleted file mode 100755
index 6adc431..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_pass_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_plus.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_plus.gif
deleted file mode 100755
index 2a94eeb..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_plus.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_bl.gif
deleted file mode 100755
index 8dcd7c0..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_bl.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_bl_p.gif
deleted file mode 100755
index 0c79849..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_bl_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_d.gif
deleted file mode 100755
index ebc7457..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_mo.gif
deleted file mode 100755
index 1c7ca08..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_p.gif
deleted file mode 100755
index eb41284..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall.gif
deleted file mode 100755
index d78b867..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_d.gif
deleted file mode 100755
index 13658f7..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_mo.gif
deleted file mode 100755
index 90b576e..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg.gif
deleted file mode 100755
index 9aebb03..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_d.gif
deleted file mode 100755
index 4ab4992..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_mo.gif
deleted file mode 100755
index 7025d20..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml.gif
deleted file mode 100755
index 4542432..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_d.gif
deleted file mode 100755
index 8d3a68d..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_mo.gif
deleted file mode 100755
index 15e0aed..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reject.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reject.gif
deleted file mode 100755
index 5565cd6..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_reject.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reject_d.gif
deleted file mode 100755
index 6c09fae..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_reject_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_right.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_right.gif
deleted file mode 100755
index fdf2d8b..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_restart.gif
deleted file mode 100755
index e49fbd7..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_service_restart.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_restart_d.gif
deleted file mode 100755
index a5d6d7c..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_service_restart_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_running.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_running.gif
deleted file mode 100644
index 543fd56..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_service_running.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_start.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_start.gif
deleted file mode 100755
index 09bb58f..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_service_start.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_start_d.gif
deleted file mode 100755
index f58f111..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_service_start_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_status.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_status.gif
deleted file mode 100644
index a93bcfb..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_service_status.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_stop.gif
deleted file mode 100755
index 922addc..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_service_stop.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_stop_d.gif
deleted file mode 100755
index b4cfdea..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_service_stop_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_stopped.gif
deleted file mode 100644
index f93a25d..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_service_stopped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_services_restart_mo.gif
deleted file mode 100755
index a092b40..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_services_restart_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_services_start_mo.gif
deleted file mode 100755
index ecdb58f..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_services_start_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_services_stop_mo.gif
deleted file mode 100755
index c00e208..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_services_stop_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/the_wall/images/icons/icon_system-group-grey.png
deleted file mode 100755
index d7b964d..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_system-group-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_system-group.png b/src/usr/local/www/themes/the_wall/images/icons/icon_system-group.png
deleted file mode 100755
index 1c974f2..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_system-group.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/the_wall/images/icons/icon_system-user-grey.png
deleted file mode 100755
index 2f6047d..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_system-user-grey.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_system-user.png b/src/usr/local/www/themes/the_wall/images/icons/icon_system-user.png
deleted file mode 100755
index ef82156..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_system-user.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/the_wall/images/icons/icon_system_lock_screen.png
deleted file mode 100755
index 30f306d..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_system_lock_screen.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_system_logout.png b/src/usr/local/www/themes/the_wall/images/icons/icon_system_logout.png
deleted file mode 100755
index 9bbb6c7..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_system_logout.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_trapped.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_trapped.gif
deleted file mode 100755
index ffeb2cd..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_trapped.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_trapped_p.gif
deleted file mode 100755
index 6d46aaf..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_trapped_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_ts_rule.gif
deleted file mode 100755
index e15ab6c..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_ts_rule.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_ts_rule_d.gif
deleted file mode 100755
index f776281..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_ts_rule_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_up.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_up.gif
deleted file mode 100755
index 883c5a2..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_up_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_up_d.gif
deleted file mode 100755
index 0ddcce2..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_up_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_up_mo.gif
deleted file mode 100755
index 9f869a4..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_up_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_wlan.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_wlan.gif
deleted file mode 100755
index 1f0addc..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_wlan.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_wlan_d.gif
deleted file mode 100755
index 35bf580..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_wlan_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_wol_all.gif
deleted file mode 100755
index 2d22182..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_wol_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/the_wall/images/icons/icon_wzd_nsaved.png
deleted file mode 100755
index 21cb27d..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_wzd_nsaved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/the_wall/images/icons/icon_wzd_saved.png
deleted file mode 100755
index ab82946..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_wzd_saved.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_x.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_x.gif
deleted file mode 100755
index 24e4d49..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_x_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_x_d.gif
deleted file mode 100755
index d2bfbc8..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_x_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_x_mo.gif
deleted file mode 100755
index da7b57c..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_x_mo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_x_p.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_x_p.gif
deleted file mode 100755
index 8828fa6..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/icon_x_p.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/in.gif b/src/usr/local/www/themes/the_wall/images/icons/in.gif
deleted file mode 100755
index f1da771..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/in.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/in_d.gif b/src/usr/local/www/themes/the_wall/images/icons/in_d.gif
deleted file mode 100755
index 18e26be..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/in_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/out.gif b/src/usr/local/www/themes/the_wall/images/icons/out.gif
deleted file mode 100755
index 1a1d1d5..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/out.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/out_d.gif b/src/usr/local/www/themes/the_wall/images/icons/out_d.gif
deleted file mode 100755
index 879f1da..0000000
--- a/src/usr/local/www/themes/the_wall/images/icons/out_d.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/log.png b/src/usr/local/www/themes/the_wall/images/log.png
deleted file mode 100755
index 762ba80..0000000
--- a/src/usr/local/www/themes/the_wall/images/log.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/logo.gif b/src/usr/local/www/themes/the_wall/images/logo.gif
deleted file mode 100755
index a71ce5a..0000000
--- a/src/usr/local/www/themes/the_wall/images/logo.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/logobig.jpg b/src/usr/local/www/themes/the_wall/images/logobig.jpg
deleted file mode 100755
index 2ef196d..0000000
--- a/src/usr/local/www/themes/the_wall/images/logobig.jpg
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/menu_down.gif b/src/usr/local/www/themes/the_wall/images/menu_down.gif
deleted file mode 100755
index 137de8d..0000000
--- a/src/usr/local/www/themes/the_wall/images/menu_down.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/menu_right.gif b/src/usr/local/www/themes/the_wall/images/menu_right.gif
deleted file mode 100755
index 881327c..0000000
--- a/src/usr/local/www/themes/the_wall/images/menu_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/bar_blue.gif b/src/usr/local/www/themes/the_wall/images/misc/bar_blue.gif
deleted file mode 100755
index 741186a..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/bar_blue.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/bar_gray.gif b/src/usr/local/www/themes/the_wall/images/misc/bar_gray.gif
deleted file mode 100755
index e86e245..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/bar_gray.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/bar_left.gif b/src/usr/local/www/themes/the_wall/images/misc/bar_left.gif
deleted file mode 100755
index af751fa..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/bar_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/bar_right.gif b/src/usr/local/www/themes/the_wall/images/misc/bar_right.gif
deleted file mode 100755
index ff12d9e..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/bar_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/the_wall/images/misc/bullet_toggle_minus.png
deleted file mode 100755
index 37db2fd..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/bullet_toggle_minus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/the_wall/images/misc/bullet_toggle_plus.png
deleted file mode 100755
index fba7af9..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/bullet_toggle_plus.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/button.gif b/src/usr/local/www/themes/the_wall/images/misc/button.gif
deleted file mode 100755
index e85dbb3..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/button.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/graph.png b/src/usr/local/www/themes/the_wall/images/misc/graph.png
deleted file mode 100755
index 507ec75..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/graph.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/key_128.gif b/src/usr/local/www/themes/the_wall/images/misc/key_128.gif
deleted file mode 100755
index ea5ae34..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/key_128.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/key_152.gif b/src/usr/local/www/themes/the_wall/images/misc/key_152.gif
deleted file mode 100755
index 6c7fc03..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/key_152.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/key_256.gif b/src/usr/local/www/themes/the_wall/images/misc/key_256.gif
deleted file mode 100755
index 3e1c377..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/key_256.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/key_64.gif b/src/usr/local/www/themes/the_wall/images/misc/key_64.gif
deleted file mode 100755
index 87892bd..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/key_64.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/loader.gif b/src/usr/local/www/themes/the_wall/images/misc/loader.gif
deleted file mode 100755
index a98cf78..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/loader_all.gif b/src/usr/local/www/themes/the_wall/images/misc/loader_all.gif
deleted file mode 100755
index cb6bc0c..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/loader_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/loader_filter.gif b/src/usr/local/www/themes/the_wall/images/misc/loader_filter.gif
deleted file mode 100755
index b838b17..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/loader_filter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/loader_tab.gif b/src/usr/local/www/themes/the_wall/images/misc/loader_tab.gif
deleted file mode 100755
index a98cf78..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/loader_tab.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/logon.png b/src/usr/local/www/themes/the_wall/images/misc/logon.png
deleted file mode 100755
index acd388b..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/logon.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/progress_bar.gif b/src/usr/local/www/themes/the_wall/images/misc/progress_bar.gif
deleted file mode 100755
index 3b4aa52..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/progress_bar.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/rrd_error.png b/src/usr/local/www/themes/the_wall/images/misc/rrd_error.png
deleted file mode 100755
index a79ecf3..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/rrd_error.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_alerter.gif b/src/usr/local/www/themes/the_wall/images/misc/status_alerter.gif
deleted file mode 100755
index 7ff1e95..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/status_alerter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_carpmaster.gif b/src/usr/local/www/themes/the_wall/images/misc/status_carpmaster.gif
deleted file mode 100755
index 2c32908..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/status_carpmaster.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_left.gif b/src/usr/local/www/themes/the_wall/images/misc/status_left.gif
deleted file mode 100755
index b5a2930..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/status_left.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_page_loading.gif b/src/usr/local/www/themes/the_wall/images/misc/status_page_loading.gif
deleted file mode 100755
index 067ef18..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/status_page_loading.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_reload_all.gif b/src/usr/local/www/themes/the_wall/images/misc/status_reload_all.gif
deleted file mode 100755
index 72de6bd..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/status_reload_all.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_reload_filter.gif b/src/usr/local/www/themes/the_wall/images/misc/status_reload_filter.gif
deleted file mode 100755
index d72761a..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/status_reload_filter.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_right.gif b/src/usr/local/www/themes/the_wall/images/misc/status_right.gif
deleted file mode 100755
index bf66fdb..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/status_right.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/tri_c.gif b/src/usr/local/www/themes/the_wall/images/misc/tri_c.gif
deleted file mode 100755
index 317b758..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/tri_c.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/tri_c_black.gif b/src/usr/local/www/themes/the_wall/images/misc/tri_c_black.gif
deleted file mode 100755
index 309846e..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/tri_c_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/tri_o.gif b/src/usr/local/www/themes/the_wall/images/misc/tri_o.gif
deleted file mode 100755
index eb95c32..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/tri_o.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/tri_o_black.gif b/src/usr/local/www/themes/the_wall/images/misc/tri_o_black.gif
deleted file mode 100755
index f818f3b..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/tri_o_black.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/widget_loader.gif b/src/usr/local/www/themes/the_wall/images/misc/widget_loader.gif
deleted file mode 100755
index ca35e2a..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/widget_loader.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/widget_loader_old.gif b/src/usr/local/www/themes/the_wall/images/misc/widget_loader_old.gif
deleted file mode 100755
index fad101f..0000000
--- a/src/usr/local/www/themes/the_wall/images/misc/widget_loader_old.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/new_tab_menu.png b/src/usr/local/www/themes/the_wall/images/new_tab_menu.png
deleted file mode 100755
index 4bdfcef..0000000
--- a/src/usr/local/www/themes/the_wall/images/new_tab_menu.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/status.png b/src/usr/local/www/themes/the_wall/images/status.png
deleted file mode 100755
index a3e368e..0000000
--- a/src/usr/local/www/themes/the_wall/images/status.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/transparent.gif b/src/usr/local/www/themes/the_wall/images/transparent.gif
deleted file mode 100755
index 89c5530..0000000
--- a/src/usr/local/www/themes/the_wall/images/transparent.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/transparent_pixel.gif b/src/usr/local/www/themes/the_wall/images/transparent_pixel.gif
deleted file mode 100755
index 35d42e8..0000000
--- a/src/usr/local/www/themes/the_wall/images/transparent_pixel.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/blank.gif b/src/usr/local/www/themes/the_wall/javascript/ie7/blank.gif
deleted file mode 100755
index a4fe2e6..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/blank.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-box-model.js
deleted file mode 100644
index 45543f6..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-box-model.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-core.js
deleted file mode 100644
index b11e2b1..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-core.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css-strict.js
deleted file mode 100644
index 4406d7a..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css-strict.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css2.js
deleted file mode 100644
index 7121c8e..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css2.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css3.js
deleted file mode 100644
index 86b24f5..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css3.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-fixed.js
deleted file mode 100644
index 4321cda..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-fixed.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-html4.js
deleted file mode 100644
index 4d2baa9..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-html4.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-ie5.js
deleted file mode 100644
index 707fa56..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-ie5.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite-p.js
deleted file mode 100644
index 3a66d19..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite.js
deleted file mode 100644
index 88c764f..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-png.js
deleted file mode 100644
index 7b8f2cf..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-png.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-server.css
deleted file mode 100644
index 47c7edd..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-server.css
+++ /dev/null
@@ -1,43 +0,0 @@
-body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
-body {margin: 8px; background: #333;}
-h1 {margin: 0;}
-h1 a:hover {background-color: transparent;}
-h2 {font-size: 1.75em;}
-h3 {font-size: 1.1em;}
-a:active {color: #ff0000;}
-a:link {color: #0a6cce;}
-a:visited {color: #0a6cce;}
-code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
- padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
-code.box {display: block; padding: 10px; margin: 0.5em 0;}
-ul {list-style-type: square;}
-dd {margin: .2em 0 .5em 1em;}
-dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
-dl.library dd {font-style: italic; margin-left: 3em;}
-dt {font-weight: bold;}
-dt.pack {color: brown;}
-a img {border-style: none;}
-hr {height: 1px; color: #000; border-style: solid;}
-hr.short {height: 2px; width: 100px;}
-div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
-hr {border-bottom-width: 0px;}
-div.header hr {color: #0a6cce; background-color: #0a6cce;}
-div.content {min-height: 100px;}
-div.footer hr {color: #898e79; background-color: #898e79; }
-div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
-a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
-div.footer a:hover {background-color: transparent; text-decoration: none;}
-div.header .menu {text-align: right;}
-div.footer {font-size: x-small; margin-top: 8px;}
-div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
-#license {margin-top: 5px; font-size: xx-small;}
-table {border-top: 1px solid #000; border-left: 1px solid #000;}
-th {background-color: #fff; text-align: left;}
-th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
-th.small {width: 100px;}
-th.medium {width: 200px;}
-th.large {width: 270px;}
-th.x-large {width: 408px;}
-table.fixed {table-layout: fixed;}
-span.comment {color: #666;}
-
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard-p.js
deleted file mode 100644
index 73e99ac..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard-p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
-/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard.js
deleted file mode 100644
index 2109905..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* IE7 version 0.7.3 (alpha) 2004/09/18 */
-if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/test-trans.png b/src/usr/local/www/themes/the_wall/javascript/ie7/test-trans.png
deleted file mode 100755
index e187e2c..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/ie7/test-trans.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/img/grey-40.png b/src/usr/local/www/themes/the_wall/javascript/img/grey-40.png
deleted file mode 100755
index 758b716..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/img/grey-40.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/img/submenu-off.gif b/src/usr/local/www/themes/the_wall/javascript/img/submenu-off.gif
deleted file mode 100755
index ddcdcae..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/img/submenu-off.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/img/submenu-on.gif b/src/usr/local/www/themes/the_wall/javascript/img/submenu-on.gif
deleted file mode 100755
index 7a58077..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/img/submenu-on.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/img/white-90.png b/src/usr/local/www/themes/the_wall/javascript/img/white-90.png
deleted file mode 100755
index efc84b4..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/img/white-90.png
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/img/x.gif b/src/usr/local/www/themes/the_wall/javascript/img/x.gif
deleted file mode 100755
index 5bfd67a..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/img/x.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/niftyjsCode.js b/src/usr/local/www/themes/the_wall/javascript/niftyjsCode.js
deleted file mode 100644
index e71ea14..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/niftyjsCode.js
+++ /dev/null
@@ -1,174 +0,0 @@
-function NiftyCheck(){
-if(!document.getElementById || !document.createElement)
- return(false);
-isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
-if(Array.prototype.push==null){Array.prototype.push=function(){
- this[this.length]=arguments[0]; return(this.length);};}
-return(true);
-}
-
-function Rounded(selector,wich,bk,color,opt){
-var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
-
-if(color=="transparent"){
- cn=cn+"x";
- ecolor=bk;
- bk="transparent";
- }
-else if(opt && opt.indexOf("border")>=0){
- var optar=opt.split(" ");
- for(i=0;i<optar.length;i++)
- if(optar[i].indexOf("#")>=0) ecolor=optar[i];
- if(ecolor=="") ecolor="#666";
- cn+="e";
- edges=true;
- }
-else if(opt && opt.indexOf("smooth")>=0){
- cn+="a";
- ecolor=Mix(bk,color);
- }
-if(opt && opt.indexOf("small")>=0) cn+="s";
-prefixt=cn;
-prefixb=cn;
-if(wich.indexOf("all")>=0){t=true;b=true;}
-else if(wich.indexOf("top")>=0) t="true";
-else if(wich.indexOf("tl")>=0){
- t="true";
- if(wich.indexOf("tr")<0) prefixt+="l";
- }
-else if(wich.indexOf("tr")>=0){
- t="true";
- prefixt+="r";
- }
-if(wich.indexOf("bottom")>=0) b=true;
-else if(wich.indexOf("bl")>=0){
- b="true";
- if(wich.indexOf("br")<0) prefixb+="l";
- }
-else if(wich.indexOf("br")>=0){
- b="true";
- prefixb+="r";
- }
-var v=getElementsBySelector(selector);
-var l=v.length;
-for(i=0;i<l;i++){
- if(edges) AddBorder(v[i],ecolor);
- if(t) AddTop(v[i],bk,color,ecolor,prefixt);
- if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
- }
-}
-
-function AddBorder(el,bc){
-var i;
-if(!el.passed){
- if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
- var t=el.firstChild.nodeValue;
- el.removeChild(el.lastChild);
- var d=CreateEl("span");
- d.style.display="block";
- d.appendChild(document.createTextNode(t));
- el.appendChild(d);
- }
- for(i=0;i<el.childNodes.length;i++){
- if(el.childNodes[i].nodeType==1){
- el.childNodes[i].style.borderLeft="1px solid "+bc;
- el.childNodes[i].style.borderRight="1px solid "+bc;
- }
- }
- }
-el.passed=true;
-}
-
-function AddTop(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=1;i<=lim;i++){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingTop=0;
-el.insertBefore(d,el.firstChild);
-}
-
-function AddBottom(el,bk,color,bc,cn){
-var i,lim=4,d=CreateEl("b");
-
-if(cn.indexOf("s")>=0) lim=2;
-if(bc) d.className="artop";
-else d.className="rtop";
-d.style.backgroundColor=bk;
-for(i=lim;i>0;i--){
- var x=CreateEl("b");
- x.className=cn + i;
- x.style.backgroundColor=color;
- if(bc) x.style.borderColor=bc;
- d.appendChild(x);
- }
-el.style.paddingBottom=0;
-el.appendChild(d);
-}
-
-function CreateEl(x){
-if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
-else return(document.createElement(x));
-}
-
-function getElementsBySelector(selector){
-var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
-
-if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
- s=selector.split(" ");
- var fs=s[0].split("#");
- if(fs.length==1) return(objlist);
- f=document.getElementById(fs[1]);
- if(f) return(f.getElementsByTagName(s[1]));
- return(objlist);
- }
-if(selector.indexOf("#")>0){ //id selector like "tag#id"
- s=selector.split("#");
- tag=s[0];
- selid=s[1];
- }
-if(selid!=""){
- f=document.getElementById(selid);
- if(f) objlist.push(f);
- return(objlist);
- }
-if(selector.indexOf(".")>0){ //class selector like "tag.class"
- s=selector.split(".");
- tag=s[0];
- selclass=s[1];
- }
-var v=document.getElementsByTagName(tag); // tag selector like "tag"
-if(selclass=="")
- return(v);
-for(i=0;i<v.length;i++){
- if(v[i].className.indexOf(selclass)>=0){
- objlist.push(v[i]);
- }
- }
-return(objlist);
-}
-
-function Mix(c1,c2){
-var i,step1,step2,x,y,r=new Array(3);
-if(c1.length==4)step1=1;
-else step1=2;
-if(c2.length==4) step2=1;
-else step2=2;
-for(i=0;i<3;i++){
- x=parseInt(c1.substr(1+step1*i,step1),16);
- if(step1==1) x=16*x+x;
- y=parseInt(c2.substr(1+step2*i,step2),16);
- if(step2==1) y=16*y+y;
- r[i]=Math.floor((x*50+y*50)/100);
- }
-return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/javascript/transmenu-body.php b/src/usr/local/www/themes/the_wall/javascript/transmenu-body.php
deleted file mode 100644
index eea9235..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/transmenu-body.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/* $Id$ */
-/* ========================================================================== */
-/*
- transmenu-body.php
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-function nervecenterTransmenuGetBodyJS() {
- global $rootmenu;
-
- if (isset($rootmenu)) {
- return $rootmenu->getMenuJScript();
- } else if (empty($rootmenu)) {
- return "alert('No rootmenu object found.');";
- } else {
- return "alert('No JavaScript attached to rootmenu object.');";
- }
-}
-
-?>
diff --git a/src/usr/local/www/themes/the_wall/javascript/transmenu-head.php b/src/usr/local/www/themes/the_wall/javascript/transmenu-head.php
deleted file mode 100644
index 66e1952..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/transmenu-head.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/* $Id$ */
-/* ========================================================================== */
-/*
- transmenu-head.php
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-function nervecenterTransmenuGetHeadJS() {
- global $g, $rootmenu;
-
- $transmenu_stub =<<<EOD
- function tmenuinit() {
- //==========================================================================================
- // if supported, initialize TransMenus
- //==========================================================================================
- // Check isSupported() so that menus aren't accidentally sent to non-supporting browsers.
- // This is better than server-side checking because it will also catch browsers which would
- // normally support the menus but have javascript disabled.
- //
- // If supported, call initialize() and then hook whatever image rollover code you need to do
- // to the .onactivate and .ondeactivate events for each menu.
- //==========================================================================================
- if (TransMenu.isSupported()) {
- TransMenu.initialize();
-
- // hook all the highlight swapping of the main toolbar to menu activation/deactivation
- // instead of simple rollover to get the effect where the button stays hightlit until
- // the menu is closed.
- @@CHILD_JSCRIPT@@
- }
- } // end function
-EOD;
-
- if (empty($rootmenu)) {
- require_once("menudef.inc");
- }
-
- $childJScript = "";
- foreach ($rootmenu->getChildren() as $component) {
- $id = "mnua_" . str_replace(" ", "", strtolower($component->getID()));
-
- $childJScript .=<<<EOD
- {$id}.onactivate = function() { document.getElementById("{$id}").className = "hover"; };
- {$id}.ondeactivate = function() { document.getElementById("{$id}").className = ""; };
-
-EOD;
- }
-
- $transmenu_stub = basename($_SERVER['PHP_SELF']) != "wizard.php" ? str_replace("@@CHILD_JSCRIPT@@", $childJScript, $transmenu_stub) : "";
-
- return $transmenu_stub;
-}
-
-?>
diff --git a/src/usr/local/www/themes/the_wall/javascript/transmenu.org b/src/usr/local/www/themes/the_wall/javascript/transmenu.org
deleted file mode 100644
index 6c9e353..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/transmenu.org
+++ /dev/null
@@ -1,785 +0,0 @@
-/* =================================================================================================
- * TransMenu
- * March, 2003
- *
- * Customizable multi-level animated DHTML menus with transparency.
- *
- * Copyright 2003-2004, Aaron Boodman (www.youngpup.net)
- * =================================================================================================
- * "Can I use this?"
- *
- * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
- * out at: http://creativecommons.org/licenses/by/2.0/
- *
- * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
- * for writing it. You may not misrepresent yourself as the author of this code.
- * =================================================================================================
- * "It's kinda hard to read, though"
- *
- * The uncompressed, commented version of this script can be found at:
- * http://youngpup.net/projects/transMenus
- * =================================================================================================
- * updates:
- * 04.19.04 fixed cascade problem with menus nested greater than two levels.
- * 12.23.03 added hideCurrent for menu actuators with no menus. renamed to TransMenu.
- * 04.18.03 fixed render bug in IE 5.0 Mac by removing that browser from compatibility table ;)
- * also made gecko check a little more strict by specifying build no.
- * ============================================================================================== */
-
-
-
-//==================================================================================================
-// Configuration properties
-//==================================================================================================
-TransMenu.spacerGif = "themes/nervecenter/javascript/img/x.gif"; // path to a transparent spacer gif
-TransMenu.dingbatOn = "themes/nervecenter/javascript/img/submenu-on.gif"; // path to the active sub menu dingbat
-TransMenu.dingbatOff = "themes/nervecenter/javascript/img/submenu-off.gif"; // path to the inactive sub menu dingbat
-TransMenu.dingbatSize = 14; // size of the dingbat (square shape assumed)
-TransMenu.menuPadding = 5; // padding between menu border and items grid
-TransMenu.itemPadding = 3; // additional padding around each item
-TransMenu.shadowSize = 2; // size of shadow under menu
-TransMenu.shadowOffset = 3; // distance shadow should be offset from leading edge
-TransMenu.shadowColor = "#FF0000"; // color of shadow (transparency is set in CSS)
-TransMenu.shadowPng = "themes/nervecenter/javascript/img/grey-40.png"; // a PNG graphic to serve as the shadow for mac IE5
-TransMenu.backgroundColor = "#990000"; // color of the background (transparency set in CSS)
-TransMenu.backgroundPng = "themes/nervecenter/javascript/img/white-90.png"; // a PNG graphic to server as the background for mac IE5
-TransMenu.hideDelay = 1000; // number of milliseconds to wait before hiding a menu
-TransMenu.slideTime = 400; // number of milliseconds it takes to open and close a menu
-
-
-//==================================================================================================
-// Internal use properties
-//==================================================================================================
-TransMenu.reference = {topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};
-TransMenu.direction = {down:1,right:2};
-TransMenu.registry = [];
-TransMenu._maxZ = 100;
-
-
-
-//==================================================================================================
-// Static methods
-//==================================================================================================
-// supporting win ie5+, mac ie5.1+ and gecko >= mozilla 1.0
-TransMenu.isSupported = function() {
- var ua = navigator.userAgent.toLowerCase();
- var pf = navigator.platform.toLowerCase();
- var an = navigator.appName;
- var r = false;
-
- if (ua.indexOf("gecko") > -1 && navigator.productSub >= 20020605) r = true; // gecko >= moz 1.0
- else if (an == "Microsoft Internet Explorer") {
- if (document.getElementById) { // ie5.1+ mac,win
- if (pf.indexOf("mac") == 0) {
- r = /msie (\d(.\d*)?)/.test(ua) && Number(RegExp.$1) >= 5.1;
- }
- else r = true;
- }
- }
-
- return r;
-}
-
-// call this in onload once menus have been created
-TransMenu.initialize = function() {
- for (var i = 0, menu = null; menu = this.registry[i]; i++) {
- menu.initialize();
- }
-}
-
-// call this in document body to write out menu html
-TransMenu.renderAll = function() {
- var aMenuHtml = [];
- for (var i = 0, menu = null; menu = this.registry[i]; i++) {
- aMenuHtml[i] = menu.toString();
- }
- document.write(aMenuHtml.join(""));
-}
-
-//==================================================================================================
-// TransMenu constructor (only called internally)
-//==================================================================================================
-// oActuator : The thing that causes the menu to be shown when it is mousedover. Either a
-// reference to an HTML element, or a TransMenuItem from an existing menu.
-// iDirection : The direction to slide out. One of TransMenu.direction.
-// iLeft : Left pixel offset of menu from actuator
-// iTop : Top pixel offset of menu from actuator
-// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
-// parentMenuSet : Menuset this menu will be added to.
-//==================================================================================================
-function TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, parentMenuSet) {
- // public methods
- this.addItem = addItem;
- this.addMenu = addMenu;
- this.toString = toString;
- this.initialize = initialize;
- this.isOpen = false;
- this.show = show;
- this.hide = hide;
- this.items = [];
-
- // events
- this.onactivate = new Function(); // when the menu starts to slide open
- this.ondeactivate = new Function(); // when the menu finishes sliding closed
- this.onmouseover = new Function(); // when the menu has been moused over
- this.onqueue = new Function(); // hack .. when the menu sets a timer to be closed a little while in the future
- this.ondequeue = new Function();
-
- // initialization
- this.index = TransMenu.registry.length;
- TransMenu.registry[this.index] = this;
-
- var id = "TransMenu" + this.index;
- var contentHeight = null;
- var contentWidth = null;
- var childMenuSet = null;
- var animating = false;
- var childMenus = [];
- var slideAccel = -1;
- var elmCache = null;
- var ready = false;
- var _this = this;
- var a = null;
-
- var pos = iDirection == TransMenu.direction.down ? "top" : "left";
- var dim = null;
-
- // private and public method implimentations
- function addItem(sText, sUrl) {
- var item = new TransMenuItem(sText, sUrl, this);
- item._index = this.items.length;
- this.items[item._index] = item;
- }
-
- function addMenu(oMenuItem) {
- if (!oMenuItem.parentMenu == this) throw new Error("Cannot add a menu here");
-
- if (childMenuSet == null) childMenuSet = new TransMenuSet(TransMenu.direction.right, -5, 2, TransMenu.reference.topRight);
-
- var m = childMenuSet.addMenu(oMenuItem);
-
- childMenus[oMenuItem._index] = m;
- m.onmouseover = child_mouseover;
- m.ondeactivate = child_deactivate;
- m.onqueue = child_queue;
- m.ondequeue = child_dequeue;
-
- return m;
- }
-
- function initialize() {
- initCache();
- initEvents();
- initSize();
- ready = true;
- }
-
- function show() {
- //dbg_dump("show");
- if (ready) {
- _this.isOpen = true;
- animating = true;
- setContainerPos();
- elmCache["clip"].style.visibility = "visible";
- elmCache["clip"].style.zIndex = TransMenu._maxZ++;
- //dbg_dump("maxZ: " + TransMenu._maxZ);
- slideStart();
- _this.onactivate();
- }
- }
-
- function hide() {
- if (ready) {
- _this.isOpen = false;
- animating = true;
-
- for (var i = 0, item = null; item = elmCache.item[i]; i++)
- dehighlight(item);
-
- if (childMenuSet) childMenuSet.hide();
-
- slideStart();
- _this.ondeactivate();
- }
- }
-
- function setContainerPos() {
- var sub = oActuator.constructor == TransMenuItem;
- var act = sub ? oActuator.parentMenu.elmCache["item"][oActuator._index] : oActuator;
- var el = act;
-
- var x = 0;
- var y = 0;
-
-
- var minX = 0;
- var maxX = (window.innerWidth ? window.innerWidth : document.body.clientWidth) - parseInt(elmCache["clip"].style.width);
- var minY = 0;
- var maxY = (window.innerHeight ? window.innerHeight : document.body.clientHeight) - parseInt(elmCache["clip"].style.height);
-
- // add up all offsets... subtract any scroll offset
- while (sub ? el.parentNode.className.indexOf("transMenu") == -1 : el.offsetParent) {
- x += el.offsetLeft;
- y += el.offsetTop;
-
- if (el.scrollLeft) x -= el.scrollLeft;
- if (el.scrollTop) y -= el.scrollTop;
-
- el = el.offsetParent;
- }
-
- if (oActuator.constructor == TransMenuItem) {
- x += parseInt(el.parentNode.style.left);
- y += parseInt(el.parentNode.style.top);
- }
-
- switch (iReferencePoint) {
- case TransMenu.reference.topLeft:
- break;
- case TransMenu.reference.topRight:
- x += act.offsetWidth;
- break;
- case TransMenu.reference.bottomLeft:
- y += act.offsetHeight;
- break;
- case TransMenu.reference.bottomRight:
- x += act.offsetWidth;
- y += act.offsetHeight;
- break;
- }
-
- x += iLeft;
- y += iTop;
-
- x = Math.max(Math.min(x, maxX), minX);
- y = Math.max(Math.min(y, maxY), minY);
-
- elmCache["clip"].style.left = x + "px";
- elmCache["clip"].style.top = y + "px";
- }
-
- function slideStart() {
- var x0 = parseInt(elmCache["content"].style[pos]);
- var x1 = _this.isOpen ? 0 : -dim;
-
- if (a != null) a.stop();
- a = new Accelimation(x0, x1, TransMenu.slideTime, slideAccel);
-
- a.onframe = slideFrame;
- a.onend = slideEnd;
-
- a.start();
- }
-
- function slideFrame(x) {
- elmCache["content"].style[pos] = x + "px";
- }
-
- function slideEnd() {
- if (!_this.isOpen) elmCache["clip"].style.visibility = "hidden";
- animating = false;
- }
-
- function initSize() {
- // everything is based off the size of the items table...
- var ow = elmCache["items"].offsetWidth;
- var oh = elmCache["items"].offsetHeight;
- var ua = navigator.userAgent.toLowerCase();
-
- // clipping container should be ow/oh + the size of the shadow
- elmCache["clip"].style.width = ow + TransMenu.shadowSize + 2 + "px";
- elmCache["clip"].style.height = oh + TransMenu.shadowSize + 2 + "px";
-
- // same with content...
- elmCache["content"].style.width = ow + TransMenu.shadowSize + "px";
- elmCache["content"].style.height = oh + TransMenu.shadowSize + "px";
-
- contentHeight = oh + TransMenu.shadowSize;
- contentWidth = ow + TransMenu.shadowSize;
-
- dim = iDirection == TransMenu.direction.down ? contentHeight : contentWidth;
-
- // set initially closed
- elmCache["content"].style[pos] = -dim - TransMenu.shadowSize + "px";
- elmCache["clip"].style.visibility = "hidden";
-
- // if *not* mac/ie 5
- if (ua.indexOf("mac") == -1 || ua.indexOf("gecko") > -1) {
- // set background div to offset size
- elmCache["background"].style.width = ow + "px";
- elmCache["background"].style.height = oh + "px";
- elmCache["background"].style.backgroundColor = TransMenu.backgroundColor;
-
- // shadow left starts at offset left and is offsetHeight pixels high
- elmCache["shadowRight"].style.left = ow + "px";
- elmCache["shadowRight"].style.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize) + "px";
- elmCache["shadowRight"].style.backgroundColor = TransMenu.shadowColor;
-
- // shadow bottom starts at offset height and is offsetWidth - shadowOffset
- // pixels wide (we don't want the bottom and right shadows to overlap or we
- // get an extra bright bottom-right corner)
- elmCache["shadowBottom"].style.top = oh + "px";
- elmCache["shadowBottom"].style.width = ow - TransMenu.shadowOffset + "px";
- elmCache["shadowBottom"].style.backgroundColor = TransMenu.shadowColor;
- }
- // mac ie is a little different because we use a PNG for the transparency
- else {
- // set background div to offset size
- elmCache["background"].firstChild.src = TransMenu.backgroundPng;
- elmCache["background"].firstChild.width = ow;
- elmCache["background"].firstChild.height = oh;
-
- // shadow left starts at offset left and is offsetHeight pixels high
- elmCache["shadowRight"].firstChild.src = TransMenu.shadowPng;
- elmCache["shadowRight"].style.left = ow + "px";
- elmCache["shadowRight"].firstChild.width = TransMenu.shadowSize;
- elmCache["shadowRight"].firstChild.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize);
-
- // shadow bottom starts at offset height and is offsetWidth - shadowOffset
- // pixels wide (we don't want the bottom and right shadows to overlap or we
- // get an extra bright bottom-right corner)
- elmCache["shadowBottom"].firstChild.src = TransMenu.shadowPng;
- elmCache["shadowBottom"].style.top = oh + "px";
- elmCache["shadowBottom"].firstChild.height = TransMenu.shadowSize;
- elmCache["shadowBottom"].firstChild.width = ow - TransMenu.shadowOffset;
- }
- }
-
- function initCache() {
- var menu = document.getElementById(id);
- var all = menu.all ? menu.all : menu.getElementsByTagName("*"); // IE/win doesn't support * syntax, but does have the document.all thing
-
- elmCache = {};
- elmCache["clip"] = menu;
- elmCache["item"] = [];
-
- for (var i = 0, elm = null; elm = all[i]; i++) {
- switch (elm.className) {
- case "items":
- case "content":
- case "background":
- case "shadowRight":
- case "shadowBottom":
- elmCache[elm.className] = elm;
- break;
- case "item":
- elm._index = elmCache["item"].length;
- elmCache["item"][elm._index] = elm;
- break;
- }
- }
-
- // hack!
- _this.elmCache = elmCache;
- }
-
- function initEvents() {
- // hook item mouseover
- for (var i = 0, item = null; item = elmCache.item[i]; i++) {
- item.onmouseover = item_mouseover;
- item.onmouseout = item_mouseout;
- item.onclick = item_click;
- }
-
- // hook actuation
- if (typeof oActuator.tagName != "undefined") {
- oActuator.onmouseover = actuator_mouseover;
- oActuator.onmouseout = actuator_mouseout;
- }
-
- // hook menu mouseover
- elmCache["content"].onmouseover = content_mouseover;
- elmCache["content"].onmouseout = content_mouseout;
- }
-
- function highlight(oRow) {
- oRow.className = "item hover";
- if (childMenus[oRow._index])
- oRow.lastChild.firstChild.src = TransMenu.dingbatOn;
- }
-
- function dehighlight(oRow) {
- oRow.className = "item";
- if (childMenus[oRow._index])
- oRow.lastChild.firstChild.src = TransMenu.dingbatOff;
- }
-
- function item_mouseover() {
- if (!animating) {
- highlight(this);
-
- if (childMenus[this._index])
- childMenuSet.showMenu(childMenus[this._index]);
- else if (childMenuSet) childMenuSet.hide();
- }
- }
-
- function item_mouseout() {
- if (!animating) {
- if (childMenus[this._index])
- childMenuSet.hideMenu(childMenus[this._index]);
- else // otherwise child_deactivate will do this
- dehighlight(this);
- }
- }
-
- function item_click() {
- if (!animating) {
- if (_this.items[this._index].url)
- location.href = _this.items[this._index].url;
- }
- }
-
- function actuator_mouseover() {
- parentMenuSet.showMenu(_this);
- }
-
- function actuator_mouseout() {
- parentMenuSet.hideMenu(_this);
- }
-
- function content_mouseover() {
- if (!animating) {
- parentMenuSet.showMenu(_this);
- _this.onmouseover();
- }
- }
-
- function content_mouseout() {
- if (!animating) {
- parentMenuSet.hideMenu(_this);
- }
- }
-
- function child_mouseover() {
- if (!animating) {
- parentMenuSet.showMenu(_this);
- }
- }
-
- function child_deactivate() {
- for (var i = 0; i < childMenus.length; i++) {
- if (childMenus[i] == this) {
- dehighlight(elmCache["item"][i]);
- break;
- }
- }
- }
-
- function child_queue() {
- parentMenuSet.hideMenu(_this);
- }
-
- function child_dequeue() {
- parentMenuSet.showMenu(_this);
- }
-
- function toString() {
- var aHtml = [];
- var sClassName = "transMenu" + (oActuator.constructor != TransMenuItem ? " top" : "");
-
- for (var i = 0, item = null; item = this.items[i]; i++) {
- aHtml[i] = item.toString(childMenus[i]);
- }
-
- return '<div id="' + id + '" class="' + sClassName + '">' +
- '<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">' +
- '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr>' +
- aHtml.join('') +
- '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr></table>' +
- '<div class="shadowBottom"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '<div class="shadowRight"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '<div class="background"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
- '</div></div>';
- }
-}
-
-
-//==================================================================================================
-// TransMenuSet
-//==================================================================================================
-// iDirection : The direction to slide out. One of TransMenu.direction.
-// iLeft : Left pixel offset of menus from actuator
-// iTop : Top pixel offset of menus from actuator
-// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
-//==================================================================================================
-TransMenuSet.registry = [];
-
-function TransMenuSet(iDirection, iLeft, iTop, iReferencePoint) {
- // public methods
- this.addMenu = addMenu;
- this.showMenu = showMenu;
- this.hideMenu = hideMenu;
- this.hide = hide;
- this.hideCurrent = hideCurrent;
-
- // initialization
- var menus = [];
- var _this = this;
- var current = null;
-
- this.index = TransMenuSet.registry.length;
- TransMenuSet.registry[this.index] = this;
-
- // method implimentations...
- function addMenu(oActuator) {
- var m = new TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, this);
- menus[menus.length] = m;
- return m;
- }
-
- function showMenu(oMenu) {
- if (oMenu != current) {
- // close currently open menu
- if (current != null) hide(current);
-
- // set current menu to this one
- current = oMenu;
-
- // if this menu is closed, open it
- oMenu.show();
- }
- else {
- // hide pending calls to close this menu
- cancelHide(oMenu);
- }
- }
-
- function hideMenu(oMenu) {
- //dbg_dump("hideMenu a " + oMenu.index);
- if (current == oMenu && oMenu.isOpen) {
- //dbg_dump("hideMenu b " + oMenu.index);
- if (!oMenu.hideTimer) scheduleHide(oMenu);
- }
- }
-
- function scheduleHide(oMenu) {
- //dbg_dump("scheduleHide " + oMenu.index);
- oMenu.onqueue();
- oMenu.hideTimer = window.setTimeout("TransMenuSet.registry[" + _this.index + "].hide(TransMenu.registry[" + oMenu.index + "])", TransMenu.hideDelay);
- }
-
- function cancelHide(oMenu) {
- //dbg_dump("cancelHide " + oMenu.index);
- if (oMenu.hideTimer) {
- oMenu.ondequeue();
- window.clearTimeout(oMenu.hideTimer);
- oMenu.hideTimer = null;
- }
- }
-
- function hide(oMenu) {
- if (!oMenu && current) oMenu = current;
-
- if (oMenu && current == oMenu && oMenu.isOpen) {
- hideCurrent();
- }
- }
-
- function hideCurrent() {
- if (null != current) {
- cancelHide(current);
- current.hideTimer = null;
- current.hide();
- current = null;
- }
- }
-}
-
-//==================================================================================================
-// TransMenuItem (internal)
-// represents an item in a dropdown
-//==================================================================================================
-// sText : The item display text
-// sUrl : URL to load when the item is clicked
-// oParent : Menu this item is a part of
-//==================================================================================================
-function TransMenuItem(sText, sUrl, oParent) {
- this.toString = toString;
- this.text = sText;
- this.url = sUrl;
- this.parentMenu = oParent;
-
- function toString(bDingbat) {
- var sDingbat = bDingbat ? TransMenu.dingbatOff : TransMenu.spacerGif;
- var iEdgePadding = TransMenu.itemPadding + TransMenu.menuPadding;
- var sPaddingLeft = "padding:" + TransMenu.itemPadding + "px; padding-left:" + iEdgePadding + "px;"
- var sPaddingRight = "padding:" + TransMenu.itemPadding + "px; padding-right:" + iEdgePadding + "px;"
-
- return '<tr class="item"><td nowrap style="' + sPaddingLeft + '">' +
- sText + '</td><td width="14" style="' + sPaddingRight + '">' +
- '<img src="' + sDingbat + '" width="14" height="14"></td></tr>';
- }
-}
-
-
-
-
-
-
-//=====================================================================
-// Accel[erated] [an]imation object
-// change a property of an object over time in an accelerated fashion
-//=====================================================================
-// obj : reference to the object whose property you'd like to animate
-// prop : property you would like to change eg: "left"
-// to : final value of prop
-// time : time the animation should take to run
-// zip : optional. specify the zippiness of the acceleration. pick a
-// number between -1 and 1 where -1 is full decelerated, 1 is
-// full accelerated, and 0 is linear (no acceleration). default
-// is 0.
-// unit : optional. specify the units for use with prop. default is
-// "px".
-//=====================================================================
-// bezier functions lifted from the lib_animation.js file in the
-// 13th Parallel API. www.13thparallel.org
-//=====================================================================
-
-function Accelimation(from, to, time, zip) {
- if (typeof zip == "undefined") zip = 0;
- if (typeof unit == "undefined") unit = "px";
-
- this.x0 = from;
- this.x1 = to;
- this.dt = time;
- this.zip = -zip;
- this.unit = unit;
- this.timer = null;
- this.onend = new Function();
- this.onframe = new Function();
-}
-
-
-
-//=====================================================================
-// public methods
-//=====================================================================
-
-// after you create an accelimation, you call this to start it-a runnin'
-Accelimation.prototype.start = function() {
- this.t0 = new Date().getTime();
- this.t1 = this.t0 + this.dt;
- var dx = this.x1 - this.x0;
- this.c1 = this.x0 + ((1 + this.zip) * dx / 3);
- this.c2 = this.x0 + ((2 + this.zip) * dx / 3);
- Accelimation._add(this);
-}
-
-// and if you need to stop it early for some reason...
-Accelimation.prototype.stop = function() {
- Accelimation._remove(this);
-}
-
-
-
-//=====================================================================
-// private methods
-//=====================================================================
-
-// paints one frame. gets called by Accelimation._paintAll.
-Accelimation.prototype._paint = function(time) {
- if (time < this.t1) {
- var elapsed = time - this.t0;
- this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));
- }
- else this._end();
-}
-
-// ends the animation
-Accelimation.prototype._end = function() {
- Accelimation._remove(this);
- this.onframe(this.x1);
- this.onend();
-}
-
-
-
-
-//=====================================================================
-// static methods (all private)
-//=====================================================================
-
-// add a function to the list of ones to call periodically
-Accelimation._add = function(o) {
- var index = this.instances.length;
- this.instances[index] = o;
- // if this is the first one, start the engine
- if (this.instances.length == 1) {
- this.timerID = window.setInterval("Accelimation._paintAll()", this.targetRes);
- }
-}
-
-// remove a function from the list
-Accelimation._remove = function(o) {
- for (var i = 0; i < this.instances.length; i++) {
- if (o == this.instances[i]) {
- this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) );
- break;
- }
- }
- // if that was the last one, stop the engine
- if (this.instances.length == 0) {
- window.clearInterval(this.timerID);
- this.timerID = null;
- }
-}
-
-// "engine" - call each function in the list every so often
-Accelimation._paintAll = function() {
- var now = new Date().getTime();
- for (var i = 0; i < this.instances.length; i++) {
- this.instances[i]._paint(now);
- }
-}
-
-
-// Bezier functions:
-Accelimation._B1 = function(t) { return t*t*t }
-Accelimation._B2 = function(t) { return 3*t*t*(1-t) }
-Accelimation._B3 = function(t) { return 3*t*(1-t)*(1-t) }
-Accelimation._B4 = function(t) { return (1-t)*(1-t)*(1-t) }
-
-
-//Finds the coordinates of a point at a certain stage through a bezier curve
-Accelimation._getBezier = function(percent,startPos,endPos,control1,control2) {
- return endPos * this._B1(percent) + control2 * this._B2(percent) + control1 * this._B3(percent) + startPos * this._B4(percent);
-}
-
-
-//=====================================================================
-// static properties
-//=====================================================================
-
-Accelimation.instances = [];
-Accelimation.targetRes = 10;
-Accelimation.timerID = null;
-
-
-//=====================================================================
-// IE win memory cleanup
-//=====================================================================
-
-if (window.attachEvent) {
- var cearElementProps = [
- 'data',
- 'onmouseover',
- 'onmouseout',
- 'onmousedown',
- 'onmouseup',
- 'ondblclick',
- 'onclick',
- 'onselectstart',
- 'oncontextmenu'
- ];
-
- window.attachEvent("onunload", function() {
- var el;
- for(var d = document.all.length;d--;){
- el = document.all[d];
- for(var c = cearElementProps.length;c--;){
- el[cearElementProps[c]] = null;
- }
- }
- });
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/javascript/transmenuC.js b/src/usr/local/www/themes/the_wall/javascript/transmenuC.js
deleted file mode 100644
index 88626c7..0000000
--- a/src/usr/local/www/themes/the_wall/javascript/transmenuC.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/* =================================================================================================
- * TransMenu
- * March, 2003
- * Customizable multi-level animated DHTML menus with transparency.
- * =================================================================================================
- * "Can I use this?"
- *
- * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
- * out at: http://creativecommons.org/licenses/by/2.0/
- *
- * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
- * for writing it. You may not misrepresent yourself as the author of this code.
- * =================================================================================================
- * "It's kinda hard to read, though"
- *
- * The uncompressed, commented version of this script can be found at:
- * http://youngpup.net/projects/transMenus
- * ============================================================================================== */
-TransMenu.spacerGif="themes/nervecenter/javascript/img/x.gif";TransMenu.dingbatOn="themes/nervecenter/javascript/img/submenu-on.gif";TransMenu.dingbatOff="themes/nervecenter/javascript/img/submenu-off.gif";TransMenu.dingbatSize=14;TransMenu.menuPadding=5;TransMenu.itemPadding=3;TransMenu.shadowSize=2;TransMenu.shadowOffset=3;TransMenu.shadowColor="#000000";TransMenu.shadowPng="themes/nervecenter/javascript/img/grey-40.png";TransMenu.backgroundColor="#990000";TransMenu.backgroundPng="themes/nervecenter/javascript/img/white-90.png";TransMenu.hideDelay=1000;TransMenu.slideTime=400;TransMenu.reference={topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};TransMenu.direction={down:1,right:2};TransMenu.registry=[];TransMenu._maxZ=100;TransMenu.isSupported=function(){var ua=navigator.userAgent.toLowerCase();var pf=navigator.platform.toLowerCase();var an=navigator.appName;var r=false;if(ua.indexOf("gecko")>-1&&navigator.productSub>=20020605)r=true;else if(an=="Microsoft Internet Explorer"){if(document.getElementById){if(pf.indexOf("mac")==0){r=/msie (\d(.\d*)?)/.test(ua)&&Number(RegExp.$1)>=5.1;}
-else r=true;}}
-return r;}
-TransMenu.initialize=function(){for(var i=0,menu=null;menu=this.registry[i];i++){menu.initialize();}}
-TransMenu.renderAll=function(){var aMenuHtml=[];for(var i=0,menu=null;menu=this.registry[i];i++){aMenuHtml[i]=menu.toString();}
-document.write(aMenuHtml.join(""));}
-function TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,parentMenuSet){this.addItem=addItem;this.addMenu=addMenu;this.toString=toString;this.initialize=initialize;this.isOpen=false;this.show=show;this.hide=hide;this.items=[];this.onactivate=new Function();this.ondeactivate=new Function();this.onmouseover=new Function();this.onqueue=new Function();this.ondequeue=new Function();this.index=TransMenu.registry.length;TransMenu.registry[this.index]=this;var id="TransMenu"+this.index;var contentHeight=null;var contentWidth=null;var childMenuSet=null;var animating=false;var childMenus=[];var slideAccel=-1;var elmCache=null;var ready=false;var _this=this;var a=null;var pos=iDirection==TransMenu.direction.down?"top":"left";var dim=null;function addItem(sText,sUrl){var item=new TransMenuItem(sText,sUrl,this);item._index=this.items.length;this.items[item._index]=item;}
-function addMenu(oMenuItem){if(!oMenuItem.parentMenu==this)throw new Error("Cannot add a menu here");if(childMenuSet==null)childMenuSet=new TransMenuSet(TransMenu.direction.right,-5,2,TransMenu.reference.topRight);var m=childMenuSet.addMenu(oMenuItem);childMenus[oMenuItem._index]=m;m.onmouseover=child_mouseover;m.ondeactivate=child_deactivate;m.onqueue=child_queue;m.ondequeue=child_dequeue;return m;}
-function initialize(){initCache();initEvents();initSize();ready=true;}
-function show(){if(ready){_this.isOpen=true;animating=true;setContainerPos();elmCache["clip"].style.visibility="visible";elmCache["clip"].style.zIndex=TransMenu._maxZ++;slideStart();_this.onactivate();}}
-function hide(){if(ready){_this.isOpen=false;animating=true;for(var i=0,item=null;item=elmCache.item[i];i++)dehighlight(item);if(childMenuSet)childMenuSet.hide();slideStart();_this.ondeactivate();}}
-function setContainerPos(){var sub=oActuator.constructor==TransMenuItem;var act=sub?oActuator.parentMenu.elmCache["item"][oActuator._index]:oActuator;var el=act;var x=0;var y=0;var minX=0;var maxX=(window.innerWidth?window.innerWidth:document.body.clientWidth)-parseInt(elmCache["clip"].style.width);var minY=0;var maxY=(window.innerHeight?window.innerHeight:document.body.clientHeight)-parseInt(elmCache["clip"].style.height);while(sub?el.parentNode.className.indexOf("transMenu")==-1:el.offsetParent){x+=el.offsetLeft;y+=el.offsetTop;if(el.scrollLeft)x-=el.scrollLeft;if(el.scrollTop)y-=el.scrollTop;el=el.offsetParent;}
-if(oActuator.constructor==TransMenuItem){x+=parseInt(el.parentNode.style.left);y+=parseInt(el.parentNode.style.top);}
-switch(iReferencePoint){case TransMenu.reference.topLeft:break;case TransMenu.reference.topRight:x+=act.offsetWidth;break;case TransMenu.reference.bottomLeft:y+=act.offsetHeight;break;case TransMenu.reference.bottomRight:x+=act.offsetWidth;y+=act.offsetHeight;break;}
-x+=iLeft;y+=iTop;x=Math.max(Math.min(x,maxX),minX);y=Math.max(Math.min(y,maxY),minY);elmCache["clip"].style.left=x+"px";elmCache["clip"].style.top=y+"px";}
-function slideStart(){var x0=parseInt(elmCache["content"].style[pos]);var x1=_this.isOpen?0:-dim;if(a!=null)a.stop();a=new Accelimation(x0,x1,TransMenu.slideTime,slideAccel);a.onframe=slideFrame;a.onend=slideEnd;a.start();}
-function slideFrame(x){elmCache["content"].style[pos]=x+"px";}
-function slideEnd(){if(!_this.isOpen)elmCache["clip"].style.visibility="hidden";animating=false;}
-function initSize(){var ow=elmCache["items"].offsetWidth;var oh=elmCache["items"].offsetHeight;var ua=navigator.userAgent.toLowerCase();elmCache["clip"].style.width=ow+TransMenu.shadowSize+2+"px";elmCache["clip"].style.height=oh+TransMenu.shadowSize+2+"px";elmCache["content"].style.width=ow+TransMenu.shadowSize+"px";elmCache["content"].style.height=oh+TransMenu.shadowSize+"px";contentHeight=oh+TransMenu.shadowSize;contentWidth=ow+TransMenu.shadowSize;dim=iDirection==TransMenu.direction.down?contentHeight:contentWidth;elmCache["content"].style[pos]=-dim-TransMenu.shadowSize+"px";elmCache["clip"].style.visibility="hidden";if(ua.indexOf("mac")==-1||ua.indexOf("gecko")>-1){elmCache["background"].style.width=ow+"px";elmCache["background"].style.height=oh+"px";elmCache["background"].style.backgroundColor=TransMenu.backgroundColor;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].style.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize)+"px";elmCache["shadowRight"].style.backgroundColor=TransMenu.shadowColor;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].style.width=ow-TransMenu.shadowOffset+"px";elmCache["shadowBottom"].style.backgroundColor=TransMenu.shadowColor;}
-else{elmCache["background"].firstChild.src=TransMenu.backgroundPng;elmCache["background"].firstChild.width=ow;elmCache["background"].firstChild.height=oh;elmCache["shadowRight"].firstChild.src=TransMenu.shadowPng;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].firstChild.width=TransMenu.shadowSize;elmCache["shadowRight"].firstChild.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize);elmCache["shadowBottom"].firstChild.src=TransMenu.shadowPng;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].firstChild.height=TransMenu.shadowSize;elmCache["shadowBottom"].firstChild.width=ow-TransMenu.shadowOffset;}}
-function initCache(){var menu=document.getElementById(id);var all=menu.all?menu.all:menu.getElementsByTagName("*");elmCache={};elmCache["clip"]=menu;elmCache["item"]=[];for(var i=0,elm=null;elm=all[i];i++){switch(elm.className){case"items":case"content":case"background":case"shadowRight":case"shadowBottom":elmCache[elm.className]=elm;break;case"item":elm._index=elmCache["item"].length;elmCache["item"][elm._index]=elm;break;}}
-_this.elmCache=elmCache;}
-function initEvents(){for(var i=0,item=null;item=elmCache.item[i];i++){item.onmouseover=item_mouseover;item.onmouseout=item_mouseout;item.onclick=item_click;}
-if(typeof oActuator.tagName!="undefined"){oActuator.onmouseover=actuator_mouseover;oActuator.onmouseout=actuator_mouseout;}
-elmCache["content"].onmouseover=content_mouseover;elmCache["content"].onmouseout=content_mouseout;}
-function highlight(oRow){oRow.className="item hover";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOn;}
-function dehighlight(oRow){oRow.className="item";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOff;}
-function item_mouseover(){if(!animating){highlight(this);if(childMenus[this._index])childMenuSet.showMenu(childMenus[this._index]);else if(childMenuSet)childMenuSet.hide();}}
-function item_mouseout(){if(!animating){if(childMenus[this._index])childMenuSet.hideMenu(childMenus[this._index]);else dehighlight(this);}}
-function item_click(){if(!animating){if(_this.items[this._index].url)location.href=_this.items[this._index].url;}}
-function actuator_mouseover(){parentMenuSet.showMenu(_this);}
-function actuator_mouseout(){parentMenuSet.hideMenu(_this);}
-function content_mouseover(){if(!animating){parentMenuSet.showMenu(_this);_this.onmouseover();}}
-function content_mouseout(){if(!animating){parentMenuSet.hideMenu(_this);}}
-function child_mouseover(){if(!animating){parentMenuSet.showMenu(_this);}}
-function child_deactivate(){for(var i=0;i<childMenus.length;i++){if(childMenus[i]==this){dehighlight(elmCache["item"][i]);break;}}}
-function child_queue(){parentMenuSet.hideMenu(_this);}
-function child_dequeue(){parentMenuSet.showMenu(_this);}
-function toString(){var aHtml=[];var sClassName="transMenu"+(oActuator.constructor!=TransMenuItem?" top":"");for(var i=0,item=null;item=this.items[i];i++){aHtml[i]=item.toString(childMenus[i]);}
-return'<div id="'+id+'" class="'+sClassName+'">'+'<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">'+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr>'+aHtml.join('')+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr></table>'+'<div class="shadowBottom"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="shadowRight"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="background"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'</div></div>';}}
-TransMenuSet.registry=[];function TransMenuSet(iDirection,iLeft,iTop,iReferencePoint){this.addMenu=addMenu;this.showMenu=showMenu;this.hideMenu=hideMenu;this.hide=hide;this.hideCurrent=hideCurrent;var menus=[];var _this=this;var current=null;this.index=TransMenuSet.registry.length;TransMenuSet.registry[this.index]=this;function addMenu(oActuator){var m=new TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,this);menus[menus.length]=m;return m;}
-function showMenu(oMenu){if(oMenu!=current){if(current!=null)hide(current);current=oMenu;oMenu.show();}
-else{cancelHide(oMenu);}}
-function hideMenu(oMenu){if(current==oMenu&&oMenu.isOpen){if(!oMenu.hideTimer)scheduleHide(oMenu);}}
-function scheduleHide(oMenu){oMenu.onqueue();oMenu.hideTimer=window.setTimeout("TransMenuSet.registry["+_this.index+"].hide(TransMenu.registry["+oMenu.index+"])",TransMenu.hideDelay);}
-function cancelHide(oMenu){if(oMenu.hideTimer){oMenu.ondequeue();window.clearTimeout(oMenu.hideTimer);oMenu.hideTimer=null;}}
-function hide(oMenu){if(!oMenu&&current)oMenu=current;if(oMenu&&current==oMenu&&oMenu.isOpen){hideCurrent();}}
-function hideCurrent(){if (null != current){cancelHide(current);current.hideTimer=null;current.hide();current=null;}}}
-function TransMenuItem(sText,sUrl,oParent){this.toString=toString;this.text=sText;this.url=sUrl;this.parentMenu=oParent;function toString(bDingbat){var sDingbat=bDingbat?TransMenu.dingbatOff:TransMenu.spacerGif;var iEdgePadding=TransMenu.itemPadding+TransMenu.menuPadding;var sPaddingLeft="padding:"+TransMenu.itemPadding+"px; padding-left:"+iEdgePadding+"px;"
-var sPaddingRight="padding:"+TransMenu.itemPadding+"px; padding-right:"+iEdgePadding+"px;"
-return'<tr class="item"><td nowrap style="'+sPaddingLeft+'">'+sText+'</td><td width="14" style="'+sPaddingRight+'">'+'<img src="'+sDingbat+'" width="14" height="14"></td></tr>';}}
-function Accelimation(from,to,time,zip){if(typeof zip=="undefined")zip=0;if(typeof unit=="undefined")unit="px";this.x0=from;this.x1=to;this.dt=time;this.zip=-zip;this.unit=unit;this.timer=null;this.onend=new Function();this.onframe=new Function();}
-Accelimation.prototype.start=function(){this.t0=new Date().getTime();this.t1=this.t0+this.dt;var dx=this.x1-this.x0;this.c1=this.x0+((1+this.zip)*dx/3);this.c2=this.x0+((2+this.zip)*dx/3);Accelimation._add(this);}
-Accelimation.prototype.stop=function(){Accelimation._remove(this);}
-Accelimation.prototype._paint=function(time){if(time<this.t1){var elapsed=time-this.t0;this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));}
-else this._end();}
-Accelimation.prototype._end=function(){Accelimation._remove(this);this.onframe(this.x1);this.onend();}
-Accelimation._add=function(o){var index=this.instances.length;this.instances[index]=o;if(this.instances.length==1){this.timerID=window.setInterval("Accelimation._paintAll()",this.targetRes);}}
-Accelimation._remove=function(o){for(var i=0;i<this.instances.length;i++){if(o==this.instances[i]){this.instances=this.instances.slice(0,i).concat(this.instances.slice(i+1));break;}}
-if(this.instances.length==0){window.clearInterval(this.timerID);this.timerID=null;}}
-Accelimation._paintAll=function(){var now=new Date().getTime();for(var i=0;i<this.instances.length;i++){this.instances[i]._paint(now);}}
-Accelimation._B1=function(t){return t*t*t}
-Accelimation._B2=function(t){return 3*t*t*(1-t)}
-Accelimation._B3=function(t){return 3*t*(1-t)*(1-t)}
-Accelimation._B4=function(t){return(1-t)*(1-t)*(1-t)}
-Accelimation._getBezier=function(percent,startPos,endPos,control1,control2){return endPos*this._B1(percent)+control2*this._B2(percent)+control1*this._B3(percent)+startPos*this._B4(percent);}
-Accelimation.instances=[];Accelimation.targetRes=10;Accelimation.timerID=null;
-if(window.attachEvent){var cearElementProps=['data','onmouseover','onmouseout','onmousedown','onmouseup','ondblclick','onclick','onselectstart','oncontextmenu'];window.attachEvent("onunload", function() {var el;for(var d=document.all.length;d--;){el=document.all[d];for(var c=cearElementProps.length;c--;){el[cearElementProps[c]] = null;}}});} \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/jsevents/body.def b/src/usr/local/www/themes/the_wall/jsevents/body.def
deleted file mode 100644
index 501d548..0000000
--- a/src/usr/local/www/themes/the_wall/jsevents/body.def
+++ /dev/null
@@ -1,7 +0,0 @@
-# Format: <event_name>=<jsfunction_name> !<forbidden_page_0>,<forbidden_page_1>...<forbidden_page_n>
-# where: forbidden pages are those pages that should *not* use
-# the particular JavaScript function within the JS event
-# specified below.
-# $Id$
-#
-onload=tmenuinit(); !wizard.php \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/loader.js b/src/usr/local/www/themes/the_wall/loader.js
deleted file mode 100644
index 20ecfbb..0000000
--- a/src/usr/local/www/themes/the_wall/loader.js
+++ /dev/null
@@ -1,30 +0,0 @@
-//<![CDATA[
-
-var browser = '';
-var version = '';
-var entrance = '';
-var cond = '';
-
-// BROWSER?
-if (browser == '') {
- if (navigator.appName.indexOf('Microsoft') != -1)
- browser = 'IE';
- else if (navigator.appName.indexOf('Netscape') != -1)
- browser = 'Netscape';
- else
- browser = 'IE';
-}
-if (version == '') {
- version= navigator.appVersion;
- paren = version.indexOf('(');
- whole_version = navigator.appVersion.substring(0,paren-1);
- version = parseInt(whole_version);
-}
-
-if (browser == 'IE' && version < 7) {
- document.write('<script type="text/javascript" src="/themes/the_wall/javascript/ie7/ie7-standard-p.js"></script>');
-}
-
-document.write('<script type="text/javascript" src="/themes/the_wall/javascript/niftyjsCode.js"></script>');
-
-//]]>
diff --git a/src/usr/local/www/themes/the_wall/login.css b/src/usr/local/www/themes/the_wall/login.css
deleted file mode 100644
index 3c97a9a..0000000
--- a/src/usr/local/www/themes/the_wall/login.css
+++ /dev/null
@@ -1,1159 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.infoboxnptd2 {
- width:100%;
- color:white;
- background-color:#990000;
- padding-right: 10px;
-}
-
-.infoboxnptd {
- width:8%;
- background-color:#990000;
-}
-
-.infoboxnptable {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnptable2 {
- height:32px;
- width:100%;
- background-color:#990000;
-}
-
-.infoboxnp {
- background-color:#990000;
- width:100%;
-}
-
-.infoboxnpimg {
- vertical-align:middle;
- width:28px;
- height:32px;
- background-color:#990000;
-}
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #999999;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- background: url('images/background.jpg') repeat-x; background-attachment:fixed;
- background-position : center 0px;
- background-color: #999999;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 20px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
- text-align: center;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-#login {
-/* background: #cccccc; */
- background-color: transparent;
- border: 0px solid #cccccc;
- margin: 5em auto;
- padding: 0em;
- width: 400px;
-/* filter:alpha(opacity=60);
- -moz-opacity:0.6;
- -khtml-opacity: 0.6;
- opacity: 0.6; */
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
-/* background: #ffffff; */
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 400px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -420px;
- left: 70px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- top: -300px; */
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px;
- position: relative;
- left: 10px;
- top: -300px; */
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- text-align: center;
- padding: 3px;
- margin: 0em;
-/* text-indent: 10px; */
- position: relative;
- top: -20px;
- left: 170px;
-}
-
-/* loginerror box follows */
-
-#login #inputerrors {
- background-color: transparent;
- border: 0px solid #666666;
- margin: 5em auto;
- vertical-align: middle;
- padding: 0em;
- width: 330px;
- height: 50px;
- position: relative;
- top: -370px;
-}
-/*
-#login #errortext {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 330px;
- position: relative;
- top: -350px;
-}
-
-#login #errordesc {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 330px;
- position: relative;
- top: -350px;
-}
-#login #errordesc h1 {
- background: url(/images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-// position: relative;
-// top: -300px;
-}
-*/ \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/menu.inc b/src/usr/local/www/themes/the_wall/menu.inc
deleted file mode 100644
index a274410..0000000
--- a/src/usr/local/www/themes/the_wall/menu.inc
+++ /dev/null
@@ -1,177 +0,0 @@
-<?php
-/* $Id$ */
-/* ========================================================================== */
-/*
- menu.inc
- Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
- All rights reserved.
- */
-/* ========================================================================== */
-/*
- Originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
- */
-/* ========================================================================== */
-
-require("menu.inc");
-
-define("TMENU_STUB", "
- // set up drop downs anywhere in the body of the page. I think the bottom of the page is better..
- // but you can experiment with effect on loadtime.
- if (TransMenu.isSupported()) {
-
- //==================================================================================================
- // create a set of dropdowns
- //==================================================================================================
- // the first param should always be down, as it is here
- //
- // The second and third param are the top and left offset positions of the menus from their actuators
- // respectively. To make a menu appear a little to the left and bottom of an actuator, you could use
- // something like -5, 5
- //
- // The last parameter can be .topLeft, .bottomLeft, .topRight, or .bottomRight to inidicate the corner
- // of the actuator from which to measure the offset positions above. Here we are saying we want the
- // menu to appear directly below the bottom left corner of the actuator
- //==================================================================================================
- var ms = new TransMenuSet(TransMenu.direction.down, 1, 0, TransMenu.reference.bottomLeft);
-
- //==================================================================================================
- // create a dropdown menu
- //==================================================================================================
- // the first parameter should be the HTML element which will act actuator for the menu
- //==================================================================================================
-
- @@MENU_DEFINITIONS@@
-
- //==================================================================================================
- // write drop downs into page
- //==================================================================================================
- // this method writes all the HTML for the menus into the page with document.write(). It must be
- // called within the body of the HTML page.
- //==================================================================================================
- TransMenu.renderAll();
- }
-");
-
-class NervecenterMenu extends Menu {
- private $menuJScript = "NOT-SET";
- private $menuJScriptEvents = "NOT-SET";
- private $menuID = "NOT-SET";
-
- public function __construct($identification = "", $filename = "", Component $c = NULL) {
- parent::__construct($identification, $filename, $c);
-
- $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
- $this->menuID = $id;
-
- if ($this->hasParent()) {
- $this->menuJScript = "\tvar {$id} = ms.addMenu(document.getElementById('{$id}'));\n";
- }
- } // end __construct
-
- public function getMenuID() {
- return $this->menuID;
- }
-
- public function setMenuID($myMenuID) {
- $this->menuID = $myMenuID;
- }
-
- public function getMenuJScript() {
- $childJScript = "";
- foreach ($this->getChildren() as $component) {
- $childJScript .= $component->getMenuJScript();
- }
-
- if (! $this->hasParent()) {
- $this->menuJScript = str_replace("@@MENU_DEFINITIONS@@", $childJScript, TMENU_STUB);
- } else {
- $this->menuJScript .= "\n$childJScript\n";
- }
-
- return $this->menuJScript;
- }
-
- public function getMenuJScriptEvents() {
- return $this->menuJScriptEvents;
- }
-
- public function __toString() {
- if (! $this->hasParent()) {
- $menuMarkup =<<<EOD
- <div id="menu">
- @@CHILD_ELEMENTS@@
- </div>
-
-EOD;
- } else {
- $name = gettext($this->getID());
- $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
-
- $menuMarkup =<<<EOD
- <a id="{$id}" href="#">{$name}</a>
- @@CHILD_ELEMENTS@@
-EOD;
- }
-
- $childMarkup = "";
- foreach ($this->getChildren() as $component) {
- $childMarkup .= $component;
- }
-
- $menuMarkup = str_replace("@@CHILD_ELEMENTS@@", $childMarkup, $menuMarkup);
-
- return $menuMarkup;
- }
-}
-
-class NervecenterMenuItem extends MenuItem {
- private $menuJScript = "NOT-SET";
- private $menuJScriptEvents = "NOT-SET";
-
- public function __construct($identification = "", $filename = "", $href = "", Component $c = NULL) {
- parent::__construct($identification, $filename, $href, $c);
-
- $href = $this->getHref() <> "" ? $this->getHref() : "{$this->getFile()}";
- $name = gettext($this->getID());
- $file = $this->getFile();
-
- $this->menuJScript = $this->check_access("{$file}", "\t{$this->getParent()->getMenuID()}.addItem('{$name}', '{$href}');\n");
- }
-
- public function getMenuJScript() {
- return $this->menuJScript;
- }
-
- public function getMenuJScriptEvents() {
- return $this->menuJScriptEvents;
- }
-
- public function __toString() {
- return "";
- }
-}
-
-?>
diff --git a/src/usr/local/www/themes/the_wall/new_tab_menu.css b/src/usr/local/www/themes/the_wall/new_tab_menu.css
deleted file mode 100644
index 04c4cf2..0000000
--- a/src/usr/local/www/themes/the_wall/new_tab_menu.css
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- new_tab_menu.css
- part of pfSense
- Copyright (C) 2010-2011 Robert Zelaya
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-
-
- Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
- The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
-
- <tr>
- <td>
- <?php
- $tab_array_indent = 0; // move to the line in px
- $tab_array_space = 1; // space betwen lines in px
- $tab_array_char_limit = 82; // number or chr before the drop down box
- $tab_array = array();
- $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
- $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
- $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
- $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
- $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
- $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
-
-*/
-
-.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
-
-.newtabmenu li{float:left; margin-right:2px; text-align: center;}
-.newtabmenu a:link, .newtabmenu a:visited{
- background:url(images/new_tab_menu.png) right 45px;
- color:#ffffff; /* noactive font */
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- font-weight:bold;
- font-size:.9em;
- height:20px;
- line-height:20px;
- text-decoration:none;
-}
-.newtabmenu a span{
- background:url(images/new_tab_menu.png) left 45px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- height:20px;
- margin-right:7px;
- padding-left:7px;
-}
-.newtabmenu a:hover{
- background:url(images/new_tab_menu.png) right 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
- color:#ffffff; /* hover over font */
-}
-.newtabmenu a:hover span{
- background:url(images/new_tab_menu.png) left 23px;
- display:block;
- /* fix for IE6 */
- display: inline-block;
- /* END */
-}
-
-/* -------------------------------- */
-/* ACTIVE ELEMENTS */
-.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
- color:#000000; /* active font */
- background:url(images/new_tab_menu.png) right 0 no-repeat;
-}
-.newtabmenu_active a span, .newtabmenu_active a:hover span{
- background:url(images/new_tab_menu.png) left 0 no-repeat;
-} \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/no_big_logo b/src/usr/local/www/themes/the_wall/no_big_logo
deleted file mode 100644
index 6e5c70d..0000000
--- a/src/usr/local/www/themes/the_wall/no_big_logo
+++ /dev/null
@@ -1 +0,0 @@
-NO! DONT! \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/rrdcolors.inc.php b/src/usr/local/www/themes/the_wall/rrdcolors.inc.php
deleted file mode 100644
index dcb7a39..0000000
--- a/src/usr/local/www/themes/the_wall/rrdcolors.inc.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/* $Id$ */
-/*
- rrdcolors.inc.php
- Part of pfSense
- Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR 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.
-*/
-
-/* This file is included by the RRD graphing page and sets the colors */
-
-/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
-$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
-
-/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
-$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
-
-/* 95th Percentile Lines Out, In */
-$colortraffic95 = array('660000', 'FF0000');
-
-/* State Table pfrate, pfstates, pfnat, srcip, dstip */
-$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
-
-/* Processor Usage user, nice, system, int, processes */
-$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
-
-/* Memory Usage active, inact, free, cache, wire */
-$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
-
-/* MBUF Usage current, cache, total, max */
-$colormbuf = array('0080FF','00E344','FF0000','000000');
-
-/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
-$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
-$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
-
-/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
-$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
-/* Quality Graph Loss */
-$colorqualityloss = 'ee0000';
-
-/* Wireless Graph SNR, Rate, Channel*/
-/* Cellular Graph RSSI, */
-$colorwireless = array('333333','a83c3c','999999');
-
-/* SPAMD Times min area, avg area, max area, Time line */
-$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
-/* SPAMD Connections max area, min area, min line, max line, avg line */
-$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
-
-/* OpenVPN Users Online Users */
-$colorvpnusers = array('990000');
-
-/* Captive Portal Total Users Total Users */
-/* Captive Portal Concurrent Concurrent Users */
-$colorcaptiveportalusers = array('990000');
-
-?>
diff --git a/src/usr/local/www/themes/the_wall/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/the_wall/styles/jquery-ui-1.11.1.css
deleted file mode 100644
index 8a8c54f..0000000
--- a/src/usr/local/www/themes/the_wall/styles/jquery-ui-1.11.1.css
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*! jQuery UI - v1.11.1 - 2014-09-22
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.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:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-clearfix {
- min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* 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: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.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: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- 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;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- min-height: 0; /* support: IE7 */
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
- position: absolute;
- left: .5em;
- top: 50%;
- margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-button {
- display: inline-block;
- position: relative;
- padding: 0;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
- width: 2.4em;
-}
-.ui-button-icons-only {
- width: 3.4em;
-}
-button.ui-button-icons-only {
- width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
- display: block;
- line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
- padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
- padding: .4em;
- text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
- padding-left: 2.1em;
- padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
- padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
- position: absolute;
- top: 50%;
- margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
- left: 50%;
- margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
- left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
- right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
- margin-right: 7px;
-}
-.ui-buttonset .ui-button {
- margin-left: 0;
- margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.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 {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.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,
-.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%;
- font-size: 0;
-}
-
-/* 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,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-.ui-dialog {
- overflow: hidden;
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
- width: 12px;
- height: 12px;
- right: -5px;
- bottom: -5px;
- background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: none;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- position: relative;
- margin: 0;
- padding: 3px 1em 3px .4em;
- cursor: pointer;
- min-height: 0; /* support: IE7 */
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-progressbar {
- height: 1em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
- background-color: #990000;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
- height: 100%;
- filter: alpha(opacity=25); /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- /* Support: IE7 */
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-button {
- display: inline-block;
- overflow: hidden;
- position: relative;
- text-decoration: none;
- cursor: pointer;
-}
-.ui-selectmenu-button span.ui-icon {
- right: 0.5em;
- left: auto;
- margin-top: -8px;
- position: absolute;
- top: 50%;
-}
-.ui-selectmenu-button span.ui-selectmenu-text {
- text-align: left;
- padding: 0.4em 2.1em 0.4em 1em;
- display: block;
- line-height: 1.4;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.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;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.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;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 22px;
-}
-.ui-spinner-button {
- width: 16px;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top: none;
- border-bottom: none;
- border-right: none;
-}
-/* vertically center icon */
-.ui-spinner .ui-icon {
- position: absolute;
- margin-top: -8px;
- top: 50%;
- left: 0;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
- /* need to fix icons sprite */
- background-position: -65px -16px;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
- -webkit-box-shadow: 0 0 5px #aaa;
- box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #aaaaaa;
- background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #bbbbbb;
- /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
- color: #444444;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #444444;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #cccccc;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #3383bb;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #3383bb;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #bbbbbb;
- background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #599fcf;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited {
- color: #599fcf;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #999999;
- background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #ffffff;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #ffffff;
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
- color: #444444;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #444444;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #c0402a;
- background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
- color: #ffffff;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #ffffff;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #ffffff;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70); /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35); /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
-}
-.ui-state-default .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-active .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
-}
-.ui-state-highlight .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.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-on { background-position: -96px -144px; }
-.ui-icon-radio-off { 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-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.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-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 6px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 6px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
- opacity: .8;
- filter: Alpha(Opacity=80); /* support: IE8 */
-}
-.ui-widget-shadow {
- margin: -4px 0 0 -4px;
- padding: 4px;
- background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
- opacity: .6;
- filter: Alpha(Opacity=60); /* support: IE8 */
- border-radius: 0pxdow;
-}
diff --git a/src/usr/local/www/themes/the_wall/styles/menustyles.css b/src/usr/local/www/themes/the_wall/styles/menustyles.css
deleted file mode 100644
index 06b3c7a..0000000
--- a/src/usr/local/www/themes/the_wall/styles/menustyles.css
+++ /dev/null
@@ -1,44 +0,0 @@
-#navigation {
- /* border:1px solid black; */
- width: 98%;
- vertical-align: middle;
- height: 16px;
- padding-top: 4px;
- }
-
-#menu {
- /* background: #990000; */
- /* border-bottom:1px solid white; */
- padding: 0 0 0 0;
- width: 98%;
- vertical-align: middle;
- height: 16px;
- }
-#menu a {
- padding: 2px 28px 4px 28px;
- text-decoration: none;
- font-weight: bold;
- font-size: 1.0em;
- color: #FFFFFF;
- width: 08%;
- height: 16px;
- }
-#menu a.hover {
- background: #AF2020;
- }
-#menu span {
- display: none;
- }
-
-#subnav {
- font-size: 10px;
- margin-bottom: 2em;
- }
-#subnav a {
- color: #FF0000; /* #FB3B00; */
- margin-right: 1em;
- }
-#subnav span {
- color: silver;
- margin-right: 1em;
- }
diff --git a/src/usr/local/www/themes/the_wall/styles/transmenu.css b/src/usr/local/www/themes/the_wall/styles/transmenu.css
deleted file mode 100644
index f683574..0000000
--- a/src/usr/local/www/themes/the_wall/styles/transmenu.css
+++ /dev/null
@@ -1,75 +0,0 @@
-/* this is the clipping region for the menu. it's width and height get set by script, depending on the size of the items table */
-.transMenu {
- position:absolute;
- overflow:hidden;
- left:-1000px;
- top:-1000px;
- }
-
-/* this is the main container for the menu itself. it's width and height get set by script, depending on the size of the items table */
-.transMenu .content {
- position:absolute;
- }
-
-/* this table comprises all menu items. each TR is one item. It is relatively positioned so that the shadow and background transparent divs can be positioned underneath it */
-.transMenu .items {
- position:relative;
- left:0px; top:0px;
- z-index:2;
- }
-
-.transMenu.top .items {
- border-top:none;
- }
-
-/* each TR.item is one menu item */
-.transMenu .item {
- color: #FFFFFF; /* #336; */
- font-size: 1.1em;
- font-weight: normal;
- font-family:sans-serif;
- text-decoration:none;
- /* this is a hack for mac/ie5, whom incorrectly cascades the border properties of the parent table to each row */
- border:none;
- cursor:pointer;
- cursor:hand;
- }
-
-/* this DIV is the semi-transparent white background of each menu. the -moz-opacity is a proprietary way to get transparency in mozilla, the filter is for IE/windows 5.0+. */
-/* we set the background color in script because ie mac does not use it; that browser only uses a semi-transparent white PNG that the spacer gif inside this DIV is replaced by */
-.transMenu .background {
- position:absolute;
- left:0px; top:0px;
- z-index:1;
- -moz-opacity:.8;
- filter:alpha(opacity=80);
- }
-
-/* same concept as .background, but this is the sliver of shadow on the right of the menu. It's left, height, and background are set by script. In IE5/mac, it uses a PNG */
-.transMenu .shadowRight {
- position:absolute;
- z-index:3;
- top:3px; width:2px;
- -moz-opacity:.4;
- filter:alpha(opacity=40);
- }
-
-/* same concept as .background, but this is the sliver of shadow on the bottom of the menu. It's top, width, and background are set by script. In IE5/mac, it uses a PNG */
-.transMenu .shadowBottom {
- position:absolute;
- z-index:1;
- left:3px; height:2px;
- -moz-opacity:.4;
- filter:alpha(opacity=40);
- }
-
-/* this is the class that is used when the mouse is over an item. script sets the row to this class when required. */
-.transMenu .item.hover {
- background:#fdfdfd;
- color:black;
- }
-
-/* this is either the dingbat that indicates there is a submenu, or a spacer gif in it's place. We give it extra margin to create some space between the text and the dingbat */
-.transMenu .item img {
- margin-left:10px;
- } \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/wizard.css b/src/usr/local/www/themes/the_wall/wizard.css
deleted file mode 100644
index a2d31d5..0000000
--- a/src/usr/local/www/themes/the_wall/wizard.css
+++ /dev/null
@@ -1,1060 +0,0 @@
-/* Element CSS Definitions */
-html, body, td, th, input, select {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 0.9em;
-
-}
-
-.nowrap { white-space: nowrap; }
-
-/* please adjust the bgcolor to be used together with niftycorners! */
-.rtop, .artop {
- background-color: #999999;
-}
-
-div.GraphLink {
- position: relative;
-}
-
-span.GraphLinkLine {
- position: absolute;
- background-color: #990000;
- width: 100%;
-}
-
-/* DOM Tooltip CSS definitions */
-div.niceTitle
-{
- background-color: #333333;
- color: #FFFFFF;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- width: 250px;
- left: 0;
- top: 0;
- padding: 4px;
- position: absolute;
- text-align: left;
- z-index: 20;
- -moz-border-radius: 0 10px 10px 10px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
- -moz-opacity: .87;
- -khtml-opacity: .87;
- opacity: .87;
-}
-div.niceTitle h1
-{
- background: #990000;
- border-bottom: 1px dotted #FFFFFF;
- font-weight: bold;
- font-size: 13px;
- font-family: "Trebuchet MS", sans-serif;
- margin: 3px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 3px;
- text-align: left;
- left: 0;
- top: 0;
- -moz-border-radius: 0 8px 0 0;
- -moz-opacity: 1;
-}
-div.niceTitle .contents
-{
- margin: 0;
- padding: 0 3px;
- filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
- -moz-opacity: 1;
- -khtml-opacity: 1;
- opacity: 1;
-}
-div.niceTitle p
-{
- background: #FFFFFF;
- border: 1px solid #990000;
- color: #000000;
- font-size: 9px;
- padding: 5px;
- margin: 3px;
- text-align: left;
- -moz-opacity: 1;
- -moz-border-radius: 0 0 8px 8px;
-}
-
-body {
- margin: 0px auto;
- /* background: url('images/background.png') no-repeat; */
- background-position : center 0px;
- background-color: #999999;
-}
-
-form {
- margin: 0px;
-}
-a {
- text-decoration: none;
-}
-form input {
- font-size: 1.1em;
-}
-
-iframe {
- z-index: 1;
- border: 1px dashed #990000;
-}
-.iframe {
- background-color: #FFFFFF;
-}
-
-/* ID Based CSS Definitions */
-#wrapper {
- width: 810px;
- margin: 0px auto;
-}
-
-#header {
- background: url('images/header.png') no-repeat;
- background-position: 0px;
- height: 102px;
- width: 810px;
- margin-bottom: 5px;
- z-index: 2;
-}
-#header-left {
- position: relative;
- /* background: url('images/logo.gif') no-repeat; */
- background-position: center;
- height: 65px;
- width: 145px;
- left: 10px;
- float: left;
-}
-#header-left #status-link {
- position: relative;
- top: 10px;
- left: 6px;
-}
-#header-right {
- position: relative;
- /* background: url('images/header.gif') no-repeat; */
- height: 70px;
- color: #fff;
- left: 0px;
- margin-left: 165px;
-}
-#header-right .alert {
- position: relative;
- /* background: url('images/alert.gif') no-repeat; */
- background-position: 4px 2px;
- color: #fff;
- height: 17px;
- width: 500px;
- padding: 4px;
- padding-left: 27px;
- float: left;
-}
-#header-right .container {
- position: relative;
-}
-#header-right .container .left {
- position: relative;
- float: left;
- font-size: 1.3em;
- font-weight: bold;
- top: 15px;
- left: 4px;
- display: none;
-}
-#header-right .container .right {
- position: relative;
- float: right;
- top: 22px;
- padding-right: 4px;
- z-index: 1;
-}
-
-#header-right .container .right #alerts {
- position: relative;
- background: url('images/alert_bgr.png') no-repeat;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-top: 20px;
- padding-left: 5px;
- margin: 0px;
-}
-#header-right .container .right #hostname {
- position: relative;
- height: 39px;
- width: 431px;
- z-index: 1;
- padding-left: 5px;
- margin: 0px;
- top: 25px;
- left: 230px;
- font-size: 14px;
- color: #cccccc;
- font-weight: bold;
-}
-
-
-
-table#marquee {
- position: relative;
- top: -6px;
- left: -5px;
- border: 0;
- padding: 0;
- margin: 0;
- width: 424px;
- background-color: transparent;
- padding: 2px;
- border: 0px;
-}
-span#marquee-container {
- position: absolute;
- visibility: hidden;
- top: -100px;
- left: -10000px;
-}
-div#marquee-text {
- font-size: 1.18em;
- font-weight: normal;
- font-family: Verdana;
- color: #ffffff;
-}
-table#marquee div#container {
- position: relative;
- overflow: hidden;
- width: 418px;
- height: 20px;
-}
-table#marquee div#container div#scroller {
- position: absolute;
- left: 0px;
- top: 0px;
-}
-
-
-
-
-
-#content {
- position: relative;
- top: -15px;
- left: 0px;
- margin-top: 0px;
- margin-left: 0px;
- padding-top: 0px;
- width: 810px;
- background-color: #ffffff;
-}
-
-#left {
- width: 810px;
- height: 1px;
-}
-#right {
- position: relative;
- top: -10px;
- width: 770px;
- margin-top: 0px;
- margin-left: 5px;
- margin-right: 5px;
- padding-top: 5px;
- padding-left: 10px;
- padding-right: 10px;
- padding-bottom: 20px;
- min-height: 400px;
-}
-
-#footer {
- position: relative;
- background: url('images/footer.png') no-repeat;
- top: -18px;
- left: 0px;
- width: 810px;
- height: 75px;
- color: #ffffff;
- text-align: center;;
- font-size: 0.9em;
- padding-top: 17px;
- margin-bottom: 20px;
- clear: both;
-}
-#footer p {
- padding: 0px;
- margin: 0px;
-}
-
-/* Style the List */
-#navigation {
- /* background: url('images/menu.gif') no-repeat; */
- /* width: 693px; */
- position: relative;
- top: -25px;
- left: 3px;
- width: 810px;
- padding: 0px;
- height: 28px;
- z-index: 3;
-}
-#navigation ul {
- padding: 0;
- margin: 0;
- list-style: none;
- text-align: center;
-}
-#navigation ul#menu {
- padding-top: 3px;
- padding-left: 5px;
-}
-
-/* Style the List Elements */
-#navigation ul li {
- float: left;
- position: relative;
- /* width: 7.5em; */
- width: 8.77em;
-}
-#navigation ul li div {
- font-size: 1em;
- font-weight: bold;
-}
-/* Make the List inside the List Elements */
-/* initially hidden with absolute position */
-#navigation ul li ul {
- display: none;
- position: absolute;
- top: 2em;
- left: -2px;
- width: 9em;
- font-weight: normal;
- background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
- /* background-color: #202020;
- background: url("images/menu_footer.gif") no-repeat;
- background-position: bottom;
- */
- padding: 0em 0 0.4em 0;
- padding-top: 0.3em;
-}
-/* to override top and left in browsers other than IE */
-/* which will position to the top right of the containing */
-/* li, rather than bottom left */
-#navigation ul li > ul {
- top: auto;
- left: auto;
- left: -1px !important;
-}
-/* Show initial drop down upon mouse over, but do not show */
-/* nested side drop menus within listed elements */
-#navigation ul li:hover ul {
- display: block;
- cursor: pointer;
-}
-#navigation ul li:hover {
- cursor: pointer;
- cursor: pointer;
-}
-#navigation ul li:hover div {
- text-decoration: none;
-}
-
-#navigation ul li {
- background-color: transparent;
- color: #FFF;
-}
-#navigation ul li ul li {
- border: 1px solid #990000;
- width: 8.8em;
- height: 1.6em;
- line-height: 1.6em;
- background-color: #990000;
- color: #FFF;
-}
-#navigation ul li ul li:hover {
- background-color: #666666;
-}
-
-#navigation li li a {
- display: block;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-#navigation ul li ul li a.navlnk:hover {
- text-decoration: none;
-}
-#navigation ul li.first {
- border-right: 0px;
-}
-#navigation ul li.middle {
- border-right: 0px;
-}
-#navigation ul li.last {
-
-}
-
-#navigation ul li.dropfirst {
- border-bottom: 0px;
-}
-#navigation ul li.dropmiddle {
- border-bottom: 0px;
-}
-#navigation ul li.droplast {
-}
-
-#wzdtabcont {
- float: left;
- background-color: #FFFFFF;
- color: #000000;
- padding: 0;
-}
-
-ul#wzdnav {
- font-size: 0.96em;
- float: left;
- width: 14.5em;
- margin: 0;
- padding-left: 18px;
-}
-
-ul#wzdnav li {
- list-style: none;
- margin: 0;
- padding-bottom: 0.2em;
- padding-left: 0;
-}
-
-ul#wzdnav a {
- display: block;
- padding: 0.3em;
- font-weight: normal;
-}
-
-#wzdnavbold a {
- display: block;
- padding: 0.3em;
- font-weight: bold ! important;
-}
-
-ul#wzdnav a:link {
- color: black;
- background-color: #eee;
-}
-
-ul#wzdnav a:visited {
- color: #666;
- background-color: #eee;
-}
-
-ul#wzdnav a:hover {
- color: black;
- background-color: white;
-}
-
-ul#wzdnav a:active {
- color: white;
- background-color: gray;
-}
-
-#graph {
- position: relative;
- z-index: 1;
-}
-
-#logoutbtn {
- position: absolute;
- left: 95%;
- vertical-align: middle;
-}
-
-/* Class Based CSS Definitions */
-.pgtitle {
- font-size: 18px;
- color: #777777;
- font-weight: bold;
-}
-.tfrtitle {
- font-size: 18px;
- color: #ffffff;
- font-weight: bold;
-}
-.vncell {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- border-bottom: 1px solid #999999;
-}
-.formfld {
- padding-left: 19px;
- font-size: small;
-}
-.formselect {
- font-size: 1.0em;
-}
-.langopt {
- padding-left: 34px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.saved {
- /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
-}
-.notsaved {
- /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
- list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
-}
-.en {
- background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
-}
-.de {
- background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
-}
-.es {
- background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
-}
-.pt_BR {
- background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
-}
-.host {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
-}
-.search {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
-}
-.file {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
-}
-.mail {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
-}
-.imp {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
-}
-.pwd {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
-}
-.user {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
-}
-.group {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
-}
-.url {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
-}
-.time {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
-}
-.unknown {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
-}
-.formfld_cert {
- background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
- padding-left: 28px;
- font-family: Courier New, Courier, monospaced;
- font-size: 11px;
-}
-.formfldalias {
- background-color: #990000;
- color: #FFFFFF;
-}
-.formpre {
- font-family: Courier New, Courier, monospaced;
- font-size: 10px;
-}
-.formbtn {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
- font-weight: bold;
-}
-.formbtns {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: bold;
-}
-.vvcell {
- background-color: #FFFFC6;
-}
-.errmsg {
- font-weight: bold;
- color: #CC0000;
-}
-.red {
- color: #CC0000;
-}
-.gray {
- color: #A0A0A0;
-}
-.vexpl {
- font-size: 11px;
-}
-.navlnk {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 13px;
-}
-.navlnks {
- color: #FFFFFF;
- text-decoration: none;
- font-size: 11px;
-}
-.redlnk {
- color: #990000;
- text-decoration: none;
-}
-.tblnk {
- color: #FFFFFF;
- text-decoration: none;
-}
-.vncellreq {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vncellt {
- background-color: #DDDDDD;
- padding-right: 20px;
- padding-left: 8px;
- padding-top: 4px;
- padding-bottom: 4px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
-}
-.vtable {
- border-bottom: 1px solid #999999;
-}
-.vnsepcell {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.cpline {
- font-size: 11px;
- color: #FFFFFF;
-}
-.hostname {
- font-size: 11px;
- color: #990000;
- font-weight: bold;
-}
-.vnsepcellr {
- background-color: #BBBBBB;
- padding-right: 20px;
- padding-left: 8px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listrpad {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-right: 16px;
- padding-left: 10px;
- padding-top: 8px;
- padding-bottom: 8px;
-}
-.listn {
- font-size: 11px;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbg {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listbggrey {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #999999;
- padding-right: 16px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listhdr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdr a {
- color: #000000;
-}
-.listhdrr {
- background-color: #BBBBBB;
- padding-right: 16px;
- padding-left: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.listhdrr a {
- color: #000000;
-}
-.listlr {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listlrns {
- background-color: #FFFFFF;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- border-left: 1px solid #999999;
- font-size: 11px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.list {
- font-size: 11px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.listt {
- font-size: 11px;
- padding-top: 5px;
-}
-.listhdrrns {
- background-color: #BBBBBB;
- padding-left: 6px;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-right: 6px;
- font-weight: bold;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
-}
-.listbgns {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- font-size: 11px;
- background-color: #D9DEE8;
- padding-left: 6px;
- padding-right: 4px;
- padding-top: 4px;
- padding-bottom: 4px;
-}
-.listtopic {
- border-right: 1px solid #999999;
- font-size: 11px;
- background-color: #990000;
- padding-right: 16px;
- padding-left: 6px;
- color: #FFFFFF;
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
-}
-.optsect_t {
- border-right: 1px solid #999999;
- background-color: #990000;
- padding-right: 6px;
- padding-left: 6px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.optsect_s {
- font-size: 11px;
- color: #FFFFFF;
- font-weight: bold;
-}
-.tabnavtbl {
-}
-
-
-/* MISC CSS Definitions */
-ul#tabnav {
- font-size: 11px;
- font-weight: bold;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-ul#tabnav li.tabinact1 {
- float: left;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact {
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-ul#tabnav li.tabinact a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabinact1 a {
- float: left;
- display: block;
- text-decoration: none;
- padding: 5px 8px 5px 8px;
- color: #FFFFFF;
-}
-ul#tabnav li.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabcont {
- background-color: #EEEEEE;
- padding-right: 12px;
- padding-left: 12px;
- padding-top: 12px;
- padding-bottom: 12px;
-}
-.tabact {
- float: left;
- background-color: #EEEEEE;
- color: #000000;
- padding: 5px 8px 5px 8px;
- white-space: nowrap;
-}
-.tabinact {
- font-weight: bold;
- float: left;
- border-left: 1px solid #999999;
- background-color: #777777;
- color: #FFFFFF;
- padding: 0;
- white-space: nowrap;
-}
-.menu {
- background-color: #000000;
- white-space: nowrap;
- padding: 0px 5px 0px 5px;
- width: 100%;
- vertical-align: top;
-}
-
-
-/* Auto Complete Suggestions */
-div.suggestions {
- -moz-box-sizing: border-box;
- /* box-sizing: border-box; */
- border: 1px solid black;
- position: absolute;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div {
- cursor: default;
- padding: 0px 3px;
- background-color: #990000;
- color: #FFF;
-}
-
-div.suggestions div.current {
- background-color: #3366cc;
- color: #FFF;
-}
-/* End Auto Complete Suggestions */
-
-
-/* Nifty Corners Crap */
-.rtop,.artop{display:block}
-.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
-.artop *{border-style: solid;border-width:0 1px}
-.r1,.rl1,.re1,.rel1{margin-left:5px}
-.r1,.rr1,.re1,.rer1{margin-right:5px}
-.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
-.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
-.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
-.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
-.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
-.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
-.rx1,.rxl1{border-left-width:5px}
-.rx1,.rxr1{border-right-width:5px}
-.rx2,.rxl2{border-left-width:3px}
-.rx2,.rxr2{border-right-width:3px}
-.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
-.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
-.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
-.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
-.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
-.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
-/* End Nifty Corners Crap */
-
-
-
-/* CSS for Dynamic Log Viewer */
-/* Author: Erik Kristensen */
-div#log div.log-entry {
- clear: both;
-}
-
-div#log div.log-entry span,
-div#log div.log-header span {
- padding: 3px 2px 3px 2px;
- padding-left: 8px;
-}
-
-div#log div.log-entry span.log-action {
- padding-bottom: 6px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-div#log div.log-header span {
- border-top: 1px solid #999;
- background-color: #bbb;
- font-weight: bold;
- text-align: left;
-}
-
-div#log span.log-action,
-div#log span.log-time,
-div#log span.log-interface,
-div#log span.log-source,
-div#log span.log-destination,
-div#log span.log-protocol {
- float: left;
- text-align: left;
- border-left: 1px solid #999;
- border-bottom: 1px solid #999;
-}
-
-div#log span.log-general {
-
-}
-
-div#log span.log-protocol {
- border-right: 1px solid #999;
-}
-
-div#log span.log-action {
- width: 2em;
- text-align: center;
-}
-
-div#log span.log-time {
- width: 12.5em;
-}
-
-div#log span.log-interface {
- width: 5em;
-}
-
-div#log span.log-source,
-div#log span.log-destination {
- width: 17.6em;
-}
-
-div#log span.log-protocol {
- width: 5.5em;
-}
-/* END CSS FOR DYNAMIC LOG VIEWER */
-
-#login {
- background: #cccccc;
- border: 0px solid #666666;
- margin: 5em auto;
- padding: 0em;
- width: 340px;
-}
-
-#login h1 {
- background: url(images/misc/logon.png) no-repeat top left;
- margin-top: 0;
- display: block;
- text-indent: -1000px;
- height: 50px;
- border-bottom: none;
-}
-
-#login p {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login span {
- font-size: 1em;
- font-weight: bold;
- width: 20%;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login p#text {
- font-size: 1em;
- font-weight: normal;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
-
-#login #username, #password {
- font-size: 1em;
- width: 60%;
- padding: 3px;
- margin: 0em;
-}
-
-#login #submit {
- font-size: 1em;
- font-weight: bold;
- padding: 3px;
- margin: 0em;
- text-indent: 10px;
-}
diff --git a/src/usr/local/www/tree-images/empty.gif b/src/usr/local/www/tree-images/empty.gif
deleted file mode 100755
index b501ceb..0000000
--- a/src/usr/local/www/tree-images/empty.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/tree-images/join.gif b/src/usr/local/www/tree-images/join.gif
deleted file mode 100755
index 976ba7e..0000000
--- a/src/usr/local/www/tree-images/join.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/tree-images/joinbottom.gif b/src/usr/local/www/tree-images/joinbottom.gif
deleted file mode 100755
index 8552b66..0000000
--- a/src/usr/local/www/tree-images/joinbottom.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/tree-images/line.gif b/src/usr/local/www/tree-images/line.gif
deleted file mode 100755
index 976beda..0000000
--- a/src/usr/local/www/tree-images/line.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/tree-images/minus_.gif b/src/usr/local/www/tree-images/minus_.gif
deleted file mode 100755
index 7c3a143..0000000
--- a/src/usr/local/www/tree-images/minus_.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/tree-images/minus_up.gif b/src/usr/local/www/tree-images/minus_up.gif
deleted file mode 100755
index 16915d4..0000000
--- a/src/usr/local/www/tree-images/minus_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/tree-images/page.gif b/src/usr/local/www/tree-images/page.gif
deleted file mode 100755
index 531f133..0000000
--- a/src/usr/local/www/tree-images/page.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/tree-images/plus_.gif b/src/usr/local/www/tree-images/plus_.gif
deleted file mode 100755
index 34c1a5e..0000000
--- a/src/usr/local/www/tree-images/plus_.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/tree-images/plus_up.gif b/src/usr/local/www/tree-images/plus_up.gif
deleted file mode 100755
index d095e07..0000000
--- a/src/usr/local/www/tree-images/plus_up.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/tree-images/plus_updown.gif b/src/usr/local/www/tree-images/plus_updown.gif
deleted file mode 100755
index afc1753..0000000
--- a/src/usr/local/www/tree-images/plus_updown.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/tree-images/zone.gif b/src/usr/local/www/tree-images/zone.gif
deleted file mode 100755
index f49d647..0000000
--- a/src/usr/local/www/tree-images/zone.gif
+++ /dev/null
Binary files differ
diff --git a/src/usr/local/www/tree/index.html b/src/usr/local/www/tree/index.html
index f2c45d4..f2c45d4 100644..100755
--- a/src/usr/local/www/tree/index.html
+++ b/src/usr/local/www/tree/index.html
diff --git a/src/usr/local/www/tree/tree.css b/src/usr/local/www/tree/tree.css
index 31b7979..31b7979 100644..100755
--- a/src/usr/local/www/tree/tree.css
+++ b/src/usr/local/www/tree/tree.css
diff --git a/src/usr/local/www/tree/tree.js b/src/usr/local/www/tree/tree.js
index 8e9651e..8e9651e 100644..100755
--- a/src/usr/local/www/tree/tree.js
+++ b/src/usr/local/www/tree/tree.js
diff --git a/src/usr/local/www/treeview.css b/src/usr/local/www/treeview.css
deleted file mode 100644
index 3cdf792..0000000
--- a/src/usr/local/www/treeview.css
+++ /dev/null
@@ -1,48 +0,0 @@
-.treeview {
- border: 0px;
- margin: 0px;
- padding: 0px;
- font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
- font-size: 12px;
- color: #333;
- white-space: nowrap;
- border: 0px;
- vertical-align: middle;
-}
-.treeview img {
- border: 0px;
- margin: 0px;
- padding: 0px;
- vertical-align: top;
-}
-.treeview a {
- border: 0px;
- margin: 0px;
- padding: 0px;
- color: #000;
- text-decoration: none;
- vertical-align: top;/* r3b*/
-}
-.treeview a.node {
- border: 0px;
- margin: 0px;
- padding: 0px;
- white-space: nowrap;
- color: #00F;
- height:16px;
- width:auto;
- overflow:hidden;
- padding: 0px 0px 0px 0px;
- vertical-align: top;
-}
-
-.treeview a.nodeSel {
- border: 0px;
- margin: 0px;
- padding: 0px;
-
-}
-.treeview .clip {
- overflow: hidden;
-
-}
diff --git a/src/usr/local/www/vpn_ipsec.php b/src/usr/local/www/vpn_ipsec.php
index 6ef6040..cfe6bf9 100644
--- a/src/usr/local/www/vpn_ipsec.php
+++ b/src/usr/local/www/vpn_ipsec.php
@@ -70,7 +70,7 @@ if ($_POST) {
clear_subsystem_dirty('ipsec');
}
}
- } else if ($_POST['submit']) {
+ } else if ($_POST['save']) {
$pconfig = $_POST;
$config['ipsec']['enable'] = $_POST['enable'] ? true : false;
@@ -78,7 +78,7 @@ if ($_POST) {
write_config();
$retval = vpn_ipsec_configure();
- } else if (isset($_POST['del_x'])) {
+ } else if (isset($_POST['del'])) {
/* delete selected p1 entries */
if (is_array($_POST['p1entry']) && count($_POST['p1entry'])) {
foreach ($_POST['p1entry'] as $p1entrydel) {
@@ -88,7 +88,7 @@ if ($_POST) {
mark_subsystem_dirty('ipsec');
}
}
- } else if (isset($_POST['delp2_x'])) {
+ } else if (isset($_POST['delp2'])) {
/* delete selected p2 entries */
if (is_array($_POST['p2entry']) && count($_POST['p2entry'])) {
foreach ($_POST['p2entry'] as $p2entrydel) {
@@ -100,19 +100,21 @@ if ($_POST) {
}
} else {
/* yuck - IE won't send value attributes for image buttons, while Mozilla does - so we use .x/.y to find move button clicks instead... */
+
+ // TODO: this. is. nasty.
unset($delbtn, $delbtnp2, $movebtn, $movebtnp2, $togglebtn, $togglebtnp2);
foreach ($_POST as $pn => $pd) {
- if (preg_match("/del_(\d+)_x/", $pn, $matches)) {
+ if (preg_match("/del_(\d+)/", $pn, $matches)) {
$delbtn = $matches[1];
- } else if (preg_match("/delp2_(\d+)_x/", $pn, $matches)) {
+ } else if (preg_match("/delp2_(\d+)/", $pn, $matches)) {
$delbtnp2 = $matches[1];
- } else if (preg_match("/move_(\d+)_x/", $pn, $matches)) {
+ } else if (preg_match("/move_(\d+)/", $pn, $matches)) {
$movebtn = $matches[1];
- } else if (preg_match("/movep2_(\d+)_x/", $pn, $matches)) {
+ } else if (preg_match("/movep2_(\d+)/", $pn, $matches)) {
$movebtnp2 = $matches[1];
- } else if (preg_match("/toggle_(\d+)_x/", $pn, $matches)) {
+ } else if (preg_match("/toggle_(\d+)/", $pn, $matches)) {
$togglebtn = $matches[1];
- } else if (preg_match("/togglep2_(\d+)_x/", $pn, $matches)) {
+ } else if (preg_match("/togglep2_(\d+)/", $pn, $matches)) {
$togglebtnp2 = $matches[1];
}
}
@@ -238,458 +240,312 @@ $shortcut_section = "ipsec";
include("head.inc");
+$tab_array = array();
+$tab_array[] = array(gettext("Tunnels"), true, "vpn_ipsec.php");
+$tab_array[] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
+$tab_array[] = array(gettext("Pre-Shared Keys"), false, "vpn_ipsec_keys.php");
+$tab_array[] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
+display_top_tabs($tab_array);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="vpn_ipsec.php" method="post">
<script type="text/javascript" src="/javascript/row_toggle.js"></script>
+
<?php
if ($savemsg) {
- print_info_box($savemsg);
+ print_info_box($savemsg, 'success');
}
+
if ($pconfig['enable'] && is_subsystem_dirty('ipsec')) {
print_info_box_np(gettext("The IPsec tunnel configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
}
?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn ipsec">
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Tunnels"), true, "vpn_ipsec.php");
- $tab_array[1] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
- $tab_array[2] = array(gettext("Pre-Shared Keys"), false, "vpn_ipsec_keys.php");
- $tab_array[3] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td class="vtable">
- <table border="0" cellspacing="2" cellpadding="0" summary="enable">
- <tr>
- <td>
- <input name="enable" type="checkbox" id="enable" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\"";?> />
- </td>
- <td>
- <strong><?=gettext("Enable IPsec"); ?></strong>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td>
- <input name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- </td>
- </tr>
- </table>
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="phase-1 entries">
- <tr id="frheader">
- <td class="list">&nbsp;</td>
- <td class="list">&nbsp;</td>
- <td class="listhdrr"><?=gettext("IKE"); ?></td>
- <td class="listhdrr"><?=gettext("Remote Gateway"); ?></td>
- <td class="listhdrr"><?=gettext("Mode"); ?></td>
- <td class="listhdrr"><?=gettext("P1 Protocol"); ?></td>
- <td class="listhdrr"><?=gettext("P1 Transforms"); ?></td>
- <td class="listhdrr"><?=gettext("P1 Description"); ?></td>
- <td class="list">
- </td>
- </tr>
-<?php
- $i = 0;
- foreach ($a_phase1 as $ph1ent):
- $iconfn = "pass";
- $spans = $spane = "";
- if (isset($ph1ent['disabled'])) {
- $spans = "<span class=\"gray\">";
- $spane = "</span>";
- $iconfn .= "_d";
- }
-?>
- <tr valign="top" id="fr<?=$i;?>" ondblclick="document.location='vpn_ipsec_phase1.php?p1index=<?=$i;?>'">
- <td class="listt" align="center" valign="middle">
- <input type="checkbox" id="frc<?=$i;?>" name="p1entry[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
- </td>
- <td class="listt" align="center" valign="middle">
- <input name="toggle_<?=$i;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn?>.gif"
- title="<?=gettext("click to toggle enabled/disabled status");?>"
- type="image" style="height:11;width:11;border:0" />
- </td>
- <td class="listlr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>">
- <?=$spans;?>
-<?php
- if (empty($ph1ent['iketype']) || $ph1ent['iketype'] == "ikev1") {
- echo "V1";
- } else {
- echo "V2";
- }
-?>
- <?=$spane;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>">
- <?=$spans;?>
-<?php
- if ($ph1ent['interface']) {
- $iflabels = get_configured_interface_with_descr();
- $carplist = get_configured_carp_interface_list();
- foreach ($carplist as $cif => $carpip) {
- $iflabels[$cif] = $carpip." (".get_vip_descr($carpip).")";
- }
+<h2>Rules</h2>
+
+<form method="post">
+<div class="table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th>&nbsp;</th>
+ <th>&nbsp;</th>
+ <th><?=gettext("IKE"); ?></th>
+ <th><?=gettext("Remote Gateway"); ?></th>
+ <th><?=gettext("Mode"); ?></th>
+ <th><?=gettext("P1 Protocol"); ?></th>
+ <th><?=gettext("P1 Transforms"); ?></th>
+ <th><?=gettext("P1 Description"); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php $i = 0; foreach ($a_phase1 as $ph1ent): ?>
+<?php
+ $iconfn = "pass";
- $aliaslist = get_configured_ip_aliases_list();
- foreach ($aliaslist as $aliasip => $aliasif) {
- $iflabels[$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
- }
+ $entryStatus = (isset($ph1ent['disabled']) ? 'disabled' : 'enabled');
- $grouplist = return_gateway_groups_array();
- foreach ($grouplist as $name => $group) {
- if ($group[0]['vip'] <> "") {
- $vipif = $group[0]['vip'];
- } else {
- $vipif = $group[0]['int'];
- }
- $iflabels[$name] = "GW Group {$name}";
- }
- $if = htmlspecialchars($iflabels[$ph1ent['interface']]);
- } else {
- $if = "WAN";
- }
-
- if (!isset($ph1ent['mobile'])) {
- echo $if."<br />".$ph1ent['remote-gateway'];
- } else {
- echo $if."<br /><strong>" . gettext("Mobile Client") . "</strong>";
- }
+ if ($entryStatus == 'disabled') {
+ $iconfn .= "_d";
+ }
?>
- <?=$spane;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>">
- <?=$spans;?>
- <?php
- if (empty($ph1ent['iketype']) || $ph1ent['iketype'] == "ikev1") {
- echo "{$ph1ent['mode']}";
- }
- ?>
- <?=$spane;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>">
- <?=$spans;?>
- <?=$p1_ealgos[$ph1ent['encryption-algorithm']['name']]['name'];?>
+ <tr id="fr<?=$i?>" ondblclick="document.location='vpn_ipsec_phase1.php?p1index=<?=$i?>'" class="<?= $entryStatus ?>">
+ <td>
+ <input type="checkbox" id="frc<?=$i?>" name="p1entry[]" value="<?=$i?>" onclick="fr_bgcolor('<?=$i?>')" />
+ </td>
+ <td>
+ <button value="toggle_<?=$i?>" name="toggle_<?=$i?>" title="<?=gettext("click to toggle enabled/disabled status")?>" class="btn btn-xs btn-default" type="submit"><?= ($entryStatus == 'disabled' ? 'enable' : 'disable') ?></button>
+ </td>
+ <td onclick="fr_toggle(<?=$i?>)" id="frd<?=$i?>">
<?php
- if ($ph1ent['encryption-algorithm']['keylen']) {
- if ($ph1ent['encryption-algorithm']['keylen'] == "auto") {
- echo " (" . gettext("auto") . ")";
- } else {
- echo " ({$ph1ent['encryption-algorithm']['keylen']} " . gettext("bits") . ")";
- }
- }
+ if (empty($ph1ent['iketype']) || $ph1ent['iketype'] == "ikev1")
+ echo "V1";
+ else
+ echo "V2";
?>
- <?=$spane;?>
- </td>
- <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>">
- <?=$spans;?>
- <?=$p1_halgos[$ph1ent['hash-algorithm']];?>
- <?=$spane;?>
- </td>
- <td class="listbg" onclick="fr_toggle(<?=$i;?>)">
- <?=$spans;?>
- <?=htmlspecialchars($ph1ent['descr']);?>&nbsp;
- <?=$spane;?>
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
- <tr>
- <td>
- <input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)"
- name="move_<?=$i;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif"
- title="<?=gettext("move selected entries before this");?>"
- type="image" style="height:17;width:17;border:0" />
- </td>
- <td>
- <a href="vpn_ipsec_phase1.php?p1index=<?=$i;?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit phase1 entry"); ?>" width="17" height="17" border="0" alt="edit" />
- </a>
- </td>
- </tr>
- <tr>
- <td>
- <input name="del_<?=$i;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif"
- title="<?=gettext("delete phase1 entry");?>"
- type="image" style="height:17;width:17;border:0"
- onclick="return confirm('<?=gettext("Do you really want to delete this phase1 and all associated phase2 entries?"); ?>')" />
- </td>
- <td>
+ </td>
+ <td onclick="fr_toggle(<?=$i?>)" id="frd<?=$i?>">
<?php
- if (!isset($ph1ent['mobile'])):
+ if ($ph1ent['interface']) {
+ $iflabels = get_configured_interface_with_descr();
+
+ $carplist = get_configured_carp_interface_list();
+ foreach ($carplist as $cif => $carpip)
+ $iflabels[$cif] = $carpip." (".get_vip_descr($carpip).")";
+
+ $aliaslist = get_configured_ip_aliases_list();
+ foreach ($aliaslist as $aliasip => $aliasif)
+ $iflabels[$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
+
+ $grouplist = return_gateway_groups_array();
+ foreach ($grouplist as $name => $group) {
+ if($group[0]['vip'] != "")
+ $vipif = $group[0]['vip'];
+ else
+ $vipif = $group[0]['int'];
+ $iflabels[$name] = "GW Group {$name}";
+ }
+ $if = htmlspecialchars($iflabels[$ph1ent['interface']]);
+ }
+ else
+ $if = "WAN";
+
+ if (!isset($ph1ent['mobile']))
+ echo $if."<br />".$ph1ent['remote-gateway'];
+ else
+ echo $if."<br /><strong>" . gettext("Mobile Client") . "</strong>";
?>
- <a href="vpn_ipsec_phase1.php?dup=<?=$i;?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("copy phase1 entry"); ?>" width="17" height="17" border="0" alt="add" />
- </a>
+ </td>
+ <td onclick="fr_toggle(<?=$i?>)" id="frd<?=$i?>">
+ <?=$spans?>
+ <?php
+ if (empty($ph1ent['iketype']) || $ph1ent['iketype'] == "ikev1")
+ echo "{$ph1ent['mode']}";
+ ?>
+ <?=$spane?>
+ </td>
+ <td onclick="fr_toggle(<?=$i?>)" id="frd<?=$i?>">
+ <?=$p1_ealgos[$ph1ent['encryption-algorithm']['name']]['name']?>
<?php
- endif;
+ if ($ph1ent['encryption-algorithm']['keylen']) {
+ if ($ph1ent['encryption-algorithm']['keylen']=="auto")
+ echo " (" . gettext("auto") . ")";
+ else
+ echo " ({$ph1ent['encryption-algorithm']['keylen']} " . gettext("bits") . ")";
+ }
?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td class="listt">&nbsp;</td>
- <td class="listt">&nbsp;</td>
- <td class="listrborder" colspan="6">
+ </td>
+ <td>
+ <?=$p1_halgos[$ph1ent['hash-algorithm']]?>
+ </td>
+ <td>
+ <?=htmlspecialchars($ph1ent['descr'])?>
+ </td>
+ <td>
+ <?php // TODO: add mouseover behaviour which indicates insert position when moving ?>
+ <button class="btn btn-xs btn-default" type="submit" name="move_<?=$i?>" value="move_<?=$i?>"><?=gettext("move selected entries before this")?></button>
+ <a class="btn btn-xs btn-primary" href="vpn_ipsec_phase1.php?p1index=<?=$i?>" title="<?=gettext("edit phase1 entry"); ?>">edit</a>
+ <button class="btn btn-xs btn-danger" type="submit" name="del_<?=$i?>" value="del_<?=$i?>" title="<?=gettext('delete phase1 entry'); ?>">delete</button>
+ <?php if (!isset($ph1ent['mobile'])): ?>
+ <a class="btn btn-xs btn-success" href="vpn_ipsec_phase1.php?dup=<?=$i?>" title="<?=gettext("copy phase1 entry"); ?>">copy</a>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr class="<?= $entryStatus ?>">
+ <td colspan="2"></td>
+ <td colspan="7" class="contains-table">
<?php
- if (isset($_POST["tdph2-{$i}-visible"])) {
- $tdph2_visible = htmlspecialchars($_POST["tdph2-{$i}-visible"]);
- } else {
- $tdph2_visible = 0;
- }
+ if (isset($_POST["tdph2-{$i}-visible"]))
+ $tdph2_visible = htmlspecialchars($_POST["tdph2-{$i}-visible"]);
+ else
+ $tdph2_visible = 0;
?>
- <input type="hidden" name="tdph2-<?=$i;?>-visible" id="tdph2-<?=$i;?>-visible" value="<?=$tdph2_visible?>" />
- <div id="shph2but-<?=$i?>" <?php echo ($tdph2_visible == '1' ? 'style="display:none"' : '');?>>
+ <input type="hidden" name="tdph2-<?=$i?>-visible" id="tdph2-<?=$i?>-visible" value="<?=$tdph2_visible?>" />
+ <div id="shph2but-<?=$i?>" <?=($tdph2_visible == '1' ? 'style="display:none"' : '')?>>
<?php
- $phase2count = 0;
- foreach ($a_phase2 as $ph2ent) {
- if ($ph2ent['ikeid'] != $ph1ent['ikeid']) {
- continue;
- }
- $phase2count++;
- }
- $fr_prefix = "frp2{$i}";
- $fr_header = $fr_prefix . "header";
+ $phase2count=0;
+
+ foreach ($a_phase2 as $ph2ent) {
+ if ($ph2ent['ikeid'] != $ph1ent['ikeid'])
+ continue;
+ $phase2count++;
+ }
+ $fr_prefix = "frp2{$i}";
+ $fr_header = $fr_prefix . "header";
?>
- <input type="button" onclick="show_phase2('tdph2-<?=$i?>', 'shph2but-<?=$i?>')" value="+" /> - <?php printf(gettext("Show %s Phase-2 entries"), $phase2count); ?>
- </div>
- <div id="tdph2-<?=$i?>" <?php echo ($tdph2_visible != '1' ? 'style="display:none"' : '');?>>
- <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="phase-2 entries">
- <tr id="<?=$fr_header;?>">
- <td>&nbsp;</td>
- <td>&nbsp;</td>
- <td class="listhdrr"><?=gettext("Mode"); ?></td>
- <td class="listhdrr"><?=gettext("Local Subnet"); ?></td>
- <td class="listhdrr"><?=gettext("Remote Subnet"); ?></td>
- <td class="listhdrr"><?=gettext("P2 Protocol"); ?></td>
- <td class="listhdrr"><?=gettext("P2 Transforms"); ?></td>
- <td class="listhdrr"><?=gettext("P2 Auth Methods"); ?></td>
- <td class ="list">&nbsp;</td>
+ <input type="button" onclick="show_phase2('tdph2-<?=$i?>','shph2but-<?=$i?>')" value="+" /> - <?php printf(gettext("Show %s Phase-2 entries"), $phase2count); ?>
+ </div>
+ <div id="tdph2-<?=$i?>" <?=($tdph2_visible != '1' ? 'style="display:none"' : '')?>>
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th>&nbsp;</th>
+ <th>&nbsp;</th>
+ <th><?=gettext("Mode"); ?></th>
+ <th><?=gettext("Local Subnet"); ?></th>
+ <th><?=gettext("Remote Subnet"); ?></th>
+ <th><?=gettext("P2 Protocol"); ?></th>
+ <th><?=gettext("P2 Transforms"); ?></th>
+ <th><?=gettext("P2 Auth Methods"); ?></th>
+ <th>&nbsp;</th>
</tr>
+ </thead>
+ <tbody>
+<?php $j = 0; foreach ($a_phase2 as $ph2index => $ph2ent): ?>
<?php
- $j = 0;
- foreach ($a_phase2 as $ph2index => $ph2ent):
- if ($ph2ent['ikeid'] != $ph1ent['ikeid']) {
- continue;
- }
+ if ($ph2ent['ikeid'] != $ph1ent['ikeid'])
+ continue;
- $fr_c = $fr_prefix . "c" . $j;
- $fr_d = $fr_prefix . "d" . $j;
+ $fr_c = $fr_prefix . "c" . $j;
+ $fr_d = $fr_prefix . "d" . $j;
+
+ $iconfn = "pass";
+ $entryStatus = (isset($ph2ent['disabled']) || isset($ph1ent['disabled']) ? 'disabled' : 'enabled');
+
+ if ($entryStatus == 'disabled')
+ $iconfn .= "_d";
- $iconfn = "pass";
- $spans = $spane = "";
- if (isset($ph2ent['disabled']) || isset($ph1ent['disabled'])) {
- $spans = "<span class=\"gray\">";
- $spane = "</span>";
- $iconfn .= "_d";
- }
?>
- <tr valign="top" id="<?=$fr_prefix . $j;?>" ondblclick="document.location='vpn_ipsec_phase2.php?p2index=<?=$ph2ent['uniqid'];?>'">
- <td class="listt" align="center" valign="middle">
- <input type="checkbox" id="<?=$fr_c;?>" name="p2entry[]" value="<?=$ph2index;?>" onclick="fr_bgcolor('<?=$j;?>', '<?=$fr_prefix;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
+ <tr id="<?=$fr_prefix . $j?>" ondblclick="document.location='vpn_ipsec_phase2.php?p2index=<?=$ph2ent['uniqid']?>'" class="<?= $entryStatus ?>">
+ <td>
+ <input type="checkbox" id="<?=$fr_c?>" name="p2entry[]" value="<?=$ph2index?>" onclick="fr_bgcolor('<?=$j?>', '<?=$fr_prefix?>')" />
</td>
- <td class="listt" align="center" valign="middle">
- <input name="togglep2_<?=$ph2index;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn?>.gif"
- title="<?=gettext("click to toggle enabled/disabled status");?>"
- type="image" style="height:11;width:11;border:0" />
+ <td>
+ <button value="togglep2_<?=$ph2index?>" name="togglep2_<?=$ph2index?>" title="<?=gettext("click to toggle enabled/disabled status")?>" class="btn btn-xs btn-default" type="submit"><?= ($entryStatus == 'disabled'? 'enable' : 'disable') ?></button>
</td>
- <td class="listlr nowrap" id="<?=$fr_d;?>" onclick="fr_toggle('<?=$j;?>', '<?=$fr_prefix;?>')">
- <?=$spans;?>
- <?=$ph2ent['mode'];?>
- <?=$spane;?>
+ <td id="<?=$fr_d?>" onclick="fr_toggle('<?=$j?>', '<?=$fr_prefix?>')">
+ <?=$ph2ent['mode']?>
</td>
-<?php
- if (($ph2ent['mode'] == "tunnel") or ($ph2ent['mode'] == "tunnel6")):
-?>
- <td class="listr nowrap" id="<?=$fr_d;?>" onclick="fr_toggle('<?=$j;?>', '<?=$fr_prefix;?>')">
- <?=$spans;?>
- <?=ipsec_idinfo_to_text($ph2ent['localid']); ?>
- <?=$spane;?>
- </td>
- <td class="listr nowrap" id="<?=$fr_d;?>" onclick="fr_toggle('<?=$j;?>', '<?=$fr_prefix;?>')">
- <?=$spans;?>
- <?=ipsec_idinfo_to_text($ph2ent['remoteid']); ?>
- <?=$spane;?>
- </td>
-<?php
- else:
- echo "<td class=\"listr nowrap\">&nbsp;</td><td class=\"listr nowrap\">&nbsp;</td>";
- endif;
-?>
- <td class="listr nowrap" id="<?=$fr_d;?>" onclick="fr_toggle('<?=$j;?>', '<?=$fr_prefix;?>')">
- <?=$spans;?>
- <?php echo $p2_protos[$ph2ent['protocol']]; ?>
- <?=$spane;?>
+<?php if(($ph2ent['mode'] == "tunnel") or ($ph2ent['mode'] == "tunnel6")): ?>
+ <td id="<?=$fr_d?>" onclick="fr_toggle('<?=$j?>', '<?=$fr_prefix?>')">
+ <?=ipsec_idinfo_to_text($ph2ent['localid']); ?>
+ </td>
+ <td id="<?=$fr_d?>" onclick="fr_toggle('<?=$j?>', '<?=$fr_prefix?>')">
+ <?=ipsec_idinfo_to_text($ph2ent['remoteid']); ?>
</td>
- <td class="listr" id="<?=$fr_d;?>" onclick="fr_toggle('<?=$j;?>', '<?=$fr_prefix;?>')">
- <?=$spans;?>
+<?php else: ?>
+ <td colspan="2"></td>
+<?php endif; ?>
+ <td id="<?=$fr_d?>" onclick="fr_toggle('<?=$j?>', '<?=$fr_prefix?>')">
+ <?=$p2_protos[$ph2ent['protocol']]; ?>
+ </td>
+ <td id="<?=$fr_d?>" onclick="fr_toggle('<?=$j?>', '<?=$fr_prefix?>')">
<?php
- foreach ($ph2ent['encryption-algorithm-option'] as $k => $ph2ea) {
- if ($k) {
- echo ", ";
- }
- echo $p2_ealgos[$ph2ea['name']]['name'];
- if ($ph2ea['keylen']) {
- if ($ph2ea['keylen'] == "auto") {
- echo " (" . gettext("auto") . ")";
- } else {
- echo " ({$ph2ea['keylen']} " . gettext("bits") . ")";
- }
- }
- }
+ foreach ($ph2ent['encryption-algorithm-option'] as $k => $ph2ea) {
+ if ($k)
+ echo ", ";
+ echo $p2_ealgos[$ph2ea['name']]['name'];
+ if ($ph2ea['keylen']) {
+ if ($ph2ea['keylen']=="auto")
+ echo " (" . gettext("auto") . ")";
+ else
+ echo " ({$ph2ea['keylen']} " . gettext("bits") . ")";
+ }
+ }
?>
- <?=$spane;?>
</td>
- <td class="listr nowrap" id="<?=$fr_d;?>" onclick="fr_toggle('<?=$j;?>', '<?=$fr_prefix;?>')">
- <?=$spans;?>
+ <td id="<?=$fr_d?>" onclick="fr_toggle('<?=$j?>', '<?=$fr_prefix?>')">
<?php
- if (!empty($ph2ent['hash-algorithm-option']) && is_array($ph2ent['hash-algorithm-option'])) {
- foreach ($ph2ent['hash-algorithm-option'] as $k => $ph2ha) {
- if ($k) {
- echo ", ";
- }
- echo $p2_halgos[$ph2ha];
- }
- }
+ if (!empty($ph2ent['hash-algorithm-option']) && is_array($ph2ent['hash-algorithm-option'])) {
+ foreach ($ph2ent['hash-algorithm-option'] as $k => $ph2ha) {
+ if ($k)
+ echo ", ";
+ echo $p2_halgos[$ph2ha];
+ }
+ }
?>
- <?=$spane;?>
</td>
- <td class="list nowrap" valign="middle">
- <input onmouseover="fr_insline(<?=$j;?>, true, '<?=$fr_prefix;?>')" onmouseout="fr_insline(<?=$j;?>, false, '<?=$fr_prefix;?>')"
- name="movep2_<?=$j;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif"
- title="<?=gettext("move selected entries before this");?>"
- type="image" style="height:17;width:17;border:0" />
- <a href="vpn_ipsec_phase2.php?p2index=<?=$ph2ent['uniqid'];?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit phase2 entry"); ?>" width="17" height="17" border="0" alt="edit" />
- </a>
- <input name="delp2_<?=$ph2index;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif"
- title="<?=gettext("delete phase2 entry");?>"
- type="image" style="height:17;width:17;border:0"
- onclick="return confirm('<?=gettext("Do you really want to delete this phase2 entry?"); ?>')" />
- <a href="vpn_ipsec_phase2.php?dup=<?=$ph2ent['uniqid'];?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new Phase 2 based on this one"); ?>" width="17" height="17" border="0" alt="add" />
- </a>
+ <td>
+ <?php // TODO: add mouseover behaviour which indicates insert position when moving ?>
+ <button class="btn btn-xs btn-default" type="submit" name="movep2_<?=$j?>" value="movep2_<?=$j?>"><?=gettext("move selected entries before this")?></button>
+ <a class="btn btn-xs btn-primary" href="vpn_ipsec_phase2.php?p2index=<?=$ph2ent['uniqid']?>" title="<?=gettext("edit phase2 entry"); ?>">edit</a>
+ <button class="btn btn-xs btn-danger" type="submit" name="delp2_<?=$ph2index?>" value="delp2_<?=$ph2index?>" title="<?=gettext('delete phase2 entry'); ?>">delete</button>
+ <a class="btn btn-xs btn-success" href="vpn_ipsec_phase2.php?dup=<?=$ph2ent['uniqid']?>" title="<?=gettext("add a new Phase 2 based on this one"); ?>">copy</a>
</td>
</tr>
+<?php $j++; endforeach; ?>
+ <tr>
+ <td colspan="8"></td>
+ <td>
<?php
- $j++;
- endforeach;
-?>
- <tr valign="top" id="<?=$fr_prefix . $j;?>">
- <td class="list" colspan="8"></td>
- <td class="list nowrap" valign="middle">
-<?php
- if ($j == 0):
+ if ($j == 0):
?>
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected phase2 entries to end");?>" border="0" alt="move" />
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected phase2 entries to end")?>" border="0" alt="move" />
<?php
- else:
+ else:
?>
- <input onmouseover="fr_insline(<?=$j;?>, true, '<?=$fr_prefix;?>')" onmouseout="fr_insline(<?=$j;?>, false, '<?=$fr_prefix;?>')" name="movep2_<?=$j;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17;border:0" title="<?=gettext("move selected phase2 entries to end");?>" />
+ <input onmouseover="fr_insline(<?=$j?>, true, '<?=$fr_prefix?>')" onmouseout="fr_insline(<?=$j?>, false, '<?=$fr_prefix?>')" name="movep2_<?=$j?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17;border:0" title="<?=gettext("move selected phase2 entries to end")?>" />
<?php
- endif;
+ endif;
?>
- <a href="vpn_ipsec_phase2.php?ikeid=<?=$ph1ent['ikeid'];?><?php if (isset($ph1ent['mobile'])) echo "&amp;mobile=true";?>">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add phase2 entry"); ?>" width="17" height="17" border="0" alt="add" />
+ <a href="vpn_ipsec_phase2.php?ikeid=<?=$ph1ent['ikeid']?><?php if (isset($ph1ent['mobile'])) echo "&amp;mobile=true"?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add phase2 entry"); ?>" alt="add" />
</a>
<?php
- if ($j == 0):
+ if ($j == 0):
?>
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected phase2 entries");?>" border="0" alt="delete" />
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected phase2 entries")?>" border="0" alt="delete" />
<?php
- else:
+ else:
?>
- <input name="delp2" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" style="width:17;height:17" title="<?=gettext("delete selected phase2 entries");?>" onclick="return confirm('<?=gettext("Do you really want to delete the selected phase2 entries?");?>')" />
+ <input name="delp2" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" style="width:17;height:17" title="<?=gettext("delete selected phase2 entries")?>" onclick="return confirm('<?=gettext("Do you really want to delete the selected phase2 entries?")?>')" />
<?php
- endif;
+ endif;
?>
</td>
</tr>
- </table>
- </div>
- </td>
- </tr>
+ </tbody>
+ </table>
+ </div>
+ </td>
+ </tr>
<?php
$i++;
endforeach; // $a_phase1 as $ph1ent
?>
- <tr valign="top" id="fr<?=$i;?>">
- <td class="list" colspan="8"></td>
- <td class="list nowrap" valign="middle">
- <table border="0" cellspacing="0" cellpadding="1" summary="edit">
- <tr>
- <td>
-<?php
- if ($i == 0):
-?>
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected phase1 entries to end");?>" border="0" alt="move" />
-<?php
- else:
-?>
- <input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)" name="move_<?=$i;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17;border:0" title="<?=gettext("move selected phase1 entries to end");?>" />
-<?php
- endif;
-?>
- </td>
- <td>
- <a href="vpn_ipsec_phase1.php">
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add new phase1");?>" alt="add" />
- </a>
- </td>
- </tr>
- <tr>
- <td>
-<?php
- if ($i == 0):
-?>
- <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected phase1 entries");?>" border="0" alt="delete" />
-<?php
- else:
-?>
- <input name="del" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" style="width:17;height:17" title="<?=gettext("delete selected phase1 entries");?>" onclick="return confirm('<?=gettext("Do you really want to delete the selected phase1 entries?");?>')" />
-<?php
- endif;
-?>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td colspan="8">
- <p>
- <span class="vexpl">
- <span class="red">
- <strong><?=gettext("Note"); ?>:<br /></strong>
- </span>
- <?=gettext("You can check your IPsec status at"); ?> <a href="diag_ipsec.php"><?=gettext("Status:IPsec"); ?></a>.<br />
- <?=gettext("IPsec Debug Mode can be enabled at"); ?> <a href="vpn_ipsec_settings.php"><?=gettext("VPN:IPsec:Advanced Settings"); ?></a>.<br />
- <?=gettext("IPsec can be set to prefer older SAs at"); ?> <a href="vpn_ipsec_settings.php"><?=gettext("VPN:IPsec:Advanced Settings"); ?></a>.
- </span>
- </p>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
+ </tbody>
+ </table>
+</div>
+
+<nav class="action-buttons">
+<?php if ($i !== 0): ?>
+ <input type="submit" name="move_<?=$i?>" class="btn btn-default" value="<?=gettext("move selected phase1 entries to end")?>" />
+<?php endif; ?>
+ <a href="vpn_ipsec_phase1.php" class="btn btn-success"><?=gettext("add new phase1")?></a>
+<?php if ($i !== 0): ?>
+ <input type="submit" name="del" class="btn btn-danger" value="<?=gettext("delete selected phase1 entries")?>" onclick="return confirm('<?=gettext("Do you really want to delete the selected phase1 entries?")?>')" />
+<?php endif; ?>
+</nav>
</form>
-<?php include("fend.inc"); ?>
+
+<div class="alert alert-info">
+ <strong><?=gettext("Note:")?></strong><br />
+ <?=gettext("You can check your IPsec status at"); ?> <a href="diag_ipsec.php"><?=gettext("Status:IPsec"); ?></a>.<br />
+ <?=gettext("IPsec Debug Mode can be enabled at"); ?> <a href="vpn_ipsec_settings.php"><?=gettext("VPN:IPsec:Advanced Settings"); ?></a>.<br />
+ <?=gettext("IPsec can be set to prefer older SAs at"); ?> <a href="vpn_ipsec_settings.php"><?=gettext("VPN:IPsec:Advanced Settings"); ?></a>.
+</div>
+
+<?php include("foot.inc"); ?>
<script type="text/javascript">
//<![CDATA[
function show_phase2(id, buttonid) {
@@ -699,6 +555,4 @@ function show_phase2(id, buttonid) {
document.getElementById(visible).value = "1";
}
//]]>
-</script>
-</body>
-</html>
+</script> \ No newline at end of file
diff --git a/src/usr/local/www/vpn_ipsec_keys.php b/src/usr/local/www/vpn_ipsec_keys.php
index 8c30d6b..d5ae312 100644
--- a/src/usr/local/www/vpn_ipsec_keys.php
+++ b/src/usr/local/www/vpn_ipsec_keys.php
@@ -83,20 +83,14 @@ include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="vpn_ipsec_keys.php" method="post">
<?php
-if ($savemsg) {
+if ($savemsg)
print_info_box($savemsg);
-}
-if (is_subsystem_dirty('ipsec')) {
+if (is_subsystem_dirty('ipsec'))
print_info_box_np(gettext("The IPsec tunnel configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
-}
+
?>
-</form>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn ipsec keys">
- <tr><td class="tabnavtbl">
+
<?php
$tab_array = array();
$tab_array[0] = array(gettext("Tunnels"), false, "vpn_ipsec.php");
@@ -105,126 +99,79 @@ if (is_subsystem_dirty('ipsec')) {
$tab_array[3] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
display_top_tabs($tab_array);
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
- <tr>
- <td class="listhdrr"><?=gettext("Identifier"); ?></td>
- <td class="listhdrr"><?=gettext("Type"); ?></td>
- <td class="listhdr"><?=gettext("Pre-Shared Key"); ?></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add key">
- <tr>
- <td width="20" height="17"></td>
- <td>
- <a href="vpn_ipsec_keys_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add key"); ?>" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-<?php
- $i = 0;
- foreach ($userkeys as $secretent):
-?>
- <tr>
- <td class="listlr gray">
- <?php
- if ($secretent['ident'] == 'allusers') {
- echo gettext("ANY USER");
- } else {
- echo htmlspecialchars($secretent['ident']);
- }
- ?>
- </td>
- <td class="listlr gray">
- <?php
- if (empty($secretent['type'])) {
- echo 'PSK';
- } else {
- echo htmlspecialchars($secretent['type']);
- }
- ?>
- </td>
- <td class="listr gray">
- <?=htmlspecialchars($secretent['pre-shared-key']);?>
- </td>
- <td class="list nowrap">
- <form action="system_usermanager.php" method="post" name="form_edit_key">
- <input type="hidden" name="act" value="edit" />
- <input type="hidden" name="userid" value="<?=$secretent['id'];?>" />
- <input type="image" name="edituser[]" width="17" height="17" border="0"
- src="/themes/<?=$g['theme'];?>/images/icons/icon_e.gif"
- title="<?=gettext("edit");?>" />
- </form>
- &nbsp;
- </td>
- </tr>
-<?php
- $i++;
- endforeach;
-?>
-<?php
- $i = 0;
- foreach ($a_secret as $secretent):
-?>
- <tr>
- <td class="listlr">
- <?=htmlspecialchars($secretent['ident']);?>
- </td>
- <td class="listlr">
- <?php
- if (empty($secretent['type'])) {
- echo 'PSK';
- } else {
- echo htmlspecialchars($secretent['type']);
- }
- ?>
- </td>
- <td class="listr">
- <?=htmlspecialchars($secretent['pre-shared-key']);?>
- </td>
- <td class="list nowrap"><a href="vpn_ipsec_keys_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit key"); ?>" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;<a href="vpn_ipsec_keys.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this Pre-Shared Key?"); ?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete key"); ?>" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
-<?php
- $i++;
- endforeach;
-?>
- <tr>
- <td class="list" colspan="3"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add key">
- <tr>
- <td width="20" height="17"></td>
- <td>
- <a href="vpn_ipsec_keys_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add key"); ?>" width="17" height="17" border="0" alt="add" /></a>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- <tr>
- <td colspan="4">
- <p>
- <span class="vexpl">
- <span class="red">
- <strong><?=gettext("Note"); ?>:<br /></strong>
- </span>
- <?=gettext("PSK for any user can be set by using an identifier of any/ANY");?>
- </span>
- </p>
- </td>
- </tr>
-</table>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<div class="table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><?=gettext("Identifier"); ?></th>
+ <th><?=gettext("Type"); ?></th>
+ <th><?=gettext("Pre-Shared Key"); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+
+ <tbody>
+<?php $i = 0; foreach ($userkeys as $secretent): ?>
+ <tr>
+ <td>
+ <?php
+ if ($secretent['ident'] == 'allusers')
+ echo gettext("ANY USER");
+ else
+ echo htmlspecialchars($secretent['ident']);
+ ?>
+ </td>
+ <td>
+ <?php
+ if (empty($secretent['type']))
+ echo 'PSK';
+ else
+ echo htmlspecialchars($secretent['type']);
+ ?>
+ </td>
+ <td>
+ <?=htmlspecialchars($secretent['pre-shared-key'])?>
+ </td>
+ <td>
+ <a class="btn btn-primary btn-xs" href="system_usermanager.php?act=edit&amp;userid=<?=$secretent['id']?>">edit user</a>
+ </td>
+ </tr>
+<?php $i++; endforeach; ?>
+
+<?php $i = 0; foreach ($a_secret as $secretent): ?>
+ <tr>
+ <td>
+ <?=htmlspecialchars($secretent['ident'])?>
+ </td>
+ <td>
+ <?php
+ if (empty($secretent['type']))
+ echo 'PSK';
+ else
+ echo htmlspecialchars($secretent['type']);
+ ?>
+ </td>
+ <td>
+ <?=htmlspecialchars($secretent['pre-shared-key'])?>
+ </td>
+ <td>
+ <a class="btn btn-primary btn-xs" href="vpn_ipsec_keys_edit.php?id=<?=$i?>">edit key</a>
+ <a class="btn btn-danger btn-xs" href="vpn_ipsec_keys.php?act=del&amp;id=<?=$i?>">delete key</a>
+ </td>
+ </tr>
+<?php $i++; endforeach; ?>
+ </tbody>
+ </table>
+</div>
+
+<nav class="action-buttons">
+ <a class="btn btn-success" href="vpn_ipsec_keys_edit.php"><?=gettext("add key")?></a>
+</nav>
+
+<div class="alert alert-info">
+ <strong><?=gettext("Note"); ?>:</strong><br />
+ <?=gettext("PSK for any user can be set by using an identifier of any/ANY")?>
+</div>
+
+<?php include("foot.inc"); ?> \ No newline at end of file
diff --git a/src/usr/local/www/vpn_ipsec_keys_edit.php b/src/usr/local/www/vpn_ipsec_keys_edit.php
index 6419a6b..d4037c4 100644
--- a/src/usr/local/www/vpn_ipsec_keys_edit.php
+++ b/src/usr/local/www/vpn_ipsec_keys_edit.php
@@ -133,67 +133,55 @@ include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="vpn_ipsec_keys_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="vpn ipsec keys edit">
- <tr>
- <td colspan="2" valign="top" class="listtopic">Edit pre-shared secret</td>
- </tr>
- <tr>
- <td valign="top" class="vncellreq"><?=gettext("Identifier"); ?></td>
- <td class="vtable">
- <?=$mandfldhtml;?><input name="ident" type="text" class="formfld unknown" id="ident" size="30" value="<?=htmlspecialchars($pconfig['ident']);?>" />
- <br />
- <?=gettext("This can be either an IP address, fully qualified domain name or an e-mail address"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Secret type"); ?></td>
- <td width="78%" class="vtable">
- <select name="type" class="formselect">
- <?php
- foreach ($ipsec_preshared_key_type as $value => $descr) {
- echo "<option value='{$value}' ";
- if ($pconfig['type'] == $value) {
- echo "selected=\"selected\"";
- }
- echo ">{$descr}</option>";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Pre-Shared Key"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="psk" type="text" class="formfld unknown" id="psk" size="40" value="<?=htmlspecialchars($pconfig['psk']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <?php if (isset($id) && $a_secret[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- <tr>
- <td colspan="4">
- <p>
- <span class="vexpl">
- <span class="red">
- <strong><?=gettext("Note"); ?>:<br /></strong>
- </span>
- <?=gettext("PSK for any user can be set by using an identifier of any/ANY");?>
- </span>
- </p>
- </td>
- </tr>
- </table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php
+
+require('classes/Form.class.php');
+$form = new Form;
+
+$section = new Form_Section('Edit pre-shared-secret');
+
+$section->addInput(new Form_Input(
+ 'ident',
+ 'Identifier',
+ 'text',
+ $pconfig['ident']
+))->setHelp('This can be either an IP address, fully qualified domain name or an e-mail address');
+
+$section->addInput(new Form_Select(
+ 'type',
+ 'Secret type',
+ $pconfig['type'],
+ $ipsec_preshared_key_type
+))->setWidth(2);
+
+$section->addInput(new Form_Input(
+ 'psk',
+ 'Pre-Shared Key',
+ 'text',
+ $pconfig['psk']
+));
+
+if (isset($id) && $a_secret[$id])
+{
+ $form->addGlobal(new Form_Input(
+ 'id',
+ false,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+
+print $form;
+
+?>
+
+<div class="alert alert-info">
+ <strong><?=gettext("Note"); ?>:</strong><br />
+ <?=gettext("PSK for any user can be set by using an identifier of any/ANY")?>
+</div>
+
+<?php include("foot.inc"); ?> \ No newline at end of file
diff --git a/src/usr/local/www/vpn_ipsec_mobile.php b/src/usr/local/www/vpn_ipsec_mobile.php
index bb1ef75..503b2b2 100644
--- a/src/usr/local/www/vpn_ipsec_mobile.php
+++ b/src/usr/local/www/vpn_ipsec_mobile.php
@@ -134,7 +134,7 @@ if ($_POST['apply']) {
}
}
-if ($_POST['submit']) {
+if ($_POST['save']) {
unset($input_errors);
$pconfig = $_POST;
@@ -278,463 +278,334 @@ $shortcut_section = "ipsec";
include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
+ <script type="text/javascript">
+ //<![CDATA[
-<script type="text/javascript">
-//<![CDATA[
+ function pool_change() {
-function pool_change() {
+ if (document.iform.pool_enable.checked) {
+ document.iform.pool_address.disabled = 0;
+ document.iform.pool_netbits.disabled = 0;
+ } else {
+ document.iform.pool_address.disabled = 1;
+ document.iform.pool_netbits.disabled = 1;
+ }
+ }
- if (document.iform.pool_enable.checked) {
- document.iform.pool_address.disabled = 0;
- document.iform.pool_netbits.disabled = 0;
- } else {
- document.iform.pool_address.disabled = 1;
- document.iform.pool_netbits.disabled = 1;
- }
-}
+ function dns_domain_change() {
-function dns_domain_change() {
+ if (document.iform.dns_domain_enable.checked)
+ document.iform.dns_domain.disabled = 0;
+ else
+ document.iform.dns_domain.disabled = 1;
+ }
- if (document.iform.dns_domain_enable.checked) {
- document.iform.dns_domain.disabled = 0;
- } else {
- document.iform.dns_domain.disabled = 1;
- }
-}
+ function dns_split_change() {
-function dns_split_change() {
+ if (document.iform.dns_split_enable.checked)
+ document.iform.dns_split.disabled = 0;
+ else
+ document.iform.dns_split.disabled = 1;
+ }
- if (document.iform.dns_split_enable.checked) {
- document.iform.dns_split.disabled = 0;
- } else {
- document.iform.dns_split.disabled = 1;
- }
-}
+ function dns_server_change() {
+
+ if (document.iform.dns_server_enable.checked) {
+ document.iform.dns_server1.disabled = 0;
+ document.iform.dns_server2.disabled = 0;
+ document.iform.dns_server3.disabled = 0;
+ document.iform.dns_server4.disabled = 0;
+ } else {
+ document.iform.dns_server1.disabled = 1;
+ document.iform.dns_server2.disabled = 1;
+ document.iform.dns_server3.disabled = 1;
+ document.iform.dns_server4.disabled = 1;
+ }
+ }
-function dns_server_change() {
+ function wins_server_change() {
- if (document.iform.dns_server_enable.checked) {
- document.iform.dns_server1.disabled = 0;
- document.iform.dns_server2.disabled = 0;
- document.iform.dns_server3.disabled = 0;
- document.iform.dns_server4.disabled = 0;
- } else {
- document.iform.dns_server1.disabled = 1;
- document.iform.dns_server2.disabled = 1;
- document.iform.dns_server3.disabled = 1;
- document.iform.dns_server4.disabled = 1;
- }
-}
+ if (document.iform.wins_server_enable.checked) {
+ document.iform.wins_server1.disabled = 0;
+ document.iform.wins_server2.disabled = 0;
+ } else {
+ document.iform.wins_server1.disabled = 1;
+ document.iform.wins_server2.disabled = 1;
+ }
+ }
-function wins_server_change() {
+ function pfs_group_change() {
- if (document.iform.wins_server_enable.checked) {
- document.iform.wins_server1.disabled = 0;
- document.iform.wins_server2.disabled = 0;
- } else {
- document.iform.wins_server1.disabled = 1;
- document.iform.wins_server2.disabled = 1;
- }
-}
+ if (document.iform.pfs_group_enable.checked)
+ document.iform.pfs_group.disabled = 0;
+ else
+ document.iform.pfs_group.disabled = 1;
+ }
-function pfs_group_change() {
+ function login_banner_change() {
- if (document.iform.pfs_group_enable.checked) {
- document.iform.pfs_group.disabled = 0;
- } else {
- document.iform.pfs_group.disabled = 1;
- }
-}
+ if (document.iform.login_banner_enable.checked)
+ document.iform.login_banner.disabled = 0;
+ else
+ document.iform.login_banner.disabled = 1;
+ }
-function login_banner_change() {
+ //]]>
+ </script>
- if (document.iform.login_banner_enable.checked) {
- document.iform.login_banner.disabled = 0;
- } else {
- document.iform.login_banner.disabled = 1;
- }
+<?php
+if ($savemsg)
+ print_info_box($savemsg);
+if (isset($config['ipsec']['enable']) && is_subsystem_dirty('ipsec'))
+ print_info_box_np(gettext("The IPsec tunnel configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
+foreach ($a_phase1 as $ph1ent)
+ if (isset($ph1ent['mobile']))
+ $ph1found = true;
+if ($pconfig['enable'] && !$ph1found)
+ print_info_box_np(gettext("Support for IPsec Mobile clients is enabled but a Phase1 definition was not found") . ".<br />" . gettext("Please click Create to define one."),gettext("create"),gettext("Create Phase1"));
+if ($input_errors)
+ print_input_errors($input_errors);
+
+$tab_array = array();
+$tab_array[0] = array(gettext("Tunnels"), false, "vpn_ipsec.php");
+$tab_array[1] = array(gettext("Mobile clients"), true, "vpn_ipsec_mobile.php");
+$tab_array[2] = array(gettext("Pre-Shared Key"), false, "vpn_ipsec_keys.php");
+$tab_array[3] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+$form = new Form;
+
+$section = new Form_Section('Enable IPsec Mobile Client Support');
+$section->addInput(new Form_Checkbox(
+ 'enable',
+ 'IKE Extensions',
+ 'Enable IPsec Mobile Client Support',
+ $pconfig['enable']
+));
+
+$form->add($section);
+
+$section = new Form_Section('Extended Authentication (Xauth)');
+
+$authServers = array();
+
+foreach (auth_get_authserver_list() as $authServer)
+ $authServers[$authServer['name']] = $authServer['name']; // Value == name
+
+$section->addInput(new Form_Select(
+ 'user_source',
+ 'User Authentication',
+ explode(",", $pconfig['user_source']),
+ $authServers,
+ true
+))->setHelp('Source');
+
+$section->addInput(new Form_Select(
+ 'group_source',
+ 'Group Authentication',
+ $pconfig['group_source'],
+ array(
+ 'none' => 'none',
+ 'system' => 'system',
+ )
+))->setHelp('Source');
+
+$form->add($section);
+
+$section = new Form_Section('Client Configuration (mode-cfg)');
+
+$section->addInput(new Form_Checkbox(
+ 'pool_enable',
+ 'Virtual Address Pool',
+ 'Provide a virtual IP address to clients',
+ $pconfig['pool_enable']
+))->toggles('.toggle-pool_enable');
+
+// TODO: Refactor this manual setup
+$group = new Form_Group('');
+$group->addClass('toggle-pool_enable collapse');
+
+if (!empty($pconfig['pool_enable']))
+ $group->addClass('in');
+
+$group->add(new Form_Input(
+ 'pool_address',
+ 'Network',
+ 'text',
+ htmlspecialchars($pconfig['pool_address'])
+))->setWidth(4)->setHelp('Network configuration for Virtual Address Pool');
+
+$netBits = array();
+
+for ($i = 32; $i >= 0; $i--)
+ $netBits[$i] = $i;
+
+$group->add(new Form_Select(
+ 'pool_netbits',
+ '',
+ $pconfig['pool_netbits'],
+ $netBits
+))->setWidth(2);
+
+$section->add($group);
+
+$section->addInput(new Form_Checkbox(
+ 'net_list_enable',
+ 'Network List',
+ 'Provide a list of accessible networks to clients',
+ $pconfig['net_list_enable']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'save_passwd_enable',
+ 'Save Xauth Password',
+ 'Allow clients to save Xauth passwords (Cisco VPN client only).',
+ $pconfig['save_passwd_enable']
+))->setHelp('NOTE: With iPhone clients, this does not work when deployed via the iPhone configuration utility, only by manual entry.');
+
+$section->addInput(new Form_Checkbox(
+ 'dns_domain_enable',
+ 'DNS Default Domain',
+ 'Provide a default domain name to clients',
+ $pconfig['dns_domain_enable']
+))->toggles('.toggle-dns_domain');
+
+$group = new Form_Group('');
+$group->addClass('toggle-dns_domain collapse');
+
+if (!empty($pconfig['dns_domain_enable']))
+ $group->addClass('in');
+
+$group->add(new Form_Input(
+ 'dns_domain',
+ '',
+ 'text',
+ htmlspecialchars($pconfig['dns_domain'])
+))->setHelp('Specify domain as DNS Default Domain');
+
+$section->add($group);
+
+$section->addInput(new Form_Checkbox(
+ 'dns_split_enable',
+ 'Split DNS',
+ 'Provide a list of split DNS domain names to clients. Enter a space separated list.',
+ $pconfig['dns_split_enable']
+))->toggles('.toggle-dns_split');
+
+$group = new Form_Group('');
+$group->addClass('toggle-dns_split collapse');
+
+if (!empty($pconfig['dns_split_enable']))
+ $group->addClass('in');
+
+$group->add(new Form_Input(
+ 'dns_split',
+ '',
+ 'text',
+ htmlspecialchars($pconfig['dns_split'])
+))->setHelp('NOTE: If left blank, and a default domain is set, it will be used for this value.');
+
+$section->add($group);
+
+$section->addInput(new Form_Checkbox(
+ 'dns_server_enable',
+ 'DNS Servers',
+ 'Provide a DNS server list to clients',
+ $pconfig['dns_server_enable']
+))->toggles('.toggle-dns_server_enable');
+
+for ($i = 1; $i <= 4; $i++)
+{
+ $group = new Form_Group('Server #' . $i);
+ $group->addClass('toggle-dns_server_enable collapse');
+
+ if (!empty($pconfig['dns_server_enable']))
+ $group->addClass('in');
+
+ $group->add(new Form_Input(
+ 'dns_server' . $i,
+ 'Server #' . $i,
+ 'text',
+ htmlspecialchars($pconfig['dns_server' . $i])
+ ));
+
+ $section->add($group);
}
-//]]>
-</script>
+$section->addInput(new Form_Checkbox(
+ 'wins_server_enable',
+ 'WINS Servers',
+ 'Provide a WINS server list to clients',
+ $pconfig['wins_server_enable']
+))->toggles('.toggle-wins_server_enable');
+
+for ($i = 1; $i <= 2; $i++)
+{
+ $group = new Form_Group('Server #' . $i);
+ $group->addClass('toggle-wins_server_enable collapse');
+
+ if (!empty($pconfig['wins_server_enable']))
+ $group->addClass('in');
+
+ $group->add(new Form_Input(
+ 'wins_server' . $i,
+ 'Server #' . $i,
+ 'text',
+ htmlspecialchars($pconfig['wins_server' . $i]),
+ array('size' => 20)
+ ));
+
+ $section->add($group);
+}
-<form action="vpn_ipsec_mobile.php" method="post" name="iform" id="iform">
+$section->addInput(new Form_Checkbox(
+ 'pfs_group_enable',
+ 'Phase2 PFS Group',
+ 'Provide the Phase2 PFS group to clients ( overrides all mobile phase2 settings )',
+ $pconfig['pfs_group_enable']
+))->toggles('.toggle-pfs_group');
-<?php
- if ($savemsg) {
- print_info_box($savemsg);
- }
- if (isset($config['ipsec']['enable']) && is_subsystem_dirty('ipsec')) {
- print_info_box_np(gettext("The IPsec tunnel configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
- }
- foreach ($a_phase1 as $ph1ent) {
- if (isset($ph1ent['mobile'])) {
- $ph1found = true;
- }
- }
- if ($pconfig['enable'] && !$ph1found) {
- print_info_box_np(gettext("Support for IPsec Mobile clients is enabled but a Phase1 definition was not found") . ".<br />" . gettext("Please click Create to define one."), gettext("create"), gettext("Create Phase1"));
- }
- if ($input_errors) {
- print_input_errors($input_errors);
- }
-?>
+$group = new Form_Group('Group');
+$group->addClass('toggle-pfs_group collapse');
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn ipsec mobile">
- <tr>
- <td class="tabnavtbl">
- <?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Tunnels"), false, "vpn_ipsec.php");
- $tab_array[1] = array(gettext("Mobile clients"), true, "vpn_ipsec_mobile.php");
- $tab_array[2] = array(gettext("Pre-Shared Key"), false, "vpn_ipsec_keys.php");
- $tab_array[3] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("IKE Extensions"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="2" cellpadding="0" summary="ike extensions">
- <tr>
- <td>
- <?php set_checked($pconfig['enable'], $chk); ?>
- <input name="enable" type="checkbox" id="enable" value="yes" <?=$chk;?> />
- </td>
- <td>
- <strong><?=gettext("Enable IPsec Mobile Client Support"); ?></strong>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic">
- <?=gettext("Extended Authentication (Xauth)"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("User Authentication"); ?></td>
- <td width="78%" class="vtable">
- <?=gettext("Source"); ?>:&nbsp;&nbsp;
- <select name="user_source[]" class="formselect" id="user_source" multiple="multiple" size="3">
- <?php
- $authmodes = explode(",", $pconfig['user_source']);
- $auth_servers = auth_get_authserver_list();
- foreach ($auth_servers as $auth_server) {
- $selected = "";
- if (in_array($auth_server['name'], $authmodes)) {
- $selected = "selected=\"selected\"";
- }
- echo "<option value='{$auth_server['name']}' {$selected}>{$auth_server['name']}</option>\n";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Group Authentication"); ?></td>
- <td width="78%" class="vtable">
- <?=gettext("Source"); ?>:&nbsp;&nbsp;
- <select name="group_source" class="formselect" id="group_source">
- <option value="none"><?=gettext("none"); ?></option>
- <option value="system" <?php if ($pconfig['group_source'] == "system") echo "selected=\"selected\""; ?> ><?=gettext("system"); ?></option>
- </select>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic">
- <?=gettext("Client Configuration (mode-cfg)"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Virtual Address Pool"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="2" cellpadding="0" summary="enable pool">
- <tr>
- <td>
- <?php set_checked($pconfig['pool_enable'], $chk); ?>
- <input name="pool_enable" type="checkbox" id="pool_enable" value="yes" <?=$chk;?> onclick="pool_change()" />
- </td>
- <td>
- <?=gettext("Provide a virtual IP address to clients"); ?><br />
- </td>
- </tr>
- </table>
- <table border="0" cellspacing="2" cellpadding="0" summary="virtual address pool">
- <tr>
- <td>
- <?=gettext("Network"); ?>:&nbsp;
- <input name="pool_address" type="text" class="formfld unknown" id="pool_address" size="20" value="<?=htmlspecialchars($pconfig['pool_address']);?>" />
- /
- <select name="pool_netbits" class="formselect" id="pool_netbits">
- <?php for ($i = 32; $i >= 0; $i--): ?>
- <option value="<?=$i;?>" <?php if ($i == $pconfig['pool_netbits']) echo "selected=\"selected\""; ?>>
- <?=$i;?>
- </option>
- <?php endfor; ?>
- </select>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Network List"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="2" cellpadding="0" summary="network list">
- <tr>
- <td>
- <?php set_checked($pconfig['net_list_enable'], $chk); ?>
- <input name="net_list_enable" type="checkbox" id="net_list_enable" value="yes" <?=$chk;?> />
- </td>
- <td>
- <?=gettext("Provide a list of accessible networks to clients"); ?><br />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Save Xauth Password"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="2" cellpadding="0" summary="password">
- <tr>
- <td>
- <?php set_checked($pconfig['save_passwd_enable'], $chk); ?>
- <input name="save_passwd_enable" type="checkbox" id="save_passwd_enable" value="yes" <?=$chk;?> />
- </td>
- <td>
- <?=gettext("Allow clients to save Xauth passwords (Cisco VPN client only)."); ?><br />
- <?=gettext("NOTE: With iPhone clients, this does not work when deployed via the iPhone configuration utility, only by manual entry."); ?><br />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("DNS Default Domain"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="2" cellpadding="0" summary="enable dns default domain">
- <tr>
- <td>
- <?php set_checked($pconfig['dns_domain_enable'], $chk); ?>
- <input name="dns_domain_enable" type="checkbox" id="dns_domain_enable" value="yes" <?=$chk;?> onclick="dns_domain_change()" />
- </td>
- <td>
- <?=gettext("Provide a default domain name to clients"); ?><br />
- </td>
- </tr>
- </table>
- <table border="0" cellspacing="2" cellpadding="0" summary="dns default domain">
- <tr>
- <td>
- <input name="dns_domain" type="text" class="formfld unknown" id="dns_domain" size="30" value="<?=htmlspecialchars($pconfig['dns_domain']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Split DNS"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="2" cellpadding="0" summary="enable split dns">
- <tr>
- <td>
- <?php set_checked($pconfig['dns_split_enable'], $chk); ?>
- <input name="dns_split_enable" type="checkbox" id="dns_split_enable" value="yes" <?=$chk;?> onclick="dns_split_change()" />
- </td>
- <td>
- <?=gettext("Provide a list of split DNS domain names to clients. Enter a space separated list."); ?><br />
- <?=gettext("NOTE: If left blank, and a default domain is set, it will be used for this value."); ?>
- </td>
- </tr>
- </table>
- <table border="0" cellspacing="2" cellpadding="0" summary="split dns">
- <tr>
- <td>
- <input name="dns_split" type="text" class="formfld unknown" id="dns_split" size="30" value="<?=htmlspecialchars($pconfig['dns_split']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("DNS Servers"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="2" cellpadding="0" summary="enable dns servers">
- <tr>
- <td>
- <?php set_checked($pconfig['dns_server_enable'], $chk); ?>
- <input name="dns_server_enable" type="checkbox" id="dns_server_enable" value="yes" <?=$chk;?> onclick="dns_server_change()" />
- </td>
- <td>
- <?=gettext("Provide a DNS server list to clients"); ?><br />
- </td>
- </tr>
- </table>
- <table border="0" cellspacing="2" cellpadding="0" summary="dns servers">
- <tr>
- <td>
- <?=gettext("Server"); ?> #1:&nbsp;
- <input name="dns_server1" type="text" class="formfld unknown" id="dns_server1" size="20" value="<?=htmlspecialchars($pconfig['dns_server1']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <?=gettext("Server"); ?> #2:&nbsp;
- <input name="dns_server2" type="text" class="formfld unknown" id="dns_server2" size="20" value="<?=htmlspecialchars($pconfig['dns_server2']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <?=gettext("Server"); ?> #3:&nbsp;
- <input name="dns_server3" type="text" class="formfld unknown" id="dns_server3" size="20" value="<?=htmlspecialchars($pconfig['dns_server3']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <?=gettext("Server"); ?> #4:&nbsp;
- <input name="dns_server4" type="text" class="formfld unknown" id="dns_server4" size="20" value="<?=htmlspecialchars($pconfig['dns_server4']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("WINS Servers"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="2" cellpadding="0" summary="enable wins servers">
- <tr>
- <td>
- <?php set_checked($pconfig['wins_server_enable'], $chk); ?>
- <input name="wins_server_enable" type="checkbox" id="wins_server_enable" value="yes" <?=$chk;?> onclick="wins_server_change()" />
- </td>
- <td>
- <?=gettext("Provide a WINS server list to clients"); ?><br />
- </td>
- </tr>
- </table>
- <table border="0" cellspacing="2" cellpadding="0" summary="wins servers">
- <tr>
- <td>
- <?=gettext("Server"); ?> #1:&nbsp;
- <input name="wins_server1" type="text" class="formfld unknown" id="wins_server1" size="20" value="<?=htmlspecialchars($pconfig['wins_server1']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <?=gettext("Server"); ?> #2:&nbsp;
- <input name="wins_server2" type="text" class="formfld unknown" id="wins_server2" size="20" value="<?=htmlspecialchars($pconfig['wins_server2']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Phase2 PFS Group"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="2" cellpadding="0" summary="enable pfs group">
- <tr>
- <td>
- <?php set_checked($pconfig['pfs_group_enable'], $chk); ?>
- <input name="pfs_group_enable" type="checkbox" id="pfs_group_enable" value="yes" <?=$chk;?> onclick="pfs_group_change()" />
- </td>
- <td>
- <?=gettext("Provide the Phase2 PFS group to clients ( overrides all mobile phase2 settings )"); ?><br />
- </td>
- </tr>
- </table>
- <table border="0" cellspacing="2" cellpadding="0" summary="phase-2 pfs group">
- <tr>
- <td>
- <?=gettext("Group"); ?>:&nbsp;&nbsp;
- <select name="pfs_group" class="formselect" id="pfs_group">
- <?php foreach ($p2_pfskeygroups as $keygroup => $keygroupname): ?>
- <option value="<?=$keygroup;?>" <?php if ($pconfig['pfs_group'] == $keygroup) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($keygroupname);?>
- </option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Login Banner"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="2" cellpadding="0" summary="enable login banner">
- <tr>
- <td>
- <?php set_checked($pconfig['login_banner_enable'], $chk); ?>
- <input name="login_banner_enable" type="checkbox" id="login_banner_enable" value="yes" <?=$chk;?> onclick="login_banner_change()" />
- </td>
- <td>
- <?=gettext("Provide a login banner to clients"); ?><br />
- </td>
- </tr>
- </table>
- <table border="0" cellspacing="2" cellpadding="0" summary="banner">
- <tr>
- <td>
- <?php $banner = htmlspecialchars($pconfig['login_banner']); ?>
- <textarea name="login_banner" cols="65" rows="7" id="login_banner" class="formpre"><?=htmlspecialchars($banner);?></textarea>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<script type="text/javascript">
-//<![CDATA[
-pool_change();
-dns_domain_change();
-dns_split_change();
-dns_server_change();
-wins_server_change();
-pfs_group_change();
-login_banner_change();
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if (!empty($pconfig['pfs_group_enable']))
+ $group->addClass('in');
-<?php
+$group->add(new Form_Select(
+ 'pfs_group',
+ 'Group',
+ $pconfig['pfs_group'],
+ $p2_pfskeygroups
+))->setWidth(2);
-/* local utility functions */
+$section->add($group);
-function set_checked($var,& $chk) {
- if ($var) {
- $chk = "checked=\"checked\"";
- } else {
- $chk = "";
- }
-}
+$section->addInput(new Form_Checkbox(
+ 'login_banner_enable',
+ 'Login Banner',
+ 'Provide a login banner to clients',
+ $pconfig['login_banner_enable']
+))->toggles('.toggle-login_banner');
-?>
+$group = new Form_Group('');
+$group->addClass('toggle-login_banner collapse');
+
+if (!empty($pconfig['login_banner_enable']))
+ $group->addClass('in');
+
+// TODO: should be a textarea
+$group->add(new Form_Input(
+ 'login_banner',
+ '',
+ 'text',
+ htmlspecialchars($pconfig['login_banner'])
+));
+
+$section->add($group);
+
+$form->add($section);
+
+print $form;
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/vpn_ipsec_phase1.php b/src/usr/local/www/vpn_ipsec_phase1.php
index 11a2e90..588b4dd 100644
--- a/src/usr/local/www/vpn_ipsec_phase1.php
+++ b/src/usr/local/www/vpn_ipsec_phase1.php
@@ -129,7 +129,7 @@ if (isset($p1index) && $a_phase1[$p1index]) {
$pconfig['responderonly'] = true;
}
- if ($a_phase1[$p1index]['dpd_delay'] && $a_phase1[$p1index]['dpd_maxfail']) {
+ if ($a_phase1[$p1index]['dpd_delay'] && $a_phase1[$p1index]['dpd_maxfail']) {
$pconfig['dpd_enable'] = true;
$pconfig['dpd_delay'] = $a_phase1[$p1index]['dpd_delay'];
$pconfig['dpd_maxfail'] = $a_phase1[$p1index]['dpd_maxfail'];
@@ -243,7 +243,7 @@ if ($_POST) {
if ($pconfig['remotegw'] && is_ipaddr($pconfig['remotegw']) && !isset($pconfig['disabled'])) {
$t = 0;
foreach ($a_phase1 as $ph1tmp) {
- if ($p1index <> $t) {
+ if ($p1index != $t) {
$tremotegw = $pconfig['remotegw'];
if (($ph1tmp['remote-gateway'] == $tremotegw) && !isset($ph1tmp['disabled'])) {
$input_errors[] = sprintf(gettext('The remote gateway "%1$s" is already used by phase1 "%2$s".'), $tremotegw, $ph1tmp['descr']);
@@ -481,612 +481,605 @@ if ($_POST) {
}
}
+function build_interface_list() {
+ $interfaces = get_configured_interface_with_descr();
+
+ $carplist = get_configured_carp_interface_list();
+
+ foreach ($carplist as $cif => $carpip)
+ $interfaces[$cif] = $carpip." (".get_vip_descr($carpip).")";
+
+ $aliaslist = get_configured_ip_aliases_list();
+
+ foreach ($aliaslist as $aliasip => $aliasif)
+ $interfaces[$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
+
+ $grouplist = return_gateway_groups_array();
+
+ foreach ($grouplist as $name => $group) {
+ if($group[0]['vip'] != "")
+ $vipif = $group[0]['vip'];
+ else
+ $vipif = $group[0]['int'];
+
+ $interfaces[$name] = "GW Group {$name}";
+ }
+
+ return($interfaces);
+
+}
+
+function build_auth_method_list() {
+ global $p1_authentication_methods;
+
+ $list = array();
+
+ foreach ($p1_authentication_methods as $method_type => $method_params){
+ if (!$pconfig['mobile'] && $method_params['mobile'])
+ continue;
+
+ $list[$method_type] = htmlspecialchars($method_params['name']);
+ }
+
+ return($list);
+}
+
+function build_myid_list() {
+ global $my_identifier_list;
+
+ $list = array();
+
+ foreach ($my_identifier_list as $id_type => $id_params)
+ $list[$id_type] = htmlspecialchars($id_params['desc']);
+
+ return($list);
+}
+
+function build_peerid_list() {
+ global $peer_identifier_list;
+
+ $list = array();
+
+ foreach ($peer_identifier_list as $id_type => $id_params)
+ $list[$id_type] = htmlspecialchars($id_params['desc']);
+
+ return($list);
+}
+
+function build_cert_list() {
+ global $config;
+
+ $list = array();
+
+ if(is_array($config['cert'])) {
+ foreach ($config['cert'] as $cert)
+ $list[$cert['refid']] = $cert['descr'];
+ }
+
+ return($list);
+}
+
+function build_ca_list() {
+ global $config;
+
+ $list = array();
+
+ if(is_array($config['ca'])) {
+ foreach ($config['ca'] as $ca)
+ $list[$ca['refid']] = $ca['descr'];
+ }
+
+ return($list);
+}
+
+function build_eal_list() {
+ global $p1_ealgos;
+
+ $list = array();
+
+ if(is_array($p1_ealgos)) {
+ foreach ($p1_ealgos as $algo => $algodata)
+ $list[$algo] = htmlspecialchars($algodata['name']);
+ }
+
+ return($list);
+}
+
if ($pconfig['mobile']) {
$pgtitle = array(gettext("VPN"), gettext("IPsec"), gettext("Edit Phase 1"), gettext("Mobile Client"));
} else {
$pgtitle = array(gettext("VPN"), gettext("IPsec"), gettext("Edit Phase 1"));
}
-$shortcut_section = "ipsec";
+$shortcut_section = "ipsec";
include("head.inc");
+$tab_array = array();
+$tab_array[] = array(gettext("Tunnels"), true, "vpn_ipsec.php");
+$tab_array[] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
+$tab_array[] = array(gettext("Pre-Shared Keys"), false, "vpn_ipsec_keys.php");
+$tab_array[] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('General Information');
+
+$section->addInput(new Form_Checkbox(
+ 'disabled',
+ 'Disabled',
+ 'Set this option to disable this phase1 without removing it from the list. ',
+ $pconfig['disabled']
+));
+
+$section->addInput(new Form_Select(
+ 'iketype',
+ 'Key Exchange version',
+ $pconfig['iketype'],
+ array("ikev1" => "V1", "ikev2" => "V2", "auto" => "Auto")
+))->setHelp('Select the Internet Key Exchange protocol version to be used, IKEv1 or IKEv2.');
+
+$section->addInput(new Form_Select(
+ 'protocol',
+ 'Internet Protocol',
+ $pconfig['protocol'],
+ array("inet" => "IPv4", "inet6" => "IPv6")
+))->setHelp('Select the Internet Protocol family.');
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ $pconfig['interface'],
+ build_interface_list()
+))->setHelp('Select the interface for the local endpoint of this phase1 entry.');
+
+$section->addInput(new Form_Input(
+ 'remotegw',
+ 'Remote Gateway',
+ 'text',
+ $pconfig['remotegw']
+))->setHelp('Enter the public IP address or host name of the remote gateway');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$form->add($section);
+
+$section = new Form_Section('Phase 1 proposal (Authentication)');
+
+$section->addInput(new Form_Select(
+ 'authentication_method',
+ 'Authentication Method',
+ $pconfig['authentication_method'],
+ build_auth_method_list()
+))->setHelp('Must match the setting chosen on the remote side.');
+
+$section->addInput(new Form_Select(
+ 'mode',
+ 'Negotiation mode',
+ $pconfig['mode'],
+ array("main" => "Main", "aggressive" => "Aggressive")
+))->setHelp('Aggressive is more flexible, but less secure.');
+
+$group = new Form_Group('My identifier');
+
+$group->add(new Form_Select(
+ 'myid_type',
+ null,
+ $pconfig['myid_type'],
+ build_myid_list()
+));
+
+$group->add(new Form_Input(
+ 'myid_data',
+ null,
+ 'text',
+ $pconfig['myid_data']
+));
+
+$section->add($group);
+
+$group = new Form_Group('Peer identifier');
+$group->addClass('peeridgroup');
+
+$group->add(new Form_Select(
+ 'peerid_type',
+ null,
+ $pconfig['peerid_type'],
+ build_peerid_list()
+));
+
+$group->add(new Form_Input(
+ 'peerid_data',
+ null,
+ 'text',
+ $pconfig['peerid_data']
+));
+
+if($pconfig['mobile'])
+ $group->setHelp('This is known as the "group" setting on some VPN client implementations');
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'pskey',
+ 'Pre-Shared Key',
+ 'text',
+ $pconfig['pskey']
+))->setHelp('Enter your Pre-Shared Key string.');
+
+$section->addInput(new Form_Select(
+ 'certref',
+ 'My Certificate',
+ $pconfig['certref'],
+ build_cert_list()
+))->setHelp('Select a certificate previously configured in the Certificate Manager.');
+
+$section->addInput(new Form_Select(
+ 'caref',
+ 'My Certificate Authority',
+ $pconfig['caref'],
+ build_ca_list()
+))->setHelp('Select a certificate authority previously configured in the Certificate Manager.');
+
+$form->add($section);
+
+$section = new Form_Section('Phase 1 proposal (Algorithms)');
+
+$group = new Form_Group('Encryption Algorithm');
+
+$group->add(new Form_Select(
+ 'ealgo',
+ null,
+ $pconfig['ealgo']['name'],
+ build_eal_list()
+));
+
+$group->add(new Form_Select(
+ 'ealgo_keylen',
+ null,
+ $pconfig['ealgo_keylen'],
+ array()
+));
+
+$section->add($group);
+
+$section->addInput(new Form_Select(
+ 'halgo',
+ 'Hash Algorithm',
+ $pconfig['halgo'],
+ $p1_halgos
+))->setHelp('Must match the setting chosen on the remote side.');
+
+$section->addInput(new Form_Select(
+ 'dhgroup',
+ 'DH Group',
+ $pconfig['dhgroup'],
+ $p1_dhgroups
+))->setHelp('Must match the setting chosen on the remote side.');
+
+$section->addInput(new Form_Input(
+ 'lifetime',
+ 'Lifetime (Seconds)',
+ 'number',
+ $pconfig['lifetime']
+));
+
+$form->add($section);
+
+$section = new Form_Section('Advanced Options');
+
+$section->addInput(new Form_Checkbox(
+ 'rekey_enable',
+ 'Disable rekey',
+ 'Disables renegotiation when a connection is about to expire.',
+ $pconfig['rekey_enable']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'reauth_enable',
+ 'Disable Reauth',
+ 'Whether rekeying of an IKE_SA should also reauthenticate the peer. In IKEv1, reauthentication is always done.',
+ $pconfig['reauth_enable']
+));
+
+$section->addInput(new Form_Checkbox(
+ 'responderonly',
+ 'Responder Only',
+ 'Enable this option to never initiate this connection from this side, only respond to incoming requests.',
+ $pconfig['responderonly']
+));
+
+$section->addInput(new Form_Select(
+ 'nat_traversal',
+ 'NAT Traversal',
+ $pconfig['nat_traversal'],
+ array('on' => 'Auto', 'force' => 'Force')
+))->setHelp('Set this option to enable the use of NAT-T (i.e. the encapsulation of ESP in UDP packets) if needed, ' .
+ 'which can help with clients that are behind restrictive firewalls.');
+
+$section->addInput(new Form_Select(
+ 'mobike',
+ 'MOBIKE',
+ $pconfig['mobike'],
+ array('on' => 'Enable', 'off' => 'Disable')
+))->setHelp('Set this option to control the use of MOBIKE');
+
+$section->addInput(new Form_Checkbox(
+ 'dpd_enable',
+ 'Dead Peer Detection',
+ 'Enable DPD',
+ $pconfig['dpd_enable']
+));
+
+$section->addInput(new Form_Input(
+ 'dpd_delay',
+ 'Delay',
+ 'number',
+ $pconfig['dpd_delay']
+))->setHelp('Delay between requesting peer acknowledgement.');
+
+$section->addInput(new Form_Input(
+ 'dpd_maxfail',
+ 'Max failures',
+ 'number',
+ $pconfig['dpd_maxfail']
+))->setHelp('Number of consecutive failures allowed before disconnect. ');
+
+if (isset($p1index) && $a_phase1[$p1index]) {
+ $section->addInput(new Form_Input(
+ 'p1index',
+ null,
+ 'hidden',
+ $pconfig['$p1index']
+ ));
+}
+
+if ($pconfig['mobile']) {
+ $section->addInput(new Form_Input(
+ 'mobile',
+ null,
+ 'hidden',
+ 'true'
+ ));
+}
+
+$section->addInput(new Form_Input(
+ 'ikeid',
+ null,
+ 'hidden',
+ $pconfig['ikeid']
+));
+
+$form->add($section);
+
+print($form);
+
+/* determine if we should init the key length */
+$keyset = '';
+if (isset($pconfig['ealgo']['keylen']))
+ if (is_numeric($pconfig['ealgo']['keylen']))
+ $keyset = $pconfig['ealgo']['keylen'];
+?>
+
+
+<form action="vpn_ipsec_phase1.php" method="post" name="iform" id="iform">
+
+<?php
+ if ($input_errors)
+ print_input_errors($input_errors);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
<script type="text/javascript">
//<![CDATA[
+events.push(function(){
-function myidsel_change() {
- index = document.iform.myid_type.selectedIndex;
- value = document.iform.myid_type.options[index].value;
- if (value == 'myaddress') {
- document.getElementById('myid_data').style.visibility = 'hidden';
- } else {
- document.getElementById('myid_data').style.visibility = 'visible';
+ function myidsel_change() {
+ hideGroupInput('myid_data', ($('#myid_type').val() == 'myaddress'));
}
-}
-function iketype_change() {
- index = document.iform.iketype.selectedIndex;
- value = document.iform.iketype.options[index].value;
- if (value == 'ikev2') {
- document.getElementById('negmode').style.display= 'none';
- document.getElementById('mobike').style.display= '';
- document.getElementById('natt').style.display= 'none';
- document.getElementById('disablereauth').style.display= '';
- } else {
- document.getElementById('negmode').style.display = '';
- document.getElementById('mobike').style.display = 'none';
- document.getElementById('natt').style.display= '';
- document.getElementById('disablereauth').style.display= 'none';
+ function iketype_change() {
+
+ if ($('#iketype').val() == 'ikev2') {
+ hideInput('mode', true);
+ hideInput('mobike', false);
+ hideInput('nat_traversal', true);
+ hideCheckbox('reauth_enable', false);
+ } else {
+ hideInput('mode', false);
+ hideInput('mobike', true);
+ hideInput('nat_traversal', false);
+ hideCheckbox('reauth_enable', true);
+ }
}
-}
-function peeridsel_change() {
- index = document.iform.peerid_type.selectedIndex;
- value = document.iform.peerid_type.options[index].value;
- if (value == 'peeraddress') {
- document.getElementById('peerid_data').style.visibility = 'hidden';
- } else if (value == 'any') {
- document.getElementById('peerid_data').style.visibility = 'hidden';
- } else {
- document.getElementById('peerid_data').style.visibility = 'visible';
+ function peeridsel_change() {
+ hideGroupInput('peerid_data', ($('#peerid_type').val() == 'peeraddress') || ($('#peerid_type').val() == 'any'));
}
-}
-function methodsel_change() {
- index = document.iform.authentication_method.selectedIndex;
- value = document.iform.authentication_method.options[index].value;
+ function methodsel_change() {
+
+ switch ($('#authentication_method').val()) {
+ case 'eap-mschapv2':
+ case 'eap-tls':
+ case 'hybrid_rsa_server':
+ case 'xauth_rsa_server':
+ case 'rsasig':
+ hideInput('pskey', true);
+ hideClass('peeridgroup', false);
+ hideInput('certref', false);
+ hideInput('caref', false);
+ disableInput('certref', false);
+ disableInput('caref', false);
+ break;
- switch (value) {
- case 'eap-mschapv2':
- case 'eap-tls':
- case 'eap-radius':
- document.getElementById('opt_psk').style.display = 'none';
- document.getElementById('opt_peerid').style.display = '';
- document.getElementById('opt_cert').style.display = '';
- document.getElementById('opt_ca').style.display = '';
- document.getElementById('opt_cert').disabled = false;
- document.getElementById('opt_ca').disabled = false;
- break;
- case 'hybrid_rsa_server':
- document.getElementById('opt_psk').style.display = 'none';
- document.getElementById('opt_peerid').style.display = '';
- document.getElementById('opt_cert').style.display = '';
- document.getElementById('opt_ca').style.display = '';
- document.getElementById('opt_cert').disabled = false;
- document.getElementById('opt_ca').disabled = false;
- break;
- case 'xauth_rsa_server':
- case 'rsasig':
- document.getElementById('opt_psk').style.display = 'none';
- document.getElementById('opt_peerid').style.display = '';
- document.getElementById('opt_cert').style.display = '';
- document.getElementById('opt_ca').style.display = '';
- document.getElementById('opt_cert').disabled = false;
- document.getElementById('opt_ca').disabled = false;
- break;
<?php if ($pconfig['mobile']) { ?>
- case 'pre_shared_key':
- document.getElementById('opt_psk').style.display = 'none';
- document.getElementById('opt_peerid').style.display = 'none';
- document.getElementById('opt_cert').style.display = 'none';
- document.getElementById('opt_ca').style.display = 'none';
- document.getElementById('opt_cert').disabled = true;
- document.getElementById('opt_ca').disabled = true;
- break;
+ case 'pre_shared_key':
+ hideInput('pskey', true);
+ hideClass('peeridgroup', true);
+ hideInput('certref', true);
+ hideInput('caref', true);
+ disableInput('certref', true);
+ disableInput('caref', true);
+ break;
<?php } ?>
- default: /* psk modes*/
- document.getElementById('opt_psk').style.display = '';
- document.getElementById('opt_peerid').style.display = '';
- document.getElementById('opt_cert').style.display = 'none';
- document.getElementById('opt_ca').style.display = 'none';
- document.getElementById('opt_cert').disabled = true;
- document.getElementById('opt_ca').disabled = true;
- break;
+ default: /* psk modes*/
+ hideInput('pskey', false);
+ hideClass('peeridgroup', false);
+ hideInput('certref', true);
+ hideInput('caref', true);
+ disableInput('certref', true);
+ disableInput('caref', true);
+ break;
+ }
}
-}
-/* PHP generated java script for variable length keys */
-function ealgosel_change(bits) {
- switch (document.iform.ealgo.selectedIndex) {
+ /* PHP generates javascript case statements for variable length keys */
+ function ealgosel_change(bits) {
+
+ $("select[name='ealgo_keylen']").find('option').remove().end();
+
+ switch ($('#ealgo').find(":selected").index().toString()) {
+<?php
+ $i = 0;
+ foreach ($p1_ealgos as $algo => $algodata) {
+ if (is_array($algodata['keysel'])) {
+?>
+ case '<?=$i?>':
+ hideGroupInput('ealgo_keylen', false);
+<?php
+ $key_hi = $algodata['keysel']['hi'];
+ $key_lo = $algodata['keysel']['lo'];
+ $key_step = $algodata['keysel']['step'];
+
+ for ($keylen = $key_hi; $keylen >= $key_lo; $keylen -= $key_step) {
+?>
+ $("select[name='ealgo_keylen']").append($('<option value="<?=$keylen?>"><?=$keylen?> bits</option>'));
+<?php
+ }
+?>
+ break;
+<?php
+ } else {
+?>
+ case '<?=$i?>':
+ hideGroupInput('ealgo_keylen', true);
+ break;
<?php
-$i = 0;
-foreach ($p1_ealgos as $algo => $algodata) {
- if (is_array($algodata['keysel'])) {
- echo " case {$i}:\n";
- echo " document.iform.ealgo_keylen.style.visibility = 'visible';\n";
- echo " document.iform.ealgo_keylen.options.length = 0;\n";
- // echo " document.iform.ealgo_keylen.options[document.iform.ealgo_keylen.options.length] = new Option( 'auto', 'auto' );\n";
-
- $key_hi = $algodata['keysel']['hi'];
- $key_lo = $algodata['keysel']['lo'];
- $key_step = $algodata['keysel']['step'];
-
- for ($keylen = $key_hi; $keylen >= $key_lo; $keylen -= $key_step) {
- echo " document.iform.ealgo_keylen.options[document.iform.ealgo_keylen.options.length] = new Option( '{$keylen} bits', '{$keylen}' );\n";
}
- echo " break;\n";
- } else {
- echo " case {$i}:\n";
- echo " document.iform.ealgo_keylen.style.visibility = 'hidden';\n";
- echo " document.iform.ealgo_keylen.options.length = 0;\n";
- echo " break;\n";
+ $i++;
}
- $i++;
-}
?>
- }
+ }
- if (bits) {
- document.iform.ealgo_keylen.value = bits;
+ if( bits )
+ $('#ealgo_keylen').val(bits);
}
-}
-function dpdchkbox_change() {
- if (document.iform.dpd_enable.checked) {
- document.getElementById('opt_dpd').style.display = '';
- } else {
- document.getElementById('opt_dpd').style.display = 'none';
- }
+ function dpdchkbox_change() {
+ hide = ! $('#dpd_enable').prop('checked');
- if (!document.iform.dpd_delay.value) {
- document.iform.dpd_delay.value = "10";
- }
+ hideInput('dpd_delay', hide);
+ hideInput('dpd_maxfail', hide);
+
+ if(! $('#dpd_delay').val())
+ $('#dpd_delay').val('10')
- if (!document.iform.dpd_maxfail.value) {
- document.iform.dpd_maxfail.value = "5";
+ if(! $('#dpd_maxfail').val())
+ $('#dpd_maxfail').val('5')
}
-}
-//]]>
-</script>
+ // ---------- Library of show/hide functions ----------------------------------------------------------------------
-<form action="vpn_ipsec_phase1.php" method="post" name="iform" id="iform">
+ // Hides the <div> in which the specified input element lives so that the input,
+ // its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
-<?php
- if ($input_errors) {
- print_input_errors($input_errors);
+ // Hides the <div> in which the specified group input element lives so that the input,
+ // its label and help text are hidden
+ function hideGroupInput(id, hide) {
+ if(hide)
+ $('#' + id).parent('div').addClass('hidden');
+ else
+ $('#' + id).parent('div').removeClass('hidden');
}
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn ipsec phase-1">
- <tr class="tabnavtbl">
- <td id="tabnav">
- <?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Tunnels"), true, "vpn_ipsec.php");
- $tab_array[1] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
- $tab_array[2] = array(gettext("Pre-Shared Keys"), false, "vpn_ipsec_keys.php");
- $tab_array[3] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("General information"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
- <td width="78%" class="vtable">
- <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable this phase1 entry"); ?></strong><br />
- <span class="vexpl">
- <?=gettext("Set this option to disable this phase1 without removing it from the list"); ?>.
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Key Exchange version"); ?></td>
- <td width="78%" class="vtable">
- <select name="iketype" class="formselect" onchange='iketype_change()'>
- <?php
- $keyexchange = array("ikev1" => "V1", "ikev2" => "V2");
- foreach ($keyexchange as $kidx => $name):
- ?>
- <option value="<?=$kidx;?>" <?php if ($kidx == $pconfig['iketype']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($name);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Select the Internet Key Exchange protocol version to be used, IKEv1 or IKEv2"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Internet Protocol"); ?></td>
- <td width="78%" class="vtable">
- <select name="protocol" class="formselect">
- <?php
- $protocols = array("inet" => "IPv4", "inet6" => "IPv6");
- foreach ($protocols as $protocol => $name):
- ?>
- <option value="<?=$protocol;?>" <?php if ($protocol == $pconfig['protocol']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($name);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Select the Internet Protocol family from this dropdown"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
- <td width="78%" class="vtable">
- <select name="interface" class="formselect">
- <?php
- $interfaces = get_configured_interface_with_descr();
-
- $carplist = get_configured_carp_interface_list();
- foreach ($carplist as $cif => $carpip) {
- $interfaces[$cif] = $carpip." (".get_vip_descr($carpip).")";
- }
-
- $aliaslist = get_configured_ip_aliases_list();
- foreach ($aliaslist as $aliasip => $aliasif) {
- $interfaces[$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
- }
-
- $grouplist = return_gateway_groups_array();
- foreach ($grouplist as $name => $group) {
- if ($group[0]['vip'] <> "") {
- $vipif = $group[0]['vip'];
- } else {
- $vipif = $group[0]['int'];
- }
- $interfaces[$name] = "GW Group {$name}";
- }
-
-
- foreach ($interfaces as $iface => $ifacename):
- ?>
- <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl"><?=gettext("Select the interface for the local endpoint of this phase1 entry"); ?>.</span>
- </td>
- </tr>
-
- <?php if (!$pconfig['mobile']): ?>
-
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Remote gateway"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="remotegw" type="text" class="formfld unknown" id="remotegw" size="28" value="<?=htmlspecialchars($pconfig['remotegw']);?>" />
- <br />
- <?=gettext("Enter the public IP address or host name of the remote gateway"); ?>
- </td>
- </tr>
-
- <?php endif; ?>
-
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed)"); ?>.
- </span>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic">
- <?=gettext("Phase 1 proposal (Authentication)"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Authentication method"); ?></td>
- <td width="78%" class="vtable">
- <select name="authentication_method" class="formselect" onchange="methodsel_change()">
- <?php
- foreach ($p1_authentication_methods as $method_type => $method_params):
- if (!$pconfig['mobile'] && $method_params['mobile']) {
- continue;
- }
- ?>
- <option value="<?=$method_type;?>" <?php if ($method_type == $pconfig['authentication_method']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($method_params['name']);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Must match the setting chosen on the remote side"); ?>.
- </span>
- </td>
- </tr>
- <tr id='negmode' >
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Negotiation mode"); ?></td>
- <td width="78%" class="vtable">
- <select name="mode" class="formselect">
- <?php
- $modes = array("main" => "Main", "aggressive" => "Aggressive");
- foreach ($modes as $mode => $mdescr):
- ?>
- <option value="<?=$mode;?>" <?php if ($mode == $pconfig['mode']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($mdescr);?>
- </option>
- <?php endforeach; ?>
- </select> <br /> <span class="vexpl"><?=gettext("Aggressive is more flexible, but less secure"); ?>.</span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("My identifier"); ?></td>
- <td width="78%" class="vtable">
- <select name="myid_type" class="formselect" onchange="myidsel_change()">
- <?php foreach ($my_identifier_list as $id_type => $id_params): ?>
- <option value="<?=$id_type;?>" <?php if ($id_type == $pconfig['myid_type']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($id_params['desc']);?>
- </option>
- <?php endforeach; ?>
- </select>
- <input name="myid_data" type="text" class="formfld unknown" id="myid_data" size="30" value="<?=htmlspecialchars($pconfig['myid_data']);?>" />
- </td>
- </tr>
- <tr id="opt_peerid">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Peer identifier"); ?></td>
- <td width="78%" class="vtable">
- <select name="peerid_type" class="formselect" onchange="peeridsel_change()">
- <?php
- foreach ($peer_identifier_list as $id_type => $id_params):
- if ($pconfig['mobile'] && !$id_params['mobile']) {
- continue;
- }
- ?>
- <option value="<?=$id_type;?>" <?php if ($id_type == $pconfig['peerid_type']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($id_params['desc']);?>
- </option>
- <?php endforeach; ?>
- </select>
- <input name="peerid_data" type="text" class="formfld unknown" id="peerid_data" size="30" value="<?=htmlspecialchars($pconfig['peerid_data']);?>" />
- <?php if ($pconfig['mobile']) { ?>
- <br /><br /><?=gettext("NOTE: This is known as the \"group\" setting on some VPN client implementations"); ?>.
- <?php } ?>
- </td>
- </tr>
- <tr id="opt_psk">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Pre-Shared Key"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?>
- <input name="pskey" type="text" class="formfld unknown" id="pskey" size="40" value="<?=htmlspecialchars($pconfig['pskey']);?>" />
- <span class="vexpl">
- <br />
- <?=gettext("Input your Pre-Shared Key string"); ?>.
- </span>
- </td>
- </tr>
- <tr id="opt_cert">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("My Certificate"); ?></td>
- <td width="78%" class="vtable">
- <select name="certref" class="formselect">
- <?php
- foreach ($config['cert'] as $cert):
- $selected = "";
- if ($pconfig['certref'] == $cert['refid']) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$cert['refid'];?>" <?=$selected;?>><?=htmlspecialchars($cert['descr']);?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Select a certificate previously configured in the Certificate Manager"); ?>.
- </span>
- </td>
- </tr>
- <tr id="opt_ca">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("My Certificate Authority"); ?></td>
- <td width="78%" class="vtable">
- <select name="caref" class="formselect">
- <?php
- foreach ($config['ca'] as $ca):
- $selected = "";
- if ($pconfig['caref'] == $ca['refid']) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$ca['refid'];?>" <?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Select a certificate authority previously configured in the Certificate Manager"); ?>.
- </span>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic">
- <?=gettext("Phase 1 proposal (Algorithms)"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Encryption algorithm"); ?></td>
- <td width="78%" class="vtable">
- <select name="ealgo" class="formselect" onchange="ealgosel_change()">
- <?php
- foreach ($p1_ealgos as $algo => $algodata):
- $selected = "";
- if ($algo == $pconfig['ealgo']['name']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$algo;?>"<?=$selected?>>
- <?=htmlspecialchars($algodata['name']);?>
- </option>
- <?php endforeach; ?>
- </select>
- <select name="ealgo_keylen" width="30" class="formselect">
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Hash algorithm"); ?></td>
- <td width="78%" class="vtable">
- <select name="halgo" class="formselect">
- <?php foreach ($p1_halgos as $algo => $algoname): ?>
- <option value="<?=$algo;?>" <?php if ($algo == $pconfig['halgo']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($algoname);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Must match the setting chosen on the remote side"); ?>.
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("DH key group"); ?></td>
- <td width="78%" class="vtable">
- <select name="dhgroup" class="formselect">
- <?php foreach ($p1_dhgroups as $keygroup => $keygroupname): ?>
- <option value="<?=$keygroup;?>" <?php if ($keygroup == $pconfig['dhgroup']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($keygroupname);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Must match the setting chosen on the remote side"); ?>.
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Lifetime"); ?></td>
- <td width="78%" class="vtable">
- <input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="20" value="<?=htmlspecialchars($pconfig['lifetime']);?>" />
- <?=gettext("seconds"); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced Options"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Disable Rekey");?></td>
- <td width="78%" class="vtable">
- <input name="rekey_enable" type="checkbox" id="rekey_enable" value="yes" <?php if (isset($pconfig['rekey_enable'])) echo "checked=\"checked\""; ?> />
- <?=gettext("Whether a connection should be renegotiated when it is about to expire."); ?><br />
- </td>
- </tr>
- <tr id='disablereauth'>
- <td width="22%" valign="top" class="vncell"><?=gettext("Disable Reauth");?></td>
- <td width="78%" class="vtable">
- <input name="reauth_enable" type="checkbox" id="reauth_enable" value="yes" <?php if (isset($pconfig['reauth_enable'])) echo "checked=\"checked\""; ?> />
- <?=gettext("Whether rekeying of an IKE_SA should also reauthenticate the peer. In IKEv1, reauthentication is always done."); ?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Responder Only");?></td>
- <td width="78%" class="vtable">
- <input name="responderonly" type="checkbox" id="responderonly" value="yes" <?php if (isset($pconfig['responderonly'])) echo "checked=\"checked\""; ?> />
- <?=gettext("Enable this option to never initiate this connection from this side, only respond to incoming requests."); ?><br />
- </td>
- </tr>
- <tr id='natt'>
- <td width="22%" valign="top" class="vncell"><?=gettext("NAT Traversal"); ?></td>
- <td width="78%" class="vtable">
- <select name="nat_traversal" class="formselect">
- <option value="on" <?php if ($pconfig['nat_traversal'] != 'on') echo "selected=\"selected\""; ?>><?=gettext("Auto"); ?></option>
- <option value="force" <?php if ($pconfig['nat_traversal'] == 'force') echo "selected=\"selected\""; ?>><?=gettext("Force"); ?></option>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Set this option to enable the use of NAT-T (i.e. the encapsulation of ESP in UDP packets) if needed, " .
- "which can help with clients that are behind restrictive firewalls"); ?>.
- </span>
- </td>
- </tr>
- <tr id='mobike'>
- <td width="22%" valign="top" class="vncell"><?=gettext("MOBIKE"); ?></td>
- <td width="78%" class="vtable">
- <select name="mobike" class="formselect">
- <option value="on" <?php if ($pconfig['mobike'] == 'on') echo "selected=\"selected\""; ?>><?=gettext("Enable"); ?></option>
- <option value="off" <?php if ($pconfig['mobike'] != 'on') echo "selected=\"selected\""; ?>><?=gettext("Disable"); ?></option>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("Set this option to control the use of MOBIKE"); ?>.
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Dead Peer Detection"); ?></td>
- <td width="78%" class="vtable">
- <input name="dpd_enable" type="checkbox" id="dpd_enable" value="yes" <?php if (isset($pconfig['dpd_enable'])) echo "checked=\"checked\""; ?> onclick="dpdchkbox_change()" />
- <?=gettext("Enable DPD"); ?><br />
- <div id="opt_dpd">
- <br />
- <input name="dpd_delay" type="text" class="formfld unknown" id="dpd_delay" size="5" value="<?=htmlspecialchars($pconfig['dpd_delay']);?>" />
- <?=gettext("seconds"); ?><br />
- <span class="vexpl">
- <?=gettext("Delay between requesting peer acknowledgement"); ?>.
- </span><br />
- <br />
- <input name="dpd_maxfail" type="text" class="formfld unknown" id="dpd_maxfail" size="5" value="<?=htmlspecialchars($pconfig['dpd_maxfail']);?>" />
- <?=gettext("retries"); ?><br />
- <span class="vexpl">
- <?=gettext("Number of consecutive failures allowed before disconnect"); ?>.
- </span>
- <br />
- </div>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <?php if (isset($p1index) && $a_phase1[$p1index]): ?>
- <input name="p1index" type="hidden" value="<?=htmlspecialchars($p1index);?>" />
- <?php endif; ?>
- <?php if ($pconfig['mobile']): ?>
- <input name="mobile" type="hidden" value="true" />
- <?php endif; ?>
- <input name="ikeid" type="hidden" value="<?=htmlspecialchars($pconfig['ikeid']);?>" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
+ // Hides the <div> in which the specified checkbox lives so that the checkbox,
+ // its label and help text are hidden
+ function hideCheckbox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
+ }
-<script type="text/javascript">
-//<![CDATA[
-<?php
- /* determine if we should init the key length */
- $keyset = '';
- if (isset($pconfig['ealgo']['keylen'])) {
- if (is_numeric($pconfig['ealgo']['keylen'])) {
- $keyset = $pconfig['ealgo']['keylen'];
- }
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
}
-?>
-myidsel_change();
-peeridsel_change();
-iketype_change();
-methodsel_change();
-ealgosel_change(<?=$keyset;?>);
-dpdchkbox_change();
+
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ // ---------- Monitor elements for change and call the appropriate display functions ------------------------------
+
+ // Enable DPD
+ $('#dpd_enable').click(function () {
+ dpdchkbox_change();
+ });
+
+ // Peer identifier
+ $('#peerid_type').click(function () {
+ peeridsel_change();
+ });
+
+ // My identifier
+ $('#myid_type').click(function () {
+ myidsel_change();
+ });
+
+ // ike type
+ $('#iketype').click(function () {
+ iketype_change();
+ });
+
+ // authentication method
+ $('#authentication_method').click(function () {
+ methodsel_change();
+ });
+
+ // authentication method
+ $('#ealgo').click(function () {
+ ealgosel_change(<?=$keyset?>);
+ });
+
+ // On ititial page load
+ myidsel_change();
+ peeridsel_change();
+ iketype_change();
+ methodsel_change();
+ ealgosel_change(<?=$keyset?>);
+ dpdchkbox_change();
+});
//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/vpn_ipsec_phase2.php b/src/usr/local/www/vpn_ipsec_phase2.php
index f9a9805..4edecd4 100644
--- a/src/usr/local/www/vpn_ipsec_phase2.php
+++ b/src/usr/local/www/vpn_ipsec_phase2.php
@@ -233,8 +233,13 @@ if ($_POST) {
$localid_data = ipsec_idinfo_to_cidr($name['localid'], false, $name['mode']);
$entered = array();
$entered['type'] = $pconfig['localid_type'];
- if (isset($pconfig['localid_address'])) $entered['address'] = $pconfig['localid_address'];
- if (isset($pconfig['localid_netbits'])) $entered['netbits'] = $pconfig['localid_netbits'];
+
+ if (isset($pconfig['localid_address']))
+ $entered['address'] = $pconfig['localid_address'];
+
+ if (isset($pconfig['localid_netbits']))
+ $entered['netbits'] = $pconfig['localid_netbits'];
+
$entered_localid_data = ipsec_idinfo_to_cidr($entered, false, $pconfig['mode']);
if ($localid_data == $entered_localid_data) {
/* adding new p2 entry */
@@ -412,507 +417,6 @@ $shortcut_section = "ipsec";
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
-<script type="text/javascript">
-//<![CDATA[
-
-function change_mode() {
- index = document.iform.mode.selectedIndex;
- value = document.iform.mode.options[index].value;
- if ((value == 'tunnel') || (value == 'tunnel6')) {
- document.getElementById('opt_localid').style.display = '';
-<?php if (!isset($pconfig['mobile'])): ?>
- document.getElementById('opt_remoteid').style.display = '';
-<?php endif; ?>
- } else {
- document.getElementById('opt_localid').style.display = 'none';
-<?php if (!isset($pconfig['mobile'])): ?>
- document.getElementById('opt_remoteid').style.display = 'none';
-<?php endif; ?>
- }
-}
-
-function typesel_change_natlocal(bits) {
- var value = document.iform.mode.options[index].value;
- if (typeof(bits) === "undefined") {
- if (value === "tunnel") {
- bits = 24;
- } else if (value === "tunnel6") {
- bits = 64;
- }
- }
- var address_is_blank = !/\S/.test(document.iform.natlocalid_address.value);
- switch (document.iform.natlocalid_type.selectedIndex) {
- case 0: /* single */
- document.iform.natlocalid_address.disabled = 0;
- if (address_is_blank) {
- document.iform.natlocalid_netbits.value = 0;
- }
- document.iform.natlocalid_netbits.disabled = 1;
- break;
- case 1: /* network */
- document.iform.natlocalid_address.disabled = 0;
- if (address_is_blank) {
- document.iform.natlocalid_netbits.value = bits;
- }
- document.iform.natlocalid_netbits.disabled = 0;
- break;
- case 3: /* none */
- document.iform.natlocalid_address.disabled = 1;
- document.iform.natlocalid_netbits.disabled = 1;
- break;
- default:
- document.iform.natlocalid_address.value = "";
- document.iform.natlocalid_address.disabled = 1;
- if (address_is_blank) {
- document.iform.natlocalid_netbits.value = 0;
- }
- document.iform.natlocalid_netbits.disabled = 1;
- break;
- }
-}
-
-function typesel_change_local(bits) {
- var value = document.iform.mode.options[index].value;
- if (typeof(bits) === "undefined") {
- if (value === "tunnel") {
- bits = 24;
- } else if (value === "tunnel6") {
- bits = 64;
- }
- }
- var address_is_blank = !/\S/.test(document.iform.localid_address.value);
- switch (document.iform.localid_type.selectedIndex) {
- case 0: /* single */
- document.iform.localid_address.disabled = 0;
- if (address_is_blank) {
- document.iform.localid_netbits.value = 0;
- }
- document.iform.localid_netbits.disabled = 1;
- break;
- case 1: /* network */
- document.iform.localid_address.disabled = 0;
- if (address_is_blank) {
- document.iform.localid_netbits.value = bits;
- }
- document.iform.localid_netbits.disabled = 0;
- break;
- case 3: /* none */
- document.iform.localid_address.disabled = 1;
- document.iform.localid_netbits.disabled = 1;
- break;
- default:
- document.iform.localid_address.value = "";
- document.iform.localid_address.disabled = 1;
- if (address_is_blank) {
- document.iform.localid_netbits.value = 0;
- }
- document.iform.localid_netbits.disabled = 1;
- break;
- }
-}
-
-<?php if (!isset($pconfig['mobile'])): ?>
-
-function typesel_change_remote(bits) {
- var value = document.iform.mode.options[index].value;
- if (typeof(bits) === "undefined") {
- if (value === "tunnel") {
- bits = 24;
- }
- else if (value === "tunnel6") {
- bits = 64;
- }
- }
- var address_is_blank = !/\S/.test(document.iform.remoteid_address.value);
- switch (document.iform.remoteid_type.selectedIndex) {
- case 0: /* single */
- document.iform.remoteid_address.disabled = 0;
- if (address_is_blank) {
- document.iform.remoteid_netbits.value = 0;
- }
- document.iform.remoteid_netbits.disabled = 1;
- break;
- case 1: /* network */
- document.iform.remoteid_address.disabled = 0;
- if (address_is_blank) {
- document.iform.remoteid_netbits.value = bits;
- }
- document.iform.remoteid_netbits.disabled = 0;
- break;
- default:
- document.iform.remoteid_address.value = "";
- document.iform.remoteid_address.disabled = 1;
- if (address_is_blank) {
- document.iform.remoteid_netbits.value = 0;
- }
- document.iform.remoteid_netbits.disabled = 1;
- break;
- }
-}
-
-<?php endif; ?>
-
-function change_protocol() {
- index = document.iform.proto.selectedIndex;
- value = document.iform.proto.options[index].value;
- if (value == 'esp')
- document.getElementById('opt_enc').style.display = '';
- else
- document.getElementById('opt_enc').style.display = 'none';
-}
-
-//]]>
-</script>
-
-<form action="vpn_ipsec_phase2.php" method="post" name="iform" id="iform">
-
-<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
-?>
-
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn ipsec phase-2">
- <tr class="tabnavtbl">
- <td id="tabnav">
- <?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Tunnels"), true, "vpn_ipsec.php");
- $tab_array[1] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
- $tab_array[2] = array(gettext("Pre-Shared Keys"), false, "vpn_ipsec_keys.php");
- $tab_array[3] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
- <td width="78%" class="vtable">
- <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable this phase2 entry"); ?></strong>
- <br />
- <span class="vexpl">
- <?=gettext("Set this option to disable this phase2 entry without removing it from the list"); ?>.
- </span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Mode"); ?></td>
- <td width="78%" class="vtable">
- <select name="mode" class="formselect" onchange="change_mode()">
- <?php
- foreach ($p2_modes as $name => $value):
- $selected = "";
- if ($name == $pconfig['mode']) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$name;?>" <?=$selected;?>><?=$value;?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr id="opt_localid">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Local Network"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="0" summary="local network">
- <tr>
- <td><?=gettext("Type"); ?>:&nbsp;&nbsp;</td>
- <td></td>
- <td>
- <select name="localid_type" class="formselect" onchange="typesel_change_local()">
- <option value="address" <?php if ($pconfig['localid_type'] == "address") echo "selected=\"selected\"";?>><?=gettext("Address"); ?></option>
- <option value="network" <?php if ($pconfig['localid_type'] == "network") echo "selected=\"selected\"";?>><?=gettext("Network"); ?></option>
- <?php
- $iflist = get_configured_interface_with_descr();
- foreach ($iflist as $ifname => $ifdescr):
- ?>
- <option value="<?=$ifname; ?>" <?php if ($pconfig['localid_type'] == $ifname) echo "selected=\"selected\"";?>><?=sprintf(gettext("%s subnet"), $ifdescr); ?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
- <td><?=$mandfldhtmlspc;?></td>
- <td>
- <input name="localid_address" type="text" class="formfld unknown ipv4v6" id="localid_address" size="28" value="<?=htmlspecialchars($pconfig['localid_address']);?>" />
- /
- <select name="localid_netbits" class="formselect ipv4v6" id="localid_netbits">
- <?php for ($i = 128; $i >= 0; $i--): ?>
- <option value="<?=$i;?>" <?php if (isset($pconfig['localid_netbits']) && $i == $pconfig['localid_netbits']) echo "selected=\"selected\""; ?>>
- <?=$i;?>
- </option>
- <?php endfor; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td colspan="3">
- <br />
- <?php echo gettext("In case you need NAT/BINAT on this network specify the address to be translated"); ?>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Type"); ?>:&nbsp;&nbsp;</td>
- <td></td>
- <td>
- <select name="natlocalid_type" class="formselect" onchange="typesel_change_natlocal()">
- <option value="address" <?php if ($pconfig['natlocalid_type'] == "address") echo "selected=\"selected\"";?>><?=gettext("Address"); ?></option>
- <option value="network" <?php if ($pconfig['natlocalid_type'] == "network") echo "selected=\"selected\"";?>><?=gettext("Network"); ?></option>
- <?php
- $iflist = get_configured_interface_with_descr();
- foreach ($iflist as $ifname => $ifdescr):
- ?>
- <option value="<?=$ifname; ?>" <?php if ($pconfig['natlocalid_type'] == $ifname) echo "selected=\"selected\"";?>><?=sprintf(gettext("%s subnet"), $ifdescr); ?></option>
- <?php endforeach; ?>
- <option value="none" <?php if (empty($pconfig['natlocalid_type']) || $pconfig['natlocalid_type'] == "none") echo "selected=\"selected\"";?>><?=gettext("None"); ?></option>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
- <td><?=$mandfldhtmlspc;?></td>
- <td>
- <input name="natlocalid_address" type="text" class="formfld unknown ipv4v6" id="natlocalid_address" size="28" value="<?=htmlspecialchars($pconfig['natlocalid_address']);?>" />
- /
- <select name="natlocalid_netbits" class="formselect ipv4v6" id="natlocalid_netbits">
- <?php for ($i = 128; $i >= 0; $i--): ?>
- <option value="<?=$i;?>" <?php if (isset($pconfig['natlocalid_netbits']) && $i == $pconfig['natlocalid_netbits']) echo "selected=\"selected\""; ?>>
- <?=$i;?>
- </option>
- <?php endfor; ?>
- </select>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <?php if (!isset($pconfig['mobile'])): ?>
-
- <tr id="opt_remoteid">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Remote Network"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="0" summary="remote network">
- <tr>
- <td><?=gettext("Type"); ?>:&nbsp;&nbsp;</td>
- <td></td>
- <td>
- <select name="remoteid_type" class="formselect" onchange="typesel_change_remote()">
- <option value="address" <?php if ($pconfig['remoteid_type'] == "address") echo "selected=\"selected\""; ?>><?=gettext("Address"); ?></option>
- <option value="network" <?php if ($pconfig['remoteid_type'] == "network") echo "selected=\"selected\""; ?>><?=gettext("Network"); ?></option>
- </select>
- </td>
- </tr>
- <tr>
- <td><?=gettext("Address"); ?>:&nbsp;&nbsp;</td>
- <td><?=$mandfldhtmlspc;?></td>
- <td>
- <input name="remoteid_address" type="text" class="formfld unknown ipv4v6" id="remoteid_address" size="28" value="<?=htmlspecialchars($pconfig['remoteid_address']);?>" />
- /
- <select name="remoteid_netbits" class="formselect ipv4v6" id="remoteid_netbits">
- <?php for ($i = 128; $i >= 0; $i--) {
-
- echo "<option value=\"{$i}\"";
- if (isset($pconfig['remoteid_netbits']) && $i == $pconfig['remoteid_netbits']) echo " selected=\"selected\"";
- echo ">{$i}</option>\n";
- } ?>
- </select>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <?php endif; ?>
-
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- <span class="vexpl">
- <?=gettext("You may enter a description here for your reference (not parsed)"); ?>.
- </span>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic">
- <?=gettext("Phase 2 proposal (SA/Key Exchange)"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol"); ?></td>
- <td width="78%" class="vtable">
- <select name="proto" class="formselect" onchange="change_protocol()">
- <?php foreach ($p2_protos as $proto => $protoname): ?>
- <option value="<?=$proto;?>" <?php if ($proto == $pconfig['proto']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($protoname);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br />
- <span class="vexpl">
- <?=gettext("ESP is encryption, AH is authentication only"); ?>
- </span>
- </td>
- </tr>
- <tr id="opt_enc">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Encryption algorithms"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellspacing="0" cellpadding="0" summary="encryption">
- <?php
- foreach ($p2_ealgos as $algo => $algodata):
- $checked = '';
- if (is_array($pconfig['ealgos']) && in_array($algo, $pconfig['ealgos'])) {
- $checked = " checked=\"checked\"";
- }
- ?>
- <tr>
- <td>
- <input type="checkbox" name="ealgos[]" value="<?=$algo;?>"<?=$checked?> />
- </td>
- <td>
- <?=htmlspecialchars($algodata['name']);?>
- </td>
- <td>
- <?php if (is_array($algodata['keysel'])): ?>
- &nbsp;&nbsp;
- <select name="keylen_<?=$algo;?>" class="formselect">
- <option value="auto"><?=gettext("auto"); ?></option>
- <?php
- $key_hi = $algodata['keysel']['hi'];
- $key_lo = $algodata['keysel']['lo'];
- $key_step = $algodata['keysel']['step'];
- for ($keylen = $key_hi; $keylen >= $key_lo; $keylen -= $key_step):
- $selected = "";
- // if ($checked && in_array("keylen_".$algo, $pconfig))
- if ($keylen == $pconfig["keylen_".$algo]) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$keylen;?>"<?=$selected;?>><?=$keylen;?> <?=gettext("bits"); ?></option>
- <?php endfor; ?>
- </select>
- <?php endif; ?>
- </td>
- </tr>
-
- <?php endforeach; ?>
-
- </table>
- <br />
- <?=gettext("Hint: use 3DES for best compatibility or if you have a hardware " .
- "crypto accelerator card. Blowfish is usually the fastest in " .
- "software encryption"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Hash algorithms"); ?></td>
- <td width="78%" class="vtable">
- <?php foreach ($p2_halgos as $algo => $algoname): ?>
- <input type="checkbox" name="halgos[]" value="<?=$algo;?>" <?php if (in_array($algo, $pconfig['halgos'])) echo "checked=\"checked\""; ?> />
- <?=htmlspecialchars($algoname);?>
- <br />
- <?php endforeach; ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("PFS key group"); ?></td>
- <td width="78%" class="vtable">
- <?php if (!isset($pconfig['mobile']) || !isset($a_client['pfs_group'])): ?>
- <select name="pfsgroup" class="formselect">
- <?php foreach ($p2_pfskeygroups as $keygroup => $keygroupname): ?>
- <option value="<?=$keygroup;?>" <?php if ($keygroup == $pconfig['pfsgroup']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($keygroupname);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br />
- <?php else: ?>
-
- <select class="formselect" disabled="disabled">
- <option selected="selected"><?=$p2_pfskeygroups[$a_client['pfs_group']];?></option>
- </select>
- <input name="pfsgroup" type="hidden" value="<?=htmlspecialchars($pconfig['pfsgroup']);?>" />
- <br />
- <span class="vexpl"><em><?=gettext("Set globally in mobile client options"); ?></em></span>
- <?php endif; ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Lifetime"); ?></td>
- <td width="78%" class="vtable">
- <input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="20" value="<?=htmlspecialchars($pconfig['lifetime']);?>" />
- <?=gettext("seconds"); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced Options"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Automatically ping host"); ?></td>
- <td width="78%" class="vtable">
- <input name="pinghost" type="text" class="formfld unknown" id="pinghost" size="28" value="<?=htmlspecialchars($pconfig['pinghost']);?>" />
- <?=gettext("IP address"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <?php if ($pconfig['mobile']): ?>
- <input name="mobile" type="hidden" value="true" />
- <input name="remoteid_type" type="hidden" value="mobile" />
- <?php endif; ?>
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input name="ikeid" type="hidden" value="<?=htmlspecialchars($pconfig['ikeid']);?>" />
- <?php if (!empty($pconfig['reqid'])): ?>
- <input name="reqid" type="hidden" value="<?=htmlspecialchars($pconfig['reqid']);?>" />
- <?php endif; ?>
- <input name="uniqid" type="hidden" value="<?=htmlspecialchars($pconfig['uniqid']);?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<script type="text/javascript">
-//<![CDATA[
-change_mode('<?=htmlspecialchars($pconfig['mode'])?>');
-change_protocol('<?=htmlspecialchars($pconfig['proto'])?>');
-typesel_change_local(<?=htmlspecialchars($pconfig['localid_netbits'])?>);
-typesel_change_natlocal(<?=htmlspecialchars($pconfig['natlocalid_netbits'])?>);
-<?php if (!isset($pconfig['mobile'])): ?>
-typesel_change_remote(<?=htmlspecialchars($pconfig['remoteid_netbits'])?>);
-<?php endif; ?>
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
-
-<?php
-
-/* local utility functions */
-
function pconfig_to_ealgos(& $pconfig) {
global $p2_ealgos;
@@ -980,4 +484,514 @@ function idinfo_to_pconfig($prefix,& $idinfo,& $pconfig) {
}
}
+if ($input_errors)
+ print_input_errors($input_errors);
+
+$tab_array = array();
+$tab_array[0] = array(gettext("Tunnels"), true, "vpn_ipsec.php");
+$tab_array[1] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
+$tab_array[2] = array(gettext("Pre-Shared Keys"), false, "vpn_ipsec_keys.php");
+$tab_array[3] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('General Information');
+
+$section->addInput(new Form_Checkbox(
+ 'disabled',
+ 'Disabled',
+ 'Disable this phase 2 entry without removing it from the list. ',
+ $pconfig['disabled']
+));
+
+$section->addInput(new Form_Select(
+ 'mode',
+ 'Mode',
+ $pconfig['mode'],
+ $p2_modes
+));
+
+$group = new Form_Group('Local Network');
+$group->addClass('opt_localid');
+
+$subnetarray = get_configured_interface_with_descr();
+foreach($subnetarray as $ifname => $ifdescr)
+ $subnetarray[$ifname] = $ifdescr . ' subnet';
+
+$group->add(new Form_Select(
+ 'localid_type',
+ null,
+ $pconfig['localid_type'],
+ array_merge(array('address' => 'Address', 'network' => 'Network'), $subnetarray)
+))->setHelp('Type');
+
+$group->add(new Form_IpAddress(
+ 'localid_address',
+ null,
+ $pconfig['localid_address']
+))->setHelp('Address')->addMask(localid_netbits, $pconfig['localid_netbits']);
+
+$section->add($group);
+
+$group = new Form_Group('NAT/BINAT translation');
+$group->addClass('opt_natid');
+
+$subnetarray = get_configured_interface_with_descr();
+foreach($subnetarray as $ifname => $ifdescr)
+ $subnetarray[$ifname] = $ifdescr . ' subnet';
+
+// Tack none, address & network on the beginning
+$subnetarray = array('none' => gettext('None'), 'address' => 'Address', 'network' => 'Network') + $subnetarray;
+
+$group->add(new Form_Select(
+ 'natlocalid_type',
+ null,
+ $pconfig['natlocalid_type'],
+ $subnetarray
+))->setHelp('Type');
+
+$group->add(new Form_IpAddress(
+ 'natlocalid_address',
+ null,
+ $pconfig['localid_address']
+))->setHelp('Address')->addMask(natlocalid_netbits, $pconfig['natlocalid_netbits']);
+
+$group->setHelp('If NAT/BINAT is required on this network specify the address to be translated');
+$section->add($group);
+
+$group = new Form_Group('Remote Network');
+$group->addClass('opt_remoteid');
+
+$group->add(new Form_Select(
+ 'remoteid_type',
+ null,
+ $pconfig['remoteid_type'],
+ array('address' => 'Address', 'network' => 'Network')
+))->setHelp('Type');
+
+$group->add(new Form_IpAddress(
+ 'remoteid_address',
+ null,
+ $pconfig['remoteid_address']
+))->setHelp('Address')->addMask(remoteid_netbits, $pconfig['remoteid_netbits']);
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+))->setHelp('You may enter a description here for your reference (not parsed).');
+
+$form->add($section);
+
+$section = new Form_Section('Phase 2 proposal (SA/Key Exchange)');
+
+$section->addInput(new Form_Select(
+ 'proto',
+ 'Protocol',
+ $pconfig['proto'],
+ $p2_protos
+))->setHelp('ESP is encryption, AH is authentication only.');
+
+$i = 0;
+$rows = count($p2_ealgos) - 1;
+
+foreach ($p2_ealgos as $algo => $algodata) {
+ $group = new Form_Group($i == 0 ? 'Encryption Algorithms':'');
+ $group->addClass('encalg');
+
+ $group->add(new Form_Checkbox(
+ 'ealgos[]',
+ null,
+ $algodata['name'],
+ (is_array($pconfig['ealgos']) && in_array($algo,$pconfig['ealgos'])),
+ $algo
+ ))->addClass('multi');
+
+
+
+ if(is_array($algodata['keysel'])) {
+ $list = array();
+ $key_hi = $algodata['keysel']['hi'];
+ $key_lo = $algodata['keysel']['lo'];
+ $key_step = $algodata['keysel']['step'];
+ for ($keylen = $key_hi; $keylen >= $key_lo; $keylen -= $key_step) {
+ $list[$keylen] = $keylen . ' bits';
+ }
+
+ $group->add(new Form_Select(
+ 'keylen_' . $algo,
+ null,
+ $keylen == $pconfig["keylen_".$algo],
+ array_merge(array('auto' => 'Auto'), $list)
+ ));
+ }
+
+
+ if($i == $rows)
+ $group->setHelp('Use 3DES for best compatibility or if you have a hardware crypto accelerator card. Blowfish is usually the fastest in software encryption.');
+
+ $i++;
+ $section->add($group);
+}
+
+$group = new Form_Group('Hash Algorithms');
+
+foreach ($p2_halgos as $algo => $algoname) {
+ $group->add(new Form_Checkbox(
+ 'halgos[]',
+ null,
+ $algoname,
+ (in_array($algo, $pconfig['halgos'])),
+ $algo
+ ))->addClass('multi');
+}
+
+$section->add($group);
+
+$sm = (!isset($pconfig['mobile']) || !isset($a_client['pfs_group']));
+
+$section->addInput(new Form_Select(
+ 'pfsgroup',
+ 'PFS key group',
+ $pconfig['psgroup'],
+ $sm ? $p2_pfskeygroups:array()
+))->setHelp($sm ? '':'Set globally in mobile client options');
+
+$section->addInput(new Form_Input(
+ 'lifetime',
+ 'Lifetime',
+ 'number',
+ $pconfig['lifetime']
+))->setHelp('Seconds');
+
+$form->add($section);
+
+$section = new Form_Section('Advanced Configuration');
+
+$section->addInput(new Form_IpAddress(
+ 'pinghost',
+ 'Automatically ping host',
+ $pconfig['pinghost']
+))->setHelp('IP Address');
+
+// Hidden inputs
+if ($pconfig['mobile']) {
+ $section->addInput(new Form_Input(
+ 'mobile',
+ null,
+ 'hidden',
+ 'true'
+ ));
+}
+
+$section->addInput(new Form_Input(
+ 'ikeid',
+ null,
+ 'hidden',
+ $pconfig['ikeid']
+));
+
+if (!empty($pconfig['reqid'])) {
+ $section->addInput(new Form_Input(
+ 'reqid',
+ null,
+ 'hidden',
+ $pconfig['reqid']
+ ));
+}
+
+$section->addInput(new Form_Input(
+ 'uniqid',
+ null,
+ 'hidden',
+ $pconfig['uniqid']
+));
+
+$form->add($section);
+
+print($form);
+
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+events.push(function(){
+
+ // ---------- On changing "Mode" ----------------------------------------------------------------------------------
+ function change_mode() {
+
+ value = $('#mode').val();
+
+ if ((value == 'tunnel') || (value == 'tunnel6')) {
+ hideClass('opt_localid', false);
+ hideClass('opt_natid', false);
+
+<?php if (!isset($pconfig['mobile'])): ?>
+ hideClass('opt_remoteid', false);
+ hideClass('opt_natid', false);
+<?php endif; ?>
+ } else {
+ hideClass('opt_localid', true);
+ hideClass('opt_natid', true);
+<?php if (!isset($pconfig['mobile'])): ?>
+ hideClass('opt_remoteid', true);
+<?php endif; ?>
+ }
+ }
+
+ // ---------- On changing "NAT/BINAT" -----------------------------------------------------------------------------
+ function typesel_change_natlocal(bits) {
+ var value = $('#mode').val();
+
+ if (typeof(bits) === "undefined") {
+ if (value === "tunnel") {
+ bits = 24;
+ }
+ else if (value === "tunnel6") {
+ bits = 64;
+ }
+ }
+
+ var address_is_blank = !/\S/.test($('#natlocalid_address').val());
+
+ switch ($("#natlocalid_type option:selected").index()) {
+ case 0: /* single */
+ disableInput('natlocalid_address', false);
+
+ if (address_is_blank) {
+ $('#natlocalid_netbits').val(0);
+ }
+
+ disableInput('natlocalid_netbits', true);
+ break;
+ case 1: /* network */
+ disableInput('natlocalid_address', false);
+
+ if (address_is_blank) {
+ $('#natlocalid_netbits').val(bits);
+ }
+
+ disableInput('natlocalid_netbits', false);
+ break;
+ case 3: /* none */
+ disableInput('natlocalid_address', true);
+ disableInput('natlocalid_netbits', true);
+ break;
+ default:
+ $('#natlocalid_address').val("");
+ disableInput('natlocalid_address', true);
+
+ if (address_is_blank) {
+ $('#natlocalid_netbits').val(0);
+ }
+
+ disableInput('natlocalid_netbits', true);
+ break;
+ }
+ }
+
+ // ---------- On changing "Local Network" -------------------------------------------------------------------------
+ function typesel_change_local(bits) {
+ var value = $('#mode').val();
+
+ if (typeof(bits) === "undefined") {
+ if (value === "tunnel") {
+ bits = 24;
+ }
+ else if (value === "tunnel6") {
+ bits = 64;
+ }
+ }
+
+ var address_is_blank = !/\S/.test($('#localid_address').val());
+
+ switch ($("#localid_type option:selected").index()) {
+ case 0: /* single */
+ disableInput('localid_address', false);
+
+ if (address_is_blank) {
+ $('#localid_netbits').val(0);
+ }
+
+ disableInput('localid_netbits', true);
+ break;
+ case 1: /* network */
+ disableInput('localid_address', false);
+
+ if (address_is_blank) {
+ $('#localid_netbits').val(bits);
+ }
+
+ disableInput('localid_netbits', false);
+ break;
+ case 3: /* none */
+ disableInput('localid_address', true);
+ disableInput('localid_netbits', true);
+ break;
+ default:
+ $('#localid_address').val("");
+ disableInput('localid_address', true);
+
+ if (address_is_blank) {
+ $('#localid_netbits').val(0);
+ }
+
+ disableInput('localid_netbits', true);
+ break;
+ }
+ }
+
+<?php
+
+ // ---------- On changing "Remote Network" ------------------------------------------------------------------------
+ if (!isset($pconfig['mobile'])): ?>
+
+ function typesel_change_remote(bits) {
+
+ var value = $('#mode').val();
+
+ if (typeof(bits) === "undefined") {
+ if (value === "tunnel") {
+ bits = 24;
+ }
+ else if (value === "tunnel6") {
+ bits = 64;
+ }
+ }
+
+ var address_is_blank = !/\S/.test($('#remoteid_address').val());
+
+ switch ($("#remoteid_type option:selected").index()) {
+ case 0: /* single */
+ disableInput('remoteid_address', false);
+
+ if (address_is_blank) {
+ $('#remoteid_netbits').val(0);
+ }
+
+ disableInput('remoteid_netbits', true);
+ break;
+ case 1: /* network */
+ disableInput('remoteid_address', false);
+
+ if (address_is_blank) {
+ $('#remoteid_netbits').val(bits);
+ }
+
+ disableInput('remoteid_netbits', false);
+ break;
+ case 3: /* none */
+ disableInput('remoteid_address', true);
+ disableInput('remoteid_netbits', true);
+ break;
+ default:
+ $('#remoteid_address').val("");
+ disableInput('remoteid_address', true);
+
+ if (address_is_blank) {
+ $('#remoteid_netbits').val(0);
+ }
+
+ disableInput('remoteid_netbits', true);
+ break;
+ }
+ }
+
+ <?php endif; ?>
+
+ function change_protocol() {
+ hideClass('encalg', ($('#proto').val() != 'esp'));
+ }
+
+ // ---------- Library of show/hide functions ----------------------------------------------------------------------
+
+ // Hides the <div> in which the specified input element lives so that the input,
+ // its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
+
+ // Hides the <div> in which the specified group input element lives so that the input,
+ // its label and help text are hidden
+ function hideGroupInput(id, hide) {
+ if(hide)
+ $('#' + id).parent('div').addClass('hidden');
+ else
+ $('#' + id).parent('div').removeClass('hidden');
+ }
+
+ // Hides the <div> in which the specified checkbox lives so that the checkbox,
+ // its label and help text are hidden
+ function hideCheckbox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
+ }
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
+ }
+
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ // ---------- Monitor elements for change and call the appropriate display functions ------------------------------
+
+ // Protocol
+ $('#proto').click(function () {
+ change_protocol();
+ });
+
+ // Localid
+ $('#localid_type').click(function () {
+ typesel_change_local(<?=htmlspecialchars($pconfig['localid_netbits'])?>);
+ });
+
+ // Remoteid
+ $('#remoteid_type').click(function () {
+ typesel_change_remote(<?=htmlspecialchars($pconfig['remoteid_netbits'])?>);
+ });
+
+ // NATLocalid
+ $('#natlocalid_type').click(function () {
+ typesel_change_natlocal(<?=htmlspecialchars($pconfig['natlocalid_netbits'])?>);
+ });
+
+ // Mode
+ $('#mode').click(function () {
+ change_mode();
+ });
+
+ // ---------- Iniatial page load ----------------------------------------------------------------------------------
+ change_mode();
+ change_protocol();
+ typesel_change_local(<?=htmlspecialchars($pconfig['localid_netbits'])?>);
+ typesel_change_natlocal(<?=htmlspecialchars($pconfig['natlocalid_netbits'])?>);
+<?php
+ if (!isset($pconfig['mobile'])):
?>
+ typesel_change_remote(<?=htmlspecialchars($pconfig['remoteid_netbits'])?>);
+<?php
+endif;
+?>
+});
+//]]>
+</script>
+<?php
+include("foot.inc");
diff --git a/src/usr/local/www/vpn_ipsec_settings.php b/src/usr/local/www/vpn_ipsec_settings.php
index ac3fde9..c6fe0ad 100644
--- a/src/usr/local/www/vpn_ipsec_settings.php
+++ b/src/usr/local/www/vpn_ipsec_settings.php
@@ -111,7 +111,7 @@ if ($_POST) {
$input_errors[] = "A valid value must be specified for StrongSwan Lib debug.";
}
if (isset($pconfig['maxmss'])) {
- if (!is_numericint($pconfig['maxmss']) && $pconfig['maxmss'] <> '') {
+ if (!is_numericint($pconfig['maxmss']) && $pconfig['maxmss'] != '') {
$input_errors[] = "An integer must be specified for Maximum MSS.";
}
if ($pconfig['maxmss'] <> '' && $pconfig['maxmss'] < 576 || $pconfig['maxmss'] > 65535) {
@@ -243,9 +243,6 @@ $shortcut_section = "ipsec";
include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-
<script type="text/javascript">
//<![CDATA[
@@ -260,8 +257,6 @@ function maxmss_checked(obj) {
//]]>
</script>
-<form action="vpn_ipsec_settings.php" method="post" name="iform" id="iform">
-
<?php
if ($savemsg) {
print_info_box($savemsg);
@@ -271,175 +266,122 @@ function maxmss_checked(obj) {
}
?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn ipsec settings">
- <tr>
- <td class="tabnavtbl">
- <?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Tunnels"), false, "vpn_ipsec.php");
- $tab_array[1] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
- $tab_array[2] = array(gettext("Pre-Shared Key"), false, "vpn_ipsec_keys.php");
- $tab_array[3] = array(gettext("Advanced Settings"), true, "vpn_ipsec_settings.php");
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td id="mainarea">
- <div class="tabcont">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("IPsec Advanced Settings"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IPsec Debug"); ?></td>
- <td width="78%" class="vtable">
- <strong><?=gettext("Start IPsec in debug mode based on sections selected"); ?></strong>
- <br />
- <table summary="ipsec debug">
- <?php foreach ($ipsec_loglevels as $lkey => $ldescr): ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=$ldescr;?></td>
- <td width="78%" valign="top" class="vncell">
- <?php
- echo "<select name=\"ipsec_{$lkey}\" id=\"ipsec_{$lkey}\">\n";
- foreach (array("Silent", "Audit", "Control", "Diag", "Raw", "Highest") as $lidx => $lvalue) {
- echo "<option value=\"{$lidx}\" ";
- if ($pconfig["ipsec_{$lkey}"] == $lidx) {
- echo "selected=\"selected\"";
- }
- echo ">{$lvalue}</option>\n";
- }
- ?>
- </select>
- </td>
- </tr>
- <?php endforeach; ?>
- <tr style="display:none;">
- <td></td>
- </tr>
- </table>
- <br /><?=gettext("Launches IPsec in debug mode so that more verbose logs " .
- "will be generated to aid in troubleshooting."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Unique IDs"); ?></td>
- <td width="78%" class="vtable">
- <strong><?=gettext("Configure Unique IDs as: "); ?></strong>
- <?php
- echo "<select name=\"uniqueids\" id=\"uniqueids\">\n";
- foreach ($ipsec_idhandling as $value => $lvalue) {
- echo "<option value=\"{$value}\" ";
- if ($pconfig['uniqueids'] == $value) {
- echo "selected=\"selected\"";
- }
- echo ">{$lvalue}</option>\n";
- }
- ?>
- </select>
- <br />
- <?=gettext("whether a particular participant ID should be kept unique, with any new IKE_SA using an ID " .
- "deemed to replace all old ones using that ID. Participant IDs normally are unique, so a new " .
- "IKE_SA using the same ID is almost invariably intended to replace an old one. " .
- "The difference between <b>no</b> and <b>never</b> is that the old IKE_SAs will be replaced when receiving an " .
- "INITIAL_CONTACT notify if the option is no but will ignore these notifies if <b>never</b> is configured. " .
- "The daemon also accepts the value <b>keep</b> to reject " .
- "new IKE_SA setups and keep the duplicate established earlier. Defaults to Yes."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IP Compression"); ?></td>
- <td width="78%" class="vtable">
- <input name="compression" type="checkbox" id="compression" value="yes" <?php if ($pconfig['compression']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable IPCompression"); ?></strong>
- <br />
- <?=gettext("IPComp compression of content is proposed on the connection."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Strict interface binding"); ?></td>
- <td width="78%" class="vtable">
- <input name="enableinterfacesuse" type="checkbox" id="enableinterfacesuse" value="yes" <?php if ($pconfig['enableinterfacesuse']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable strict interface binding"); ?></strong>
- <br />
- <?=gettext("Enable strongSwan's interfaces_use option to bind specific interfaces only. This option is known to break IPsec with dynamic IP interfaces. This is not recommended at this time."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Unencrypted payloads in IKEv1 Main Mode"); ?></td>
- <td width="78%" class="vtable">
- <input name="acceptunencryptedmainmode" type="checkbox" id="acceptunencryptedmainmode" value="yes" <?php if ($pconfig['acceptunencryptedmainmode']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Accept unencrypted ID and HASH payloads in IKEv1 Main Mode"); ?></strong>
- <br />
- <?=gettext("Some implementations send the third Main Mode message unencrypted, probably to find the PSKs for the specified ID for authentication." .
- "This is very similar to Aggressive Mode, and has the same security implications: " .
- "A passive attacker can sniff the negotiated Identity, and start brute forcing the PSK using the HASH payload." .
- " It is recommended to keep this option to no, unless you know exactly what the implications are and require compatibility to such devices (for example, some SonicWall boxes).");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Maximum MSS"); ?></td>
- <td width="78%" class="vtable">
- <input name="maxmss_enable" type="checkbox" id="maxmss_enable" value="yes" <?php if ($pconfig['maxmss_enable'] == true) echo "checked=\"checked\""; ?> onclick="maxmss_checked(this)" />
- <strong><?=gettext("Enable MSS clamping on VPN traffic"); ?></strong>
- <br />
- <input name="maxmss" id="maxmss" value="<?php if ($pconfig['maxmss'] <> "") echo htmlspecialchars($pconfig['maxmss']); else "1400"; ?>" class="formfld unknown" <?php if ($pconfig['maxmss_enable'] == false) echo "disabled=\"disabled\""; ?> />
- <br />
- <?=gettext("Enable MSS clamping on TCP flows over VPN. " .
- "This helps overcome problems with PMTUD on IPsec VPN links. If left blank, the default value is 1400 bytes. "); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Disable Cisco Extensions"); ?></td>
- <td width="78%" class="vtable">
- <input name="unityplugin" type="checkbox" id="unityplugin" value="yes" <?php if ($pconfig['unityplugin'] == true) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Disable Unity Plugin"); ?></strong>
- <br />
- <?=gettext("Disable Unity Plugin which provides Cisco Extension support as Split-Include, Split-Exclude, Split-Dns, ..."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Strict CRL Checking"); ?></td>
- <td width="78%" class="vtable">
- <input name="strictcrlpolicy" type="checkbox" id="strictcrlpolicy" value="yes" <?php if ($pconfig['strictcrlpolicy'] == true) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable strict Certificate Revocation List checking"); ?></strong>
- <br />
- <?=gettext("Check this to require availability of a fresh CRL for peer authentication based on RSA signatures to succeed."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Make before Break"); ?></td>
- <td width="78%" class="vtable">
- <input name="makebeforebreak" type="checkbox" id="makebeforebreak" value="yes" <?php if ($pconfig['makebeforebreak'] == true) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Initiate IKEv2 reauthentication with a make-before-break"); ?></strong>
- <br />
- <?=gettext("instead of a break-before-make scheme. Make-before-break uses overlapping IKE and CHILD_SA during reauthentication " .
- "by first recreating all new SAs before deleting the old ones. This behavior can be beneficial to avoid connectivity gaps " .
- "during reauthentication, but requires support for overlapping SAs by the peer.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Auto-exclude LAN address"); ?></td>
- <td width="78%" class="vtable">
- <input name="noshuntlaninterfaces" type="checkbox" id="noshuntlaninterfaces" value="yes" <?php if ($pconfig['noshuntlaninterfaces'] != true) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable bypass for LAN interface IP"); ?></strong>
- <br />
- <?=gettext("Exclude traffic from LAN subnet to LAN IP address from IPsec."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php
+
+$tab_array = array();
+$tab_array[0] = array(gettext("Tunnels"), false, "vpn_ipsec.php");
+$tab_array[1] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
+$tab_array[2] = array(gettext("Pre-Shared Key"), false, "vpn_ipsec_keys.php");
+$tab_array[3] = array(gettext("Advanced Settings"), true, "vpn_ipsec_settings.php");
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+$form = new Form;
+
+$section = new Form_Section('Start IPsec in debug mode based on sections selected');
+
+foreach ($ipsec_loglevels as $lkey => $ldescr)
+{
+ $section->addInput(new Form_Select(
+ 'ipsec_' . $lkey,
+ $ldescr,
+ $pconfig['ipsec_' . $lkey],
+ array('Silent', 'Audit', 'Control', 'Diag', 'Raw', 'Highest')
+ ))->setWidth(2);
+}
+
+$section->addInput(new Form_StaticText('', ''))->setHelp(
+ 'Launches IPsec in debug mode so that more verbose logs will be generated to aid in troubleshooting.'
+);
+
+$form->add($section);
+
+$section = new Form_Section('IPsec Advanced Settings');
+
+$section->addInput(new Form_Select(
+ 'uniqueids',
+ 'Configure Unique IDs as',
+ $pconfig['uniqueids'],
+ $ipsec_idhandling
+))->setHelp(
+ 'Whether a particular participant ID should be kept unique, with any new IKE_SA using an ID ' .
+ 'deemed to replace all old ones using that ID. Participant IDs normally are unique, so a new ' .
+ 'IKE_SA using the same ID is almost invariably intended to replace an old one. ' .
+ 'The difference between <b>no</b> and <b>never</b> is that the old IKE_SAs will be replaced when receiving an ' .
+ 'INITIAL_CONTACT notify if the option is no but will ignore these notifies if <b>never</b> is configured. ' .
+ 'The daemon also accepts the value <b>keep</b> to reject ' .
+ 'new IKE_SA setups and keep the duplicate established earlier. Defaults to Yes.'
+);
+
+$section->addInput(new Form_Checkbox(
+ 'compression',
+ 'IP Compression',
+ 'Enable IPCompression',
+ $pconfig['compression']
+))->setHelp('IPComp compression of content is proposed on the connection.');
+
+$section->addInput(new Form_Checkbox(
+ 'enableinterfacesuse',
+ 'Strict interface binding',
+ 'Enable strict interface binding',
+ $pconfig['enableinterfacesuse']
+))->setHelp('Enable strongSwan\'s interfaces_use option to bind specific interfaces only. This option is known to break IPsec with dynamic IP interfaces. This is not recommended at this time.');
+
+$section->addInput(new Form_Checkbox(
+ 'acceptunencryptedmainmode',
+ 'Unencrypted payloads in IKEv1 Main Mode',
+ 'Accept unencrypted ID and HASH payloads in IKEv1 Main Mode',
+ $pconfig['acceptunencryptedmainmode']
+))->setHelp(
+ 'Some implementations send the third Main Mode message unencrypted, probably to find the PSKs for the specified ID for authentication.' .
+ 'This is very similar to Aggressive Mode, and has the same security implications: ' .
+ 'A passive attacker can sniff the negotiated Identity, and start brute forcing the PSK using the HASH payload.' .
+ 'It is recommended to keep this option to no, unless you know exactly what the implications are and require compatibility to such devices (for example, some SonicWall boxes).'
+);
+
+$section->addInput(new Form_Checkbox(
+ 'maxmss_enable',
+ 'Enable Maximum MSS',
+ 'Enable MSS clamping on VPN traffic',
+ $pconfig['maxmss_enable']
+))->toggles('.toggle-maxmss', 'collapse');
+
+$group = new Form_Group('Maximum MSS');
+$group->addClass('toggle-maxmss collapse');
+
+if (!empty($pconfig['maxmss_enable']))
+ $group->addClass('in');
+
+$group->add(new Form_Input(
+ 'maxmss',
+ 'Maximum MSS',
+ 'text',
+ ($pconfig['maxmss'] ? $pconfig['maxmss'] : '1400')
+))->setHelp(
+ 'Enable MSS clamping on TCP flows over VPN. ' .
+ 'This helps overcome problems with PMTUD on IPsec VPN links. If left blank, the default value is 1400 bytes. '
+);
+
+$section->add($group);
+
+$section->addInput(new Form_Checkbox(
+ 'unityplugin',
+ 'Disable Cisco Extensions',
+ 'Disable Unity Plugin',
+ $pconfig['unityplugin']
+))->setHelp('Disable Unity Plugin which provides Cisco Extension support as Split-Include, Split-Exclude, Split-Dns, ...');
+
+$section->addInput(new Form_Checkbox(
+ 'shuntlaninterfaces',
+ 'Bypass LAN address',
+ 'Enable bypass for LAN interface ip',
+ $pconfig['shuntlaninterfaces']
+))->setHelp('Prevent LAN ip address to be processed for IPsec traffic.');
+
+$form->add($section);
+
+print $form;
+
+?>
+
+<?php include("foot.inc"); ?> \ No newline at end of file
diff --git a/src/usr/local/www/vpn_l2tp.php b/src/usr/local/www/vpn_l2tp.php
index 88f4eae..bb61217 100644
--- a/src/usr/local/www/vpn_l2tp.php
+++ b/src/usr/local/www/vpn_l2tp.php
@@ -107,7 +107,7 @@ if ($_POST) {
$subnet_end = ip2ulong($_POST['remoteip']) + $_POST['n_l2tp_units'] - 1;
if ((ip2ulong($_POST['localip']) >= $subnet_start) &&
- (ip2ulong($_POST['localip']) <= $subnet_end)) {
+ (ip2ulong($_POST['localip']) <= $subnet_end)) {
$input_errors[] = gettext("The specified server address lies in the remote subnet.");
}
if ($_POST['localip'] == get_interface_ip("lan")) {
@@ -193,9 +193,6 @@ if ($_POST) {
include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-
<script type="text/javascript">
//<![CDATA[
function get_radio_value(obj) {
@@ -283,203 +280,240 @@ function enable_change(enable_over) {
}
//]]>
</script>
-<form action="vpn_l2tp.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<div id="inputerrors"></div>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn l2tp">
- <tr><td class="tabnavtbl">
+
+<form class="form-horizontal" action="vpn_l2tp.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors)?>
+<?php if ($savemsg) print_info_box($savemsg)?>
+
+<?php
+$tab_array = array();
+$tab_array[0] = array(gettext("Configuration"), true, "vpn_l2tp.php");
+$tab_array[1] = array(gettext("Users"), false, "vpn_l2tp_users.php");
+display_top_tabs($tab_array);
+?>
+
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title"><?=gettext('Enable L2TP'); ?></h2>
+ </div>
+
+ <div class="panel-body">
+ <div class="form-group">
+ <div class="col-sm-10">
+ <label>
+ <input name="mode" type="radio" onclick="enable_change(false)" value="off" <?php if (($pconfig['mode'] != "server") && ($pconfig['mode'] != "redir")) echo "checked=\"checked\""?> />
+ <?=gettext("Off")?>
+ </label>
+ <label>
+ <input type="radio" name="mode" value="server" onclick="enable_change(false)" <?php if ($pconfig['mode'] == "server") echo "checked=\"checked\""?> />
+ <?=gettext("Enable L2TP server")?>
+ </label>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title"><?=gettext('Configuration'); ?></h2>
+ </div>
+
+ <div class="panel-body">
+ <div class="form-group">
+ <label for="interface" class="col-sm-2 control-label"><?=gettext("Interface")?></label>
+ <div class="col-sm-2">
+ <select class="form-control" name="interface" class="formselect" id="interface">
+<?php
+$interfaces = get_configured_interface_with_descr();
+foreach ($interfaces as $iface => $ifacename): ?>
+ <option value="<?=$iface?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""?>>
+ <?=htmlspecialchars($ifacename)?>
+ </option>
+<?php endforeach?>
+ </select>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="localip" class="col-sm-2 control-label"><?=gettext("Server Address")?></label>
+ <div class="col-sm-10">
+ <?=$mandfldhtml?><input name="localip" type="text" class="form-control formfld unknown" id="localip" size="20" value="<?=htmlspecialchars($pconfig['localip'])?>" />
+
+ <span class="help-block">
+ <?=gettext("Enter the IP address the L2TP server should give to clients for use as their \"gateway\"")?>.
+ <br />
+ <?=gettext("Typically this is set to an unused IP just outside of the client range")?>.
+ <br />
+ <br />
+ <?=gettext("NOTE: This should NOT be set to any IP address currently in use on this firewall")?>.
+ </span>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="remoteip" class="col-sm-2 control-label"><?=gettext("Remote Address Range")?></label>
+ <div class="col-sm-10">
+ <?=$mandfldhtml?><input name="remoteip" type="text" class="form-control formfld unknown" id="remoteip" size="20" value="<?=htmlspecialchars($pconfig['remoteip'])?>" />
+ <span class="help-block">
+ <?=gettext("Specify the starting address for the client IP address subnet.")?>
+ </span>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="l2tp_subnet" class="col-sm-2 control-label"><?=gettext("Subnet Mask")?></label>
+ <div class="col-sm-2">
+ <select id="l2tp_subnet" name="l2tp_subnet" class="form-control">
<?php
- $tab_array = array();
- $tab_array[0] = array(gettext("Configuration"), true, "vpn_l2tp.php");
- $tab_array[1] = array(gettext("Users"), false, "vpn_l2tp_users.php");
- display_top_tabs($tab_array);
+ for($x=0; $x<33; $x++) {
+ if($x == $pconfig['l2tp_subnet'])
+ $SELECTED = " selected=\"selected\"";
+ else
+ $SELECTED = "";
+ echo "<option value=\"{$x}\"{$SELECTED}>{$x}</option>\n";
+ }
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="22%" valign="top" class="vtable">&nbsp;</td>
- <td width="78%" class="vtable">
- <input name="mode" type="radio" onclick="enable_change(false)" value="off"
- <?php if (($pconfig['mode'] != "server") && ($pconfig['mode'] != "redir")) echo "checked=\"checked\"";?> />
- <?=gettext("Off"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vtable">&nbsp;</td>
- <td width="78%" class="vtable">
- <input type="radio" name="mode" value="server" onclick="enable_change(false)" <?php if ($pconfig['mode'] == "server") echo "checked=\"checked\""; ?> />
- <?=gettext("Enable L2TP server"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><b><?=gettext("Interface");?></b></td>
- <td width="78%" valign="top" class="vtable">
- <select name="interface" class="formselect" id="interface">
- <?php
- $interfaces = get_configured_interface_with_descr();
- foreach ($interfaces as $iface => $ifacename):
- ?>
- <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br />
-
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Server Address");?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="localip" type="text" class="formfld unknown" id="localip" size="20" value="<?=htmlspecialchars($pconfig['localip']);?>" />
- <br />
- <?=gettext("Enter the IP address the L2TP server should give to clients for use as their \"gateway\""); ?>.
- <br />
- <?=gettext("Typically this is set to an unused IP just outside of the client range"); ?>.
- <br />
- <br />
- <?=gettext("NOTE: This should NOT be set to any IP address currently in use on this firewall"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Remote Address Range");?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="remoteip" type="text" class="formfld unknown" id="remoteip" size="20" value="<?=htmlspecialchars($pconfig['remoteip']);?>" />
- <br />
- <?=gettext("Specify the starting address for the client IP address subnet.");?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet Mask"); ?></td>
- <td width="78%" class="vtable">
- <select id="l2tp_subnet" name="l2tp_subnet">
- <?php
- for ($x = 0; $x < 33; $x++) {
- if ($x == $pconfig['l2tp_subnet']) {
- $SELECTED = " selected=\"selected\"";
- } else {
- $SELECTED = "";
- }
- echo "<option value=\"{$x}\"{$SELECTED}>{$x}</option>\n";
- }
- ?>
- </select>
- <br /><?=gettext("Hint:"); ?> 24 <?=gettext("is"); ?> 255.255.255.0
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Number of L2TP users"); ?></td>
- <td width="78%" class="vtable">
- <select id="n_l2tp_units" name="n_l2tp_units">
- <?php
- for ($x = 0; $x < 255; $x++) {
- if ($x == $pconfig['n_l2tp_units']) {
- $SELECTED = " selected=\"selected\"";
- } else {
- $SELECTED = "";
- }
- echo "<option value=\"{$x}\"{$SELECTED}>{$x}</option>\n";
- }
- ?>
- </select>
- <br /><?=gettext("Hint:"); ?> 10 <?=gettext("is ten L2TP clients"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Secret");?></td>
- <td width="78%" class="vtable">
- <input type="password" name="secret" id="secret" class="formfld pwd" value="<?php echo htmlspecialchars($pconfig['secret']); ?>" />
- <br />
- <?=gettext("Specify optional secret shared between peers. Required on some devices/setups.");?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Authentication Type");?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?>
- <select name="paporchap" id="paporchap">
- <option value='chap'<?php if ($pconfig['paporchap'] == "chap") echo " selected=\"selected\""; ?>><?=gettext("CHAP"); ?></option>
- <option value='pap'<?php if ($pconfig['paporchap'] == "pap") echo " selected=\"selected\""; ?>><?=gettext("PAP"); ?></option>
- </select>
- <br />
- <?=gettext("Specifies which protocol to use for authentication.");?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("L2TP DNS Servers"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="l2tp_dns1" type="text" class="formfld unknown" id="l2tp_dns1" size="20" value="<?=htmlspecialchars($pconfig['l2tp_dns1']);?>" />
- <br />
- <input name="l2tp_dns2" type="text" class="formfld unknown" id="l2tp_dns2" size="20" value="<?=htmlspecialchars($pconfig['l2tp_dns2']);?>" />
- <br />
- <?=gettext("primary and secondary DNS servers assigned to L2TP clients"); ?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("WINS Server"); ?></td>
- <td width="78%" valign="top" class="vtable">
- <input name="wins" class="formfld unknown" id="wins" size="20" value="<?=htmlspecialchars($pconfig['wins']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS"); ?></td>
- <td width="78%" class="vtable">
- <input name="radiusenable" type="checkbox" id="radiusenable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radiusenable']) echo "checked=\"checked\""; ?> />
- <strong> <?=gettext("Use a RADIUS server for authentication");?><br /></strong>
- <?=gettext("When set, all users will be authenticated using the RADIUS server specified below. The local user database will not be used.");?><br />
- <br />
- <input name="radacct_enable" type="checkbox" id="radacct_enable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radacct_enable']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable RADIUS accounting");?></strong><br />
- <?=gettext("Sends accounting packets to the RADIUS server.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS Server");?></td>
- <td width="78%" class="vtable">
- <input name="radiusserver" type="text" class="formfld unknown" id="radiusserver" size="20" value="<?=htmlspecialchars($pconfig['radiusserver']);?>" />
- <br />
- <?=gettext("Enter the IP address of the RADIUS server.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS Shared Secret");?></td>
- <td width="78%" valign="top" class="vtable">
- <input name="radiussecret" type="password" class="formfld pwd" id="radiussecret" size="20" value="<?=htmlspecialchars($pconfig['radiussecret']);?>" />
- <br />
- <?=gettext("Enter the shared secret that will be used to authenticate to the RADIUS server.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS Issued IP's");?></td>
- <td width="78%" valign="top" class="vtable">
- <input name="radiusissueips" value="yes" type="checkbox" class="formfld" id="radiusissueips"<?php if (isset($pconfig['radiusissueips'])) echo " checked=\"checked\""; ?> />
- <br />
- <?=gettext("Issue IP Addresses via RADIUS server.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <span class="vexpl">
- <strong class="red"><?=gettext("Note:");?></strong><br />
- <?=gettext("Don't forget to add a firewall rule to permit traffic from L2TP clients!");?>
- </span>
- </td>
- </tr>
- </table>
+ </select>
+ <span class="help-block">
+ <?=gettext("Hint:")?> 24 <?=gettext("is")?> 255.255.255.0
+ </span>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="n_l2tp_units" class="col-sm-2 control-label"><?=gettext("Number of L2TP users")?></label>
+ <div class="col-sm-2">
+ <select id="n_l2tp_units" name="n_l2tp_units" class="form-control">
+<?php
+ for($x=0; $x<255; $x++) {
+ if($x == $pconfig['n_l2tp_units'])
+ $SELECTED = " selected=\"selected\"";
+ else
+ $SELECTED = "";
+ echo "<option value=\"{$x}\"{$SELECTED}>{$x}</option>\n";
+ }
+?>
+ </select>
+ <span class="help-block">
+ <?=gettext("Hint:")?> 10 <?=gettext("is ten L2TP clients")?>
+ </span>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="secret" class="col-sm-2 control-label"><?=gettext("Secret")?></label>
+ <div class="col-sm-10">
+ <input type="password" name="secret" id="secret" class="formfld pwd form-control" value="<?=htmlspecialchars($pconfig['secret'])?>" />
+ <span class="help-block">
+ <?=gettext("Specify optional secret shared between peers. Required on some devices/setups.")?>
+ </span>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="paporchap" class="col-sm-2 control-label"><?=gettext("Authentication Type")?></label>
+ <div class="col-sm-2">
+ <?=$mandfldhtml?><select name="paporchap" id="paporchap" class="form-control">
+ <option value='chap'<?php if($pconfig['paporchap'] == "chap") echo " selected=\"selected\""?>><?=gettext("CHAP")?></option>
+ <option value='pap'<?php if($pconfig['paporchap'] == "pap") echo " selected=\"selected\""?>><?=gettext("PAP")?></option>
+ </select>
+ <span class="help-block">
+ <?=gettext("Specifies which protocol to use for authentication.")?>
+ </span>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="l2tp_dns1" class="col-sm-2 control-label"><?=gettext("L2TP DNS Servers")?></label>
+ <div class="col-sm-10">
+ <?=$mandfldhtml?><input name="l2tp_dns1" type="text" class="formfld unknown form-control" id="l2tp_dns1" size="20" value="<?=htmlspecialchars($pconfig['l2tp_dns1'])?>" />
+ <input name="l2tp_dns2" type="text" class="formfld unknown form-control" id="l2tp_dns2" size="20" value="<?=htmlspecialchars($pconfig['l2tp_dns2'])?>" />
+ <span class="help-block">
+ <?=gettext("primary and secondary DNS servers assigned to L2TP clients")?>
+ </span>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="wins" class="col-sm-2 control-label"><?=gettext("WINS Server")?></label>
+ <div class="col-sm-10">
+ <input name="wins" class="formfld unknown form-control" id="wins" size="20" value="<?=htmlspecialchars($pconfig['wins'])?>" />
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title"><?=gettext('RADIUS'); ?></h2>
+ </div>
+
+ <div class="panel-body">
+ <div class="form-group">
+ <label for="radiusenable" class="col-sm-2 control-label"><?=gettext('Enable')?></label>
+ <div class="col-sm-10 checkbox">
+ <label>
+ <input name="radiusenable" type="checkbox" id="radiusenable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radiusenable']) echo "checked=\"checked\""?> />
+ <?=gettext("Use a RADIUS server for authentication")?>
+ </label>
+ <span class="help-block">
+ <?=gettext("When set, all users will be authenticated using the RADIUS server specified below. The local user database will not be used.")?>
+ </span>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="radacct_enable" class="col-sm-2 control-label"><?=gettext('Enable accounting')?></label>
+ <div class="col-sm-10 checkbox">
+ <label>
+ <input name="radacct_enable" type="checkbox" id="radacct_enable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radacct_enable']) echo "checked=\"checked\""?> />
+ <?=gettext("Enable RADIUS accounting")?>
+ </label>
+ <span class="help-block">
+ <?=gettext("Sends accounting packets to the RADIUS server.")?>
+ </span>
+ </div>
</div>
- </td>
- </tr>
-</table>
+
+ <div class="form-group">
+ <label for="radiusserver" class="col-sm-2 control-label"><?=gettext("RADIUS Server")?></label>
+ <div class="col-sm-10">
+ <input name="radiusserver" type="text" class="formfld unknown form-control" id="radiusserver" size="20" value="<?=htmlspecialchars($pconfig['radiusserver'])?>" />
+ <span class="help-block">
+ <?=gettext("Enter the IP address of the RADIUS server.")?>
+ </span>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="radiussecret" class="col-sm-2 control-label"><?=gettext("RADIUS Shared Secret")?></label>
+ <div class="col-sm-10">
+ <input name="radiussecret" type="password" class="formfld pwd form-control" id="radiussecret" size="20" value="<?=htmlspecialchars($pconfig['radiussecret'])?>" />
+ <span class="help-block">
+ <?=gettext("Enter the shared secret that will be used to authenticate to the RADIUS server.")?>
+ </span>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="radiusissueips" class="col-sm-2 control-label"><?=gettext("RADIUS Issued IP's")?></label>
+ <div class="col-sm-10 checkbox">
+ <label>
+ <input name="radiusissueips" value="yes" type="checkbox" class="formfld" id="radiusissueips"<?php if(isset($pconfig['radiusissueips'])) echo " checked=\"checked\""?> />
+ <?=gettext("Issue IP Addresses via RADIUS server.")?>
+ </label>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<?php
+ // TODO: Is it possible to detect available rules and only show warning if there are no (relevant) rules set?
+?>
+ <div class="alert alert-danger">
+ <strong><?=gettext("Note:")?></strong> <?=gettext("Don't forget to add a firewall rule to permit traffic from L2TP clients!")?>
+ </div>
+
+ <div class="col-sm-10 col-sm-offset-2">
+ <input id="submit" name="Submit" type="submit" class="btn btn-primary" value="<?=gettext("Save")?>" onclick="enable_change(true)" />
+ </div>
</form>
<script type="text/javascript">
@@ -488,6 +522,4 @@ function enable_change(enable_over) {
//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php include("foot.inc")?> \ No newline at end of file
diff --git a/src/usr/local/www/vpn_l2tp_users.php b/src/usr/local/www/vpn_l2tp_users.php
index 7ffc969..3ec4408 100644
--- a/src/usr/local/www/vpn_l2tp_users.php
+++ b/src/usr/local/www/vpn_l2tp_users.php
@@ -78,69 +78,51 @@ if ($_GET['act'] == "del") {
include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-<div id="inputerrors"></div>
-<form action="vpn_l2tp_users.php" method="post">
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php
-if (isset($config['l2tp']['radius']['enable'])) {
- print_info_box(gettext("Warning: RADIUS is enabled. The local user database will not be used."));
-}
-?>
-<?php if (is_subsystem_dirty('l2tpusers')): ?><br/>
-<?php print_info_box_np(gettext("The l2tp user list has been modified") . ".<br />" . gettext("You must apply the changes in order for them to take effect") . ".<br /><b>" . gettext("Warning: this will terminate all current l2tp sessions!") . "</b>");?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn l2pt users">
- <tr><td class="tabnavtbl">
+<?php if ($savemsg) print_info_box($savemsg)?>
+<?php if (isset($config['l2tp']['radius']['enable']))
+ print_info_box(gettext("Warning: RADIUS is enabled. The local user database will not be used."))?>
+<?php if (is_subsystem_dirty('l2tpusers')):?><br/>
+<?php print_info_box_np(gettext("The l2tp user list has been modified") . ".<br />" . gettext("You must apply the changes in order for them to take effect") . ".<br /><b>" . gettext("Warning: this will terminate all current l2tp sessions!") . "</b>")?><br />
+<?php endif?>
+
<?php
$tab_array = array();
$tab_array[0] = array(gettext("Configuration"), false, "vpn_l2tp.php");
$tab_array[1] = array(gettext("Users"), true, "vpn_l2tp_users.php");
display_top_tabs($tab_array);
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td class="listhdrr"><?=gettext("Username");?></td>
- <td class="listhdr"><?=gettext("IP address");?></td>
- <td class="list"></td>
- </tr>
-<?php
- $i = 0;
- foreach ($a_secret as $secretent):
-?>
- <tr>
- <td class="listlr">
- <?=htmlspecialchars($secretent['name']);?>
- </td>
- <td class="listr">
- <?php if ($secretent['ip'] == "") $secretent['ip'] = "Dynamic"; ?>
- <?=htmlspecialchars($secretent['ip']);?>&nbsp;
- </td>
- <td class="list nowrap">
- <a href="vpn_l2tp_users_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="edit user" width="17" height="17" border="0" alt="edit" /></a>
- &nbsp;<a href="vpn_l2tp_users.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this user?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete user"); ?>" width="17" height="17" border="0" alt="delete" /></a>
- </td>
- </tr>
-<?php
- $i++;
- endforeach;
-?>
- <tr>
- <td class="list" colspan="2"></td>
- <td class="list"> <a href="vpn_l2tp_users_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add user"); ?>" width="17" height="17" border="0" alt="add" /></a></td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<div class="table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><?=gettext("Username")?></th>
+ <th><?=gettext("IP address")?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php $i = 0; foreach ($a_secret as $secretent):?>
+ <tr>
+ <td>
+ <?=htmlspecialchars($secretent['name'])?>
+ </td>
+ <td>
+ <?php if($secretent['ip'] == "") $secretent['ip'] = "Dynamic"?>
+ <?=htmlspecialchars($secretent['ip'])?>&nbsp;
+ </td>
+ <td>
+ <a class="btn btn-xs btn-primary" href="vpn_l2tp_users_edit.php?id=<?=$i?>"><?= gettext('edit') ?></a>
+ <a class="btn btn-xs btn-danger" href="vpn_l2tp_users.php?act=del&amp;id=<?=$i?>"><?=gettext("delete")?></a>
+ </td>
+ </tr>
+<?php $i++; endforeach?>
+ </tbody>
+ </table>
+</div>
+
+<nav class="action-buttons">
+ <a class="btn btn-success" href="vpn_l2tp_users_edit.php"><?=gettext("add user")?></a>
+</nav>
+
+
+<?php include("foot.inc")?>
diff --git a/src/usr/local/www/vpn_l2tp_users_edit.php b/src/usr/local/www/vpn_l2tp_users_edit.php
index 6cedc02..c6ee99b 100644
--- a/src/usr/local/www/vpn_l2tp_users_edit.php
+++ b/src/usr/local/www/vpn_l2tp_users_edit.php
@@ -56,12 +56,6 @@ function l2tp_users_sort() {
require("guiconfig.inc");
require_once("vpn.inc");
-if (isset($_POST['referer'])) {
- $referer = $_POST['referer'];
-} else {
- $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/vpn_l2tp_users.php');
-}
-
if (!is_array($config['l2tp']['user'])) {
$config['l2tp']['user'] = array();
}
@@ -159,54 +153,57 @@ if ($_POST) {
include("head.inc");
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<div id="inputerrors"></div>
-<form action="vpn_l2tp_users_edit.php" method="post" name="iform" id="iform">
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="vpn l2tp users edit">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Username");?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="usernamefld" type="text" class="formfld user" id="usernamefld" size="20" value="<?=htmlspecialchars($pconfig['usernamefld']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Password");?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="passwordfld" type="password" class="formfld pwd" id="passwordfld" size="20" />
- <br /><?=$mandfldhtml;?><input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" />
- &nbsp;(<?=gettext("confirmation");?>)
- <?php if (isset($id) && $a_secret[$id]): ?>
- <br />
- <span class="vexpl"><?=gettext("If you want to change the users password, enter it here twice.");?></span>
- <?php endif; ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IP address");?></td>
- <td width="78%" class="vtable">
- <input name="ip" type="text" class="formfld unknown" id="ip" size="20" value="<?=htmlspecialchars($pconfig['ip']);?>" />
- <br /><span class="vexpl"><?=gettext("If you want the user to be assigned a specific IP address, enter it here.");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="Submit" type="submit" class="formbtn" value="<?=gettext('Save');?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_secret[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
+<?php
+if ($input_errors)
+ print_input_errors($input_errors);
+?>
+
+<form class="form-horizontal" action="vpn_l2tp_users_edit.php" method="post" name="iform" id="iform">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h2 class="panel-title"><?=gettext('User'); ?></h2>
+ </div>
+
+ <div class="panel-body">
+ <div class="form-group">
+ <label for="usernamefld" class="col-sm-2 control-label"><?=gettext("Username")?></label>
+ <div class="col-sm-10">
+ <?=$mandfldhtml?><input name="usernamefld" type="text" class="formfld user form-control" id="usernamefld" size="20" value="<?=htmlspecialchars($pconfig['usernamefld'])?>" />
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="passwordfld" class="col-sm-2 control-label"><?=gettext("Password")?></label>
+ <div class="col-sm-10">
+ <?=$mandfldhtml?><input name="passwordfld" type="password" class="formfld pwd form-control" id="passwordfld" size="20" />
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="passwordfld2" class="col-sm-2 control-label"><?=gettext('Confirm')?></label>
+ <div class="col-sm-10">
+ <?=$mandfldhtml?><input name="passwordfld2" type="password" class="formfld pwd form-control" id="passwordfld2" size="20" />
+<?php if (isset($id) && $a_secret[$id]):?>
+ <span class="help-block"><?=gettext("If you want to change the users password, enter it here twice.")?></span>
+<?php endif?>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="ip" class="col-sm-2 control-label"><?=gettext("IP address")?></label>
+ <div class="col-sm-10">
+ <input name="ip" type="text" class="formfld unknown form-control" id="ip" size="20" value="<?=htmlspecialchars($pconfig['ip'])?>" />
+ <span class="help-block"><?=gettext("If you want the user to be assigned a specific IP address, enter it here.")?></span>
+ </div>
+ </div>
+ </div>
</div>
+
+ <div class="col-sm-10 col-sm-offset-2">
+ <input id="submit" name="Submit" type="submit" class="formbtn btn btn-primary" value="<?=gettext('Save')?>" />
+ </div>
+
+<?php if (isset($id) && $a_secret[$id]):?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id)?>" />
+<?php endif?>
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php
+include("foot.inc");
diff --git a/src/usr/local/www/vpn_openvpn_client.php b/src/usr/local/www/vpn_openvpn_client.php
index 7a06c70..41296a3 100644
--- a/src/usr/local/www/vpn_openvpn_client.php
+++ b/src/usr/local/www/vpn_openvpn_client.php
@@ -380,892 +380,608 @@ if ($_POST) {
include("head.inc");
-?>
+function build_if_list() {
+ $list = array();
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
+ $interfaces = get_configured_interface_with_descr();
+ $carplist = get_configured_carp_interface_list();
-function mode_change() {
- index = document.iform.mode.selectedIndex;
- value = document.iform.mode.options[index].value;
- switch (value) {
- case "p2p_tls":
- document.getElementById("tls").style.display="";
- document.getElementById("tls_ca").style.display="";
- document.getElementById("tls_cert").style.display="";
- document.getElementById("userpass").style.display="";
- document.getElementById("userpassheader").style.display="";
- document.getElementById("psk").style.display="none";
- break;
- case "p2p_shared_key":
- document.getElementById("tls").style.display="none";
- document.getElementById("tls_ca").style.display="none";
- document.getElementById("tls_cert").style.display="none";
- document.getElementById("userpass").style.display="none";
- document.getElementById("userpassheader").style.display="none";
- document.getElementById("psk").style.display="";
- break;
- }
-}
+ foreach ($carplist as $cif => $carpip)
+ $interfaces[$cif.'|'.$carpip] = $carpip." (".get_vip_descr($carpip).")";
-function dev_mode_change() {
- index = document.iform.dev_mode.selectedIndex;
- value = document.iform.dev_mode.options[index].value;
- switch (value) {
- case "tun":
- document.getElementById("chkboxNoTunIPv6").style.display="";
- break;
- case "tap":
- document.getElementById("chkboxNoTunIPv6").style.display="none";
- break;
- }
-}
+ $aliaslist = get_configured_ip_aliases_list();
-function autokey_change() {
- if (document.iform.autokey_enable.checked) {
- document.getElementById("autokey_opts").style.display="none";
- } else {
- document.getElementById("autokey_opts").style.display="";
- }
-}
+ foreach ($aliaslist as $aliasip => $aliasif)
+ $interfaces[$aliasif.'|'.$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
-function useproxy_changed() {
+ $grouplist = return_gateway_groups_array();
- if (jQuery('#proxy_authtype').val() != 'none') {
- jQuery('#proxy_authtype_opts').show();
- } else {
- jQuery('#proxy_authtype_opts').hide();
- }
-}
+ foreach ($grouplist as $name => $group) {
+ if($group['ipprotocol'] != inet)
+ continue;
-function tlsauth_change() {
+ if($group[0]['vip'] != "")
+ $vipif = $group[0]['vip'];
+ else
+ $vipif = $group[0]['int'];
-<?php if (!$pconfig['tls']): ?>
- if (document.iform.tlsauth_enable.checked) {
- document.getElementById("tlsauth_opts").style.display="";
- } else {
- document.getElementById("tlsauth_opts").style.display="none";
+ $interfaces[$name] = "GW Group {$name}";
}
-<?php endif; ?>
- autotls_change();
+ $interfaces['lo0'] = "Localhost";
+ $interfaces['any'] = "any";
+
+ foreach ($interfaces as $iface => $ifacename)
+ $list[$iface] = $ifacename;
+
+ return($list);
}
-function autotls_change() {
+function build_cert_list() {
+ global $a_cert;
-<?php if (!$pconfig['tls']): ?>
- autocheck = document.iform.autotls_enable.checked;
-<?php else: ?>
- autocheck = false;
-<?php endif; ?>
+ $list = array();
- if (document.iform.tlsauth_enable.checked && !autocheck) {
- document.getElementById("autotls_opts").style.display="";
- } else {
- document.getElementById("autotls_opts").style.display="none";
+ foreach ($a_cert as $cert) {
+ $caname = "";
+ $inuse = "";
+ $revoked = "";
+ $ca = lookup_ca($cert['caref']);
+
+ if ($ca)
+ $caname = " (CA: {$ca['descr']})";
+
+ if ($pconfig['certref'] == $cert['refid'])
+ $selected = "selected=\"selected\"";
+
+ if (cert_in_use($cert['refid']))
+ $inuse = " *In Use";
+
+ if (is_cert_revoked($cert))
+ $revoked = " *Revoked";
+
+ $list[$cert['refid']] = $cert['descr'] . $caname . $inuse . $revoked;
}
+
+ return($list);
}
-//]]>
-</script>
-<?php
-if (!$savemsg) {
+if (!$savemsg)
$savemsg = "";
-}
-if ($input_errors) {
+if ($input_errors)
print_input_errors($input_errors);
-}
-if ($savemsg) {
- print_info_box($savemsg);
-}
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+$tab_array = array();
+$tab_array[] = array(gettext("Server"), false, "vpn_openvpn_server.php");
+$tab_array[] = array(gettext("Client"), true, "vpn_openvpn_client.php");
+$tab_array[] = array(gettext("Client Specific Overrides"), false, "vpn_openvpn_csc.php");
+$tab_array[] = array(gettext("Wizards"), false, "wizard.php?xml=openvpn_wizard.xml");
+add_package_tabs("OpenVPN", $tab_array);
+display_top_tabs($tab_array);
+
+if($act=="new" || $act=="edit") :
+ require('classes/Form.class.php');
+
+ $form = new Form();
+
+ $section = new Form_Section('General Information');
+
+ $section->addInput(new Form_checkbox(
+ 'disable',
+ 'Disabled',
+ 'Disable this server',
+ $pconfig['disable']
+ ))->setHelp('Set this option to disable this client without removing it from the list');
+
+ $section->addInput(new Form_Select(
+ 'mode',
+ 'Server mode',
+ $pconfig['mode'],
+ $openvpn_client_modes
+ ));
+
+ $section->addInput(new Form_Select(
+ 'protocol',
+ 'Protocol',
+ $pconfig['protocol'],
+ $openvpn_prots
+ ));
+
+ $section->addInput(new Form_Select(
+ 'dev_mode',
+ 'Device mode',
+ empty($pconfig['dev_mode']) ? 'tun':$pconfig['dev_mode'],
+ array_combine($openvpn_dev_mode, $openvpn_dev_mode)
+ ));
+
+ $section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ $pconfig['interface'],
+ build_if_list()
+ ));
+
+ $section->addInput(new Form_Input(
+ 'local_port',
+ 'Local port',
+ 'number',
+ $pconfig['local_port']
+ ))->setHelp('Set this option if you would like to bind to a specific port. Leave this blank or enter 0 for a random dynamic port.');
+
+ $section->addInput(new Form_Input(
+ 'sever_addr',
+ 'Server host or address',
+ 'text',
+ $pconfig['sever_addr']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'server_port',
+ 'Server port',
+ 'number',
+ $pconfig['server_port']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'proxy_addr',
+ 'Proxy host or address',
+ 'text',
+ $pconfig['proxy_addr']
+ ));
+
+ $section->addInput(new Form_Select(
+ 'proxy_authtype',
+ 'Proxy Auth. - Extra options',
+ $pconfig['proxy_authtype'],
+ array('none' => 'none', 'basic' => 'basic', 'ntlm' => 'ntlm')
+ ));
+
+ $section->addInput(new Form_Input(
+ 'proxy_user',
+ 'Username',
+ 'text',
+ $pconfig['proxy_user']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'proxy_passwd',
+ 'Password',
+ 'password',
+ $pconfig['proxy_passwd']
+ ));
+
+ $section->addInput(new Form_checkbox(
+ 'resolve_retry',
+ 'Server hostname resolution',
+ 'Infinitely resolve server ',
+ $pconfig['resolve_retry']
+ ))->setHelp('Continuously attempt to resolve the server host name. ' .
+ 'Useful when communicating with a server that is not permanently connected to the Internet.');
+
+ $section->addInput(new Form_Input(
+ 'description',
+ 'Description',
+ 'text',
+ $pconfig['description']
+ ))->setHelp('You may enter a description here for your reference (not parsed).');
+
+ $form->add($section);
+ $section = new Form_Section('User Authentication settings');
+ $section->addClass('authentication');
+
+ $section->addInput(new Form_Input(
+ 'auth_user',
+ 'Username',
+ 'text',
+ $pconfig['auth_user']
+ ))->setHelp('Leave empty when no user name is needed');
+
+ $section->addInput(new Form_Input(
+ 'auth_passwd',
+ 'Password',
+ 'password',
+ $pconfig['auth_passwd']
+ ))->setHelp('Leave empty when no password is needed');
+
+ $form->add($section);
+
+ $section = new Form_Section('Cryptographic settings');
+
+ $section->addInput(new Form_checkbox(
+ 'tlsauth_enable',
+ 'TLS authentication',
+ 'Enable authentication of TLS packets.',
+ $pconfig['tlsauth_enable']
+ ));
+
+ if (!$pconfig['tls']) {
+ $section->addInput(new Form_checkbox(
+ 'autotls_enable',
+ null,
+ 'Automatically generate a shared TLS authentication key.',
+ $pconfig['autotls_enable']
+ ));
+ }
+
+ $section->addInput(new Form_TextArea(
+ 'tls',
+ 'Key',
+ $pconfig['tls']
+ ))->setHelp('Paste your shared key here');
+
+ $section->addInput(new Form_Select(
+ 'caref',
+ 'Peer Certifiacte Authority',
+ $pconfig['caref'],
+ count($a_ca) ? array_combine($a_ca, $a_ca) : ['' => 'None']
+ ))->setHelp(count($a_ca) ? '':sprintf('No Certificate Authorities defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>'));
+
+ $section->addInput(new Form_Select(
+ 'certref',
+ 'Peer Certifiacte Authority',
+ $pconfig['certref'],
+ build_cert_list()
+ ))->setHelp(count($a_cert) ? '':sprintf('No Certificates defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>'));
+
+ if (!$pconfig['shared_key']) {
+ $section->addInput(new Form_checkbox(
+ 'autokey_enable',
+ 'Auto generate',
+ 'Automatically generate a shared key',
+ $pconfig['autokey_enable']
+ ));
+ }
+
+ $section->addInput(new Form_TextArea(
+ 'shared_key',
+ 'Shared Key',
+ $pconfig['shared_key']
+ ))->setHelp('Paste your shared key here');
+
+ $section->addInput(new Form_Select(
+ 'crypto',
+ 'Encryption Algorithm',
+ $pconfig['crypto'],
+ openvpn_get_cipherlist()
+ ));
+
+ $section->addInput(new Form_Select(
+ 'digest',
+ 'Auth digest algorithm',
+ $pconfig['digest'],
+ openvpn_get_digestlist()
+ ))->setHelp('Leave this set to SHA1 unless all clients are set to match. SHA1 is the default for OpenVPN. ');
+
+ $section->addInput(new Form_Select(
+ 'engine',
+ 'Hardware Crypto',
+ $pconfig['engine'],
+ openvpn_get_engines()
+ ));
+
+ $form->add($section);
+
+ $section = new Form_Section('Tunnel settings');
+
+ $section->addInput(new Form_Input(
+ 'tunnel_network',
+ 'IPv4 Tunnel Network',
+ 'text',
+ $pconfig['tunnel_network']
+ ))->setHelp('This is the IPv4 virtual network used for private communications between this client and the sercer ' .
+ 'expressed using CIDR (eg. 10.0.8.0/24). The first network address will be assigned to ' .
+ 'the client virtual interface.');
+
+ $section->addInput(new Form_Input(
+ 'tunnel_networkv6',
+ 'IPv6 Tunnel Network',
+ 'text',
+ $pconfig['tunnel_networkv6']
+ ))->setHelp('This is the IPv6 virtual network used for private ' .
+ 'communications between this client and the server expressed using CIDR (eg. fe80::/64). ' .
+ 'The first network address will be assigned to the server virtual interface.');
+
+ $section->addInput(new Form_Input(
+ 'remote_network',
+ 'IPv4 Remote network(s)',
+ 'text',
+ $pconfig['remote_network']
+ ))->setHelp('IPv4 networks that will be routed through the tunnel, so that a site-to-site VPN can be established without manually ' .
+ 'changing the routing tables. Expressed as a comma-separated list of one or more CIDR ranges. ' .
+ 'If this is a site-to-site VPN, enter the remote LAN/s here. You may leave this blank if you don\'t want a site-to-site VPN.');
+
+ $section->addInput(new Form_Input(
+ 'remote_networkv6',
+ 'IPv6 Remote network(s)',
+ 'text',
+ $pconfig['remote_networkv6']
+ ))->setHelp('These are the IPv6 networks that will be routed through the tunnel, so that a site-to-site VPN can be established without manually ' .
+ 'changing the routing tables. Expressed as a comma-separated list of one or more IP/PREFIX. ' .
+ 'If this is a site-to-site VPN, enter the remote LAN/s here. You may leave this blank if you don\'t want a site-to-site VPN.');
+
+$section->addInput(new Form_Input(
+ 'use_shaper',
+ 'Limit outgoing bandwidth',
+ 'number',
+ $pconfig['use_shaper'],
+ ['min' => 100, 'max' => 100000000, 'placeholder' => 'Between 100 and 100,000,000 bytes/sec']
+ ))->setHelp('Maximum outgoing bandwidth for this tunnel. Leave empty for no limit. The input value has to be something between 100 bytes/sec and 100 Mbytes/sec (entered as bytes per second).');
+
+ $section->addInput(new Form_Select(
+ 'compression',
+ 'Compression',
+ $pconfig['compression'],
+ $openvpn_compression_modes
+ ))->setHelp('Compress tunnel packets using the LZO algorithm. Adaptive compression will dynamically disable compression for a period of time if OpenVPN detects that the data in the packets is not being compressed efficiently.');
+
+ $section->addInput(new Form_checkbox(
+ 'passtos',
+ 'Type-of-Service',
+ 'Set the TOS IP header value of tunnel packets to match the encapsulated packet value.',
+ $pconfig['passtos']
+ ));
+
+ $section->addInput(new Form_checkbox(
+ 'no_tun_ipv6',
+ 'Disable IPv6',
+ 'Don\'t forward IPv6 traffic. ',
+ $pconfig['no_tun_ipv6']
+ ));
+
+ $section->addInput(new Form_checkbox(
+ 'route_no_pull',
+ 'Don\'t pull routes',
+ 'Bars the server from adding routes to the client\'s routing table',
+ $pconfig['route_no_pull']
+ ))->setHelp('This option still allows the server to set the TCP/IP properties of the client\'s TUN/TAP interface. ');
+
+ $section->addInput(new Form_checkbox(
+ 'route_no_exec',
+ 'Don\'t add/remove routes',
+ 'Don\'t add or remove routes automatically',
+ $pconfig['route_no_exec']
+ ))->setHelp('Pass routes to --route-upscript using environmental variables');
+
+ $form->add($section);
+
+ $section = new Form_Section('Advanced Configuration');
+ $section->addClass('advanced');
+
+ $section->addInput(new Form_TextArea(
+ 'custom_options',
+ 'Custom options',
+ $pconfig['custom_options']
+ ))->setHelp('Enter any additional options you would like to add to the OpenVPN server configuration here, separated by semicolon' . '<br />' .
+ 'EXAMPLE: push "route 10.0.0.0 255.255.255.0"');
+
+ $section->addInput(new Form_Select(
+ 'verbosity_level',
+ 'Verbosity level',
+ $pconfig['verbosity_level'],
+ $openvpn_verbosity_level
+ ))->setHelp('Each level shows all info from the previous levels. Level 3 is recommended if you want a good summary of what\'s happening without being swamped by output' . '<br /><br />' .
+ 'None: Only fatal errors' . '<br />' .
+ 'Default: Normal usage range' . '<br />' .
+ '5: Output R and W characters to the console for each packet read and write, uppercase is used for TCP/UDP packets and lowercase is used for TUN/TAP packets' .'<br />' .
+ '6: Debug info range');
+
+ $section->addInput(new Form_Input(
+ 'act',
+ null,
+ 'hidden',
+ $act
+ ));
+
+ if (isset($id) && $a_server[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+ }
+
+ $form->add($section);
+ print($form);
+else:
?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn openvpn client">
- <tr>
- <td class="tabnavtbl">
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Server"), false, "vpn_openvpn_server.php");
- $tab_array[] = array(gettext("Client"), true, "vpn_openvpn_client.php");
- $tab_array[] = array(gettext("Client Specific Overrides"), false, "vpn_openvpn_csc.php");
- $tab_array[] = array(gettext("Wizards"), false, "wizard.php?xml=openvpn_wizard.xml");
- add_package_tabs("openvpn-client-export", $tab_array);
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
-
- <?php if ($act == "new" || $act == "edit"): ?>
-
- <form action="vpn_openvpn_client.php" method="post" name="iform" id="iform" onsubmit="presubmit()">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="general information">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("General information"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="0" cellspacing="0" summary="enable disable client">
- <tr>
- <td>
- <?php set_checked($pconfig['disable'], $chk); ?>
- <input name="disable" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- &nbsp;
- <span class="vexpl">
- <strong><?=gettext("Disable this client"); ?></strong><br />
- </span>
- </td>
- </tr>
- </table>
- <?=gettext("Set this option to disable this client without removing it from the list"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Server Mode");?></td>
- <td width="78%" class="vtable">
- <select name="mode" id="mode" class="formselect" onchange="mode_change()">
- <?php
- foreach ($openvpn_client_modes as $name => $desc):
- $selected = "";
- if ($pconfig['mode'] == $name) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$name;?>" <?=$selected;?>><?=$desc;?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol");?></td>
- <td width="78%" class="vtable">
- <select name='protocol' class="formselect">
- <?php
- foreach ($openvpn_prots as $prot):
- $selected = "";
- if ($pconfig['protocol'] == $prot) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$prot;?>" <?=$selected;?>><?=$prot;?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Device mode");?></td>
- <td width="78%" class="vtable">
- <select name='dev_mode' class="formselect" onchange="dev_mode_change()">
- <?php
- foreach ($openvpn_dev_mode as $mode):
- $selected = "";
- if ($pconfig['dev_mode'] == $mode) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$mode;?>" <?=$selected;?>><?=$mode;?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
- <td width="78%" class="vtable">
- <select name="interface" class="formselect">
- <?php
- $interfaces = get_configured_interface_with_descr();
- $carplist = get_configured_carp_interface_list();
- foreach ($carplist as $cif => $carpip) {
- $interfaces[$cif.'|'.$carpip] = $carpip." (".get_vip_descr($carpip).")";
- }
- $aliaslist = get_configured_ip_aliases_list();
- foreach ($aliaslist as $aliasip => $aliasif) {
- $interfaces[$aliasif.'|'.$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
- }
- $grouplist = return_gateway_groups_array();
- foreach ($grouplist as $name => $group) {
- if ($group['ipprotocol'] != inet) {
- continue;
- }
- if ($group[0]['vip'] <> "") {
- $vipif = $group[0]['vip'];
- } else {
- $vipif = $group[0]['int'];
- }
- $interfaces[$name] = "GW Group {$name}";
- }
- $interfaces['lo0'] = "Localhost";
- $interfaces['any'] = "any";
- foreach ($interfaces as $iface => $ifacename):
- $selected = "";
- if ($iface == $pconfig['interface']) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$iface;?>" <?=$selected;?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
- <?php endforeach; ?>
- </select> <br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Local port");?></td>
- <td width="78%" class="vtable">
- <input name="local_port" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($pconfig['local_port']);?>" />
- <br />
- <?=gettext("Set this option if you would like to bind to a specific port. Leave this blank or enter 0 for a random dynamic port."); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Server host or address");?></td>
- <td width="78%" class="vtable">
- <input name="server_addr" type="text" class="formfld unknown" size="30" value="<?=htmlspecialchars($pconfig['server_addr']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Server port");?></td>
- <td width="78%" class="vtable">
- <input name="server_port" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($pconfig['server_port']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Proxy host or address");?></td>
- <td width="78%" class="vtable">
- <input name="proxy_addr" type="text" class="formfld unknown" size="30" value="<?=htmlspecialchars($pconfig['proxy_addr']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Proxy port");?></td>
- <td width="78%" class="vtable">
- <input name="proxy_port" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($pconfig['proxy_port']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Proxy authentication extra options");?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="proxy authentication">
- <tr>
- <td align="right" width="25%">
- <span class="vexpl">
- &nbsp;<?=gettext("Authentication method"); ?> :&nbsp;
- </span>
- </td>
- <td>
- <select name="proxy_authtype" id="proxy_authtype" class="formfld select" onchange="useproxy_changed()">
- <option value="none" <?php if ($pconfig['proxy_authtype'] == "none") echo "selected=\"selected\""; ?>><?=gettext("none"); ?></option>
- <option value="basic" <?php if ($pconfig['proxy_authtype'] == "basic") echo "selected=\"selected\""; ?>><?=gettext("basic"); ?></option>
- <option value="ntlm" <?php if ($pconfig['proxy_authtype'] == "ntlm") echo "selected=\"selected\""; ?>><?=gettext("ntlm"); ?></option>
- </select>
- </td>
- </tr>
- </table>
- <br />
- <table border="0" cellpadding="2" cellspacing="0" id="proxy_authtype_opts" style="display:none" summary="proxy authentication options">
- <tr>
- <td align="right" width="25%">
- <span class="vexpl">
- &nbsp;<?=gettext("Username"); ?> :&nbsp;
- </span>
- </td>
- <td>
- <input name="proxy_user" id="proxy_user" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['proxy_user']);?>" />
- </td>
- </tr>
- <tr>
- <td align="right" width="25%">
- <span class="vexpl">
- &nbsp;<?=gettext("Password"); ?> :&nbsp;
- </span>
- </td>
- <td>
- <input name="proxy_passwd" id="proxy_passwd" type="password" class="formfld pwd" size="20" value="<?=htmlspecialchars($pconfig['proxy_passwd']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Server host name resolution"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="server host name resolution">
- <tr>
- <td>
- <?php set_checked($pconfig['resolve_retry'], $chk); ?>
- <input name="resolve_retry" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Infinitely resolve server"); ?>
- </span>
- </td>
- </tr>
- </table>
- <?=gettext("Continuously attempt to resolve the server host " .
- "name. Useful when communicating with a server " .
- "that is not permanently connected to the Internet"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="description" type="text" class="formfld unknown" size="30" value="<?=htmlspecialchars($pconfig['description']);?>" />
- <br />
- <?=gettext("You may enter a description here for your reference (not parsed)"); ?>.
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr id='userpassheader'>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("User Authentication Settings"); ?></td>
- </tr>
- <tr id='userpass'>
- <td width="22%" valign="top" class="vncell"><?=gettext("User name/pass"); ?></td>
- <td width="78%" class="vtable">
- <?=gettext("Leave empty when no user name and/or password are needed."); ?>
- <br/>
- <table border="0" cellpadding="2" cellspacing="0" summary="user name password">
- <tr>
- <td align="right" width="25%">
- <span class="vexpl">
- &nbsp;<?=gettext("Username"); ?> :&nbsp;
- </span>
- </td>
- <td>
- <input name="auth_user" id="auth_user" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['auth_user']);?>" />
- </td>
- </tr>
- <tr>
- <td align="right" width="25%">
- <span class="vexpl">
- &nbsp;<?=gettext("Password"); ?> :&nbsp;
- </span>
- </td>
- <td>
- <input name="auth_pass" id="auth_pass" type="password" class="formfld pwd" size="20" value="<?=htmlspecialchars($pconfig['auth_pass']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Cryptographic Settings"); ?></td>
- </tr>
- <tr id="tls">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("TLS Authentication"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="tls authentication">
- <tr>
- <td>
- <?php set_checked($pconfig['tlsauth_enable'], $chk); ?>
- <input name="tlsauth_enable" id="tlsauth_enable" type="checkbox" value="yes" <?=$chk;?> onclick="tlsauth_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Enable authentication of TLS packets"); ?>.
- </span>
- </td>
- </tr>
- </table>
- <?php if (!$pconfig['tls']): ?>
- <table border="0" cellpadding="2" cellspacing="0" id="tlsauth_opts" summary="tls authentication options">
- <tr>
- <td>
- <?php set_checked($pconfig['autotls_enable'], $chk); ?>
- <input name="autotls_enable" id="autotls_enable" type="checkbox" value="yes" <?=$chk;?> onclick="autotls_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Automatically generate a shared TLS authentication key"); ?>.
- </span>
- </td>
- </tr>
- </table>
- <?php endif; ?>
- <table border="0" cellpadding="2" cellspacing="0" id="autotls_opts" summary="tls authentication options">
- <tr>
- <td>
- <textarea name="tls" cols="65" rows="7" class="formpre"><?=htmlspecialchars($pconfig['tls']);?></textarea>
- <br />
- <?=gettext("Paste your shared key here"); ?>.
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr id="tls_ca">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Peer Certificate Authority"); ?></td>
- <td width="78%" class="vtable">
- <?php if (count($a_ca)): ?>
- <select name='caref' class="formselect">
- <?php
- foreach ($a_ca as $ca):
- $selected = "";
- if ($pconfig['caref'] == $ca['refid']) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$ca['refid'];?>" <?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
- <?php endforeach; ?>
- </select>
- <?php else: ?>
- <b>No Certificate Authorities defined.</b> <br />Create one under <a href="system_camanager.php">System &gt; Cert Manager</a>.
- <?php endif; ?>
- </td>
- </tr>
- <tr id="tls_cert">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Client Certificate"); ?></td>
- <td width="78%" class="vtable">
- <select name='certref' class="formselect">
- <?php
- foreach ($a_cert as $cert):
- $selected = "";
- $caname = "";
- $inuse = "";
- $revoked = "";
- $ca = lookup_ca($cert['caref']);
- if ($ca) {
- $caname = " (CA: " . htmlspecialchars($ca['descr']) . ")";
- }
- if ($pconfig['certref'] == $cert['refid']) {
- $selected = "selected=\"selected\"";
- }
- if (cert_in_use($cert['refid'])) {
- $inuse = " *In Use";
- }
- if (is_cert_revoked($cert)) {
- $revoked = " *Revoked";
- }
- ?>
- <option value="<?=$cert['refid'];?>" <?=$selected;?>><?=htmlspecialchars($cert['descr']) . $caname . $inuse . $revoked;?></option>
- <?php endforeach; ?>
- <option value="" <?PHP if (empty($pconfig['certref'])) echo "selected=\"selected\""; ?>>None (Username and/or Password required)</option>
- </select>
- <?php if (!count($a_cert)): ?>
- <b>No Certificates defined.</b> <br />Create one under <a href="system_certmanager.php">System &gt; Cert Manager</a> if one is required for this connection.
- <?php endif; ?>
- </td>
- </tr>
- <tr id="psk">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Shared Key"); ?></td>
- <td width="78%" class="vtable">
- <?php if (!$pconfig['shared_key']): ?>
- <table border="0" cellpadding="2" cellspacing="0" summary="shared key">
- <tr>
- <td>
- <?php set_checked($pconfig['autokey_enable'], $chk); ?>
- <input name="autokey_enable" type="checkbox" value="yes" <?=$chk;?> onclick="autokey_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Automatically generate a shared key"); ?>.
- </span>
- </td>
- </tr>
- </table>
- <?php endif; ?>
- <table border="0" cellpadding="2" cellspacing="0" id="autokey_opts" summary="shared key options">
- <tr>
- <td>
- <textarea name="shared_key" cols="65" rows="7" class="formpre"><?=htmlspecialchars($pconfig['shared_key']);?></textarea>
- <br />
- <?=gettext("Paste your shared key here"); ?>.
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Encryption algorithm"); ?></td>
- <td width="78%" class="vtable">
- <select name="crypto" class="formselect">
- <?php
- $cipherlist = openvpn_get_cipherlist();
- foreach ($cipherlist as $name => $desc):
- $selected = "";
- if ($name == $pconfig['crypto']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$name;?>"<?=$selected?>>
- <?=htmlspecialchars($desc);?>
- </option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Auth Digest Algorithm"); ?></td>
- <td width="78%" class="vtable">
- <select name="digest" class="formselect">
- <?php
- $digestlist = openvpn_get_digestlist();
- foreach ($digestlist as $name => $desc):
- $selected = "";
- if ($name == $pconfig['digest']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$name;?>"<?=$selected?>>
- <?=htmlspecialchars($desc);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br /><?PHP echo gettext("NOTE: Leave this set to SHA1 unless the server is set to match. SHA1 is the default for OpenVPN."); ?>
- </td>
- </tr>
- <tr id="engine">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Hardware Crypto"); ?></td>
- <td width="78%" class="vtable">
- <select name="engine" class="formselect">
- <?php
- $engines = openvpn_get_engines();
- foreach ($engines as $name => $desc):
- $selected = "";
- if ($name == $pconfig['engine']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$name;?>"<?=$selected?>>
- <?=htmlspecialchars($desc);?>
- </option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Tunnel Settings"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Tunnel Network"); ?></td>
- <td width="78%" class="vtable">
- <input name="tunnel_network" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['tunnel_network']);?>" />
- <br />
- <?=gettext("This is the virtual network used for private " .
- "communications between this client and the " .
- "server expressed using CIDR (eg. 10.0.8.0/24). " .
- "The first network address is assumed to be the " .
- "server address and the second network address " .
- "will be assigned to the client virtual " .
- "interface"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Tunnel Network"); ?></td>
- <td width="78%" class="vtable">
- <input name="tunnel_networkv6" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['tunnel_networkv6']);?>" />
- <br />
- <?=gettext("This is the IPv6 virtual network used for private " .
- "communications between this client and the " .
- "server expressed using CIDR (eg. fe80::/64). " .
- "The first network address is assumed to be the " .
- "server address and the second network address " .
- "will be assigned to the client virtual " .
- "interface"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Remote Network/s"); ?></td>
- <td width="78%" class="vtable">
- <input name="remote_network" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['remote_network']);?>" />
- <br />
- <?=gettext("These are the IPv4 networks that will be routed through " .
- "the tunnel, so that a site-to-site VPN can be " .
- "established without manually changing the routing tables. " .
- "Expressed as a comma-separated list of one or more CIDR ranges. " .
- "If this is a site-to-site VPN, enter the " .
- "remote LAN/s here. You may leave this blank to " .
- "only communicate with other clients"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Remote Network/s"); ?></td>
- <td width="78%" class="vtable">
- <input name="remote_networkv6" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['remote_networkv6']);?>" />
- <br />
- <?=gettext("These are the IPv6 networks that will be routed through " .
- "the tunnel, so that a site-to-site VPN can be " .
- "established without manually changing the routing tables. " .
- "Expressed as a comma-separated list of one or more IP/PREFIX. " .
- "If this is a site-to-site VPN, enter the " .
- "remote LAN/s here. You may leave this blank to " .
- "only communicate with other clients"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Limit outgoing bandwidth");?></td>
- <td width="78%" class="vtable">
- <input name="use_shaper" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($pconfig['use_shaper']);?>" />
- <br />
- <?=gettext("Maximum outgoing bandwidth for this tunnel. " .
- "Leave empty for no limit. The input value has " .
- "to be something between 100 bytes/sec and 100 " .
- "Mbytes/sec (entered as bytes per second)"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Compression"); ?></td>
- <td width="78%" class="vtable">
- <select name="compression" class="formselect">
- <?php
- foreach ($openvpn_compression_modes as $cmode => $cmodedesc):
- $selected = "";
- if ($cmode == $pconfig['compression']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?= $cmode ?>" <?= $selected ?>><?= $cmodedesc ?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <?=gettext("Compress tunnel packets using the LZO algorithm. Adaptive compression will dynamically disable compression for a period of time if OpenVPN detects that the data in the packets is not being compressed efficiently."); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Type-of-Service"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="type-of-service">
- <tr>
- <td>
- <?php set_checked($pconfig['passtos'], $chk); ?>
- <input name="passtos" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Set the TOS IP header value of tunnel packets to match the encapsulated packet value"); ?>.
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <tr id="chkboxNoTunIPv6">
- <td width="22%" valign="top" class="vncell"><?=gettext("Disable IPv6"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="disable-ipv6">
- <tr>
- <td>
- <?php set_checked($pconfig['no_tun_ipv6'], $chk); ?>
- <input name="no_tun_ipv6" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Don't forward IPv6 traffic"); ?>.
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <tr id="chkboxRouteNoPull">
- <td width="22%" valign="top" class="vncell"><?=gettext("Don't pull routes"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="dont-pull-routes">
- <tr>
- <td>
- <?php set_checked($pconfig['route_no_pull'], $chk); ?>
- <input name="route_no_pull" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("This option effectively bars the server from adding routes to the client's routing table, however note that this option still allows the server to set the TCP/IP properties of the client's TUN/TAP interface"); ?>.
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <tr id="chkboxRouteNoExec">
- <td width="22%" valign="top" class="vncell"><?=gettext("Don't add/remove routes"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="dont-exec-routes">
- <tr>
- <td>
- <?php set_checked($pconfig['route_no_exec'], $chk); ?>
- <input name="route_no_exec" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Don't add or remove routes automatically. Instead pass routes to "); ?> <strong>--route-up</strong> <?=gettext("script using environmental variables"); ?>.
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="client_opts" summary="advance configuration">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Advanced"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="advance configuration">
- <tr>
- <td>
- <textarea rows="6" cols="78" name="custom_options" id="custom_options"><?=htmlspecialchars($pconfig['custom_options']);?></textarea><br />
- <?=gettext("Enter any additional options you would like to add to the OpenVPN client configuration here, separated by a semicolon"); ?><br />
- <?=gettext("EXAMPLE:"); ?> <strong>remote server.example.com 1194;</strong> or <strong>remote 1.2.3.4 1194;</strong>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <tr id="comboboxVerbosityLevel">
- <td width="22%" valign="top" class="vncell"><?=gettext("Verbosity level");?></td>
- <td width="78%" class="vtable">
- <select name="verbosity_level" class="formselect">
- <?php
- foreach ($openvpn_verbosity_level as $verb_value => $verb_desc):
- $selected = "";
- if ($pconfig['verbosity_level'] == $verb_value) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$verb_value;?>" <?=$selected;?>><?=$verb_desc;?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <?=gettext("Each level shows all info from the previous levels. Level 3 is recommended if you want a good summary of what's happening without being swamped by output"); ?>.<br /> <br />
- <strong>none</strong> -- <?=gettext("No output except fatal errors"); ?>. <br />
- <strong>default</strong>-<strong>4</strong> -- <?=gettext("Normal usage range"); ?>. <br />
- <strong>5</strong> -- <?=gettext("Output R and W characters to the console for each packet read and write, uppercase is used for TCP/UDP packets and lowercase is used for TUN/TAP packets"); ?>. <br />
- <strong>6</strong>-<strong>11</strong> -- <?=gettext("Debug info range"); ?>.
- </td>
- </tr>
-
- </table>
-
- <br />
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="icons">
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input name="act" type="hidden" value="<?=$act;?>" />
- <?php if (isset($id) && $a_client[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </form>
-
- <?php else: ?>
-
- <table class="sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="list of openvpn clients">
- <thead>
- <tr>
- <td width="10%" class="listhdrr"><?=gettext("Disabled"); ?></td>
- <td width="10%" class="listhdrr"><?=gettext("Protocol"); ?></td>
- <td width="30%" class="listhdrr"><?=gettext("Server"); ?></td>
- <td width="40%" class="listhdrr"><?=gettext("Description"); ?></td>
- <td width="10%" class="list"></td>
- </tr>
- </thead>
- <tfoot>
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('OpenVPN Clients')?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td class="list" colspan="4"></td>
- <td class="list">
- <a href="vpn_openvpn_client.php?act=new"><img src="./themes/<?=$g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add client"); ?>" width="17" height="17" border="0" alt="add" />
- </a>
- </td>
- </tr>
- <tr>
- <td colspan="4">
- <p>
- <?=gettext("Additional OpenVPN clients can be added here.");?>
- </p>
- </td>
+ <th><?=gettext("Protocol")?></th>
+ <th><?=gettext("Server")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><!-- Buttons --></th>
</tr>
- </tfoot>
- <tbody>
- <?php
- $i = 0;
- foreach ($a_client as $client):
- $disabled = "NO";
- if (isset($client['disable'])) {
- $disabled = "YES";
- }
- $server = "{$client['server_addr']}:{$client['server_port']}";
- ?>
- <tr ondblclick="document.location='vpn_openvpn_client.php?act=edit&amp;id=<?=$i;?>'">
- <td class="listlr">
- <?=$disabled;?>
- </td>
- <td class="listr">
- <?=htmlspecialchars($client['protocol']);?>
+ </thead>
+
+ <tbody>
+<?php
+ $i = 0;
+ foreach($a_client as $client):
+ $server = "{$client['server_addr']}:{$client['server_port']}";
+?>
+ <tr <?=isset($server['disable']) ? 'class="disabled"':''?>>
+ <td>
+ <?=htmlspecialchars($client['protocol'])?>
</td>
- <td class="listr">
- <?=htmlspecialchars($server);?>
+ <td>
+ <?=htmlspecialchars($server)?>
</td>
- <td class="listbg">
- <?=htmlspecialchars($client['description']);?>
+ <td>
+ <?=htmlspecialchars($client['description'])?>
</td>
- <td valign="middle" class="list nowrap">
- <a href="vpn_openvpn_client.php?act=edit&amp;id=<?=$i;?>">
- <img src="./themes/<?=$g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit client"); ?>" width="17" height="17" border="0" alt="edit" />
- </a>
- &nbsp;
- <a href="vpn_openvpn_client.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this client?"); ?>')">
- <img src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete client"); ?>" width="17" height="17" border="0" alt="delete" />
- </a>
+ <td>
+ <a href="vpn_openvpn_client.php?act=edit&amp;id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext("Edit")?></a>
+ <a href="vpn_openvpn_client.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext("Delete")?></a>
</td>
</tr>
- <?php
- $i++;
- endforeach;
- ?>
- <tr style="display:none;"><td></td></tr>
- </tbody>
- </table>
-
- <?php endif; ?>
-
- </td>
- </tr>
-</table>
+<?php
+ $i++;
+ endforeach;
+?>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<nav class="action-buttons">
+ <a href="vpn_openvpn_client.php?act=new" class="btn btn-sm btn-success">
+ <?=gettext("Add server")?>
+ </a>
+</nav>
+
+<?php
+endif;
+
+// Note:
+// The following *_change() functions were converted from Javascript/DOM to JQuery but otherwise
+// mostly left unchanged. The logic on this form is complex andthis works!
+?>
+
<script type="text/javascript">
//<![CDATA[
-mode_change();
-autokey_change();
-tlsauth_change();
-useproxy_changed();
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+events.push(function(){
+
+ function mode_change() {
+ value = $('#mode').val();
+
+ switch(value) {
+ case "p2p_tls":
+ hideInput('tls', false);
+ hideCheckbox('tlsauth_enable', false);
+ hideCheckbox('autotls_enable', false);
+ hideInput('caref', false);
+ hideInput('certreft', false);
+ hideClass('authentication', false);
+ hideCheckbox('autokey_enable', true);
+ hideInput('shared_key', true);
+ break;
+ case "p2p_shared_key":
+ hideInput('tls', true);
+ hideCheckbox('tlsauth_enable', true);
+ hideCheckbox('autotls_enable', true);
+ hideInput('caref', true);
+ hideInput('certreft', true);
+ hideClass('authentication', true);
+ hideCheckbox('autokey_enable', false);
+ hideInput('shared_key', false);
+ break;
+ }
+ }
-<?php
+ function dev_mode_change() {
+ hideCheckbox('no_tun_ipv6', ($('#dev_mode').val() == 'tap'));
+ }
-/* local utility functions */
+ function autokey_change() {
+ hideInput('shared_key', $('#autokey_enable').prop('checked'));
+ }
-function set_checked($var, & $chk) {
- if ($var) {
- $chk = "checked=\"checked\"";
- } else {
- $chk = "";
+ function useproxy_changed() {
+ hideInput('proxy_user', ($('#proxy_authtype').val() == 'none'));
+ hideInput('proxy_passwd', ($('#proxy_authtype').val() == 'none'));
}
-}
-?>
+ function tlsauth_change() {
+ var hide = ! $('#tlsauth_enable').prop('checked')
+
+ <?php if (!$pconfig['tls']): ?>
+ hideCheckbox('autotls_enable', hide);
+ <?php endif; ?>
+
+ autotls_change();
+ }
+
+ function autotls_change() {
+
+ <?php if (!$pconfig['tls']): ?>
+ autocheck = $('#autotls_enable').prop('checked');
+ <?php else: ?>
+ autocheck = false;
+ <?php endif; ?>
+
+ if ($('#tlsauth_enable').prop('checked') && !autocheck)
+ hideInput('tls', false);
+ else
+ hideInput('tls', true);
+ }
+
+ // ---------- Library of show/hide functions ----------------------------------------------------------------------
+
+ // Hides the <div> in which the specified input element lives so that the input,
+ // its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
+
+ // Hides the <div> in which the specified checkbox lives so that the checkbox,
+ // its label and help text are hidden
+ function hideCheckbox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
+ }
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
+ }
+
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ // ---------- Monitor elements for change and call the appropriate display functions ------------------------------
+
+ // TLS Authorization
+ $('#tlsauth_enable').click(function () {
+ tlsauth_change();
+ });
+
+ // Auto key
+ $('#autokey_enable').click(function () {
+ autokey_change();
+ });
+
+ // Mode
+ $('#mode').click(function () {
+ mode_change();
+ });
+
+ // Use proxy
+ $('#proxy_authtype').click(function () {
+ useproxy_changed();
+ });
+
+ // Tun/tap
+ $('#dev_mode').click(function () {
+ dev_mode_change();
+ });
+
+ // ---------- Set initial page display state ----------------------------------------------------------------------
+ mode_change();
+ autokey_change();
+ tlsauth_change();
+ useproxy_changed();
+ dev_mode_change();
+});
+//]]>
+</script>
+
+<?php include("foot.inc");
diff --git a/src/usr/local/www/vpn_openvpn_csc.php b/src/usr/local/www/vpn_openvpn_csc.php
index 356db7f..d3ffd22 100644
--- a/src/usr/local/www/vpn_openvpn_csc.php
+++ b/src/usr/local/www/vpn_openvpn_csc.php
@@ -61,7 +61,6 @@ if (isset($_POST['act'])) {
}
if ($_GET['act'] == "del") {
-
if (!$a_csc[$id]) {
pfSenseHeader("vpn_openvpn_csc.php");
exit;
@@ -100,6 +99,7 @@ if ($_GET['act'] == "edit") {
$pconfig['dns_server2'] = $a_csc[$id]['dns_server2'];
$pconfig['dns_server3'] = $a_csc[$id]['dns_server3'];
$pconfig['dns_server4'] = $a_csc[$id]['dns_server4'];
+
if ($pconfig['dns_server1'] ||
$pconfig['dns_server2'] ||
$pconfig['dns_server3'] ||
@@ -109,6 +109,7 @@ if ($_GET['act'] == "edit") {
$pconfig['ntp_server1'] = $a_csc[$id]['ntp_server1'];
$pconfig['ntp_server2'] = $a_csc[$id]['ntp_server2'];
+
if ($pconfig['ntp_server1'] ||
$pconfig['ntp_server2']) {
$pconfig['ntp_server_enable'] = true;
@@ -120,6 +121,7 @@ if ($_GET['act'] == "edit") {
$pconfig['wins_server1'] = $a_csc[$id]['wins_server1'];
$pconfig['wins_server2'] = $a_csc[$id]['wins_server2'];
+
if ($pconfig['wins_server1'] ||
$pconfig['wins_server2']) {
$pconfig['wins_server_enable'] = true;
@@ -210,7 +212,6 @@ if ($_POST) {
do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
if (!$input_errors) {
-
$csc = array();
$csc['custom_options'] = $pconfig['custom_options'];
@@ -220,14 +221,12 @@ if ($_POST) {
$csc['common_name'] = $pconfig['common_name'];
$csc['block'] = $pconfig['block'];
$csc['description'] = $pconfig['description'];
-
$csc['tunnel_network'] = $pconfig['tunnel_network'];
$csc['local_network'] = $pconfig['local_network'];
$csc['local_networkv6'] = $pconfig['local_networkv6'];
$csc['remote_network'] = $pconfig['remote_network'];
$csc['remote_networkv6'] = $pconfig['remote_networkv6'];
$csc['gwredir'] = $pconfig['gwredir'];
-
$csc['push_reset'] = $pconfig['push_reset'];
if ($pconfig['dns_domain_enable']) {
@@ -251,7 +250,6 @@ if ($_POST) {
$csc['netbios_scope'] = $pconfig['netbios_scope'];
if ($pconfig['netbios_enable']) {
-
if ($pconfig['wins_server_enable']) {
$csc['wins_server1'] = $pconfig['wins_server1'];
$csc['wins_server2'] = $pconfig['wins_server2'];
@@ -282,587 +280,403 @@ if ($_POST) {
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
-
-function dns_domain_change() {
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+$tab_array = array();
+$tab_array[] = array(gettext("Server"), false, "vpn_openvpn_server.php");
+$tab_array[] = array(gettext("Client"), false, "vpn_openvpn_client.php");
+$tab_array[] = array(gettext("Client Specific Overrides"), true, "vpn_openvpn_csc.php");
+$tab_array[] = array(gettext("Wizards"), false, "wizard.php?xml=openvpn_wizard.xml");
+add_package_tabs("OpenVPN", $tab_array);
+display_top_tabs($tab_array);
+
+if($act=="new" || $act=="edit"):
+ require('classes/Form.class.php');
+
+ $form = new Form();
+
+ $section = new Form_Section('General Information');
+
+ $section->addInput(new Form_Checkbox(
+ 'disable',
+ 'Disable',
+ 'Disable this override',
+ $pconfig['disable']
+ ))->setHelp('Set this option to disable this client-specific override without removing it from the list.');
+
+ $section->addInput(new Form_Input(
+ 'common_name',
+ 'Common name',
+ 'text',
+ $pconfig['common_name']
+ ))->setHelp('Enter the client\'s X.509 common name.');
+
+ $section->addInput(new Form_Input(
+ 'description',
+ 'Description',
+ 'text',
+ $pconfig['description']
+ ))->setHelp('You may enter a description here for your reference (not parsed). ');
+
+ $section->addInput(new Form_Checkbox(
+ 'block',
+ 'Connection blocking',
+ 'Block this client connection based on its common name. ',
+ $pconfig['block']
+ ))->setHelp('Don\'t use this option to permanently disable a client due to a compromised key or password. Use a CRL (certificate revocation list) instead. ');
+
+ $form->add($section);
+
+ $section = new Form_Section('Tunnel settings');
+
+ $section->addInput(new Form_Input(
+ 'tunnel_network',
+ 'Tunnel Network',
+ 'text',
+ $pconfig['tunnel_network']
+ ))->setHelp('This is the virtual network used for private communications between this client and the server expressed using CIDR (eg. 10.0.8.0/24). ' .
+ 'The first network address is assumed to be the server address and the second network address will be assigned to the client virtual interface. ');
+
+ $section->addInput(new Form_Input(
+ 'local_network',
+ 'IPv4 Local Network/s',
+ 'text',
+ $pconfig['local_network']
+ ))->setHelp('These are the IPv4 networks that will be accessible from this particular client. Expressed as a comma-separated list of one or more CIDR ranges. ' . '<br />' .
+ 'NOTE: You do not need to specify networks here if they have already been defined on the main server configuration.');
+
+ $section->addInput(new Form_Input(
+ 'local_networkv6',
+ 'IPv6 Local Network/s',
+ 'text',
+ $pconfig['local_networkv6']
+ ))->setHelp('These are the IPv4 networks that will be accessible from this particular client. Expressed as a comma-separated list of one or more IP/PREFIX networks.' . '<br />' .
+ 'NOTE: You do not need to specify networks here if they have already been defined on the main server configuration.');
+
+ $section->addInput(new Form_Input(
+ 'remote_network',
+ 'IPv4 Remote Network/s',
+ 'text',
+ $pconfig['remote_network']
+ ))->setHelp('These are the IPv4 networks that will be routed to this client specifically using iroute, so that a site-to-site VPN can be established. ' .
+ 'Expressed as a comma-separated list of one or more CIDR ranges. You may leave this blank if there are no client-side networks to be routed.' . '<br />' .
+ 'NOTE: Remember to add these subnets to the IPv4 Remote Networks list on the corresponding OpenVPN server settings.');
+
+ $section->addInput(new Form_Input(
+ 'remote_networkv6',
+ 'IPv6 Remote Network/s',
+ 'text',
+ $pconfig['remote_networkv6']
+ ))->setHelp('These are the IPv4 networks that will be routed to this client specifically using iroute, so that a site-to-site VPN can be established. ' .
+ 'Expressed as a comma-separated list of one or more IP/PREFIX networks. You may leave this blank if there are no client-side networks to be routed.' . '<br />' .
+ 'NOTE: Remember to add these subnets to the IPv6 Remote Networks list on the corresponding OpenVPN server settings.');
+
+ $section->addInput(new Form_Checkbox(
+ 'gwredir',
+ 'Redirect Gateway',
+ 'Force all client generated traffic through the tunnel.',
+ $pconfig['gwredir']
+ ));
+
+ $form->add($section);
+
+ $section = new Form_Section('Client settings');
+
+ // Default domain name
+ $section->addInput(new Form_Checkbox(
+ 'push_reset',
+ 'Server Definitions',
+ 'Prevent this client from receiving any server-defined client settings. ',
+ $pconfig['push_reset']
+ ));
+
+ $section->addInput(new Form_Checkbox(
+ 'dns_domain_enable',
+ 'DNS Default Domain',
+ 'Provide a default domain name to clients',
+ $pconfig['dns_domain_enable']
+ ))->toggles('.dnsdomain');
+
+ $group = new Form_Group('DNS Domain');
+ $group->addClass('dnsdomain');
+
+ $group->add(new Form_Input(
+ 'dns_domain',
+ 'DNS Domain',
+ 'text',
+ $pconfig['dns_domain']
+ ));
+
+ $section->add($group);
+
+ // DNS servers
+ $section->addInput(new Form_Checkbox(
+ 'dns_server_enable',
+ 'DNS Servers',
+ 'Provide a DNS server list to clients',
+ $pconfig['dns_server_enable']
+ ))->toggles('.dnsservers');
+
+ $group = new Form_Group(null);
+ $group->addClass('dnsservers');
+
+ $group->add(new Form_Input(
+ 'dns_server1',
+ null,
+ 'text',
+ $pconfig['dns_server1']
+ ))->setHelp('Server 1');
+
+ $group->add(new Form_Input(
+ 'dns_server2',
+ null,
+ 'text',
+ $pconfig['dns_server2']
+ ))->setHelp('Server 2');
+
+ $group->add(new Form_Input(
+ 'dns_server3',
+ null,
+ 'text',
+ $pconfig['dns_server3']
+ ))->setHelp('Server 3');
+
+ $group->add(new Form_Input(
+ 'dns_server4',
+ null,
+ 'text',
+ $pconfig['dns_server4']
+ ))->setHelp('Server 4');
+
+ $section->add($group);
+
+ // NTP servers
+ $section->addInput(new Form_Checkbox(
+ 'ntp_server_enable',
+ 'NTP Servers',
+ 'Provide an NTP server list to clients',
+ $pconfig['ntp_server_enable']
+ ))->toggles('.ntpservers');
+
+ $group = new Form_Group(null);
+ $group->addClass('ntpservers');
+
+ $group->add(new Form_Input(
+ 'ntp_server1',
+ null,
+ 'text',
+ $pconfig['ntp_server1']
+ ))->setHelp('Server 1');
+
+ $group->add(new Form_Input(
+ 'ntp_server2',
+ null,
+ 'text',
+ $pconfig['ntp_server2']
+ ))->setHelp('Server 2');
+
+ $section->add($group);
+
+ // NTP servers - For this section we need to use Javascript hiding since there
+ // are nested toggles
+ $section->addInput(new Form_Checkbox(
+ 'netbios_enable',
+ 'Netbios Option',
+ 'Enable Netbios over TCP/IP',
+ $pconfig['netbios_enable']
+ ))->setHelp('If this option is not set, all NetBIOS-over-TCP/IP options (including WINS) will be disabled. ');
+
+ $section->addInput(new Form_Select(
+ 'netbios_ntype',
+ 'Node Type',
+ $pconfig['netbios_ntype'],
+ $netbios_nodetypes
+ ))->setHelp('Possible options: b-node (broadcasts), p-node (point-to-point name queries to a WINS server), m-node (broadcast then query name server), ' .
+ 'and h-node (query name server, then broadcast). ');
+
+ $section->addInput(new Form_Input(
+ 'netbios_scope',
+ null,
+ 'text',
+ $pconfig['netbios_scope']
+ ))->setHelp('A NetBIOS Scope ID provides an extended naming service for NetBIOS over TCP/IP. ' .
+ 'The NetBIOS scope ID isolates NetBIOS traffic on a single network to only those nodes with the same NetBIOS scope ID. ');
+
+ $section->addInput(new Form_Checkbox(
+ 'wins_server_enable',
+ 'WINS servers',
+ 'Provide a WINS server list to clients',
+ $pconfig['wins_server_enable']
+ ));
+
+ $group = new Form_Group(null);
+
+ $group->add(new Form_Input(
+ 'wins_server1',
+ null,
+ 'text',
+ $pconfig['wins_server1']
+ ))->setHelp('Server 1');
+
+ $group->add(new Form_Input(
+ 'wins_server2',
+ null,
+ 'text',
+ $pconfig['wins_server2']
+ ))->setHelp('Server 2');
+
+ $group->addClass('winsservers');
+
+ $section->add($group);
+
+ $section->addInput(new Form_TextArea(
+ 'custom_options',
+ 'Advanced',
+ $pconfig['custom_options']
+ ))->setHelp('Enter any additional options you would like to add for this client specific override, separated by a semicolon. ' . '<br />' .
+ 'EXAMPLE: push "route 10.0.0.0 255.255.255.0"; ');
+
+ // The hidden fields
+ $section->addInput(new Form_Input(
+ 'act',
+ null,
+ 'hidden',
+ $act
+ ));
- if (document.iform.dns_domain_enable.checked) {
- document.getElementById("dns_domain_data").style.display="";
- } else {
- document.getElementById("dns_domain_data").style.display="none";
+ if (isset($id) && $a_csc[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
}
-}
-function dns_server_change() {
+ $form->add($section);
+ print($form);
+
+?>
- if (document.iform.dns_server_enable.checked) {
- document.getElementById("dns_server_data").style.display="";
- } else {
- document.getElementById("dns_server_data").style.display="none";
+<script>
+//<![CDATA[
+events.push(function(){
+ var visible = false;
+
+ // Hides the <div> in which the specified input element lives so that the input, its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
}
-}
-function wins_server_change() {
+ // Hides the <div> in which the specified checkbox lives so that the checkbox, its label and help text are hidden
+ function hideCheckbox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
+ }
- if (document.iform.wins_server_enable.checked) {
- document.getElementById("wins_server_data").style.display="";
- } else {
- document.getElementById("wins_server_data").style.display="none";
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
}
-}
-function ntp_server_change() {
+ // Hide/show that section, but have to also respect the wins_server_enable checkbox
+ function setNetbios() {
+ if($('#netbios_enable').prop('checked')) {
+ hideInput('netbios_ntype', false);
+ hideInput('netbios_scope', false);
+ hideCheckbox('wins_server_enable', false);
+ setWins();
+ } else {
+ hideInput('netbios_ntype', true);
+ hideInput('netbios_scope', true);
+ hideCheckbox('wins_server_enable', true);
+ hideClass('winsservers', true);
+ }
+ }
- if (document.iform.ntp_server_enable.checked) {
- document.getElementById("ntp_server_data").style.display="";
- } else {
- document.getElementById("ntp_server_data").style.display="none";
+ function setWins() {
+ hideClass('winsservers', ! $('#wins_server_enable').prop('checked'));
}
-}
-function netbios_change() {
+ // On clicking the netbios_enable checkbox
+ $('#netbios_enable').click(function () {
+ setNetbios();
+ });
- if (document.iform.netbios_enable.checked) {
- document.getElementById("netbios_data").style.display="";
- document.getElementById("wins_opts").style.display="";
- } else {
- document.getElementById("netbios_data").style.display="none";
- document.getElementById("wins_opts").style.display="none";
- }
-}
+ // On clicking the wins_server_enable checkbox
+ $('#wins_server_enable').click(function () {
+ setWins();
+ });
+ // On initial page load
+ setNetbios();
+});
//]]>
</script>
+
<?php
- if ($input_errors) {
- print_input_errors($input_errors);
- }
- if ($savemsg) {
- print_info_box($savemsg);
- }
+else : // Not an 'add' or an 'edit'. Just the table of Override CSCs
?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn openvpn csc">
- <tr>
- <td class="tabnavtbl">
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Server"), false, "vpn_openvpn_server.php");
- $tab_array[] = array(gettext("Client"), false, "vpn_openvpn_client.php");
- $tab_array[] = array(gettext("Client Specific Overrides"), true, "vpn_openvpn_csc.php");
- $tab_array[] = array(gettext("Wizards"), false, "wizard.php?xml=openvpn_wizard.xml");
- add_package_tabs("openvpn-client-export", $tab_array);
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
-
- <?php if ($act == "new" || $act == "edit"): ?>
-
- <form action="vpn_openvpn_csc.php" method="post" name="iform" id="iform" onsubmit="presubmit()">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="general information">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("General information"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="0" cellspacing="0" summary="enable disable">
- <tr>
- <td>
- <?php set_checked($pconfig['disable'], $chk); ?>
- <input name="disable" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- &nbsp;
- <span class="vexpl">
- <strong><?=gettext("Disable this override"); ?></strong><br />
- </span>
- </td>
- </tr>
- </table>
- <?=gettext("Set this option to disable this client-specific override without removing it from the list"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Common name"); ?></td>
- <td width="78%" class="vtable">
- <input name="common_name" type="text" class="formfld unknown" size="30" value="<?=htmlspecialchars($pconfig['common_name']);?>" />
- <br />
- <?=gettext("Enter the client's X.509 common name here"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="description" type="text" class="formfld unknown" size="30" value="<?=htmlspecialchars($pconfig['description']);?>" />
- <br />
- <?=gettext("You may enter a description here for your reference (not parsed)"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Connection blocking"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="connection blocking">
- <tr>
- <td>
- <?php set_checked($pconfig['block'], $chk); ?>
- <input name="block" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Block this client connection based on its common name"); ?>.
- </span>
- </td>
- </tr>
- </table>
- <?=gettext("Don't use this option to permanently disable a " .
- "client due to a compromised key or password. " .
- "Use a CRL (certificate revocation list) instead"); ?>.
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Tunnel Settings"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Tunnel Network"); ?></td>
- <td width="78%" class="vtable">
- <input name="tunnel_network" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['tunnel_network']);?>" />
- <br />
- <?=gettext("This is the virtual network used for private " .
- "communications between this client and the " .
- "server expressed using CIDR (eg. 10.0.8.0/24). " .
- "The first network address is assumed to be the " .
- "server address and the second network address " .
- "will be assigned to the client virtual " .
- "interface"); ?>.
- </td>
- </tr>
- <tr id="local_optsv4">
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Local Network/s"); ?></td>
- <td width="78%" class="vtable">
- <input name="local_network" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['local_network']);?>" />
- <br />
- <?=gettext("These are the IPv4 networks that will be accessible " .
- "from this particular client. Expressed as a comma-separated list of one or more CIDR ranges."); ?>
- <br /><?=gettext("NOTE: You do not need to specify networks here if they have " .
- "already been defined on the main server configuration.");?>
- </td>
- </tr>
- <tr id="local_optsv6">
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Local Network/s"); ?></td>
- <td width="78%" class="vtable">
- <input name="local_networkv6" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['local_networkv6']);?>" />
- <br />
- <?=gettext("These are the IPv6 networks that will be accessible " .
- "from this particular client. Expressed as a comma-separated list of one or more IP/PREFIX networks."); ?>
- <br /><?=gettext("NOTE: You do not need to specify networks here if they have " .
- "already been defined on the main server configuration.");?>
- </td>
- </tr>
- <tr id="remote_optsv4">
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Remote Network/s"); ?></td>
- <td width="78%" class="vtable">
- <input name="remote_network" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['remote_network']);?>" />
- <br />
- <?=gettext("These are the IPv4 networks that will be routed " .
- "to this client specifically using iroute, so that a site-to-site " .
- "VPN can be established. " .
- "Expressed as a comma-separated list of one or more CIDR ranges. " .
- "You may leave this blank if there are no client-side networks to " .
- "be routed"); ?>.
- <br /><?=gettext("NOTE: Remember to add these subnets to the " .
- "IPv4 Remote Networks list on the corresponding OpenVPN server settings.");?>
- </td>
- </tr>
- <tr id="remote_optsv6">
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Remote Network/s"); ?></td>
- <td width="78%" class="vtable">
- <input name="remote_networkv6" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['remote_networkv6']);?>" />
- <br />
- <?=gettext("These are the IPv6 networks that will be routed " .
- "to this client specifically using iroute, so that a site-to-site " .
- "VPN can be established. " .
- "Expressed as a comma-separated list of one or more IP/PREFIX networks. " .
- "You may leave this blank if there are no client-side networks to " .
- "be routed"); ?>.
- <br /><?=gettext("NOTE: Remember to add these subnets to the " .
- "IPv6 Remote Networks list on the corresponding OpenVPN server settings.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Redirect Gateway"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="redirect gateway">
- <tr>
- <td>
- <?php set_checked($pconfig['gwredir'], $chk); ?>
- <input name="gwredir" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Force all client generated traffic through the tunnel"); ?>.
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Client Settings"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Server Definitions"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="server definitions">
- <tr>
- <td>
- <?php set_checked($pconfig['push_reset'], $chk); ?>
- <input name="push_reset" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Prevent this client from receiving any server-defined client settings"); ?>.
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("DNS Default Domain"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="dns default domain">
- <tr>
- <td>
- <?php set_checked($pconfig['dns_domain_enable'], $chk); ?>
- <input name="dns_domain_enable" type="checkbox" id="dns_domain_enable" value="yes" <?=$chk;?> onclick="dns_domain_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Provide a default domain name to clients"); ?><br />
- </span>
- </td>
- </tr>
- </table>
- <table border="0" cellpadding="2" cellspacing="0" id="dns_domain_data" summary="dns domain data">
- <tr>
- <td>
- <input name="dns_domain" type="text" class="formfld unknown" id="dns_domain" size="30" value="<?=htmlspecialchars($pconfig['dns_domain']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("DNS Servers"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="dns servers">
- <tr>
- <td>
- <?php set_checked($pconfig['dns_server_enable'], $chk); ?>
- <input name="dns_server_enable" type="checkbox" id="dns_server_enable" value="yes" <?=$chk;?> onclick="dns_server_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Provide a DNS server list to clients"); ?><br />
- </span>
- </td>
- </tr>
- </table>
- <table border="0" cellpadding="2" cellspacing="0" id="dns_server_data" summary="dns server list">
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #1:&nbsp;
- </span>
- <input name="dns_server1" type="text" class="formfld unknown" id="dns_server1" size="20" value="<?=htmlspecialchars($pconfig['dns_server1']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #2:&nbsp;
- </span>
- <input name="dns_server2" type="text" class="formfld unknown" id="dns_server2" size="20" value="<?=htmlspecialchars($pconfig['dns_server2']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #3:&nbsp;
- </span>
- <input name="dns_server3" type="text" class="formfld unknown" id="dns_server3" size="20" value="<?=htmlspecialchars($pconfig['dns_server3']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #4:&nbsp;
- </span>
- <input name="dns_server4" type="text" class="formfld unknown" id="dns_server4" size="20" value="<?=htmlspecialchars($pconfig['dns_server4']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("NTP Servers"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="ntp servers">
- <tr>
- <td>
- <?php set_checked($pconfig['ntp_server_enable'], $chk); ?>
- <input name="ntp_server_enable" type="checkbox" id="ntp_server_enable" value="yes" <?=$chk;?> onclick="ntp_server_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Provide a NTP server list to clients"); ?><br />
- </span>
- </td>
- </tr>
- </table>
- <table border="0" cellpadding="2" cellspacing="0" id="ntp_server_data" summary="ntp server list">
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #1:&nbsp;
- </span>
- <input name="ntp_server1" type="text" class="formfld unknown" id="ntp_server1" size="20" value="<?=htmlspecialchars($pconfig['ntp_server1']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #2:&nbsp;
- </span>
- <input name="ntp_server2" type="text" class="formfld unknown" id="ntp_server2" size="20" value="<?=htmlspecialchars($pconfig['ntp_server2']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("NetBIOS Options"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="netbios options">
- <tr>
- <td>
- <?php set_checked($pconfig['netbios_enable'], $chk); ?>
- <input name="netbios_enable" type="checkbox" id="netbios_enable" value="yes" <?=$chk;?> onclick="netbios_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Enable NetBIOS over TCP/IP"); ?><br />
- </span>
- </td>
- </tr>
- </table>
- <?=gettext("If this option is not set, all NetBIOS-over-TCP/IP options (including WINS) will be disabled"); ?>.
- <br />
- <table border="0" cellpadding="2" cellspacing="0" id="netbios_data" summary="netbios options">
- <tr>
- <td>
- <br />
- <span class="vexpl">
- <?=gettext("Node Type"); ?>:&nbsp;
- </span>
- <select name='netbios_ntype' class="formselect">
- <?php
- foreach ($netbios_nodetypes as $type => $name):
- $selected = "";
- if ($pconfig['netbios_ntype'] == $type) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$type;?>" <?=$selected;?>><?=$name;?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <?=gettext("Possible options: b-node (broadcasts), p-node " .
- "(point-to-point name queries to a WINS server), " .
- "m-node (broadcast then query name server), and " .
- "h-node (query name server, then broadcast)"); ?>.
- </td>
- </tr>
- <tr>
- <td>
- <br />
- <span class="vexpl">
- Scope ID:&nbsp;
- </span>
- <input name="netbios_scope" type="text" class="formfld unknown" id="netbios_scope" size="30" value="<?=htmlspecialchars($pconfig['netbios_scope']);?>" />
- <br />
- <?=gettext("A NetBIOS Scope ID provides an extended naming " .
- "service for NetBIOS over TCP/IP. The NetBIOS " .
- "scope ID isolates NetBIOS traffic on a single " .
- "network to only those nodes with the same " .
- "NetBIOS scope ID"); ?>.
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr id="wins_opts">
- <td width="22%" valign="top" class="vncell"><?=gettext("WINS Servers"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="wins servers">
- <tr>
- <td>
- <?php set_checked($pconfig['wins_server_enable'], $chk); ?>
- <input name="wins_server_enable" type="checkbox" id="wins_server_enable" value="yes" <?=$chk;?> onclick="wins_server_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Provide a WINS server list to clients"); ?><br />
- </span>
- </td>
- </tr>
- </table>
- <table border="0" cellpadding="2" cellspacing="0" id="wins_server_data" summary="wins server list">
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #1:&nbsp;
- </span>
- <input name="wins_server1" type="text" class="formfld unknown" id="wins_server1" size="20" value="<?=htmlspecialchars($pconfig['wins_server1']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #2:&nbsp;
- </span>
- <input name="wins_server2" type="text" class="formfld unknown" id="wins_server2" size="20" value="<?=htmlspecialchars($pconfig['wins_server2']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Advanced"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="advanced">
- <tr>
- <td>
- <textarea rows="6" cols="70" name="custom_options" id="custom_options"><?=$pconfig['custom_options'];?></textarea><br />
- <?=gettext("Enter any additional options you would like to add for this client specific override, separated by a semicolon"); ?><br />
- <?=gettext("EXAMPLE: push \"route 10.0.0.0 255.255.255.0\""); ?>;
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input name="act" type="hidden" value="<?=$act;?>" />
- <?php if (isset($id) && $a_csc[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </form>
-
- <?php else: ?>
-
- <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="list">
+
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('CSC Overrides')?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td width="10%" class="listhdrr"><?=gettext("Disabled"); ?></td>
- <td width="40%" class="listhdrr"><?=gettext("Common Name"); ?></td>
- <td width="40%" class="listhdrr"><?=gettext("Description"); ?></td>
- <td width="10%" class="list"></td>
+ <th><?=gettext("Disabled")?></th>
+ <th><?=gettext("Common Name")?></th>
+ <th><?=gettext("Description")?></th>
+ <th> <!-- Buttons --></th>
</tr>
- <?php
- $i = 0;
- foreach ($a_csc as $csc):
- $disabled = "NO";
- if (isset($csc['disable'])) {
- $disabled = "YES";
- }
- ?>
- <tr ondblclick="document.location='vpn_openvpn_csc.php?act=edit&amp;id=<?=$i;?>'">
+ </thead>
+ <tbody>
+<?php
+ $i = 0;
+ foreach($a_csc as $csc):
+ $disabled = isset($csc['disable']) ? "Yes":"No";
+?>
+ <tr>
<td class="listlr">
- <?=$disabled;?>
+ <?=$disabled?>
</td>
<td class="listr">
- <?=htmlspecialchars($csc['common_name']);?>
+ <?=htmlspecialchars($csc['common_name'])?>
</td>
<td class="listbg">
- <?=htmlspecialchars($csc['description']);?>
- </td>
- <td valign="middle" class="list nowrap">
- <a href="vpn_openvpn_csc.php?act=edit&amp;id=<?=$i;?>">
- <img src="./themes/<?=$g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit csc"); ?>" width="17" height="17" border="0" alt="edit" />
- </a>
- &nbsp;
- <a href="vpn_openvpn_csc.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this csc?"); ?>')">
- <img src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete csc"); ?>" width="17" height="17" border="0" alt="delete" />
- </a>
+ <?=htmlspecialchars($csc['description'])?>
</td>
- </tr>
- <?php
- $i++;
- endforeach;
- ?>
- <tr>
- <td class="list" colspan="3"></td>
- <td class="list">
- <a href="vpn_openvpn_csc.php?act=new"><img src="./themes/<?=$g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add csc"); ?>" width="17" height="17" border="0" alt="add" />
- </a>
+ <td>
+ <a href="vpn_openvpn_csc.php?act=edit&amp;id=<?=$i?>" class="btn btn-info btn-xs"><?=gettext('Edit')?></a>
+ <a href="vpn_openvpn_csc.php?act=del&amp;id=<?=$i?>" class="btn btn-danger btn-xs"><?=gettext('Delete')?></a>
</td>
</tr>
- <tr>
- <td colspan="3">
- <p>
- <?=gettext("Additional OpenVPN client specific overrides can be added here.");?>
- </p>
- </td>
- </tr>
- </table>
-
- <?php endif; ?>
-
- </td>
- </tr>
-</table>
-<script type="text/javascript">
-//<![CDATA[
-dns_domain_change();
-dns_server_change();
-wins_server_change();
-ntp_server_change();
-netbios_change();
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
-
<?php
+ $i++;
+ endforeach;
+?>
+ </tbody>
+ </table>
-/* local utility functions */
+ <nav class="action-buttons">
+ <a href="vpn_openvpn_csc.php?act=new" class="btn btn-success btn-sm"><?=gettext('Add CSC')?></a>
+ </nav>
-function set_checked($var, & $chk) {
- if ($var) {
- $chk = "checked=\"checked\"";
- } else {
- $chk = "";
- }
-}
+ </div>
+</div>
-?>
+<?php
+endif;
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/vpn_openvpn_server.php b/src/usr/local/www/vpn_openvpn_server.php
index a7ff4ce..bdbd08c 100644
--- a/src/usr/local/www/vpn_openvpn_server.php
+++ b/src/usr/local/www/vpn_openvpn_server.php
@@ -125,9 +125,11 @@ if ($_GET['act'] == "edit") {
$pconfig['authmode'] = $a_server[$id]['authmode'];
$pconfig['dev_mode'] = $a_server[$id]['dev_mode'];
$pconfig['interface'] = $a_server[$id]['interface'];
+
if (!empty($a_server[$id]['ipaddr'])) {
$pconfig['interface'] = $pconfig['interface'] . '|' . $a_server[$id]['ipaddr'];
}
+
$pconfig['local_port'] = $a_server[$id]['local_port'];
$pconfig['description'] = $a_server[$id]['description'];
$pconfig['custom_options'] = $a_server[$id]['custom_options'];
@@ -137,6 +139,7 @@ if ($_GET['act'] == "edit") {
$pconfig['tlsauth_enable'] = "yes";
$pconfig['tls'] = base64_decode($a_server[$id]['tls']);
}
+
$pconfig['caref'] = $a_server[$id]['caref'];
$pconfig['crlref'] = $a_server[$id]['crlref'];
$pconfig['certref'] = $a_server[$id]['certref'];
@@ -188,6 +191,7 @@ if ($_GET['act'] == "edit") {
$pconfig['dns_server2'] = $a_server[$id]['dns_server2'];
$pconfig['dns_server3'] = $a_server[$id]['dns_server3'];
$pconfig['dns_server4'] = $a_server[$id]['dns_server4'];
+
if ($pconfig['dns_server1'] ||
$pconfig['dns_server2'] ||
$pconfig['dns_server3'] ||
@@ -197,6 +201,7 @@ if ($_GET['act'] == "edit") {
$pconfig['ntp_server1'] = $a_server[$id]['ntp_server1'];
$pconfig['ntp_server2'] = $a_server[$id]['ntp_server2'];
+
if ($pconfig['ntp_server1'] ||
$pconfig['ntp_server2']) {
$pconfig['ntp_server_enable'] = true;
@@ -208,6 +213,7 @@ if ($_GET['act'] == "edit") {
$pconfig['wins_server1'] = $a_server[$id]['wins_server1'];
$pconfig['wins_server2'] = $a_server[$id]['wins_server2'];
+
if ($pconfig['wins_server1'] ||
$pconfig['wins_server2']) {
$pconfig['wins_server_enable'] = true;
@@ -458,6 +464,7 @@ if ($_POST) {
} else {
$server['shared_key'] = base64_encode($pconfig['shared_key']);
}
+
$server['crypto'] = $pconfig['crypto'];
$server['digest'] = $pconfig['digest'];
$server['engine'] = $pconfig['engine'];
@@ -546,1497 +553,1066 @@ if ($_POST) {
$pconfig['authmode'] = implode(",", $pconfig['authmode']);
}
}
+
$pgtitle = array(gettext("OpenVPN"), gettext("Server"));
$shortcut_section = "openvpn";
include("head.inc");
-?>
+function build_mode_list() {
+ global $openvpn_server_modes;
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript">
-//<![CDATA[
+ $list = array();
-function mode_change() {
- index = document.iform.mode.selectedIndex;
- value = document.iform.mode.options[index].value;
- switch (value) {
- case "p2p_tls":
- case "server_tls":
- case "server_user":
- document.getElementById("tls").style.display="";
- document.getElementById("tls_ca").style.display="";
- document.getElementById("tls_crl").style.display="";
- document.getElementById("tls_cert").style.display="";
- document.getElementById("tls_dh").style.display="";
- document.getElementById("cert_depth").style.display="";
- document.getElementById("strictusercn").style.display="none";
- document.getElementById("psk").style.display="none";
- break;
- case "server_tls_user":
- document.getElementById("tls").style.display="";
- document.getElementById("tls_ca").style.display="";
- document.getElementById("tls_crl").style.display="";
- document.getElementById("tls_cert").style.display="";
- document.getElementById("tls_dh").style.display="";
- document.getElementById("cert_depth").style.display="";
- document.getElementById("strictusercn").style.display="";
- document.getElementById("psk").style.display="none";
- break;
- case "p2p_shared_key":
- document.getElementById("tls").style.display="none";
- document.getElementById("tls_ca").style.display="none";
- document.getElementById("tls_crl").style.display="none";
- document.getElementById("tls_cert").style.display="none";
- document.getElementById("tls_dh").style.display="none";
- document.getElementById("cert_depth").style.display="none";
- document.getElementById("strictusercn").style.display="none";
- document.getElementById("psk").style.display="";
- break;
- }
- switch (value) {
- case "p2p_shared_key":
- document.getElementById("client_opts").style.display="none";
- document.getElementById("remote_optsv4").style.display="";
- document.getElementById("remote_optsv6").style.display="";
- document.getElementById("gwredir_opts").style.display="none";
- document.getElementById("local_optsv4").style.display="none";
- document.getElementById("local_optsv6").style.display="none";
- document.getElementById("authmodetr").style.display="none";
- document.getElementById("inter_client_communication").style.display="none";
- break;
- case "p2p_tls":
- document.getElementById("client_opts").style.display="none";
- document.getElementById("remote_optsv4").style.display="";
- document.getElementById("remote_optsv6").style.display="";
- document.getElementById("gwredir_opts").style.display="";
- document.getElementById("local_optsv4").style.display="";
- document.getElementById("local_optsv6").style.display="";
- document.getElementById("authmodetr").style.display="none";
- document.getElementById("inter_client_communication").style.display="none";
- break;
- case "server_user":
- case "server_tls_user":
- document.getElementById("authmodetr").style.display="";
- document.getElementById("client_opts").style.display="";
- document.getElementById("remote_optsv4").style.display="none";
- document.getElementById("remote_optsv6").style.display="none";
- document.getElementById("gwredir_opts").style.display="";
- document.getElementById("local_optsv4").style.display="";
- document.getElementById("local_optsv6").style.display="";
- document.getElementById("inter_client_communication").style.display="";
- break;
- case "server_tls":
- document.getElementById("authmodetr").style.display="none";
- default:
- document.getElementById("client_opts").style.display="";
- document.getElementById("remote_optsv4").style.display="none";
- document.getElementById("remote_optsv6").style.display="none";
- document.getElementById("gwredir_opts").style.display="";
- document.getElementById("local_optsv4").style.display="";
- document.getElementById("local_optsv6").style.display="";
- document.getElementById("inter_client_communication").style.display="";
- break;
- }
- gwredir_change();
+ foreach ($openvpn_server_modes as $name => $desc)
+ $list[$name] = $desc;
+
+ return($list);
}
-function autokey_change() {
+function build_if_list() {
+ $list = array();
- if ((document.iform.autokey_enable != null) && (document.iform.autokey_enable.checked)) {
- document.getElementById("autokey_opts").style.display="none";
- } else {
- document.getElementById("autokey_opts").style.display="";
- }
-}
+ $interfaces = get_configured_interface_with_descr();
+ $carplist = get_configured_carp_interface_list();
-function tlsauth_change() {
+ foreach ($carplist as $cif => $carpip)
+ $interfaces[$cif.'|'.$carpip] = $carpip." (".get_vip_descr($carpip).")";
-<?php if (!$pconfig['tls']): ?>
- if (document.iform.tlsauth_enable.checked) {
- document.getElementById("tlsauth_opts").style.display="";
- } else {
- document.getElementById("tlsauth_opts").style.display="none";
- }
-<?php endif; ?>
+ $aliaslist = get_configured_ip_aliases_list();
- autotls_change();
-}
+ foreach ($aliaslist as $aliasip => $aliasif)
+ $interfaces[$aliasif.'|'.$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
-function autotls_change() {
+ $grouplist = return_gateway_groups_array();
-<?php if (!$pconfig['tls']): ?>
- autocheck = document.iform.autotls_enable.checked;
-<?php else: ?>
- autocheck = false;
-<?php endif; ?>
+ foreach ($grouplist as $name => $group) {
+ if($group['ipprotocol'] != inet)
+ continue;
- if (document.iform.tlsauth_enable.checked && !autocheck) {
- document.getElementById("autotls_opts").style.display="";
- } else {
- document.getElementById("autotls_opts").style.display="none";
+ if($group[0]['vip'] != "")
+ $vipif = $group[0]['vip'];
+ else
+ $vipif = $group[0]['int'];
+
+ $interfaces[$name] = "GW Group {$name}";
}
-}
-function gwredir_change() {
+ $interfaces['lo0'] = "Localhost";
+ $interfaces['any'] = "any";
- if (document.iform.gwredir.checked) {
- document.getElementById("local_optsv4").style.display="none";
- document.getElementById("local_optsv6").style.display="none";
- } else {
- document.getElementById("local_optsv4").style.display="";
- document.getElementById("local_optsv6").style.display="";
- }
+ foreach ($interfaces as $iface => $ifacename)
+ $list[$iface] = $ifacename;
+
+ return($list);
}
-function dns_domain_change() {
+function build_crl_list() {
+ global $a_crl;
- if (document.iform.dns_domain_enable.checked) {
- document.getElementById("dns_domain_data").style.display="";
- } else {
- document.getElementById("dns_domain_data").style.display="none";
- }
-}
+ $list = array('' => 'None');
-function dns_server_change() {
+ foreach ($a_crl as $crl) {
+ $caname = "";
+ $ca = lookup_ca($crl['caref']);
- if (document.iform.dns_server_enable.checked) {
- document.getElementById("dns_server_data").style.display="";
- } else {
- document.getElementById("dns_server_data").style.display="none";
+ if ($ca)
+ $caname = " (CA: {$ca['descr']})";
+
+ $list[$crl['refid']] = $crl['descr'] . $caname;
}
+
+ return($list);
}
-function wins_server_change() {
+function build_cert_list() {
+ global $a_cert;
- if (document.iform.wins_server_enable.checked) {
- document.getElementById("wins_server_data").style.display="";
- } else {
- document.getElementById("wins_server_data").style.display="none";
- }
-}
+ $list = array();
-function client_mgmt_port_change() {
+ foreach ($a_cert as $cert) {
+ $caname = "";
+ $inuse = "";
+ $revoked = "";
+ $ca = lookup_ca($cert['caref']);
- if (document.iform.client_mgmt_port_enable.checked) {
- document.getElementById("client_mgmt_port_data").style.display="";
- } else {
- document.getElementById("client_mgmt_port_data").style.display="none";
- }
-}
+ if ($ca)
+ $caname = " (CA: {$ca['descr']})";
-function ntp_server_change() {
+ if ($pconfig['certref'] == $cert['refid'])
+ $selected = "selected=\"selected\"";
- if (document.iform.ntp_server_enable.checked) {
- document.getElementById("ntp_server_data").style.display="";
- } else {
- document.getElementById("ntp_server_data").style.display="none";
- }
-}
+ if (cert_in_use($cert['refid']))
+ $inuse = " *In Use";
-function netbios_change() {
+ if (is_cert_revoked($cert))
+ $revoked = " *Revoked";
- if (document.iform.netbios_enable.checked) {
- document.getElementById("netbios_data").style.display="";
- document.getElementById("wins_opts").style.display="";
- } else {
- document.getElementById("netbios_data").style.display="none";
- document.getElementById("wins_opts").style.display="none";
+ $list[$cert['refid']] = $cert['descr'] . $caname . $inuse . $revoked;
}
+
+ return($list);
}
-function tuntap_change() {
+function build_bridge_list() {
+ $list = array();
- mindex = document.iform.mode.selectedIndex;
- mvalue = document.iform.mode.options[mindex].value;
+ $serverbridge_interface['none'] = "none";
+ $serverbridge_interface = array_merge($serverbridge_interface, get_configured_interface_with_descr());
+ $carplist = get_configured_carp_interface_list();
- switch (mvalue) {
- case "p2p_tls":
- case "p2p_shared_key":
- p2p = true;
- break;
- default:
- p2p = false;
- break;
- }
+ foreach ($carplist as $cif => $carpip)
+ $serverbridge_interface[$cif.'|'.$carpip] = $carpip." (".get_vip_descr($carpip).")";
- index = document.iform.dev_mode.selectedIndex;
- value = document.iform.dev_mode.options[index].value;
- switch (value) {
- case "tun":
- document.getElementById("chkboxNoTunIPv6").style.display="";
- document.getElementById("ipv4_tunnel_network").className="vncellreq";
- document.getElementById("serverbridge_dhcp").style.display="none";
- document.getElementById("serverbridge_interface").style.display="none";
- document.getElementById("serverbridge_dhcp_start").style.display="none";
- document.getElementById("serverbridge_dhcp_end").style.display="none";
- document.getElementById("topology_subnet_opt").style.display="";
- break;
- case "tap":
- document.getElementById("chkboxNoTunIPv6").style.display="none";
- document.getElementById("ipv4_tunnel_network").className="vncell";
- if (!p2p) {
- document.getElementById("serverbridge_dhcp").style.display="";
- document.getElementById("serverbridge_interface").style.display="";
- document.getElementById("serverbridge_dhcp_start").style.display="";
- document.getElementById("serverbridge_dhcp_end").style.display="";
- document.getElementById("topology_subnet_opt").style.display="none";
- document.iform.serverbridge_dhcp.disabled = false;
- if (document.iform.serverbridge_dhcp.checked) {
- document.iform.serverbridge_interface.disabled = false;
- document.iform.serverbridge_dhcp_start.disabled = false;
- document.iform.serverbridge_dhcp_end.disabled = false;
- } else {
- document.iform.serverbridge_interface.disabled = true;
- document.iform.serverbridge_dhcp_start.disabled = true;
- document.iform.serverbridge_dhcp_end.disabled = true;
- }
- } else {
- document.getElementById("topology_subnet_opt").style.display="none";
- document.iform.serverbridge_dhcp.disabled = true;
- document.iform.serverbridge_interface.disabled = true;
- document.iform.serverbridge_dhcp_start.disabled = true;
- document.iform.serverbridge_dhcp_end.disabled = true;
- }
- break;
- }
+ $aliaslist = get_configured_ip_aliases_list();
+
+ foreach ($aliaslist as $aliasip => $aliasif)
+ $serverbridge_interface[$aliasif.'|'.$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
+
+ foreach ($serverbridge_interface as $iface => $ifacename)
+ $list[$iface] = htmlspecialchars($ifacename);
+
+ return($list);
}
-//]]>
-</script>
-<?php
-if (!$savemsg) {
+
+if (!$savemsg)
$savemsg = "";
-}
-if ($input_errors) {
+if ($input_errors)
print_input_errors($input_errors);
-}
-if ($savemsg) {
- print_info_box_np($savemsg);
-}
+
+if ($savemsg)
+ print_info_box_np($savemsg, 'success');
+
+$tab_array = array();
+$tab_array[] = array(gettext("Server"), true, "vpn_openvpn_server.php");
+$tab_array[] = array(gettext("Client"), false, "vpn_openvpn_client.php");
+$tab_array[] = array(gettext("Client Specific Overrides"), false, "vpn_openvpn_csc.php");
+$tab_array[] = array(gettext("Wizards"), false, "wizard.php?xml=openvpn_wizard.xml");
+add_package_tabs("OpenVPN", $tab_array);
+display_top_tabs($tab_array);
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+if($act=="new" || $act=="edit") :
+ $section = new Form_Section('General Information');
+
+ $section->addInput(new Form_checkbox(
+ 'disable',
+ 'Disabled',
+ 'Disable this server',
+ $pconfig['disable']
+ ))->setHelp('Set this option to disable this server without removing it from the list');
+
+ $section->addInput(new Form_Select(
+ 'mode',
+ 'Server mode',
+ $pconfig['mode'],
+ build_mode_list()
+ ));
+
+ $section->addInput(new Form_Select(
+ 'dev_mode',
+ 'Device mode',
+ empty($pconfig['dev_mode']) ? 'tun':$pconfig['dev_mode'],
+ array_combine($openvpn_dev_mode, $openvpn_dev_mode)
+ ));
+
+ $section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ $pconfig['interface'],
+ build_if_list()
+ ));
+
+ $section->addInput(new Form_Input(
+ 'local_port',
+ 'Local port',
+ 'number',
+ $pconfig['local_port']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'description',
+ 'Description',
+ 'text',
+ $pconfig['description']
+ ))->setHelp('You may enter a description here for your reference (not parsed).');
+
+ $form->add($section);
+
+ $section = new Form_Section('Cryptographic settings');
+
+ $section->addInput(new Form_checkbox(
+ 'tlsauth_enable',
+ 'TLS authentication',
+ 'Enable authentication of TLS packets.',
+ $pconfig['tlsauth_enable']
+ ));
+
+ if (!$pconfig['tls']) {
+ $section->addInput(new Form_checkbox(
+ 'autotls_enable',
+ null,
+ 'Automatically generate a shared TLS authentication key.',
+ $pconfig['autotls_enable']
+ ));
+ }
+
+ $section->addInput(new Form_TextArea(
+ 'tls',
+ 'Key',
+ $pconfig['tls']
+ ))->setHelp('Paste your shared key here');
+
+ $section->addInput(new Form_Select(
+ 'caref',
+ 'Peer Certifiacte Authority',
+ $pconfig['caref'],
+ count($a_ca) ? array_combine($a_ca, $a_ca) : ['' => 'None']
+ ))->setHelp(count($a_ca) ? '':sprintf('No Certificate Authorities defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>'));
+
+ $section->addInput(new Form_Select(
+ 'crlref',
+ 'Peer Certifiacte Revocation list',
+ $pconfig['crlref'],
+ build_crl_list()
+ ))->setHelp(count($a_crl) ? '':sprintf('No Certificate Revocation Lists defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>'));
+
+ $section->addInput(new Form_Select(
+ 'certref',
+ 'Peer Certifiacte Authority',
+ $pconfig['certref'],
+ build_cert_list()
+ ))->setHelp(count($a_cert) ? '':sprintf('No Certificates defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>'));
+
+ $section->addInput(new Form_Select(
+ 'dh_length',
+ 'DH Parameter length (bits)',
+ $pconfig['dh_length'],
+ array_combine($openvpn_dh_lengths,$openvpn_dh_lengths)
+ ))->setHelp(count($a_cert) ? '':sprintf('No Certificates defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>'));
+
+ if (!$pconfig['shared_key']) {
+ $section->addInput(new Form_checkbox(
+ 'autokey_enable',
+ 'Auto generate',
+ 'Automatically generate a shared key',
+ $pconfig['autokey_enable']
+ ));
+ }
+
+ $section->addInput(new Form_TextArea(
+ 'shared_key',
+ 'Shared Key',
+ $pconfig['shared_key']
+ ))->setHelp('Paste your shared key here');
+
+ $section->addInput(new Form_Select(
+ 'crypto',
+ 'Encryption Algorithm',
+ $pconfig['crypto'],
+ openvpn_get_cipherlist()
+ ));
+
+ $section->addInput(new Form_Select(
+ 'digest',
+ 'Auth digest algorithm',
+ $pconfig['digest'],
+ openvpn_get_digestlist()
+ ))->setHelp('Leave this set to SHA1 unless all clients are set to match. SHA1 is the default for OpenVPN. ');
+
+ $section->addInput(new Form_Select(
+ 'engine',
+ 'Hardware Crypto',
+ $pconfig['engine'],
+ openvpn_get_engines()
+ ));
+
+ $section->addInput(new Form_Select(
+ 'cert_depth',
+ 'Certificate Depth',
+ $pconfig['cert_depth'],
+ $openvpn_cert_depths
+ ))->setHelp('When a certificate-based client logs in, do not accept certificates below this depth. ' .
+ 'Useful for denying certificates made with intermediate CAs generated from the same CA as the server.');
+
+ $section->addInput(new Form_checkbox(
+ 'strictusercn',
+ 'Strict User-CN Matching',
+ null,
+ $pconfig['strictusercn']
+ ))->setHelp('When authenticating users, enforce a match between the common name of the client certificate and the username given at login.');
+
+ $form->add($section);
+
+ $section = new Form_Section('Tunnel settings');
+
+ $section->addInput(new Form_Input(
+ 'tunnel_network',
+ 'IPv4 Tunnel Network',
+ 'text',
+ $pconfig['tunnel_network']
+ ))->setHelp('This is the IPv4 virtual network used for private communications between this server and client ' .
+ 'hosts expressed using CIDR (eg. 10.0.8.0/24). The first network address will be assigned to ' .
+ 'the server virtual interface. The remaining network addresses can optionally be assigned ' .
+ 'to connecting clients. (see Address Pool)');
+
+ $section->addInput(new Form_Input(
+ 'tunnel_networkv6',
+ 'IPv6 Tunnel Network',
+ 'text',
+ $pconfig['tunnel_networkv6']
+ ))->setHelp('This is the IPv6 virtual network used for private ' .
+ 'communications between this server and client hosts expressed using CIDR (eg. fe80::/64). ' .
+ 'The first network address will be assigned to the server virtual interface. The remaining ' .
+ 'network addresses can optionally be assigned to connecting clients. (see Address Pool)');
+
+ $section->addInput(new Form_checkbox(
+ 'serverbridge_dhcp',
+ 'Bridge DHCP',
+ 'Allow clients on the bridge to obtain DHCP.',
+ $pconfig['serverbridge_dhcp']
+ ));
+
+ $section->addInput(new Form_Select(
+ 'serberbridge_inerface',
+ 'Bridge Interface',
+ $pconfig['serberbridge_inerface'],
+ build_bridge_list()
+ ))->setHelp('The interface to which this tap instance will be bridged. This is not done automatically. You must assign this ' .
+ 'interface and create the bridge separately. This setting controls which existing IP address and subnet ' .
+ 'mask are used by OpenVPN for the bridge. Setting this to "none" will cause the Server Bridge DHCP settings below to be ignored.');
+
+ $section->addInput(new Form_Input(
+ 'serverbridge_dhcp_start',
+ 'Server Bridge DHCP Start',
+ 'text',
+ $pconfig['serverbridge_dhcp_start']
+ ))->setHelp('When using tap mode as a multi-point server, you may optionally supply a DHCP range to use on the ' .
+ 'interface to which this tap instance is bridged. If these settings are left blank, DHCP will be passed ' .
+ 'through to the LAN, and the interface setting above will be ignored.');
+
+ $section->addInput(new Form_Input(
+ 'serverbridge_dhcp_end',
+ 'Server Bridge DHCP End',
+ 'text',
+ $pconfig['serverbridge_dhcp_end']
+ ));
+
+ $section->addInput(new Form_checkbox(
+ 'gwredir',
+ 'Redirect Gateway',
+ 'Force all client generated traffic through the tunnel.',
+ $pconfig['gwredit']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'local_network',
+ 'IPv4 Local network(s)',
+ 'text',
+ $pconfig['local_network']
+ ))->setHelp('IPv4 networks that will be accessible from the remote endpoint. ' .
+ 'Expressed as a comma-separated list of one or more CIDR ranges. ' .
+ 'You may leave this blank if you don\'t want to add a route to the local network through this tunnel on the remote machine. ' .
+ 'This is generally set to your LAN network.');
+
+ $section->addInput(new Form_Input(
+ 'local_networkv6',
+ 'IPv6 Local network(s)',
+ 'text',
+ $pconfig['local_networkv6']
+ ))->setHelp('IPv6 networks that will be accessible from the remote endpoint. ' .
+ 'Expressed as a comma-separated list of one or more IP/PREFIX. You may leave this blank if you don\'t want to add a ' .
+ 'route to the local network through this tunnel on the remote machine. This is generally set to your LAN network.');
+
+ $section->addInput(new Form_Input(
+ 'remote_network',
+ 'IPv4 Remote network(s)',
+ 'text',
+ $pconfig['remote_network']
+ ))->setHelp('IPv4 networks that will be routed through the tunnel, so that a site-to-site VPN can be established without manually ' .
+ 'changing the routing tables. Expressed as a comma-separated list of one or more CIDR ranges. ' .
+ 'If this is a site-to-site VPN, enter the remote LAN/s here. You may leave this blank if you don\'t want a site-to-site VPN.');
+
+ $section->addInput(new Form_Input(
+ 'remote_networkv6',
+ 'IPv6 Remote network(s)',
+ 'text',
+ $pconfig['remote_networkv6']
+ ))->setHelp('These are the IPv6 networks that will be routed through the tunnel, so that a site-to-site VPN can be established without manually ' .
+ 'changing the routing tables. Expressed as a comma-separated list of one or more IP/PREFIX. ' .
+ 'If this is a site-to-site VPN, enter the remote LAN/s here. You may leave this blank if you don\'t want a site-to-site VPN.');
+
+ $section->addInput(new Form_Input(
+ 'maxclients',
+ 'Concurrent connections',
+ 'number',
+ $pconfig['maxclients']
+ ))->setHelp('Specify the maximum number of clients allowed to concurrently connect to this server.');
+
+ $section->addInput(new Form_Select(
+ 'compression',
+ 'Compression',
+ $pconfig['compression'],
+ $openvpn_compression_modes
+ ))->setHelp('Compress tunnel packets using the LZO algorithm. ' .
+ 'Adaptive compression will dynamically disable compression for a period of time if OpenVPN detects that the data in the ' .
+ 'packets is not being compressed efficiently"');
+
+ $section->addInput(new Form_checkbox(
+ 'passtos',
+ 'Type-of-Service',
+ 'Set the TOS IP header value of tunnel packets to match the encapsulated packet value.',
+ $pconfig['passtos']
+ ));
+
+ $section->addInput(new Form_checkbox(
+ 'client2client',
+ 'Inter-client communication',
+ 'Allow communication between clients connected to this server',
+ $pconfig['client2client']
+ ));
+
+ $section->addInput(new Form_checkbox(
+ 'duplicate_cn',
+ 'Duplicate Connection',
+ 'Allow multiple concurrent connections from clients using the same Common Name.',
+ $pconfig['duplicate_cn']
+ ))->setHelp('(This is not generally recommended, but may be needed for some scenarios.)');
+
+ $section->addInput(new Form_checkbox(
+ 'no_tun_ipv6',
+ 'Disable IPv6',
+ 'Don\'t forward IPv6 traffic. ',
+ $pconfig['no_tun_ipv6']
+ ));
+
+ $form->add($section);
+
+ $section = new Form_Section('Client Settings');
+
+ $section->addInput(new Form_checkbox(
+ 'dynamic_ip',
+ 'Dynamic IP',
+ 'Allow connected clients to retain their connections if their IP address changes',
+ $pconfig['dynamic_ip']
+ ));
+
+ $section->addInput(new Form_checkbox(
+ 'pool_enable',
+ 'Address Pool',
+ 'Provide a virtual adapter IP address to clients (see Tunnel Network)',
+ $pconfig['pool_enable']
+ ));
+
+ $section->addInput(new Form_checkbox(
+ 'topology_subnet',
+ 'Topology',
+ 'Allocate only one IP per client (topology subnet), rather than an isolated subnet per client (topology net30).',
+ $pconfig['topology_subnet']
+ ))->setHelp('Relevant when supplying a virtual adapter IP address to clients when using tun mode on IPv4.").' . '<br />' .
+ 'Some clients may require this even for IPv6, such as OpenVPN Connect (iOS/Android). ' .
+ 'Others may break if it is present, such as older versions of OpenVPN or clients such as Yealink phones.');
+
+ $section->addInput(new Form_checkbox(
+ 'dns_domain_enable',
+ 'DNS Default Domain',
+ 'Provide a default domain name to clients',
+ $pconfig['dns_domain_enable']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'dns_domain',
+ 'DNS Default Domain',
+ 'text',
+ $pconfig['dns_domain']
+ ));
+
+ $section->addInput(new Form_checkbox(
+ 'dns_server_enable',
+ 'DNS Server enable',
+ 'Provide a DNS server list to clients',
+ $pconfig['dns_server_enable']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'dns_server1',
+ 'DNS Server 1',
+ 'text',
+ $pconfig['dns_server1']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'dns_server2',
+ 'DNS Server 2',
+ 'text',
+ $pconfig['dns_server2']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'dns_server3',
+ 'DNS Server 3',
+ 'text',
+ $pconfig['dns_server3']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'dns_server4',
+ 'DNS Server 4',
+ 'text',
+ $pconfig['dns_server4']
+ ));
+
+ $section->addInput(new Form_checkbox(
+ 'push_register_dns',
+ 'Force DNS cache update',
+ 'Run "net stop dnscache", "net start dnscache", "ipconfig /flushdns" and "ipconfig /registerdns" on connection initiation.',
+ $pconfig['push_register_dns']
+ ))->setHelp('This is known to kick Windows into recognizing pushed DNS servers.');
+
+ $section->addInput(new Form_checkbox(
+ 'ntp_server_enable',
+ 'NTP Server enable',
+ 'Provide an NTP server list to clients',
+ $pconfig['ntp_server_enable']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'ntp_server1',
+ 'NTP Server 1',
+ 'text',
+ $pconfig['ntp_server1']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'ntp_server2',
+ 'NTP Server 2',
+ 'text',
+ $pconfig['ntp_server2']
+ ));
+
+ $form->add($section);
+
+ $section = new Form_Section('Netbios Options');
+
+ $section->addInput(new Form_checkbox(
+ 'netbios_enable',
+ 'Netbios enable',
+ 'Enable NetBIOS over TCP/IP',
+ $pconfig['ntp_server_enable']
+ ))->setHelp('If this option is not set, all NetBIOS-over-TCP/IP options (including WINS) will be disabled');
+
+ $section->addInput(new Form_Select(
+ 'netbios_ntype',
+ 'Node Type',
+ $pconfig['nbios_ntype'],
+ $netbios_nodetypes
+ ))->setHelp('Possible options: b-node (broadcasts), p-node (point-to-point name queries to a WINS server), ' .
+ 'm-node (broadcast then query name server), and h-node (query name server, then broadcast)');
+
+ $section->addInput(new Form_Input(
+ 'netbios_scope',
+ 'Scope ID',
+ 'text',
+ $pconfig['netbios_scope']
+ ))->setHelp('A NetBIOS Scope ID provides an extended naming service for NetBIOS over TCP/IP. The NetBIOS ' .
+ 'scope ID isolates NetBIOS traffic on a single network to only those nodes with the same ' .
+ 'NetBIOS scope ID');
+
+ $section->addInput(new Form_checkbox(
+ 'wins_server_enable',
+ 'WINS server enable',
+ 'Provide a WINS server list to clients',
+ $pconfig['wins_server_enable']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'wins_server1',
+ 'WINS Server 1',
+ 'text',
+ $pconfig['wins_server1']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'wins_server2',
+ 'WINS Server 2',
+ 'text',
+ $pconfig['wins_server2']
+ ));
+
+ $section->addInput(new Form_checkbox(
+ 'client_mgmt_port_enable',
+ 'Enable custom port ',
+ 'Use a different management port for clients.',
+ $pconfig['client_mgmt_port_enable']
+ ));
+
+ $section->addInput(new Form_Input(
+ 'client_mgmt_port',
+ 'Management port',
+ 'number',
+ $pconfig['client_mgmt_port']
+ ))->setHelp('The default port is 166. Specify a different port if the client machines need to select from multiple OpenVPN links.');
+
+
+ $form->add($section);
+
+ $section = new Form_Section('Advanced Configuration');
+ $section->addClass('advanced');
+
+ $section->addInput(new Form_TextArea(
+ 'custom_options',
+ 'Custom options',
+ $pconfig['custom_options']
+ ))->setHelp('Enter any additional options you would like to add to the OpenVPN server configuration here, separated by semicolon' . '<br />' .
+ 'EXAMPLE: push "route 10.0.0.0 255.255.255.0"');
+
+ $section->addInput(new Form_Select(
+ 'verbosity_level',
+ 'Verbosity level',
+ $pconfig['verbosity_level'],
+ $openvpn_verbosity_level
+ ))->setHelp('Each level shows all info from the previous levels. Level 3 is recommended if you want a good summary of what\'s happening without being swamped by output' . '<br /><br />' .
+ 'None: Only fatal errors' . '<br />' .
+ 'Default: Normal usage range' . '<br />' .
+ '5: Output R and W characters to the console for each packet read and write, uppercase is used for TCP/UDP packets and lowercase is used for TUN/TAP packets' .'<br />' .
+ '6: Debug info range');
+
+ $section->addInput(new Form_Input(
+ 'act',
+ null,
+ 'hidden',
+ $act
+ ));
+
+ if (isset($id) && $a_server[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+ }
+
+ $form->add($section);
+ print($form);
+
+else:
?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn openvpn server">
- <tr>
- <td class="tabnavtbl">
- <?php
- $tab_array = array();
- $tab_array[] = array(gettext("Server"), true, "vpn_openvpn_server.php");
- $tab_array[] = array(gettext("Client"), false, "vpn_openvpn_client.php");
- $tab_array[] = array(gettext("Client Specific Overrides"), false, "vpn_openvpn_csc.php");
- $tab_array[] = array(gettext("Wizards"), false, "wizard.php?xml=openvpn_wizard.xml");
- add_package_tabs("openvpn-client-export", $tab_array);
- display_top_tabs($tab_array);
- ?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
-
- <?php if ($act == "new" || $act == "edit"): ?>
-
- <form action="vpn_openvpn_server.php" method="post" name="iform" id="iform" onsubmit="presubmit()">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="general information">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("General information"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="0" cellspacing="0" summary="enable disable server">
- <tr>
- <td>
- <?php set_checked($pconfig['disable'], $chk); ?>
- <input name="disable" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- &nbsp;
- <span class="vexpl">
- <strong><?=gettext("Disable this server"); ?></strong><br />
- </span>
- </td>
- </tr>
- </table>
- <?=gettext("Set this option to disable this server without removing it from the list"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Server Mode");?></td>
- <td width="78%" class="vtable">
- <select name='mode' id='mode' class="formselect" onchange='mode_change(); tuntap_change()'>
- <?php
- foreach ($openvpn_server_modes as $name => $desc):
- $selected = "";
- if ($pconfig['mode'] == $name) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$name;?>" <?=$selected;?>><?=$desc;?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr id="authmodetr" style="display:none">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Backend for authentication");?></td>
- <td width="78%" class="vtable">
- <select name='authmode[]' id='authmode' class="formselect" multiple="multiple" size="<?php echo count($auth_servers); ?>">
- <?php
- $authmodes = explode(",", $pconfig['authmode']);
- $auth_servers = auth_get_authserver_list();
- // If no authmodes set then default to selecting the first entry in auth_servers
- if (empty($authmodes[0]) && !empty(key($auth_servers))) {
- $authmodes[0] = key($auth_servers);
- }
-
- foreach ($auth_servers as $auth_server_key => $auth_server):
- $selected = "";
- if (in_array($auth_server_key, $authmodes)) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$auth_server_key;?>" <?=$selected;?>><?=$auth_server['name'];?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol");?></td>
- <td width="78%" class="vtable">
- <select name='protocol' class="formselect">
- <?php
- foreach ($openvpn_prots as $prot):
- $selected = "";
- if ($pconfig['protocol'] == $prot) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$prot;?>" <?=$selected;?>><?=$prot;?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Device Mode"); ?></td>
- <td width="78%" class="vtable">
- <select name="dev_mode" class="formselect" onchange='tuntap_change()'>
- <?php
- foreach ($openvpn_dev_mode as $device):
- $selected = "";
- if (!empty($pconfig['dev_mode'])) {
- if ($pconfig['dev_mode'] == $device) {
- $selected = "selected=\"selected\"";
- }
- } else {
- if ($device == "tun") {
- $selected = "selected=\"selected\"";
- }
- }
- ?>
- <option value="<?=$device;?>" <?=$selected;?>><?=$device;?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
- <td width="78%" class="vtable">
- <select name="interface" class="formselect">
- <?php
- $interfaces = get_configured_interface_with_descr();
- $carplist = get_configured_carp_interface_list();
- foreach ($carplist as $cif => $carpip) {
- $interfaces[$cif.'|'.$carpip] = $carpip." (".get_vip_descr($carpip).")";
- }
- $aliaslist = get_configured_ip_aliases_list();
- foreach ($aliaslist as $aliasip => $aliasif) {
- $interfaces[$aliasif.'|'.$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
- }
- $grouplist = return_gateway_groups_array();
- foreach ($grouplist as $name => $group) {
- if ($group['ipprotocol'] != inet) {
- continue;
- }
- if ($group[0]['vip'] <> "") {
- $vipif = $group[0]['vip'];
- } else {
- $vipif = $group[0]['int'];
- }
- $interfaces[$name] = "GW Group {$name}";
- }
- $interfaces['lo0'] = "Localhost";
- $interfaces['any'] = "any";
- foreach ($interfaces as $iface => $ifacename):
- $selected = "";
- if ($iface == $pconfig['interface']) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$iface;?>" <?=$selected;?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
- <?php endforeach; ?>
- </select> <br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Local port");?></td>
- <td width="78%" class="vtable">
- <input name="local_port" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($pconfig['local_port']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <input name="description" type="text" class="formfld unknown" size="30" value="<?=htmlspecialchars($pconfig['description']);?>" />
- <br />
- <?=gettext("You may enter a description here for your reference (not parsed)"); ?>.
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Cryptographic Settings"); ?></td>
- </tr>
- <tr id="tls">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("TLS Authentication"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="tls authentication">
- <tr>
- <td>
- <?php set_checked($pconfig['tlsauth_enable'], $chk); ?>
- <input name="tlsauth_enable" id="tlsauth_enable" type="checkbox" value="yes" <?=$chk;?> onclick="tlsauth_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Enable authentication of TLS packets"); ?>.
- </span>
- </td>
- </tr>
- </table>
- <?php if (!$pconfig['tls']): ?>
- <table border="0" cellpadding="2" cellspacing="0" id="tlsauth_opts" summary="tls authentication options">
- <tr>
- <td>
- <?php set_checked($pconfig['autotls_enable'], $chk); ?>
- <input name="autotls_enable" id="autotls_enable" type="checkbox" value="yes" <?=$chk;?> onclick="autotls_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Automatically generate a shared TLS authentication key"); ?>.
- </span>
- </td>
- </tr>
- </table>
- <?php endif; ?>
- <table border="0" cellpadding="2" cellspacing="0" id="autotls_opts" summary="tls authentication key">
- <tr>
- <td>
- <textarea name="tls" cols="65" rows="7" class="formpre"><?=htmlspecialchars($pconfig['tls']);?></textarea>
- <br />
- <?=gettext("Paste your shared key here"); ?>.
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr id="tls_ca">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Peer Certificate Authority"); ?></td>
- <td width="78%" class="vtable">
- <?php if (count($a_ca)): ?>
- <select name='caref' class="formselect">
- <?php
- foreach ($a_ca as $ca):
- $selected = "";
- if ($pconfig['caref'] == $ca['refid']) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$ca['refid'];?>" <?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
- <?php endforeach; ?>
- </select>
- <?php else: ?>
- <b>No Certificate Authorities defined.</b> <br />Create one under <a href="system_camanager.php">System &gt; Cert Manager</a>.
- <?php endif; ?>
- </td>
- </tr>
- <tr id="tls_crl">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Peer Certificate Revocation List"); ?></td>
- <td width="78%" class="vtable">
- <?php if (count($a_crl)): ?>
- <select name='crlref' class="formselect">
- <option value="">None</option>
- <?php
- foreach ($a_crl as $crl):
- $selected = "";
- $caname = "";
- $ca = lookup_ca($crl['caref']);
- if ($ca) {
- $caname = " (CA: " . htmlspecialchars($ca['descr']) . ")";
- if ($pconfig['crlref'] == $crl['refid']) {
- $selected = "selected=\"selected\"";
- }
- }
- ?>
- <option value="<?=$crl['refid'];?>" <?=$selected;?>><?=htmlspecialchars($crl['descr']) . $caname;?></option>
- <?php endforeach; ?>
- </select>
- <?php else: ?>
- <b>No Certificate Revocation Lists (CRLs) defined.</b> <br />Create one under <a href="system_crlmanager.php">System &gt; Cert Manager</a>.
- <?php endif; ?>
- </td>
- </tr>
- <tr id="tls_cert">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Server Certificate"); ?></td>
- <td width="78%" class="vtable">
- <?php if (count($a_cert)): ?>
- <select name='certref' class="formselect">
- <?php
- foreach ($a_cert as $cert):
- $selected = "";
- $caname = "";
- $inuse = "";
- $revoked = "";
- $ca = lookup_ca($cert['caref']);
- if ($ca) {
- $caname = " (CA: " . htmlspecialchars($ca['descr']) . ")";
- }
- if ($pconfig['certref'] == $cert['refid']) {
- $selected = "selected=\"selected\"";
- }
- if (cert_in_use($cert['refid'])) {
- $inuse = " *In Use";
- }
- if (is_cert_revoked($cert)) {
- $revoked = " *Revoked";
- }
- ?>
- <option value="<?=$cert['refid'];?>" <?=$selected;?>><?=htmlspecialchars($cert['descr']) . $caname . $inuse . $revoked;?></option>
- <?php endforeach; ?>
- </select>
- <?php else: ?>
- <b>No Certificates defined.</b> <br />Create one under <a href="system_certmanager.php">System &gt; Cert Manager</a>.
- <?php endif; ?>
- </td>
- </tr>
- <tr id="tls_dh">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("DH Parameters Length"); ?></td>
- <td width="78%" class="vtable">
- <select name="dh_length" class="formselect">
- <?php
- foreach ($openvpn_dh_lengths as $length):
- $selected = "";
- if ($length == $pconfig['dh_length']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option<?=$selected?>><?=$length;?></option>
- <?php endforeach; ?>
- </select>
- <span class="vexpl">
- <?=gettext("bits"); ?>
- </span>
- </td>
- </tr>
- <tr id="psk">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Shared Key"); ?></td>
- <td width="78%" class="vtable">
- <?php if (!$pconfig['shared_key']): ?>
- <table border="0" cellpadding="2" cellspacing="0" summary="shared key">
- <tr>
- <td>
- <?php set_checked($pconfig['autokey_enable'], $chk); ?>
- <input name="autokey_enable" type="checkbox" value="yes" <?=$chk;?> onclick="autokey_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Automatically generate a shared key"); ?>.
- </span>
- </td>
- </tr>
- </table>
- <?php endif; ?>
- <table border="0" cellpadding="2" cellspacing="0" id="autokey_opts" summary="shared key">
- <tr>
- <td>
- <textarea name="shared_key" cols="65" rows="7" class="formpre"><?=htmlspecialchars($pconfig['shared_key']);?></textarea>
- <br />
- <?=gettext("Paste your shared key here"); ?>.
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Encryption algorithm"); ?></td>
- <td width="78%" class="vtable">
- <select name="crypto" class="formselect">
- <?php
- $cipherlist = openvpn_get_cipherlist();
- foreach ($cipherlist as $name => $desc):
- $selected = "";
- if ($name == $pconfig['crypto']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$name;?>"<?=$selected?>>
- <?=htmlspecialchars($desc);?>
- </option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Auth Digest Algorithm"); ?></td>
- <td width="78%" class="vtable">
- <select name="digest" class="formselect">
- <?php
- $digestlist = openvpn_get_digestlist();
- foreach ($digestlist as $name => $desc):
- $selected = "";
- if ($name == $pconfig['digest']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$name;?>"<?=$selected?>>
- <?=htmlspecialchars($desc);?>
- </option>
- <?php endforeach; ?>
- </select>
- <br /><?PHP echo gettext("NOTE: Leave this set to SHA1 unless all clients are set to match. SHA1 is the default for OpenVPN."); ?>
- </td>
- </tr>
- <tr id="engine">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Hardware Crypto"); ?></td>
- <td width="78%" class="vtable">
- <select name="engine" class="formselect">
- <?php
- $engines = openvpn_get_engines();
- foreach ($engines as $name => $desc):
- $selected = "";
- if ($name == $pconfig['engine']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?=$name;?>"<?=$selected?>>
- <?=htmlspecialchars($desc);?>
- </option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr id="cert_depth">
- <td width="22%" valign="top" class="vncell"><?=gettext("Certificate Depth"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="certificate depth">
- <tr>
- <td>
- <select name="cert_depth" class="formselect">
- <option value="">Do Not Check</option>
- <?php
- foreach ($openvpn_cert_depths as $depth => $depthdesc):
- $selected = "";
- if ($depth == $pconfig['cert_depth']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?= $depth ?>" <?= $selected ?>><?= $depthdesc ?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("When a certificate-based client logs in, do not accept certificates below this depth. Useful for denying certificates made with intermediate CAs generated from the same CA as the server."); ?>
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr id="strictusercn">
- <td width="22%" valign="top" class="vncell"><?=gettext("Strict User/CN Matching"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="strict user/cn matching">
- <tr>
- <td>
- <?php set_checked($pconfig['strictusercn'], $chk); ?>
- <input name="strictusercn" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("When authenticating users, enforce a match between the common name of the client certificate and the username given at login."); ?>
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Tunnel Settings"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq" id="ipv4_tunnel_network"><?=gettext("IPv4 Tunnel Network"); ?></td>
- <td width="78%" class="vtable">
- <input name="tunnel_network" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['tunnel_network']);?>" />
- <br />
- <?=gettext("This is the IPv4 virtual network used for private " .
- "communications between this server and client " .
- "hosts expressed using CIDR (eg. 10.0.8.0/24). " .
- "The first network address will be assigned to " .
- "the server virtual interface. The remaining " .
- "network addresses can optionally be assigned " .
- "to connecting clients. (see Address Pool)"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Tunnel Network"); ?></td>
- <td width="78%" class="vtable">
- <input name="tunnel_networkv6" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['tunnel_networkv6']);?>" />
- <br />
- <?=gettext("This is the IPv6 virtual network used for private " .
- "communications between this server and client " .
- "hosts expressed using CIDR (eg. fe80::/64). " .
- "The first network address will be assigned to " .
- "the server virtual interface. The remaining " .
- "network addresses can optionally be assigned " .
- "to connecting clients. (see Address Pool)"); ?>
- </td>
- </tr>
- <tr id="serverbridge_dhcp">
- <td width="22%" valign="top" class="vncell"><?=gettext("Bridge DHCP"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="bridge dhcp">
- <tr>
- <td>
- <?php set_checked($pconfig['serverbridge_dhcp'], $chk); ?>
- <input name="serverbridge_dhcp" type="checkbox" value="yes" <?=$chk;?> onchange="tuntap_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Allow clients on the bridge to obtain DHCP."); ?><br />
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr id="serverbridge_interface">
- <td width="22%" valign="top" class="vncell"><?=gettext("Bridge Interface"); ?></td>
- <td width="78%" class="vtable">
- <select name="serverbridge_interface" class="formselect">
- <?php
- $serverbridge_interface['none'] = "none";
- $serverbridge_interface = array_merge($serverbridge_interface, get_configured_interface_with_descr());
- $carplist = get_configured_carp_interface_list();
- foreach ($carplist as $cif => $carpip) {
- $serverbridge_interface[$cif.'|'.$carpip] = $carpip." (".get_vip_descr($carpip).")";
- }
- $aliaslist = get_configured_ip_aliases_list();
- foreach ($aliaslist as $aliasip => $aliasif) {
- $serverbridge_interface[$aliasif.'|'.$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
- }
- foreach ($serverbridge_interface as $iface => $ifacename):
- $selected = "";
- if ($iface == $pconfig['serverbridge_interface']) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$iface;?>" <?=$selected;?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
- <?php endforeach; ?>
- </select> <br />
- <?=gettext("The interface to which this tap instance will be " .
- "bridged. This is not done automatically. You must assign this " .
- "interface and create the bridge separately. " .
- "This setting controls which existing IP address and subnet " .
- "mask are used by OpenVPN for the bridge. Setting this to " .
- "'none' will cause the Server Bridge DHCP settings below to be ignored."); ?>
- </td>
- </tr>
- <tr id="serverbridge_dhcp_start">
- <td width="22%" valign="top" class="vncell"><?=gettext("Server Bridge DHCP Start"); ?></td>
- <td width="78%" class="vtable">
- <input name="serverbridge_dhcp_start" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['serverbridge_dhcp_start']);?>" />
- <br />
- <?=gettext("When using tap mode as a multi-point server, " .
- "you may optionally supply a DHCP range to use on the " .
- "interface to which this tap instance is bridged. " .
- "If these settings are left blank, DHCP will be passed " .
- "through to the LAN, and the interface setting above " .
- "will be ignored."); ?>
- </td>
- </tr>
- <tr id="serverbridge_dhcp_end">
- <td width="22%" valign="top" class="vncell"><?=gettext("Server Bridge DHCP End"); ?></td>
- <td width="78%" class="vtable">
- <input name="serverbridge_dhcp_end" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['serverbridge_dhcp_end']);?>" />
- <br />
- </td>
- </tr>
- <tr id="gwredir_opts">
- <td width="22%" valign="top" class="vncell"><?=gettext("Redirect Gateway"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="redirect gateway">
- <tr>
- <td>
- <?php set_checked($pconfig['gwredir'], $chk); ?>
- <input name="gwredir" type="checkbox" value="yes" <?=$chk;?> onclick="gwredir_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Force all client generated traffic through the tunnel"); ?>.
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr id="local_optsv4">
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Local Network/s"); ?></td>
- <td width="78%" class="vtable">
- <input name="local_network" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['local_network']);?>" />
- <br />
- <?=gettext("These are the IPv4 networks that will be accessible " .
- "from the remote endpoint. Expressed as a comma-separated list of one or more CIDR ranges. " .
- "You may leave this blank if you don't " .
- "want to add a route to the local network " .
- "through this tunnel on the remote machine. " .
- "This is generally set to your LAN network"); ?>.
- </td>
- </tr>
- <tr id="local_optsv6">
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Local Network/s"); ?></td>
- <td width="78%" class="vtable">
- <input name="local_networkv6" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['local_networkv6']);?>" />
- <br />
- <?=gettext("These are the IPv6 networks that will be accessible " .
- "from the remote endpoint. Expressed as a comma-separated list of one or more IP/PREFIX. " .
- "You may leave this blank if you don't " .
- "want to add a route to the local network " .
- "through this tunnel on the remote machine. " .
- "This is generally set to your LAN network"); ?>.
- </td>
- </tr>
- <tr id="remote_optsv4">
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Remote Network/s"); ?></td>
- <td width="78%" class="vtable">
- <input name="remote_network" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['remote_network']);?>" />
- <br />
- <?=gettext("These are the IPv4 networks that will be routed through " .
- "the tunnel, so that a site-to-site VPN can be " .
- "established without manually changing the routing tables. " .
- "Expressed as a comma-separated list of one or more CIDR ranges. " .
- "If this is a site-to-site VPN, enter the " .
- "remote LAN/s here. You may leave this blank if " .
- "you don't want a site-to-site VPN"); ?>.
- </td>
- </tr>
- <tr id="remote_optsv6">
- <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Remote Network/s"); ?></td>
- <td width="78%" class="vtable">
- <input name="remote_networkv6" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['remote_networkv6']);?>" />
- <br />
- <?=gettext("These are the IPv6 networks that will be routed through " .
- "the tunnel, so that a site-to-site VPN can be " .
- "established without manually changing the routing tables. " .
- "Expressed as a comma-separated list of one or more IP/PREFIX. " .
- "If this is a site-to-site VPN, enter the " .
- "remote LAN/s here. You may leave this blank if " .
- "you don't want a site-to-site VPN"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Concurrent connections");?></td>
- <td width="78%" class="vtable">
- <input name="maxclients" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($pconfig['maxclients']);?>" />
- <br />
- <?=gettext("Specify the maximum number of clients allowed to concurrently connect to this server"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Compression"); ?></td>
- <td width="78%" class="vtable">
- <select name="compression" class="formselect">
- <?php
- foreach ($openvpn_compression_modes as $cmode => $cmodedesc):
- $selected = "";
- if ($cmode == $pconfig['compression']) {
- $selected = " selected=\"selected\"";
- }
- ?>
- <option value="<?= $cmode ?>" <?= $selected ?>><?= $cmodedesc ?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <?=gettext("Compress tunnel packets using the LZO algorithm. Adaptive compression will dynamically disable compression for a period of time if OpenVPN detects that the data in the packets is not being compressed efficiently"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Type-of-Service"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="type-of-service">
- <tr>
- <td>
- <?php set_checked($pconfig['passtos'], $chk); ?>
- <input name="passtos" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Set the TOS IP header value of tunnel packets to match the encapsulated packet value"); ?>.
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr id="inter_client_communication">
- <td width="22%" valign="top" class="vncell"><?=gettext("Inter-client communication"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="inter-client communication">
- <tr>
- <td>
- <?php set_checked($pconfig['client2client'], $chk); ?>
- <input name="client2client" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Allow communication between clients connected to this server"); ?>
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr id="duplicate_cn">
- <td width="22%" valign="top" class="vncell"><?=gettext("Duplicate Connections"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="duplicate connection">
- <tr>
- <td>
- <?php set_checked($pconfig['duplicate_cn'], $chk); ?>
- <input name="duplicate_cn" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Allow multiple concurrent connections from clients using the same Common Name.<br />NOTE: This is not generally recommended, but may be needed for some scenarios."); ?>
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <tr id="chkboxNoTunIPv6">
- <td width="22%" valign="top" class="vncell"><?=gettext("Disable IPv6"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="disable-ipv6-srv">
- <tr>
- <td>
- <?php set_checked($pconfig['no_tun_ipv6'], $chk); ?>
- <input name="no_tun_ipv6" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Don't forward IPv6 traffic"); ?>.
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="client_opts" summary="client settings">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Client Settings"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Dynamic IP"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="dynamic ip">
- <tr>
- <td>
- <?php set_checked($pconfig['dynamic_ip'], $chk); ?>
- <input name="dynamic_ip" type="checkbox" id="dynamic_ip" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Allow connected clients to retain their connections if their IP address changes"); ?>.<br />
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Address Pool"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="address pool">
- <tr>
- <td>
- <?php set_checked($pconfig['pool_enable'], $chk); ?>
- <input name="pool_enable" type="checkbox" id="pool_enable" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Provide a virtual adapter IP address to clients (see Tunnel Network)"); ?><br />
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr id="topology_subnet_opt">
- <td width="22%" valign="top" class="vncell"><?=gettext("Topology"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="topology">
- <tr>
- <td>
- <?php set_checked($pconfig['topology_subnet'], $chk); ?>
- <input name="topology_subnet" type="checkbox" id="topology_subnet" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Allocate only one IP per client (topology subnet), rather than an isolated subnet per client (topology net30)."); ?><br />
- </span>
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>
- <?=gettext("Relevant when supplying a virtual adapter IP address to clients when using tun mode on IPv4."); ?><br />
- <?=gettext("Some clients may require this even for IPv6, such as OpenVPN Connect (iOS/Android). Others may break if it is present, such as older versions of OpenVPN or clients such as Yealink phones."); ?><br />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("DNS Default Domain"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="dns default domain">
- <tr>
- <td>
- <?php set_checked($pconfig['dns_domain_enable'], $chk); ?>
- <input name="dns_domain_enable" type="checkbox" id="dns_domain_enable" value="yes" <?=$chk;?> onclick="dns_domain_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Provide a default domain name to clients"); ?><br />
- </span>
- </td>
- </tr>
- </table>
- <table border="0" cellpadding="2" cellspacing="0" id="dns_domain_data" summary="dns domain data">
- <tr>
- <td>
- <input name="dns_domain" type="text" class="formfld unknown" id="dns_domain" size="30" value="<?=htmlspecialchars($pconfig['dns_domain']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("DNS Servers"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="dns servers">
- <tr>
- <td>
- <?php set_checked($pconfig['dns_server_enable'], $chk); ?>
- <input name="dns_server_enable" type="checkbox" id="dns_server_enable" value="yes" <?=$chk;?> onclick="dns_server_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Provide a DNS server list to clients"); ?><br />
- </span>
- </td>
- </tr>
- </table>
- <table border="0" cellpadding="2" cellspacing="0" id="dns_server_data" summary="dns servers">
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #1:&nbsp;
- </span>
- <input name="dns_server1" type="text" class="formfld unknown" id="dns_server1" size="20" value="<?=htmlspecialchars($pconfig['dns_server1']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #2:&nbsp;
- </span>
- <input name="dns_server2" type="text" class="formfld unknown" id="dns_server2" size="20" value="<?=htmlspecialchars($pconfig['dns_server2']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #3:&nbsp;
- </span>
- <input name="dns_server3" type="text" class="formfld unknown" id="dns_server3" size="20" value="<?=htmlspecialchars($pconfig['dns_server3']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #4:&nbsp;
- </span>
- <input name="dns_server4" type="text" class="formfld unknown" id="dns_server4" size="20" value="<?=htmlspecialchars($pconfig['dns_server4']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <tr id="chkboxPushRegisterDNS">
- <td width="22%" valign="top" class="vncell"><?=gettext("Force DNS cache update"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="push register dns">
- <tr>
- <td>
- <?php set_checked($pconfig['push_register_dns'], $chk); ?>
- <input name="push_register_dns" type="checkbox" value="yes" <?=$chk;?> />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Run ''net stop dnscache'', ''net start dnscache'', ''ipconfig /flushdns'' and ''ipconfig /registerdns'' on connection initiation. This is known to kick Windows into recognizing pushed DNS servers."); ?><br />
- </span>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("NTP Servers"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="ntp servers">
- <tr>
- <td>
- <?php set_checked($pconfig['ntp_server_enable'], $chk); ?>
- <input name="ntp_server_enable" type="checkbox" id="ntp_server_enable" value="yes" <?=$chk;?> onclick="ntp_server_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Provide a NTP server list to clients"); ?><br />
- </span>
- </td>
- </tr>
- </table>
- <table border="0" cellpadding="2" cellspacing="0" id="ntp_server_data" summary="ntp servers">
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #1:&nbsp;
- </span>
- <input name="ntp_server1" type="text" class="formfld unknown" id="ntp_server1" size="20" value="<?=htmlspecialchars($pconfig['ntp_server1']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #2:&nbsp;
- </span>
- <input name="ntp_server2" type="text" class="formfld unknown" id="ntp_server2" size="20" value="<?=htmlspecialchars($pconfig['ntp_server2']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("NetBIOS Options"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="netboios options">
- <tr>
- <td>
- <?php set_checked($pconfig['netbios_enable'], $chk); ?>
- <input name="netbios_enable" type="checkbox" id="netbios_enable" value="yes" <?=$chk;?> onclick="netbios_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Enable NetBIOS over TCP/IP"); ?><br />
- </span>
- </td>
- </tr>
- </table>
- <?=gettext("If this option is not set, all NetBIOS-over-TCP/IP options (including WINS) will be disabled"); ?>.
- <br />
- <table border="0" cellpadding="2" cellspacing="0" id="netbios_data" summary="netboios options">
- <tr>
- <td>
- <br />
- <span class="vexpl">
- <?=gettext("Node Type"); ?>:&nbsp;
- </span>
- <select name='netbios_ntype' class="formselect">
- <?php
- foreach ($netbios_nodetypes as $type => $name):
- $selected = "";
- if ($pconfig['netbios_ntype'] == $type) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$type;?>" <?=$selected;?>><?=$name;?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <?=gettext("Possible options: b-node (broadcasts), p-node " .
- "(point-to-point name queries to a WINS server), " .
- "m-node (broadcast then query name server), and " .
- "h-node (query name server, then broadcast)"); ?>.
- </td>
- </tr>
- <tr>
- <td>
- <br />
- <span class="vexpl">
- <?=gettext("Scope ID"); ?>:&nbsp;
- </span>
- <input name="netbios_scope" type="text" class="formfld unknown" id="netbios_scope" size="30" value="<?=htmlspecialchars($pconfig['netbios_scope']);?>" />
- <br />
- <?=gettext("A NetBIOS Scope ID provides an extended naming " .
- "service for NetBIOS over TCP/IP. The NetBIOS " .
- "scope ID isolates NetBIOS traffic on a single " .
- "network to only those nodes with the same " .
- "NetBIOS scope ID"); ?>.
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr id="wins_opts">
- <td width="22%" valign="top" class="vncell"><?=gettext("WINS Servers"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="wins servers">
- <tr>
- <td>
- <?php set_checked($pconfig['wins_server_enable'], $chk); ?>
- <input name="wins_server_enable" type="checkbox" id="wins_server_enable" value="yes" <?=$chk;?> onclick="wins_server_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Provide a WINS server list to clients"); ?><br />
- </span>
- </td>
- </tr>
- </table>
- <table border="0" cellpadding="2" cellspacing="0" id="wins_server_data" summary="wins servers">
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #1:&nbsp;
- </span>
- <input name="wins_server1" type="text" class="formfld unknown" id="wins_server1" size="20" value="<?=htmlspecialchars($pconfig['wins_server1']);?>" />
- </td>
- </tr>
- <tr>
- <td>
- <span class="vexpl">
- <?=gettext("Server"); ?> #2:&nbsp;
- </span>
- <input name="wins_server2" type="text" class="formfld unknown" id="wins_server2" size="20" value="<?=htmlspecialchars($pconfig['wins_server2']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Client Management Port"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="client management port">
- <tr>
- <td>
- <?php set_checked($pconfig['client_mgmt_port_enable'], $chk); ?>
- <input name="client_mgmt_port_enable" type="checkbox" id="client_mgmt_port_enable" value="yes" <?=$chk;?> onclick="client_mgmt_port_change()" />
- </td>
- <td>
- <span class="vexpl">
- <?=gettext("Use a different management port on clients. The default port is 166. Specify a different port if the client machines need to select from multiple OpenVPN links."); ?><br />
- </span>
- </td>
- </tr>
- </table>
- <table border="0" cellpadding="2" cellspacing="0" id="client_mgmt_port_data" summary="client management port">
- <tr>
- <td>
- <input name="client_mgmt_port" type="text" class="formfld unknown" id="client_mgmt_port" size="30" value="<?=htmlspecialchars($pconfig['client_mgmt_port']);?>" />
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
-
- <table width="100%" border="0" cellpadding="6" cellspacing="0" id="client_opts" summary="advance configuration">
- <tr>
- <td colspan="2" class="list" height="12"></td>
- </tr>
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Advanced"); ?></td>
- <td width="78%" class="vtable">
- <table border="0" cellpadding="2" cellspacing="0" summary="advance configuration">
- <tr>
- <td>
- <textarea rows="6" cols="78" name="custom_options" id="custom_options"><?=htmlspecialchars($pconfig['custom_options']);?></textarea><br />
- <?=gettext("Enter any additional options you would like to add to the OpenVPN server configuration here, separated by a semicolon"); ?><br />
- <?=gettext("EXAMPLE: push \"route 10.0.0.0 255.255.255.0\""); ?>;
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <tr id="comboboxVerbosityLevel">
- <td width="22%" valign="top" class="vncell"><?=gettext("Verbosity level");?></td>
- <td width="78%" class="vtable">
- <select name="verbosity_level" class="formselect">
- <?php
- foreach ($openvpn_verbosity_level as $verb_value => $verb_desc):
- $selected = "";
- if ($pconfig['verbosity_level'] == $verb_value) {
- $selected = "selected=\"selected\"";
- }
- ?>
- <option value="<?=$verb_value;?>" <?=$selected;?>><?=$verb_desc;?></option>
- <?php endforeach; ?>
- </select>
- <br />
- <?=gettext("Each level shows all info from the previous levels. Level 3 is recommended if you want a good summary of what's happening without being swamped by output"); ?>.<br /> <br />
- <strong>none</strong> -- <?=gettext("No output except fatal errors"); ?>. <br />
- <strong>default</strong>-<strong>4</strong> -- <?=gettext("Normal usage range"); ?>. <br />
- <strong>5</strong> -- <?=gettext("Output R and W characters to the console for each packet read and write, uppercase is used for TCP/UDP packets and lowercase is used for TUN/TAP packets"); ?>. <br />
- <strong>6</strong>-<strong>11</strong> -- <?=gettext("Debug info range"); ?>.
- </td>
- </tr>
-
- </table>
-
- <br />
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="icons">
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
- <input name="act" type="hidden" value="<?=$act;?>" />
- <?php if (isset($id) && $a_server[$id]): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
- </form>
-
- <?php else: ?>
-
- <table class="sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="list">
- <thead>
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('OpenVPN Servers')?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
<tr>
- <td width="10%" class="listhdrr"><?=gettext("Disabled"); ?></td>
- <td width="10%" class="listhdrr"><?=gettext("Protocol / Port"); ?></td>
- <td width="30%" class="listhdrr"><?=gettext("Tunnel Network"); ?></td>
- <td width="40%" class="listhdrr"><?=gettext("Description"); ?></td>
- <td width="10%" class="list"></td>
+ <th><?=gettext("Protocol / Port")?></th>
+ <th><?=gettext("Tunnel Network")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><!-- Buttons --></th>
</tr>
- </thead>
- <tfoot>
- <tr>
- <td class="list" colspan="4"></td>
- <td class="list">
- <a href="vpn_openvpn_server.php?act=new"><img src="./themes/<?=$g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add server"); ?>" width="17" height="17" border="0" alt="add" />
- </a>
- </td>
- </tr>
- </tfoot>
- <tbody>
- <?php
- $i = 0;
- foreach ($a_server as $server):
- $disabled = "NO";
- if (isset($server['disable'])) {
- $disabled = "YES";
- }
- ?>
- <tr>
- <td class="listlr" ondblclick="document.location='vpn_openvpn_server.php?act=edit&amp;id=<?=$i;?>'">
- <?=$disabled;?>
- </td>
- <td class="listr" ondblclick="document.location='vpn_openvpn_server.php?act=edit&amp;id=<?=$i;?>'">
- <?=htmlspecialchars($server['protocol']);?> / <?=htmlspecialchars($server['local_port']);?>
+ </thead>
+
+ <tbody>
+<?php
+ $i = 0;
+ foreach($a_server as $server):
+?>
+ <tr <?=isset($server['disable']) ? 'class="disabled"':''?>>
+ <td>
+ <?=htmlspecialchars($server['protocol'])?> / <?=htmlspecialchars($server['local_port'])?>
</td>
- <td class="listr" ondblclick="document.location='vpn_openvpn_server.php?act=edit&amp;id=<?=$i;?>'">
- <?=htmlspecialchars($server['tunnel_network']);?><br />
- <?=htmlspecialchars($server['tunnel_networkv6']);?><br />
+ <td>
+ <?=htmlspecialchars($server['tunnel_network'])?><br />
+ <?=htmlspecialchars($server['tunnel_networkv6'])?>
</td>
- <td class="listbg" ondblclick="document.location='vpn_openvpn_server.php?act=edit&amp;id=<?=$i;?>'">
- <?=htmlspecialchars($server['description']);?>
+ <td>
+ <?=htmlspecialchars($server['description'])?>
</td>
- <td valign="middle" class="list nowrap">
- <a href="vpn_openvpn_server.php?act=edit&amp;id=<?=$i;?>">
- <img src="./themes/<?=$g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit server"); ?>" width="17" height="17" border="0" alt="edit" />
- </a>
- &nbsp;
- <a href="vpn_openvpn_server.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this server?"); ?>')">
- <img src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete server"); ?>" width="17" height="17" border="0" alt="delete" />
- </a>
+ <td>
+ <a href="vpn_openvpn_server.php?act=edit&amp;id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext("Edit")?></a>
+ <a href="vpn_openvpn_server.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext("Delete")?></a>
</td>
</tr>
- <?php
- $i++;
- endforeach;
- ?>
- <tr style="display:none;"><td></td></tr>
- </tbody>
- </table>
+<?php
+ $i++;
+ endforeach;
+?>
+ </tbody>
+ </table>
+ </div>
+</div>
- <?=gettext("Additional OpenVPN servers can be added here.");?>
+<nav class="action-buttons">
+ <a href="vpn_openvpn_server.php?act=new" class="btn btn-sm btn-success">
+ <?=gettext("Add server")?>
+ </a>
+</nav>
- <?php endif; ?>
+<?php
+endif;
+
+// Note:
+// The following *_change() functions were converted from Javascript/DOM to JQuery but otherwise
+// mostly left unchanged. The logic on this form is complex andthis works!
+?>
- </td>
- </tr>
-</table>
<script type="text/javascript">
//<![CDATA[
-mode_change();
-autokey_change();
-tlsauth_change();
-gwredir_change();
-dns_domain_change();
-dns_server_change();
-wins_server_change();
-client_mgmt_port_change();
-ntp_server_change();
-netbios_change();
-tuntap_change();
-//]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
-<?php
+events.push(function(){
+
+ function mode_change() {
+ value = $('#mode').val();
+
+ switch(value) {
+ case "p2p_tls":
+ case "server_tls":
+ case "server_user":
+ hideCheckbox('tlsauth_enable', false);
+ hideCheckbox('auto_tls_enable', false);
+ hideInput('tls', false);
+ hideInput('ca_ref', false);
+ hideInput('crl_ref', false);
+ hideInput('certref', false);
+ hideInput('dh_length', false);
+ hideInput('cert_depth', false);
+ hideInput('strictusercn', true);
+ hideInput('autokey_enable', false);
+ hideInput('shared_key', false);
+ break;
+ case "server_tls_user":
+ hideCheckbox('tlsauth_enable', false);
+ hideCheckbox('auto_tls_enable', false);
+ hideInput('tls', false);
+ hideInput('ca_ref', false);
+ hideInput('crl_ref', false);
+ hideInput('certref', false);
+ hideInput('dh_length', false);
+ hideInput('cert_depth', false);
+ hideInput('strictusercn', false);
+ hideInput('autokey_enable', true);
+ hideInput('shared_key', true);
+ break;
+ case "p2p_shared_key":
+ hideCheckbox('tlsauth_enable', true);
+ hideCheckbox('auto_tls_enable', true);
+ hideInput('tls', true);
+ hideInput('ca_ref', true);
+ hideInput('crl_ref', true);
+ hideInput('certref', true);
+ hideInput('dh_length', true);
+ hideInput('cert_depth', true);
+ hideInput('strictusercn', true);
+ hideInput('autokey_enable', false);
+ hideInput('shared_key', false);
+ break;
+ }
-/* local utility functions */
+ switch(value) {
+ case "p2p_shared_key":
+ hideClass('advanced', true);
+ hideInput('remote_network', false);
+ hideInput('remote_networkv6', false);
+ hideInput('gwredir', true);
+ hideInput('local_network', true);
+ hideInput('local_networkv6', true);
+ hideInput('authmode', true);
+ hideInput('client2client', true);
+ break;
+ case "p2p_tls":
+ hideClass('advanced', true);
+ hideInput('remote_network', false);
+ hideInput('remote_networkv6', false);
+ hideInput('gwredir', false);
+ hideInput('local_network', false);
+ hideInput('local_networkv6', false);
+ hideInput('authmode', true);
+ hideInput('client2client', true);
+ break;
+ case "server_user":
+ case "server_tls_user":
+ hideClass('advanced', false);
+ hideInput('remote_network', true);
+ hideInput('remote_networkv6', true);
+ hideInput('gwredir', false);
+ hideInput('local_network', false);
+ hideInput('local_networkv6', false);
+ hideInput('authmode', false);
+ hideInput('client2client', false);
+ break;
+ case "server_tls":
+ hideInput('authmode', true);
+ default:
+ hideInput('custom_options', false);
+ hideInput('verbosity_level', false);
+ hideInput('remote_network', true);
+ hideInput('remote_networkv6', true);
+ hideInput('gwredir', false);
+ hideInput('local_network', false);
+ hideInput('local_networkv6', false);
+ hideInput('client2client', false);
+ break;
+ }
-function set_checked($var,& $chk) {
- if ($var) {
- $chk = "checked=\"checked\"";
- } else {
- $chk = "";
+ gwredir_change();
}
-}
-?>
+ function autokey_change() {
+ var hide = ! $('#autokey_enable').prop('checked')
+
+ hideInput('shared_key', hide);
+ }
+
+ function tlsauth_change() {
+ var hide = ! $('#tlsauth_enable').prop('checked')
+
+ <?php if (!$pconfig['tls']): ?>
+ hideCheckbox('autotls_enable', hide);
+ <?php endif; ?>
+
+ autotls_change();
+ }
+
+ function autotls_change() {
+
+ <?php if (!$pconfig['tls']): ?>
+ autocheck = $('#autotls_enable').prop('checked');
+ <?php else: ?>
+ autocheck = false;
+ <?php endif; ?>
+
+ if ($('#tlsauth_enable').prop('checked') && !autocheck)
+ hideInput('tls', false);
+ else
+ hideInput('tls', true);
+ }
+
+ function gwredir_change() {
+ var hide = ! $('#gwredir').prop('checked')
+
+ hideInput('local_network', hide);
+ hideInput('local_networkv6', hide);
+ hideInput('remote_network', hide);
+ hideInput('remote_networkv6', hide);
+ }
+
+ function dns_domain_change() {
+ var hide = ! $('#dns_domain_enable').prop('checked')
+
+ hideInput('dns_domain', hide);
+ }
+
+ function dns_server_change() {
+ var hide = ! $('#dns_server_enable').prop('checked')
+
+ hideInput('dns_server1', hide);
+ hideInput('dns_server2', hide);
+ hideInput('dns_server3', hide);
+ hideInput('dns_server4', hide);
+ }
+
+ function wins_server_change() {
+ var hide = ! $('#wins_server_enable').prop('checked')
+
+ hideInput('wins_server1', hide);
+ hideInput('wins_server2', hide);
+ }
+
+ function client_mgmt_port_change() {
+ var hide = ! $('#client_mgmt_port_enable').prop('checked')
+
+ hideInput('client_mgmt_port', hide);
+ }
+
+ function ntp_server_change() {
+ var hide = ! $('#ntp_server_enable').prop('checked')
+
+ hideInput('ntp_server1', hide);
+ hideInput('ntp_server2', hide);
+ }
+
+ function netbios_change() {
+ var hide = ! $('#netbios_enable').prop('checked')
+
+ hideInput('netbios_ntype', hide);
+ hideInput('netbios_scope', hide);
+ hideCheckbox('wins_server_enable', hide);
+ wins_server_change();
+ hideCheckbox('client_mgmt_port_enable', hide);
+ client_mgmt_port_change();
+ }
+
+ function tuntap_change() {
+
+ mvalue = $('#mode').val();
+
+ switch(mvalue) {
+ case "p2p_tls":
+ case "p2p_shared_key":
+ p2p = true;
+ break;
+ default:
+ p2p = false;
+ break;
+ }
+
+ value = $('#dev_mode').val();
+
+ switch(value) {
+ case "tun":
+ hideCheckbox('no_tun_ipv6', false);
+ hideInput('tunnel_network', false);
+ hideCheckbox('serverbridge_dhcp', true);
+ hideInput('serverbridge_interface', true);
+ hideInput('serverbridge_dhcp_start', true);
+ hideInput('serverbridge_dhcp_end', true);
+ hideInput('topology_subnet', false);
+ break;
+
+ case "tap":
+ hideCheckbox('no_tun_ipv6', true);
+ hideInput('tunnel_network', false);
+
+ if (!p2p) {
+ hideCheckbox('serverbridge_dhcp', false);
+ hideInput('serverbridge_interface', false);
+ hideInput('serverbridge_dhcp_start', false);
+ hideInput('serverbridge_dhcp_end', false);
+ hideInput('topology_subnet', false);
+
+ if( $('#serverbridge_dhcp').prop('checked')) {
+ disableInput('serverbridge_interface', false);
+ disableInput('serverbridge_dhcp_start', false);
+ disableInput('serverbridge_dhcp_end', false);
+ } else {
+ disableInput('serverbridge_interface', true);
+ disableInput('serverbridge_dhcp_start', true);
+ disableInput('serverbridge_dhcp_end', true);
+ }
+ } else {
+ hideInput('topology_subnet', true);
+ disableInput('serverbridge_dhcp', true);
+ disableInput('serverbridge_interface', true);
+ disableInput('serverbridge_dhcp_start', true);
+ disableInput('serverbridge_dhcp_end', true);
+ }
+
+ break;
+ }
+ }
+
+ // ---------- Library of show/hide functions ----------------------------------------------------------------------
+
+ // Hides the <div> in which the specified input element lives so that the input,
+ // its label and help text are hidden
+ function hideInput(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent('div').removeClass('hidden');
+ }
+
+ // Hides the <div> in which the specified checkbox lives so that the checkbox,
+ // its label and help text are hidden
+ function hideCheckbox(id, hide) {
+ if(hide)
+ $('#' + id).parent().parent().parent('div').addClass('hidden');
+ else
+ $('#' + id).parent().parent().parent('div').removeClass('hidden');
+ }
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
+ }
+
+ // Hides all elements of the specified class. This will usually be a section or group
+ function hideClass(s_class, hide) {
+ if(hide)
+ $('.' + s_class).hide();
+ else
+ $('.' + s_class).show();
+ }
+
+ // ---------- Monitor elements for change and call the appropriate display functions ------------------------------
+
+ // NTP
+ $('#ntp_server_enable').click(function () {
+ ntp_server_change();
+ });
+
+ // Netbios
+ $('#netbios_enable').click(function () {
+ netbios_change();
+ });
+
+ // Client management port
+ $('#client_mgmt_port_enable').click(function () {
+ client_mgmt_port_change();
+ });
+
+ // Wins server port
+ $('#wins_server_enable').click(function () {
+ wins_server_change();
+ });
+
+ // DNS server port
+ $('#dns_server_enable').click(function () {
+ dns_server_change();
+ });
+
+ // DNS server port
+ $('#dns_domain_enable').click(function () {
+ dns_domain_change();
+ });
+
+ // Gateway redirect
+ $('#gwredir').click(function () {
+ gwredir_change();
+ });
+
+ // Auto TLSkey generation
+ $('#autotls_enable').click(function () {
+ autotls_change();
+ });
+
+ // TLS Authorization
+ $('#tlsauth_enable').click(function () {
+ tlsauth_change();
+ });
+
+ // Auto key
+ $('#autokey_enable').click(function () {
+ autokey_change();
+ });
+
+ // Mode
+ $('#mode').click(function () {
+ mode_change();
+ });
+
+ // Tun/tap mode
+ $('#dev_mode').click(function () {
+ tuntap_change();
+ });
+
+ // ---------- Set initial page display state ----------------------------------------------------------------------
+ mode_change();
+ autokey_change();
+ tlsauth_change();
+ gwredir_change();
+ dns_domain_change();
+ dns_server_change();
+ wins_server_change();
+ client_mgmt_port_change();
+ ntp_server_change();
+ netbios_change();
+ tuntap_change();
+});
+//]]>
+</script>
+<?php
+
+include("foot.inc");
diff --git a/src/usr/local/www/vpn_pppoe.php b/src/usr/local/www/vpn_pppoe.php
index 4ad8d72..726cfaf 100644
--- a/src/usr/local/www/vpn_pppoe.php
+++ b/src/usr/local/www/vpn_pppoe.php
@@ -27,7 +27,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/*
- pfSense_MODULE: pppoe
+ pfSense_MODULE: pppoe
*/
##|+PRIV
@@ -94,74 +94,58 @@ $pgtitle = array(gettext("VPN"), gettext("PPPoE"));
$shortcut_section = "pppoes";
include("head.inc");
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+if (is_subsystem_dirty('vpnpppoe'))
+ print_info_box_np(gettext('The PPPoE entry list has been changed') . '.<br />' . gettext('You must apply the changes in order for them to take effect.'));
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<form action="vpn_pppoe.php" method="post">
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('vpnpppoe')): ?><br/>
-<?php print_info_box_np(gettext("The PPPoE entry list has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?>
-<?php endif; ?>
-
-<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td width="15%" class="listhdrr"><?=gettext("Interface");?></td>
- <td width="10%" class="listhdrr"><?=gettext("Local IP");?></td>
- <td width="25%" class="listhdrr"><?=gettext("Number of users");?></td>
- <td width="25%" class="listhdr"><?=gettext("Description");?></td>
- <td width="5%" class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="pppoe server">
- <tr>
- <td valign="middle" width="17">&nbsp;</td>
- <td valign="middle"><a href="vpn_pppoe_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new pppoe instance");?>" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
+<div class="table-responsive">
+ <table class="table table-striped table-hover table-condensed">
+ <thead>
+ <tr>
+ <th><?=gettext("Interface")?></th>
+ <th><?=gettext("Local IP")?></th>
+ <th><?=gettext("Number of users")?></th>
+ <th><?=gettext("Description")?></th>
+ <th><!-- Action buttons --></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- $i = 0;
- foreach ($a_pppoes as $pppoe):
+$i = 0;
+foreach ($a_pppoes as $pppoe):
?>
- <tr>
- <td class="listlr" ondblclick="document.location='vpn_pppoe_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($pppoe['interface']));?>
- </td>
- <td class="listlr" ondblclick="document.location='vpn_pppoe_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($pppoe['localip']);?>
- </td>
- <td class="listr" ondblclick="document.location='vpn_pppoe_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($pppoe['n_pppoe_units']);?>
- </td>
- <td class="listbg" ondblclick="document.location='vpn_pppoe_edit.php?id=<?=$i;?>';">
- <?=htmlspecialchars($pppoe['descr']);?>&nbsp;
- </td>
- <td valign="middle" class="list nowrap">
- <table border="0" cellspacing="0" cellpadding="1" summary="icons">
- <tr>
- <td valign="middle"><a href="vpn_pppoe_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit PPPoE instance"); ?>" alt="edit" /></a></td>
- <td><a href="vpn_pppoe.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this entry? All elements that still use it will become invalid (e.g. filter rules)!");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete pppoe instance");?>" alt="delete" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
+ <tr>
+ <td>
+ <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($pppoe['interface']))?>
+ </td>
+ <td>
+ <?=htmlspecialchars($pppoe['localip'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($pppoe['n_pppoe_units'])?>
+ </td>
+ <td>
+ <?=htmlspecialchars($pppoe['descr'])?>
+ </td>
+ <td>
+ <a href="vpn_pppoe_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext('Edit')?></a>
+ <a href="vpn_pppoe.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext('Delete')?></a>
+ </td>
+ </tr>
<?php
- $i++;
- endforeach;
+ $i++;
+endforeach;
?>
- <tr>
- <td class="list" colspan="4"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1" summary="add">
- <tr>
- <td valign="middle" width="17">&nbsp;</td>
- <td valign="middle"><a href="vpn_pppoe_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new pppoe instance");?>" alt="add" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
-</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+ </tbody>
+ </table>
+</div>
+
+<nav class="action-buttons">
+ <a href="vpn_pppoe_edit.php" class="btn btn-success"><?=gettext("Add")?></a>
+</nav>
+
+<?php
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/vpn_pppoe_edit.php b/src/usr/local/www/vpn_pppoe_edit.php
index 343c1f9..e4617a8 100644
--- a/src/usr/local/www/vpn_pppoe_edit.php
+++ b/src/usr/local/www/vpn_pppoe_edit.php
@@ -39,6 +39,8 @@
require("guiconfig.inc");
require_once("vpn.inc");
+$addrow = false;
+$dltrow = 9999;
function vpn_pppoe_get_id() {
global $config;
@@ -60,12 +62,19 @@ function vpn_pppoe_get_id() {
if (!is_array($config['pppoes']['pppoe'])) {
$config['pppoes']['pppoe'] = array();
}
+
$a_pppoes = &$config['pppoes']['pppoe'];
if (is_numericint($_GET['id'])) {
$id = $_GET['id'];
-}
-if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+
+if($_GET['addrow'] == 'true')
+ $addrow = true;
+
+if (is_numericint($_GET['dltrow']))
+ $dltrow = $_GET['dltrow'];
+
+if (isset($_POST['id']) && is_numericint($_POST['id']))
$id = $_POST['id'];
}
@@ -93,6 +102,7 @@ if (isset($id) && $a_pppoes[$id]) {
$pconfig['radiusserveracctport'] = $pppoecfg['radius']['server']['acctport'];
$pconfig['radiussecret'] = $pppoecfg['radius']['server']['secret'];
}
+
if (is_array($pppoecfg['radius']['server2'])) {
$pconfig['radiussecenable'] = isset($pppoecfg['radius']['server2']['enable']);
$pconfig['radiusserver2'] = $pppoecfg['radius']['server2']['ip'];
@@ -100,14 +110,13 @@ if (isset($id) && $a_pppoes[$id]) {
$pconfig['radiusserver2acctport'] = $pppoecfg['radius']['server2']['acctport'];
$pconfig['radiussecret2'] = $pppoecfg['radius']['server2']['secret2'];
}
+
$pconfig['radius_nasip'] = $pppoecfg['radius']['nasip'];
$pconfig['radius_acct_update'] = $pppoecfg['radius']['acct_update'];
}
}
-
if ($_POST) {
-
unset($input_errors);
$pconfig = $_POST;
@@ -177,6 +186,7 @@ if ($_POST) {
$pppoecfg['radius']['nasip'] = $_POST['radius_nasip'];
$pppoecfg['radius']['acct_update'] = $_POST['radius_acct_update'];
}
+
if ($_POST['radiusserver']) {
$pppoecfg['radius']['server'] = array();
@@ -185,6 +195,7 @@ if ($_POST) {
$pppoecfg['radius']['server']['port'] = $_POST['radiusserverport'];
$pppoecfg['radius']['server']['acctport'] = $_POST['radiusserveracctport'];
}
+
if ($_POST['radiusserver2']) {
$pppoecfg['radius']['server2'] = array();
@@ -258,414 +269,351 @@ if ($_POST) {
}
}
-$pgtitle = array(gettext("Services"), gettext("PPPoE Server"), gettext("Edit"));
+function build_interface_list() {
+ $list = array();
+
+ $interfaces = get_configured_interface_with_descr();
+
+ foreach ($interfaces as $iface => $ifacename)
+ $list[$iface] = $ifacename;
+
+ return($list);
+}
+
+$pgtitle = array(gettext("Services"),gettext("PPPoE Server"), gettext("Edit"));
$shortcut_section = "pppoes";
include("head.inc");
-?>
+if ($input_errors)
+ print_input_errors($input_errors);
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript" src="/javascript/row_helper.js"></script>
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('PPPoE Server Configuration');
+
+$section->addInput(new Form_Checkbox(
+ 'mode',
+ 'Enable',
+ 'Enable PPPoE Server',
+ ($pconfig['mode'] == "server")
+)) ->toggles('.form-group:not(:first-child)');
+
+$section->addInput(new Form_Select(
+ 'interface',
+ 'Interface',
+ $pconfig['interface'],
+ build_interface_list()
+
+));
+
+$section->addInput(new Form_Select(
+ 'pppoe_subnet',
+ 'Subnet netask',
+ $pconfig['pppoe_subnet'],
+ array_combine(range(0, 32, 1), range(0, 32, 1))
+))->setHelp('Hint: 24 is 255.255.255.0');
+
+$section->addInput(new Form_Select(
+ 'n_pppoe_units',
+ 'No. of PPPoE Users',
+ $pconfig['n_pppoe_units'],
+ array_combine(range(0, 255, 1), range(0, 255, 1))
+));
+
+$section->addInput(new Form_IpAddress(
+ 'localip',
+ 'Server Address',
+ $pconfig['localip']
+))->setHelp('Enter the IP address the PPPoE server should give to clients for use as their "gateway"' . '<br />' .
+ 'Typically this is set to an unused IP just outside of the client range '. '<br />' .
+ 'NOTE: This should NOT be set to any IP address currently in use on this firewall');
+
+$section->addInput(new Form_IpAddress(
+ 'remoteip',
+ 'Remote Address Range',
+ $pconfig['remoteip']
+))->setHelp('Specify the starting address for the client IP address subnet');
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+));
+
+$section->addInput(new Form_Input(
+ 'pppoe_dns1',
+ 'DNS Servers',
+ 'text',
+ $pconfig['pppoe_dns1']
+));
+
+$section->addInput(new Form_IpAddress(
+ 'pppoe_dns2',
+ null,
+ $pconfig['pppoe_dns2']
+))->setHelp('If entered these servers will be given to all PPPoE clients, otherwise LAN DNS and one WAN DNS will go to all clients');
+
+$section->addInput(new Form_Checkbox(
+ 'radiusenable',
+ 'RADIUS',
+ 'Use a Radius Server for authentication',
+ $pconfig['radiusenable']
+))->setHelp('All users will be authenticated using the RADIUS server specified below. The local user database ' .
+ 'will not be used');
+
+$section->addInput(new Form_Checkbox(
+ 'radacct_enable',
+ null,
+ 'Enable Radius Accounting',
+ $pconfig['radacct_enable']
+))->setHelp('Sends accounting packets to the RADIUS server');
+
+$section->addInput(new Form_Checkbox(
+ 'radiussecenable',
+ null,
+ 'Use backup RADIUS server',
+ $pconfig['radiussecenable']
+))->setHelp('If primary server fails all requests will be sent via backup server');
+
+$section->addInput(new Form_IpAddress(
+ 'radius_nasip',
+ 'NAS IP Address',
+ $pconfig['radius_nasip']
+))->setHelp('RADIUS server NAS IP Address');
+
+$section->addInput(new Form_Input(
+ 'radius_acct_update',
+ 'RADIUS Accounting Update',
+ 'text',
+ $pconfig['radius_acct_update']
+))->setHelp('RADIUS accounting update period in seconds');
+
+$section->addInput(new Form_Checkbox(
+ 'radiusissueips',
+ 'Radius Issued IPs',
+ 'Issue IP Addresses via RADIUS server',
+ $pconfig['radiusissueips']
+));
+
+$group = new Form_Group('RADIUS server Primary');
+
+$group->add(new Form_IpAddress(
+ 'radiusserver',
+ null,
+ $pconfig['radiusserver']
+))->setHelp('IP Address');
+
+$group->add(new Form_Input(
+ 'radiusserverport',
+ null,
+ 'text',
+ $pconfig['radiusserverport']
+))->setHelp('Authentication port ');
+
+$group->add(new Form_Input(
+ 'radiusserveracctport',
+ null,
+ 'text',
+ $pconfig['radiusserveracctport']
+))->setHelp('Accounting port (optional)');
+
+$group->setHelp('Standard ports are 1812 (authentication) and 1813 (accounting)');
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'radiussecret',
+ 'RADIUS primary shared secret',
+ 'password',
+ $pconfig['radiussecret']
+))->setHelp('Enter the shared secret that will be used to authenticate to the RADIUS server.');
+
+$group = new Form_Group('RADIUS server Secondary');
+
+$group->add(new Form_IpAddress(
+ 'radiusserver2',
+ null,
+ $pconfig['radiusserver2']
+))->setHelp('IP Address');
+
+$group->add(new Form_Input(
+ 'radiusserver2port',
+ null,
+ 'text',
+ $pconfig['radiusserver2port']
+))->setHelp('Authentication port ');
+
+$group->add(new Form_Input(
+ 'radiusserver2acctport',
+ null,
+ 'text',
+ $pconfig['radiusserver2acctport']
+))->setHelp('Accounting port (optional)');
+
+$group->setHelp('Standard ports are 1812 (authentication) and 1813 (accounting)');
+
+$section->add($group);
+
+$section->addInput(new Form_Input(
+ 'radiussecret2',
+ 'RADIUS secondary shared secret',
+ 'password',
+ $pconfig['radiussecret2']
+))->setHelp('Enter the shared secret that will be used to authenticate to the backup RADIUS server.');
+
+$counter = 0;
+$usernames = $pconfig['username'];
+
+//DEBUG
+$usernames = 'sbeaver:TXlQYXNzd2Q=:192.168.1.1 smith:TXlQYXNzd2Q=:192.168.2.1 sjones:TXlQYXNzd2Q=:192.168.3.1 salpha:TXlQYXNzd2Q=:192.168.4.1';
+
+if($addrow)
+ $usernames .= ' ::';
+
+if ($usernames != ""):
+ $item = explode(" ", $usernames);
+
+ $numrows = count($item) -1;
+
+ foreach($item as $ww):
+ $wws = explode(":", $ww);
+ $user = $wws[0];
+ $passwd = base64_decode($wws[1]);
+ $ip = $wws[2];
+
+ $tracker = $counter;
+
+ if($tracker != $dltrow) {
+ $group = new Form_Group($counter == 0 ? 'User table':null);
+
+ $group->add(new Form_Input(
+ 'username' . $tracker,
+ null,
+ 'text',
+ $user
+ ))->setHelp($numrows == $tracker ? 'User name':null);
+
+ $group->add(new Form_Input(
+ 'password' . $tracker,
+ null,
+ 'password',
+ $passwd
+ ))->setHelp($numrows == $tracker ? 'Password':null);
+
+ $group->add(new Form_IpAddress(
+ 'ip' . $tracker,
+ null,
+ $ip
+ ))->setHelp($numrows == $tracker ? 'IP Address':null);
+
+ $btndltrow = new Form_Button(
+ 'btndltrow' . $tracker,
+ 'Delete',
+ 'vpn_pppoe_edit.php?id=' . $id . '&dltrow=' . $tracker
+ );
+
+ $btndltrow->removeClass('btn-primary')->addClass('btn-danger btn-sm');
+
+ $group->add($btndltrow);
+ $section->add($group);
+ }
-<input type='hidden' name='username' value='textbox' class="formfld unknown" />
-<input type='hidden' name='password' value='textbox' />
-<input type='hidden' name='ip' value='textbox' />
+ $counter++;
+ endforeach;
+endif;
-<script type="text/javascript">
- //<![CDATA[
- rowname[0] = "username";
- rowtype[0] = "textbox";
- rowsize[0] = "20";
+$btnaddrow = new Form_Button(
+ 'btnaddrow',
+ 'Add Row',
+ 'vpn_pppoe_edit.php?id=' . $id . '&addrow=true'
+ );
- rowname[1] = "password";
- rowtype[1] = "password";
- rowsize[1] = "20";
+$btnaddrow->removeClass('btn-primary')->addClass('btn-success btn-sm');
- rowname[2] = "ip";
- rowtype[2] = "textbox";
- rowsize[2] = "10";
- //]]>
-</script>
+$section->addInput($btnaddrow);
-<script type="text/javascript">
-//<![CDATA[
-function get_radio_value(obj) {
- for (i = 0; i < obj.length; i++) {
- if (obj[i].checked) {
- return obj[i].value;
- }
- }
- return null;
+// Hidden fields
+if(isset($id)) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ htmlspecialchars($id, ENT_QUOTES | ENT_HTML401)
+ ));
}
-function enable_change(enable_over) {
- if ((get_radio_value(document.iform.mode) == "server") || enable_over) {
- document.iform.remoteip.disabled = 0;
- document.iform.descr.disabled = 0;
- document.iform.localip.disabled = 0;
- document.iform.radiusenable.disabled = 0;
- document.iform.interface.disabled = 0;
- document.iform.n_pppoe_units.disabled = 0;
- document.iform.pppoe_subnet.disabled = 0;
- document.iform.pppoe_dns1.disabled = 0;
- document.iform.pppoe_dns2.disabled = 0;
- if (document.iform.radiusenable.checked || enable_over) {
- document.iform.radacct_enable.disabled = 0;
- document.iform.radiusserver.disabled = 0;
- document.iform.radiussecret.disabled = 0;
- document.iform.radiusserverport.disabled = 0;
- document.iform.radiusserveracctport.disabled = 0;
- document.iform.radiusissueips.disabled = 0;
- document.iform.radius_nasip.disabled = 0;
- document.iform.radiusissueips.disabled = 0;
- document.iform.radius_nasip.disabled = 0;
- document.iform.radius_acct_update.disabled = 0;
- document.iform.radiussecenable.disabled = 0;
- if (document.iform.radiussecenable.checked || enable_over) {
- document.iform.radiusserver2.disabled = 0;
- document.iform.radiussecret2.disabled = 0;
- document.iform.radiusserver2port.disabled = 0;
- document.iform.radiusserver2acctport.disabled = 0;
- } else {
+if (isset($pconfig['pppoeid'])) {
+ $section->addInput(new Form_Input(
+ 'pppoeid',
+ null,
+ 'hidden',
+ $pconfig['pppoeid']
+ ));
+}
- document.iform.radiusserver2.disabled = 1;
- document.iform.radiussecret2.disabled = 1;
- document.iform.radiusserver2port.disabled = 1;
- document.iform.radiusserver2acctport.disabled = 1;
- }
- } else {
- document.iform.radacct_enable.disabled = 1;
- document.iform.radiusserver.disabled = 1;
- document.iform.radiussecret.disabled = 1;
- document.iform.radiusserverport.disabled = 1;
- document.iform.radiusserveracctport.disabled = 1;
- document.iform.radiusissueips.disabled = 1;
- document.iform.radius_nasip.disabled = 1;
- document.iform.radius_acct_update.disabled = 1;
- document.iform.radiussecenable.disabled = 1;
- }
- } else {
- document.iform.interface.disabled = 1;
- document.iform.n_pppoe_units.disabled = 1;
- document.iform.pppoe_subnet.disabled = 1;
- document.iform.remoteip.disabled = 1;
- document.iform.descr.disabled = 1;
- document.iform.localip.disabled = 1;
- document.iform.pppoe_dns1.disabled = 1;
- document.iform.pppoe_dns2.disabled = 1;
- document.iform.radiusenable.disabled = 1;
- document.iform.radiussecenable.disabled = 1;
- document.iform.radacct_enable.disabled = 1;
- document.iform.radiusserver.disabled = 1;
- document.iform.radiussecret.disabled = 1;
- document.iform.radiusserverport.disabled = 1;
- document.iform.radiusserveracctport.disabled = 1;
- document.iform.radiusserver2.disabled = 1;
- document.iform.radiussecret2.disabled = 1;
- document.iform.radiusserver2port.disabled = 1;
- document.iform.radiusserver2acctport.disabled = 1;
- document.iform.radiusissueips.disabled = 1;
- document.iform.radius_nasip.disabled = 1;
- document.iform.radius_acct_update.disabled = 1;
+$form->add($section);
+
+print($form);
+
+print_info_box(gettext('Don\'t forget to add a firewall rule to permit traffic from PPPoE clients'));
+?>
+<script>
+//<![CDATA[
+events.push(function(){
+
+ // Disables the specified input element
+ function disableInput(id, disable) {
+ $('#' + id).prop("disabled", disable);
}
-}
+
+ // show/hide radius server controls
+ function hide_radius(hide) {
+ disableInput('radacct_enable', hide);
+ disableInput('radiusserver', hide);
+ disableInput('radiussecret', hide);
+ disableInput('radiusserverport', hide);
+ disableInput('radiusserveracctport', hide);
+ disableInput('radiusissueips', hide);
+ disableInput('radius_nasip', hide);
+ disableInput('radiusissueips', hide);
+ disableInput('radius_nasip', hide);
+ disableInput('radius_acct_update', hide);
+ disableInput('radiussecenable', hide);
+ hide_radius2(hide);
+ }
+ // show/hide radius server 2 controls
+ function hide_radius2(hide) {
+ disableInput('radiusserver2', hide);
+ disableInput('radiussecret2', hide);
+ disableInput('radiusserver2port', hide);
+ disableInput('radiusserver2acctport', hide);
+ }
+
+ // When the RADIUS checkbox is clicked . .
+ $('#radiusenable').click(function () {
+ hide_radius(!$('#radiusenable').prop('checked'));
+ if(!$('#radiusenable').prop('checked'))
+ hide_radius2(true);
+ else
+ hide_radius2(!$('#radiussecenable').prop('checked'));
+ });
+
+ // When the 'Use backup RADIUS' checkbox is clicked . .
+ $('#radiussecenable').click(function () {
+ hide_radius2(!$('#radiussecenable').prop('checked'));
+ });
+
+ //I On initial page load
+ hide_radius2(!$('#radiussecenable').prop('checked'));
+ hide_radius(!$('#radiusenable').prop('checked'));
+});
//]]>
</script>
-<form action="vpn_pppoe_edit.php" method="post" name="iform" id="iform">
-<?php
-if ($input_errors) {
- print_input_errors($input_errors);
-}
-if ($savemsg) {
- print_info_box($savemsg);
-}
-?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="pppoe edit">
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td height="16" colspan="2" class="listtopic" valign="top"><?php echo gettext("PPPoE server configuration"); ?></td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vtable">&nbsp;</td>
- <td width="78%" class="vtable">
- <input name="mode" type="radio" onclick="enable_change(false)" value="off" <?php if ($pconfig['mode'] != "server") echo "checked=\"checked\"";?> />
- <?=gettext("Off"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vtable">&nbsp;</td>
- <td width="78%" class="vtable">
- <input type="radio" name="mode" value="server" onclick="enable_change(false)" <?php if ($pconfig['mode'] == "server") echo "checked=\"checked\""; ?> />
- <?=gettext("Enable PPPoE server"); ?>
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncell"><b><?=gettext("Interface"); ?></b></td>
- <td width="78%" valign="top" class="vtable">
-
- <select name="interface" class="formselect" id="interface">
-<?php
- $interfaces = get_configured_interface_with_descr();
- foreach ($interfaces as $iface => $ifacename):
-?>
- <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
<?php
- endforeach;
-?>
- </select> <br />
-
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet netmask"); ?></td>
- <td width="78%" class="vtable">
- <select id="pppoe_subnet" name="pppoe_subnet">
-<?php
- for ($x = 0; $x < 33; $x++) {
- if ($x == $pconfig['pppoe_subnet']) {
- $selected = "selected=\"selected\"";
- } else {
- $selected = "";
- }
- echo "<option value=\"{$x}\" {$selected}>{$x}</option>\n";
- }
-?>
- </select>
- <br /><?=gettext("Hint"); ?>: 24 <?=gettext("is"); ?> 255.255.255.0
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("No. PPPoE users"); ?></td>
- <td width="78%" class="vtable">
- <select id="n_pppoe_units" name="n_pppoe_units">
-<?php
- for ($x = 0; $x < 255; $x++) {
- if ($x == $pconfig['n_pppoe_units']) {
- $selected = "selected=\"selected\"";
- } else {
- $selected = "";
- }
- echo "<option value=\"{$x}\" {$selected}>{$x}</option>\n";
- }
-?>
- </select>
- <br /><?=gettext("Hint: 10 is ten PPPoE clients"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Server address"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="localip" type="text" class="formfld unknown" id="localip" size="20" value="<?=htmlspecialchars($pconfig['localip']);?>" />
- <br />
- <?=gettext("Enter the IP address the PPPoE server should give to clients for use as their \"gateway\""); ?>.
- <br />
- <?=gettext("Typically this is set to an unused IP just outside of the client range"); ?>.
- <br />
- <br />
- <?=gettext("NOTE: This should NOT be set to any IP address currently in use on this firewall"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Remote address range"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="remoteip" type="text" class="formfld unknown" id="remoteip" size="20" value="<?=htmlspecialchars($pconfig['remoteip']);?>" />
- <br />
- <?=gettext("Specify the starting address for the client IP address subnet"); ?>.<br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
- <br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("DNS servers"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="pppoe_dns1" type="text" class="formfld unknown" id="pppoe_dns1" size="20" value="<?=htmlspecialchars($pconfig['pppoe_dns1']);?>" />
- <br />
- <input name="pppoe_dns2" type="text" class="formfld unknown" id="pppoe_dns2" size="20" value="<?=htmlspecialchars($pconfig['pppoe_dns2']);?>" />
- <br />
- <?=gettext("If entered they will be given to all PPPoE clients, else LAN DNS and one WAN DNS will go to all clients"); ?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS"); ?></td>
- <td width="78%" class="vtable">
- <input name="radiusenable" type="checkbox" id="radiusenable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radiusenable']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Use a RADIUS server for authentication"); ?><br />
- </strong><?=gettext("When set, all users will be authenticated using " .
- "the RADIUS server specified below. The local user database " .
- "will not be used"); ?>.<br />
- <br />
- <input name="radacct_enable" type="checkbox" id="radacct_enable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radacct_enable']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Enable RADIUS accounting"); ?> <br />
- <br />
- </strong><?=gettext("Sends accounting packets to the RADIUS server"); ?>.<br />
- <input name="radiussecenable" type="checkbox" id="radiussecenable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radiussecenable']) echo "checked=\"checked\""; ?> />
- <strong><?=gettext("Use Backup RADIUS Server"); ?></strong><br />
- <?=gettext("When set, if primary server fails all requests will be sent via backup server"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("NAS IP Address"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="radius_nasip" type="text" class="formfld unknown" id="radius_nasip" size="20" value="<?=htmlspecialchars($pconfig['radius_nasip']);?>" />
- <br /><?=gettext("RADIUS server NAS IP Address"); ?><br />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("RADIUS Accounting Update"); ?></td>
- <td width="78%" class="vtable">
- <?=$mandfldhtml;?><input name="radius_acct_update" type="text" class="formfld unknown" id="radius_acct_update" size="20" value="<?=htmlspecialchars($pconfig['radius_acct_update']);?>" />
- <br /><?=gettext("RADIUS accounting update period in seconds"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS issued IPs"); ?></td>
- <td width="78%" valign="top" class="vtable">
- <input name="radiusissueips" value="yes" type="checkbox" class="formfld" id="radiusissueips" <?php if ($pconfig['radiusissueips']) echo "checked=\"checked\""; ?> />
- <br /><?=gettext("Issue IP Addresses via RADIUS server"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS server Primary"); ?></td>
- <td width="78%" class="vtable">
- <input name="radiusserver" type="text" class="formfld unknown" id="radiusserver" size="20" value="<?=htmlspecialchars($pconfig['radiusserver']);?>" />
- <input name="radiusserverport" type="text" class="formfld unknown" id="radiusserverport" size="4" value="<?=htmlspecialchars($pconfig['radiusserverport']);?>" />
- <input name="radiusserveracctport" type="text" class="formfld unknown" id="radiusserveracctport" size="4" value="<?=htmlspecialchars($pconfig['radiusserveracctport']);?>" />
- <br /><?=gettext("Enter the IP address, authentication port and accounting port (optional) of the RADIUS server."); ?><br />
- <br /> <?=gettext("standard port 1812 and 1813 accounting"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS primary shared secret"); ?></td>
- <td width="78%" valign="top" class="vtable">
- <input name="radiussecret" type="password" class="formfld pwd" id="radiussecret" size="20" value="<?=htmlspecialchars($pconfig['radiussecret']);?>" />
- <br /><?=gettext("Enter the shared secret that will be used to authenticate " .
- "to the RADIUS server"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS server Secondary"); ?></td>
- <td width="78%" class="vtable">
- <input name="radiusserver2" type="text" class="formfld unknown" id="radiusserver2" size="20" value="<?=htmlspecialchars($pconfig['radiusserver2']);?>" />
- <input name="radiusserver2port" type="text" class="formfld unknown" id="radiusserver2port" size="4" value="<?=htmlspecialchars($pconfig['radiusserver2port']);?>" />
- <input name="radiusserver2acctport" type="text" class="formfld unknown" id="radiusserver2acctport" size="4" value="<?=htmlspecialchars($pconfig['radiusserver2acctport']);?>" />
- <br /><?=gettext("Enter the IP address, authentication port and accounting port (optional) of the backup RADIUS server."); ?><br />
- <br /> <?=gettext("standard port 1812 and 1813 accounting"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS secondary shared secret"); ?></td>
- <td width="78%" valign="top" class="vtable">
- <input name="radiussecret2" type="password" class="formfld pwd" id="radiussecret2" size="20" value="<?=htmlspecialchars($pconfig['radiussecret2']);?>" />
- <br />
- <?=gettext("Enter the shared secret that will be used to authenticate " .
- "to the RADIUS server"); ?>.
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><div id="addressnetworkport"><?=gettext("User (s)");?></div></td>
- <td width="78%" class="vtable">
- <table id="usertable" summary="users">
- <tbody>
- <tr>
- <td><div id="onecolumn"><?=gettext("Username");?></div></td>
- <td><div id="twocolumn"><?=gettext("Password");?></div></td>
- <td><div id="thirdcolumn"><?=gettext("IP");?></div></td>
- </tr>
-<?php
- $counter = 0;
- $usernames = $pconfig['username'];
- if ($usernames <> ""):
- $item = explode(" ", $usernames);
- foreach ($item as $ww):
- $wws = explode(":", $ww);
- $user = $wws[0];
- $passwd = base64_decode($wws[1]);
- $ip = $wws[2];
- $tracker = $counter;
-?>
- <tr>
- <td>
- <input name="username<?php echo $tracker; ?>" type="text" class="formfld unknown" id="username<?php echo $tracker; ?>" size="20" value="<?=htmlspecialchars($user);?>" />
- </td>
- <td>
- <input name="password<?php echo $tracker; ?>" type="password" class="formfld pwd" id="password<?php echo $tracker; ?>" size="20" value="<?=htmlspecialchars($passwd);?>" />
- </td>
- <td>
- <input name="ip<?php echo $tracker; ?>" type="text" class="formfld unknown" id="ip<?php echo $tracker; ?>" size="10" value="<?=htmlspecialchars($ip);?>" />
- </td>
- <td>
- <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="delete" /></a>
- </td>
- </tr>
-<?php
- $counter++;
- endforeach;
- endif;
-?>
- </tbody>
- </table>
- <a onclick="javascript:addRowTo('usertable'); return false;" href="#">
- <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
- </a>
- </td>
- </tr>
- <tr>
- <td height="16" colspan="2" valign="top"></td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
-<?php
- if (isset($id)) {
- echo "<input type=\"hidden\" name=\"id\" id=\"id\" value=\"" . htmlspecialchars($id, ENT_QUOTES | ENT_HTML401) . "\" />";
- }
-?>
-<?php
- if (isset($pconfig['pppoeid'])) {
- echo "<input type=\"hidden\" name=\"pppoeid\" id=\"pppoeid\" value=\"{$pppoeid}\" />";
- }
-?>
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
- <a href="vpn_pppoe.php"><input name="Cancel" type="button" class="formbtn" value="<?=gettext("Cancel"); ?>" /></a>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <span class="vexpl">
- <span class="red"><strong><?=gettext("Note"); ?>:<br /></strong></span>
- <?=gettext("don't forget to add a firewall rule to permit traffic from PPPoE clients"); ?>!
- </span>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-<script type="text/javascript">
- //<![CDATA[
- enable_change(false);
-
- field_counter_js = 3;
- rows = 1;
- totalrows = <?php echo $counter; ?>;
- loaded = <?php echo $counter; ?>;
- //]]>
-</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/vpn_pptp.php b/src/usr/local/www/vpn_pptp.php
index b6ded68..fc918b4 100644
--- a/src/usr/local/www/vpn_pptp.php
+++ b/src/usr/local/www/vpn_pptp.php
@@ -1,4 +1,9 @@
<?php
+
+/*
+ WARNING: DEPRICATED! SHOULD NOT BE CONVERTED. SEE https://github.com/SjonHortensius/pfsense/issues/229
+*/
+
/*
vpn_pptp.php
part of m0n0wall (http://m0n0.ch/wall)
diff --git a/src/usr/local/www/vpn_pptp_users.php b/src/usr/local/www/vpn_pptp_users.php
index 553888f..da62e6a 100644
--- a/src/usr/local/www/vpn_pptp_users.php
+++ b/src/usr/local/www/vpn_pptp_users.php
@@ -1,4 +1,9 @@
<?php
+
+/*
+ WARNING: DEPRICATED! SHOULD NOT BE CONVERTED. SEE https://github.com/SjonHortensius/pfsense/issues/229
+*/
+
/*
vpn_pptp_users.php
part of m0n0wall (http://m0n0.ch/wall)
diff --git a/src/usr/local/www/vpn_pptp_users_edit.php b/src/usr/local/www/vpn_pptp_users_edit.php
index 8b09a7f..5c5d787 100644
--- a/src/usr/local/www/vpn_pptp_users_edit.php
+++ b/src/usr/local/www/vpn_pptp_users_edit.php
@@ -1,4 +1,9 @@
<?php
+
+/*
+ WARNING: DEPRICATED! SHOULD NOT BE CONVERTED. SEE https://github.com/SjonHortensius/pfsense/issues/229
+*/
+
/*
vpn_pptp_users_edit.php
part of m0n0wall (http://m0n0.ch/wall)
diff --git a/src/usr/local/www/widgets/widgets/captive_portal_status.widget.php b/src/usr/local/www/widgets/widgets/captive_portal_status.widget.php
index 21c44e3..4f067a0 100644
--- a/src/usr/local/www/widgets/widgets/captive_portal_status.widget.php
+++ b/src/usr/local/www/widgets/widgets/captive_portal_status.widget.php
@@ -105,42 +105,36 @@ if ($_GET['order']) {
usort($cpdb_all, "clientcmp");
}
?>
-<table class="sortable" id="sortabletable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="captive portal status">
+<table class="table">
+ <thead>
<tr>
- <td class="listhdrr"><a href="?order=ip&amp;showact=<?=$showact;?>">IP address</a></td>
- <td class="listhdrr"><a href="?order=mac&amp;showact=<?=$showact;?>">MAC address</a></td>
- <td class="listhdrr"><a href="?order=user&amp;showact=<?=$showact;?>"><?=gettext("Username");?></a></td>
-<?php
- if ($showact == 1):
-?>
- <td class="listhdrr"><a href="?order=start&amp;showact=<?=$showact;?>"><?=gettext("Session start");?></a></td>
- <td class="listhdrr"><a href="?order=start&amp;showact=<?=$showact;?>"><?=gettext("Last activity");?></a></td>
-<?php
- endif;
-?>
+ <th><a href="?order=ip&amp;showact=<?=$showact;?>">IP address</a></td>
+ <th><a href="?order=mac&amp;showact=<?=$showact;?>">MAC address</a></td>
+ <th><a href="?order=user&amp;showact=<?=$showact;?>"><?=gettext("Username");?></a></td>
+<?php if ($showact == 1): ?>
+ <th><a href="?order=start&amp;showact=<?=$showact;?>"><?=gettext("Session start");?></a></td>
+ <th><a href="?order=start&amp;showact=<?=$showact;?>"><?=gettext("Last activity");?></a></td>
+<?php endif; ?>
</tr>
-<?php
-foreach ($cpdb_all as $cpent):
-?>
+ </thead>
+ <tbody>
+<?php foreach ($cpdb_all as $cpent): ?>
<tr>
- <td class="listlr"><?=$cpent[2];?></td>
- <td class="listr"><?=$cpent[3];?>&nbsp;</td>
- <td class="listr"><?=$cpent[4];?>&nbsp;</td>
-<?php
- if ($showact == 1):
-?>
- <td class="listr"><?=htmlspecialchars(date("m/d/Y H:i:s", $cpent[0]));?></td>
- <td class="listr"><?php if ($cpent[11] && ($cpent[11] > 0)) echo htmlspecialchars(date("m/d/Y H:i:s", $cpent[11]));?></td>
-<?php
- endif;
-?>
- <td valign="middle" class="list nowrap">
- <a href="?order=<?=htmlspecialchars($_GET['order']);?>&amp;showact=<?=$showact;?>&amp;act=del&amp;zone=<?=$cpent[10];?>&amp;id=<?=$cpent[5];?>" onclick="return confirm('Do you really want to disconnect this client?')">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="x" />
+ <td><?=$cpent[2];?></td>
+ <td><?=$cpent[3];?></td>
+ <td><?=$cpent[4];?></td>
+<?php if ($showact == 1): ?>
+ <td><?=date("m/d/Y H:i:s", $cpent[0]);?></td>
+ <td><?php if ($cpent[11] && ($cpent[11] > 0)) echo date("m/d/Y H:i:s", $cpent[11]);?></td>
+<?php endif; ?>
+ <td>
+ <a href="?order=<?=htmlspecialchars($_GET['order']);?>&amp;showact=<?=$showact;?>&amp;act=del&amp;zone=<?=$cpent[10];?>&amp;id=<?=$cpent[5];?>" class="btn btn-xs btn-danger">
+ delete
</a>
</td>
</tr>
<?php
endforeach;
?>
-</table>
+ </tbody>
+</table> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/widgets/carp_status.widget.php b/src/usr/local/www/widgets/widgets/carp_status.widget.php
index bb68dbd..a44ddd8 100644
--- a/src/usr/local/www/widgets/widgets/carp_status.widget.php
+++ b/src/usr/local/www/widgets/widgets/carp_status.widget.php
@@ -40,7 +40,7 @@ require_once("/usr/local/www/widgets/include/carp_status.inc");
$carp_enabled = get_carp_status();
?>
-<table bgcolor="#990000" width="100%" border="0" cellspacing="0" cellpadding="0" summary="carp status">
+<table>
<?php
if (is_array($config['virtualip']['vip'])) {
$carpint=0;
@@ -56,12 +56,13 @@ $carp_enabled = get_carp_status();
$status = get_carp_interface_status("_vip{$carp['uniqid']}");
?>
<tr>
- <td class="vncellt" width="35%">
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_cablenic.gif" alt="cablenic" />&nbsp;
- <strong><a href="/system_hasync.php">
- <span style="color:#000000"><?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($carp['interface']) . "@{$vhid}");?></span></a></strong>
+ <td>
+ <i class="icon icon-inbox"></i>
+ <a href="/system_hasync.php">
+ <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($carp['interface']) . "@{$vhid}");?>
+ </a>
</td>
- <td width="65%" class="listr">
+ <td>
<?php
if ($carp_enabled == false) {
$status = "DISABLED";
@@ -80,6 +81,6 @@ $carp_enabled = get_carp_status();
<?=htmlspecialchars($ipaddress);}?>
</td></tr><?php }
} else { ?>
- <tr><td class="listr">No CARP Interfaces Defined. Click <a href="carp_status.php">here</a> to configure CARP.</td></tr>
+ <tr><td>No CARP Interfaces Defined. Click <a href="carp_status.php">here</a> to configure CARP.</td></tr>
<?php } ?>
</table>
diff --git a/src/usr/local/www/widgets/widgets/dyn_dns_status.widget.php b/src/usr/local/www/widgets/widgets/dyn_dns_status.widget.php
index c2eee76..7839e6e 100644
--- a/src/usr/local/www/widgets/widgets/dyn_dns_status.widget.php
+++ b/src/usr/local/www/widgets/widgets/dyn_dns_status.widget.php
@@ -48,7 +48,7 @@ if (!is_array($config['dyndnses']['dyndns'])) {
$a_dyndns = &$config['dyndnses']['dyndns'];
-if ($_REQUEST['getdyndnsstatus']) {
+if($_REQUEST['getdyndnsstatus']) {
$first_entry = true;
foreach ($a_dyndns as $dyndns) {
if ($first_entry) {
@@ -79,7 +79,7 @@ if ($_REQUEST['getdyndnsstatus']) {
?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0">
+<table>
<tr>
<td width="5%" class="listhdrr"><?=gettext("Int.");?></td>
<td width="15%" class="listhdrr"><?=gettext("Service");?></td>
@@ -139,10 +139,10 @@ if ($_REQUEST['getdyndnsstatus']) {
?>
</td>
<td class="listr">
- <div id='dyndnsstatus<?php echo $i; ?>'><?php echo gettext("Checking ..."); ?></div>
+ <div id='dyndnsstatus<?= $i;?>'><?= gettext("Checking ...");?></div>
</td>
</tr>
- <?php $i++; endforeach; ?>
+ <?php $i++; endforeach;?>
</table>
<script type="text/javascript">
//<![CDATA[
diff --git a/src/usr/local/www/widgets/widgets/gateways.widget.php b/src/usr/local/www/widgets/widgets/gateways.widget.php
index 26a6f4d..7087cf2 100644
--- a/src/usr/local/www/widgets/widgets/gateways.widget.php
+++ b/src/usr/local/www/widgets/widgets/gateways.widget.php
@@ -59,169 +59,64 @@ $a_gateways = return_gateways_array();
$gateways_status = array();
$gateways_status = return_gateways_status(true);
-$counter = 1;
-
?>
-
-<input type="hidden" id="gateways-config" name="gateways-config" value="" />
-
-<div id="gateways-settings" class="widgetconfigdiv" style="display:none;">
-<form action="/widgets/widgets/gateways.widget.php" method="post" name="gateways_widget_iform" id="gateways_widget_iform">
- Display:
- <?php
- $display_type_gw_ip="checked=\"checked\"";
- $display_type_monitor_ip="";
- $display_type_both_ip="";
- if (isset($config["widgets"]["gateways_widget"]["display_type"])) {
- $selected_radio = $config["widgets"]["gateways_widget"]["display_type"];
- if ($selected_radio == "gw_ip") {
- $display_type_gw_ip = "checked=\"checked\"";
- $display_type_monitor_ip="";
- $display_type_both_ip="";
- } else if ($selected_radio == "monitor_ip") {
- $display_type_gw_ip = "";
- $display_type_monitor_ip="checked=\"checked\"";
- $display_type_both_ip="";
- } else if ($selected_radio == "both_ip") {
- $display_type_gw_ip = "";
- $display_type_monitor_ip="";
- $display_type_both_ip="checked=\"checked\"";
- }
- }
- ?>
- <input name="display_type" class="radio" type="radio" id="display_type_gw_ip" value="gw_ip" <?php echo $display_type_gw_ip; ?> onchange="updateGatewayDisplays();" /> <span>Gateway IP</span>
- <input name="display_type" class="radio" type="radio" id="display_type_monitor_ip" value="monitor_ip" <?php echo $display_type_monitor_ip; ?> onchange="updateGatewayDisplays();" /> <span>Monitor IP</span>
- <input name="display_type" class="radio" type="radio" id="display_type_both_ip" value="both_ip" <?php echo $display_type_both_ip; ?> onchange="updateGatewayDisplays();" /> <span>Both</span>
- <br /><br />
- <input id="submit_settings" name="submit_settings" type="submit" onclick="return updatePref();" class="formbtn" value="Save Settings" />
-</form>
-</div>
-
-<script type="text/javascript">
-//<![CDATA[
- d = document;
- selectIntLink = "gateways-configure";
- textlink = d.getElementById(selectIntLink);
- textlink.style.display = "inline";
-//]]>
-</script>
-
-<table bgcolor="#990000" width="100%" border="0" cellspacing="0" cellpadding="0" summary="gateway status">
- <tr>
- <td class="listhdrr" id="gatewayname" align="center">Name</td>
- <td class="listhdrr" align="center">RTT</td>
- <td class="listhdrr" align="center">Loss</td>
- <td class="listhdrr" align="center">Status</td>
- </tr>
- <?php foreach ($a_gateways as $gname => $gateway) { ?>
+<table class="table table-striped table-hover">
+<thead>
+<tr>
+ <th>Name</td>
+ <th>RTT</td>
+ <th>Loss</td>
+ <th>Status</td>
+</tr>
+</thead>
+<tbody>
+<?php foreach ($a_gateways as $gname => $gateway): ?>
<tr>
- <td class="listhdrr" id="gateway<?php echo $counter; ?>" rowspan="2" align="center">
- <strong>
- <?php echo htmlspecialchars($gateway['name']); ?>
- </strong>
- <?php $counter++; ?>
- </td>
- <td colspan="3" class="listr ellipsis" align="center">
- <div id="gateway<?php echo $counter; ?>" style="display:inline"><b>
- <?php
- $monitor_address = "";
- $monitor_address_disp = "";
- if ($display_type == "monitor_ip" || $display_type == "both_ip") {
- $monitor_address = $gateway['monitor'];
- if ($monitor_address != "" && $display_type == "both_ip") {
- $monitor_address_disp = " (" . $monitor_address . ")";
- } else {
- $monitor_address_disp = $monitor_address;
- }
- }
- $if_gw = '';
- // If the user asked to display Gateway IP or both IPs, or asked for just monitor IP but the monitor IP is blank
- // then find the gateway IP (which is also the monitor IP if the monitor IP was not explicitly set).
- if ($display_type == "gw_ip" || $display_type == "both_ip" || ($display_type == "monitor_ip" && $monitor_address == "")) {
- if (is_ipaddr($gateway['gateway'])) {
- $if_gw = htmlspecialchars($gateway['gateway']);
- } else {
- if ($gateway['ipprotocol'] == "inet") {
- $if_gw = htmlspecialchars(get_interface_gateway($gateway['friendlyiface']));
- }
- if ($gateway['ipprotocol'] == "inet6") {
- $if_gw = htmlspecialchars(get_interface_gateway_v6($gateway['friendlyiface']));
- }
- }
- if ($if_gw == "") {
- $if_gw = "~";
- }
- }
- if ($monitor_address == $if_gw) {
- $monitor_address_disp = "";
- }
- echo $if_gw . $monitor_address_disp;
- unset ($if_gw);
- unset ($monitor_address);
- unset ($monitor_address_disp);
- $counter++;
- ?>
- </b></div>
- </td>
- </tr>
- <tr>
- <td class="listr ellipsis" align="center" id="gateway<?php echo $counter; ?>">
- <?php
- if ($gateways_status[$gname]) {
- echo htmlspecialchars($gateways_status[$gname]['delay']);
- } else {
- echo gettext("Pending");
- }
- ?>
- <?php $counter++; ?>
- </td>
- <td class="listr ellipsis" align="center" id="gateway<?php echo $counter; ?>">
- <?php
- if ($gateways_status[$gname]) {
- echo htmlspecialchars($gateways_status[$gname]['loss']);
- } else {
- echo gettext("Pending");
- }
- ?>
- <?php $counter++; ?>
- </td>
- <?php
- if ($gateways_status[$gname]) {
- if (stristr($gateways_status[$gname]['status'], "force_down")) {
- $online = "Offline (forced)";
- $bgcolor = "#F08080"; // lightcoral
- } elseif (stristr($gateways_status[$gname]['status'], "down")) {
- $online = "Offline";
- $bgcolor = "#F08080"; // lightcoral
- } elseif (stristr($gateways_status[$gname]['status'], "loss")) {
- $online = "Packetloss";
- $bgcolor = "#F0E68C"; // khaki
- } elseif (stristr($gateways_status[$gname]['status'], "delay")) {
- $online = "Latency";
- $bgcolor = "#F0E68C"; // khaki
- } elseif ($gateways_status[$gname]['status'] == "none") {
- $online = "Online";
- $bgcolor = "#90EE90"; // lightgreen
- } elseif ($gateways_status[$gname]['status'] == "") {
- $online = "Pending";
- $bgcolor = "#D3D3D3"; // lightgray
- }
- } else {
- $online = gettext("Unknown");
- $bgcolor = "#ADD8E6"; // lightblue
- }
- echo "<td class=\"listr ellipsis\" align=\"center\" id=\"gateway$counter\">$online</td>\n";
- ?>
- <td style="display:none;">
- <script type="text/javascript">
- //<![CDATA[
- jQuery('#gateway<?php echo $counter;?>').css('background-color',"<?php echo $bgcolor;?>");
- //]]>
- </script>
- </td>
- <?php
- $counter++;
- ?>
+ <td>
+<?php
+ $if_gw = '';
+ if (is_ipaddr($gateway['gateway']))
+ $if_gw = $gateway['gateway'];
+ else {
+ if($gateway['ipprotocol'] == "inet")
+ $if_gw = get_interface_gateway($gateway['friendlyiface']);
+ if($gateway['ipprotocol'] == "inet6")
+ $if_gw = get_interface_gateway_v6($gateway['friendlyiface']);
+ }
+?>
+ <?=htmlspecialchars($gateway['name'])?><br />
+ <i><?=($if_gw == '' ? '~' : htmlspecialchars($if_gw));?></i>
+ </td>
+<?php
+ if ($gateways_status[$gname]) {
+ if (stristr($gateways_status[$gname]['status'], "force_down")) {
+ $online = "Offline (forced)";
+ $bgcolor = "#F08080"; // lightcoral
+ } elseif (stristr($gateways_status[$gname]['status'], "down")) {
+ $online = "Offline";
+ $bgcolor = "#F08080"; // lightcoral
+ } elseif (stristr($gateways_status[$gname]['status'], "loss")) {
+ $online = "Packetloss";
+ $bgcolor = "#F0E68C"; // khaki
+ } elseif (stristr($gateways_status[$gname]['status'], "delay")) {
+ $online = "Latency";
+ $bgcolor = "#F0E68C"; // khaki
+ } elseif ($gateways_status[$gname]['status'] == "none") {
+ $online = "Online";
+ $bgcolor = "#90EE90"; // lightgreen
+ } elseif ($gateways_status[$gname]['status'] == "") {
+ $online = "Pending";
+ $bgcolor = "#D3D3D3"; // lightgray
+ }
+ } else {
+ $online = gettext("Unknown");
+ $bgcolor = "#ADD8E6"; // lightblue
+ }
+?>
+ <td><?=($gateways_status[$gname] ? htmlspecialchars($gateways_status[$gname]['delay']) : gettext("Pending"))?></td>
+ <td><?=($gateways_status[$gname] ? htmlspecialchars($gateways_status[$gname]['loss']) : gettext("Pending"))?></td>
+ <td style="background-color: <?=$bgcolor?>"><?=$online?></td>
</tr>
- <?php } // foreach ?>
-</table>
+<?php endforeach; ?>
+</tbody>
+</table> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/widgets/gmirror_status.widget.php b/src/usr/local/www/widgets/widgets/gmirror_status.widget.php
index 59e7f16..c8dad84 100644
--- a/src/usr/local/www/widgets/widgets/gmirror_status.widget.php
+++ b/src/usr/local/www/widgets/widgets/gmirror_status.widget.php
@@ -32,21 +32,28 @@ $nocsrf = true;
require_once("guiconfig.inc");
require_once("gmirror.inc");
-if ($_GET['textonly'] == "true") {
- header("Cache-Control: no-cache");
- echo gmirror_html_status();
- exit;
-}
?>
-<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="gmirror status">
- <tbody id="gmirror_status_table">
- <?php echo gmirror_html_status(); ?>
- </tbody>
-</table>
-
-<script type="text/javascript">
-//<![CDATA[
- var gmirrorupdater = new Ajax.PeriodicalUpdater('gmirror_status_table', '/widgets/widgets/gmirror_status.widget.php?textonly=true',
- { method: 'get', frequency: 5 } );
-//]]>
-</script>
+<div id="gmirror_status">
+ <?=gmirror_html_status()?>
+</div>
+
+<script>
+function gmirrorStatusUpdateFromServer(){
+ $.ajax({
+ type: 'get',
+ url: '/widgets/widgets/gmirror_status.widget.php',
+ dataType: 'html',
+ dataFilter: function(raw){
+ // We reload the entire widget, strip this block of javascript from it
+ return raw.replace(/<script>([\s\S]*)<\/script>/gi, '');
+ },
+ success: function(data){
+ $('#gmirror_status').html(data);
+ }
+ });
+}
+
+events.push(function(){
+ setInterval('gmirrorStatusUpdateFromServer()', 60*1000);
+});
+</script> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/widgets/installed_packages.widget.php b/src/usr/local/www/widgets/widgets/installed_packages.widget.php
index 3190e1b..b6e01bc 100644
--- a/src/usr/local/www/widgets/widgets/installed_packages.widget.php
+++ b/src/usr/local/www/widgets/widgets/installed_packages.widget.php
@@ -2,7 +2,7 @@
/*
installed_packages.widget.php
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2013-2014 Electric Sheep Fencing, LP
Copyright 2007 Scott Dale
Part of pfSense widgets (https://www.pfsense.org)
originally based on m0n0wall (http://m0n0.ch/wall)
@@ -41,86 +41,67 @@ require_once("functions.inc");
require_once("/usr/local/www/widgets/include/installed_packages.inc");
require_once("pkg-utils.inc");
-if (is_array($config['installedpackages']['package'])) {
- foreach ($config['installedpackages']['package'] as $instpkg) {
- $tocheck[] = $instpkg['name'];
- }
- $currentvers = get_pkg_info($tocheck, array('version', 'xmlver'));
+if(is_array($config['installedpackages']['package'])) {
+ $instpkgs = array();
+ foreach ($config['installedpackages']['package'] as $instpkg)
+ $instpkgs[ $instpkg['name'] ] = $instpkg;
+ ksort($instpkgs);
+ $currentvers = get_pkg_info(array_keys($instpkgs), array('version', 'xmlver'));
}
-
-$updateavailable = false;
?>
-<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="installed packages">
- <tr>
- <td width="15%" class="listhdrr">Package Name</td>
- <td width="15%" class="listhdrr">Category</td>
- <td width="30%" class="listhdrr">Package Version</td>
- </tr>
- <?php
- if ($config['installedpackages']['package'] != "") {
- $instpkgs = array();
- foreach ($config['installedpackages']['package'] as $instpkg) {
- $instpkgs[] = $instpkg['name'];
- }
- natcasesort($instpkgs);
- $y=1;
- foreach ($instpkgs as $index => $pkgname){
+<?php if (empty($config['installedpackages']['package'])): ?>
+ <div class="alert alert-warning" role="alert">
+ <strong>No packages installed.</strong>
+ You can install packages <a href="pkg_mgr.php" class="alert-link">here</a>.
+ </div>
+<?php else: ?>
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th>Package Name</th>
+ <th>Category</th>
+ <th>Package Version</th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+foreach ($instpkgs as $pkgname => $pkg):
+ if (empty($pkgname))
+ continue;
- $pkg = $config['installedpackages']['package'][$index];
- if ($pkg['name'] <> "") { ?>
- <tr valign="top">
- <td class="listlr">
- <?= $pkg['name'] ?>
- </td>
- <td class="listr">
- <?= $pkg['category'] ?>
- </td>
- <td class="listr">
- <?php
- $latest_package = $currentvers[$pkg['name']]['version'];
- if ($latest_package == false) {
- // We can't determine this package's version status.
- echo "Current: Unknown.<br />Installed: " . $pkg['version'];
- } elseif (strcmp($pkg['version'], $latest_package) > 0) {
- /* we're running a newer version of the package */
- echo "Current: {$latest_package}";
- echo "<br />Installed: {$pkg['version']}";
- } elseif (strcmp($pkg['version'], $latest_package) < 0) {
- /* our package is out of date */
- $updateavailable = true;
- ?>
- <div id="updatediv-<?php echo $y; ?>" style="color:red">
- <b>Update Available!</b></div><div style="float:left">
- Current: <?php echo $latest_package; ?><br />
- Installed: <?php echo $pkg['version']; ?></div><div style="float:right">
- <a href="pkg_mgr_install.php?mode=reinstallpkg&amp;pkg=<?= $pkg['name']; ?>"><img title="Update this package." src="./themes/<?= $g['theme']; ?>/images/icons/icon_reinstall_pkg.gif" width="17" height="17" border="0" alt="reinstall" /></a>
- </div>
- <?php
- $y++;
- } else {
- echo $pkg['version'];
- } ?>
- </td>
- </tr>
- <?php }
+ $latest_package = $currentvers[$pkg['name']]['version'];
+ if ($latest_package) {
+ // we're running a newer version of the package
+ if(strcmp($pkg['version'], $latest_package) > 0) {
+ $status = 'Newer then available ('. $latest_package .')';
+ $statusicon = 'exclamation';
}
- } else {
- echo "<tr><td colspan=\"5\" align=\"center\">There are no packages currently installed.</td></tr>";
- }
- ?>
-</table>
-
-<?php if ($updateavailable): ?>
-<script type="text/javascript">
-//<![CDATA[
- window.onload = function(in_event)
- {
- for (y=1; y<=<?php echo $y;?>; y++) {
- textID = "#updatediv-" + y;
- jQuery(textID).effect('pulsate');
+ // we're running an older version of the package
+ if(strcmp($pkg['version'], $latest_package) < 0) {
+ $status = 'Upgrade available to '.$latest_package;
+ $statusicon = 'plus';
+ }
+ // we're running the current version
+ if(!strcmp($pkg['version'], $latest_package)) {
+ $status = 'Up-to-date';
+ $statusicon = 'ok';
}
+ } else {
+ // unknown available package version
+ $status = 'Unknown';
+ $statusicon = 'question';
}
-//]]>
-</script>
-<?php endif; ?>
+?>
+ <tr>
+ <td><?=$pkg['name']?></td>
+ <td><?=$pkg['category']?></td>
+ <td>
+ <i title="<?=$status?>" class="icon icon-<?=$statusicon?>-sign"></i>
+ <?=$pkg['version']?>
+ </td>
+ </tr>
+<?php endforeach; ?>
+ </tbody>
+ </table>
+<?php endif; ?> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/widgets/interface_statistics.widget.php b/src/usr/local/www/widgets/widgets/interface_statistics.widget.php
index a124ea3..166aa80 100644
--- a/src/usr/local/www/widgets/widgets/interface_statistics.widget.php
+++ b/src/usr/local/www/widgets/widgets/interface_statistics.widget.php
@@ -40,177 +40,43 @@ require_once("pfsense-utils.inc");
require_once("functions.inc");
require_once("/usr/local/www/widgets/include/interface_statistics.inc");
+$rows = array(
+ 'inpkts' => 'Packets In',
+ 'outpkts' => 'Packets Out',
+ 'inbytes' => 'Bytes In',
+ 'outbytes' => 'Bytes Out',
+ 'inerrs' => 'Errors In',
+ 'outerrs' => 'Errors Out',
+ 'collisions' => 'Collisions',
+);
$ifdescrs = get_configured_interface_with_descr();
-$array_in_packets = array();
-$array_out_packets = array();
-$array_in_bytes = array();
-$array_out_bytes = array();
-$array_in_errors = array();
-$array_out_errors = array();
-$array_collisions = array();
-$array_interrupt = array();
-$interfacecounter = 0;
-
-//build data arrays
-foreach ($ifdescrs as $ifdescr => $ifname) {
- $ifinfo = get_interface_info($ifdescr);
- $interfacecounter++;
- if ($ifinfo['status'] != "down") {
- $array_in_packets[] = $ifinfo['inpkts'];
- $array_out_packets[] = $ifinfo['outpkts'];
- $array_in_bytes[] = format_bytes($ifinfo['inbytes']);
- $array_out_bytes[] = format_bytes($ifinfo['outbytes']);
- if (isset($ifinfo['inerrs'])) {
- $array_in_errors[] = $ifinfo['inerrs'];
- $array_out_errors[] = $ifinfo['outerrs'];
- } else {
- $array_in_errors[] = "n/a";
- $array_out_errors[] = "n/a";
- }
- if (isset($ifinfo['collisions'])) {
- $array_collisions[] = htmlspecialchars($ifinfo['collisions']);
- } else {
- $array_collisions[] = "n/a";
- }
- }
-} //end for
-
-
-
-
?>
- <div id="int_labels" style="float:left;width:32%">
- <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="interfaces statistics">
- <tr>
- <td class="widgetsubheader" style="height:25px">&nbsp;&nbsp;&nbsp;</td>
- </tr>
- <tr>
- <td class="vncellt" style="height:25px">Packets In</td>
- </tr>
- <tr>
- <td class="vncellt" style="height:25px">Packets Out</td>
- </tr>
- <tr>
- <td class="vncellt" style="height:25px">Bytes In</td>
- </tr>
- <tr>
- <td class="vncellt" style="height:25px">Bytes Out</td>
- </tr>
- <tr>
- <td class="vncellt" style="height:25px">Errors In</td>
- </tr>
- <tr>
- <td class="vncellt" style="height:25px">Errors Out</td>
- </tr>
- <tr>
- <td class="vncellt" style="height:25px">Collisions</td>
- </tr>
- </table>
- </div>
- <div id="interfacestats" style="float:right;overflow: auto; width:68%">
- <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="the stats">
- <tr>
- <?php
- $interface_names = array();
- foreach ($ifdescrs as $ifdescr => $ifname):
- $ifinfo = get_interface_info($ifdescr);
- if ($ifinfo['status'] != "down") { ?>
- <td class="widgetsubheader nowrap" style="height:25px">
- <?=htmlspecialchars($ifname);?>
- </td>
- <?php
- //build array of interface names
- $interface_names[] = $ifname;
- }
- endforeach;
- ?>
- </tr>
-
- <tr>
- <?php
- $counter = 1;
- foreach ($array_in_packets as $data):
- ?>
- <td class="listr nowrap" id="stat<?php echo $counter?>" style="height:25px">
- <?=htmlspecialchars($data);?>
- </td>
- <?php
- $counter = $counter + 7;
- endforeach;
- ?>
- </tr>
-
- <tr>
- <?php
- $counter = 2;
- foreach ($array_out_packets as $data): ?>
- <td class="listr nowrap" id="stat<?php echo $counter;?>" style="height:25px">
- <?=htmlspecialchars($data);?>
- </td>
- <?php
- $counter = $counter + 7;
- endforeach; ?>
- </tr>
-
- <tr>
- <?php
- $counter = 3;
- foreach ($array_in_bytes as $data): ?>
- <td class="listr nowrap" id="stat<?php echo $counter;?>" style="height:25px">
- <?=htmlspecialchars($data);?>
- </td>
- <?php
- $counter = $counter + 7;
- endforeach; ?>
- </tr>
-
- <tr>
- <?php
- $counter = 4;
- foreach ($array_out_bytes as $data): ?>
- <td class="listr nowrap" id="stat<?php echo $counter;?>" style="height:25px">
- <?=htmlspecialchars($data);?>
- </td>
- <?php
- $counter = $counter + 7;
- endforeach; ?>
- </tr>
-
- <tr>
- <?php
- $counter = 5;
- foreach ($array_in_errors as $data): ?>
- <td class="listr nowrap" id="stat<?php echo $counter;?>" style="height:25px">
- <?=htmlspecialchars($data);?>
- </td>
- <?php
- $counter = $counter + 7;
- endforeach; ?>
- </tr>
-
- <tr>
- <?php
- $counter = 6;
- foreach ($array_out_errors as $data): ?>
- <td class="listr nowrap" id="stat<?php echo $counter;?>" style="height:25px">
- <?=htmlspecialchars($data);?>
- </td>
- <?php
- $counter = $counter + 7;
- endforeach; ?>
- </tr>
-
- <tr>
- <?php
- $counter = 7;
- foreach ($array_collisions as $data): ?>
- <td class="listr nowrap" id="stat<?php echo $counter;?>" style="height:25px">
- <?=htmlspecialchars($data);?>
- </td>
- <?php
- $counter = $counter + 7;
- endforeach; ?>
- </tr>
- </table>
- </div>
+<table class="table table-striped table-hover">
+<thead>
+ <tr>
+ <td></td>
+<?php foreach ($ifdescrs as $ifname): ?>
+ <th><?=$ifname?></th>
+<?php endforeach; ?>
+ </tr>
+</thead>
+<tbody>
+<?php foreach ($rows as $key => $name): ?>
+ <tr>
+ <th><?=$name?></th>
+<?php foreach ($ifdescrs as $ifdescr => $ifname):
+ $ifinfo = get_interface_info($ifdescr);
+
+ if ($ifinfo['status'] == "down")
+ continue;
+
+ $ifinfo['inbytes'] = format_bytes($ifinfo['inbytes']);
+ $ifinfo['outbytes'] = format_bytes($ifinfo['outbytes']);
+ ?>
+ <td><?=(isset($ifinfo[$key]) ? htmlspecialchars($ifinfo[$key]) : 'n/a')?></td>
+<?php endforeach; ?>
+ </tr>
+<?php endforeach; ?>
+ </tbody>
+</table> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/widgets/interfaces.widget.php b/src/usr/local/www/widgets/widgets/interfaces.widget.php
index e49a030..85cfda1 100644
--- a/src/usr/local/www/widgets/widgets/interfaces.widget.php
+++ b/src/usr/local/www/widgets/widgets/interfaces.widget.php
@@ -43,13 +43,13 @@ require_once("/usr/local/www/widgets/include/interfaces.inc");
$ifdescrs = get_configured_interface_with_descr();
?>
-<table bgcolor="#990000" width="100%" border="0" cellspacing="0" cellpadding="0" summary="interfaces">
+<table class="table table-striped table-hover">
<?php
foreach ($ifdescrs as $ifdescr => $ifname):
$ifinfo = get_interface_info($ifdescr);
if ($ifinfo['ppplink']) {
- $icon = '3g';
+ $icon = 'headphones';
} else if (is_interface_wireless($ifdescr)) {
if ($ifinfo['status'] == "associated") {
$icon = 'wlan';
@@ -80,44 +80,28 @@ foreach ($ifdescrs as $ifdescr => $ifname):
}
?>
<tr>
- <td class="vncellt" rowspan="2">
- <span onclick="location.href='/interfaces.php?if=<?=$ifdescr; ?>'" style="cursor:pointer; white-space:nowrap">
- <img src="./themes/<?=$g['theme'];?>/images/icons/icon_<?=$icon;?>.gif" alt="<?=$icon;?>" />
- <u><?=htmlspecialchars($ifname);?></u>
- </span>
-<?php
- if ($ifinfo['dhcplink']) {
- echo "<br />(DHCP)";
- }
-?>
+ <td title="<?=htmlspecialchars($ifinfo['macaddr'])?>">
+ <i class="icon icon-<?=$icon?>"></i>
+ <a href="/interfaces.php?if=<?=$ifdescr?>">
+ <?=htmlspecialchars($ifname);?>
+ </a>
</td>
-<?php
- if ($known_status):
-?>
- <td rowspan="2" class="listr" align="center">
- <div id="<?php echo $ifname . "-up";?>" style="display:<?=$up_display;?>" >
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_interface_up.gif" title="<?=$ifname;?> is up" alt="up" />
- </div>
- <div id="<?php echo $ifname . "-down";?>" style="display:<?=$down_display;?>" >
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_interface_down.gif" title="<?=$ifname;?> is down" alt="down" />
- </div>
- <div id="<?php echo $ifname . "-block";?>" style="display:<?=$block_display;?>" >
- <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" title="<?=$ifname;?> is disabled" alt="block" />
- </div>
+ <td>
+ <?php if (isset($status)):?>
+ <i class="icon icon-<?=status?>-circle" alt="<?=htmlspecialchars($ifinfo['status'])?>"></i>
+ <?php else: ?>
+ <?=htmlspecialchars($ifinfo['status'])?>
+ <?php endif; ?>
</td>
-<?php
- else:
- echo htmlspecialchars($ifinfo['status']);
- endif;
-?>
- <td class="listr">
- <div id="<?php echo $ifname;?>-media" style="display:inline"><?=htmlspecialchars($ifinfo['media']);?></div>
+ <td>
+ <?=htmlspecialchars($ifinfo['media']);?>
</td>
- </tr>
- <tr>
- <td class="listr">
- <div id="<?php echo $ifname;?>-ip" style="display:inline"><strong><?=htmlspecialchars($ifinfo['ipaddr']);?> </strong><?php if ($ifinfo['ipaddr']) echo "<br />";?></div>
- <div id="<?php echo $ifname;?>-ipv6" style="display:inline"><strong><?=htmlspecialchars($ifinfo['ipaddrv6']);?> </strong></div>
+ <td<?=($ifinfo['dhcplink'] ? ' title="via dhcp"':'')?>>
+ <?php if (empty($addresses)): ?>
+ n/a
+ <?php else: ?>
+ <?= implode('<br />', $addresses)?>
+ <?php endif; ?>
</td>
</tr>
<?php
diff --git a/src/usr/local/www/widgets/widgets/ipsec.widget.php b/src/usr/local/www/widgets/widgets/ipsec.widget.php
index 49250ce..76ed282 100644
--- a/src/usr/local/www/widgets/widgets/ipsec.widget.php
+++ b/src/usr/local/www/widgets/widgets/ipsec.widget.php
@@ -40,13 +40,11 @@ require_once("functions.inc");
require_once("ipsec.inc");
if (isset($config['ipsec']['phase1'])) {
-?>
- <div>&nbsp;</div>
-<?php
$tab_array = array();
$tab_array[0] = array("Overview", true, "ipsec-Overview");
$tab_array[1] = array("Tunnels", false, "ipsec-tunnel");
$tab_array[2] = array("Mobile", false, "ipsec-mobile");
+
display_widget_tabs($tab_array);
$spd = ipsec_dump_spd();
@@ -141,125 +139,77 @@ if (isset($config['ipsec']['phase1'])) {
unset($ikenum);
}
-if (isset($config['ipsec']['phase2'])) {
-?>
-
-<div id="ipsec-Overview" style="display:block;background-color:#EEEEEE;">
- <div>
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="heading">
- <tr>
- <td class="listhdrr nowrap">Active Tunnels</td>
- <td class="listhdrr nowrap">Inactive Tunnels</td>
- <td class="listhdrr nowrap">Mobile Users</td>
- </tr>
- <tr>
- <td class="listlr"><?php echo $activecounter; ?></td>
- <td class="listr"><?php echo $inactivecounter; ?></td>
- <td class="listr"><?php if (is_array($mobile['pool'])) echo htmlspecialchars($mobile['pool'][0]['usage']); else echo 0; ?></td>
- </tr>
- </table>
- </div>
-</div>
-
-<div id="ipsec-tunnel" style="display:none;background-color:#EEEEEE;">
- <div style="padding: 10px">
- <div style="display:table-row;">
- <div class="widgetsubheader" style="display:table-cell;width:40px">Source</div>
- <div class="widgetsubheader" style="display:table-cell;width:100px">Destination</div>
- <div class="widgetsubheader" style="display:table-cell;width:90px">Description</div>
- <div class="widgetsubheader" style="display:table-cell;width:30px">Status</div>
- </div>
- <div style="max-height:105px;overflow:auto;">
-
- <?php
- foreach ($ipsec_detail_array as $ipsec) :
- ?>
-
- <div style="display:table-row;">
- <div class="listlr" style="display:table-cell;width:39px">
- <?php echo htmlspecialchars($ipsec['src']);?>
- </div>
- <div class="listr" style="display:table-cell;width:100px">
- <?php echo $ipsec['remote-subnet'];?>
- <br />
- (<?php echo htmlspecialchars($ipsec['dest']);?>)
- </div>
- <div class="listr" style="display:table-cell;width:90px">
- <?php echo htmlspecialchars($ipsec['descr']);?>
- </div>
- <div class="listr" style="display:table-cell;width:37px" align="center">
- <?php
- if ($ipsec['status'] == "true") {
- /* tunnel is up */
- $iconfn = "interface_up";
- } else {
- /* tunnel is down */
- $iconfn = "interface_down";
- }
+if (isset($config['ipsec']['phase2'])): ?>
+ <table class="table">
+ <thead>
+ <tr>
+ <th>Active Tunnels</td>
+ <th>Inactive Tunnels</td>
+ <th>Mobile Users</td>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><?=$activecounter; ?></td>
+ <td><?=$inactivecounter; ?></td>
+ <td><?=(is_array($mobile['pool']) ? htmlspecialchars($mobile['pool'][0]['usage']) : '0'); ?></td>
+ </tr>
+ </tbody>
+ </table>
- echo "<img src ='/themes/{$g['theme']}/images/icons/icon_{$iconfn}.gif' alt='Tunnel status' width='11' height='11' />";
- ?>
- </div>
- </div>
- <?php
- endforeach;
- ?>
- </div>
- </div>
-</div>
-<div id="ipsec-mobile" style="display:none;background-color:#EEEEEE;">
- <div style="padding: 10px">
- <div style="display:table-row;">
- <div class="widgetsubheader" style="display:table-cell;width:140px">User</div>
- <div class="widgetsubheader" style="display:table-cell;width:130px">IP</div>
- <div class="widgetsubheader" style="display:table-cell;width:30px">Status</div>
- </div>
- <div style="max-height:105px;overflow:auto;">
-<?php
- if (is_array($mobile['pool'])):
- foreach ($mobile['pool'] as $pool):
- if (is_array($pool['lease'])):
- foreach ($pool['lease'] as $muser) :
-?>
- <div style="display:table-row;">
- <div class="listlr" style="display:table-cell;width:139px">
- <?php echo htmlspecialchars($muser['id']);?><br />
- </div>
- <div class="listr" style="display:table-cell;width:130px">
- <?php echo htmlspecialchars($muser['host']);?><br />
- </div>
- <div class="listr" style="display:table-cell;width:30px">
- <?php echo htmlspecialchars($muser['status']);?><br/>
- </div>
- </div>
-<?php
- endforeach;
- endif;
- endforeach;
- endif;
-?>
- </div>
- </div>
-</div>
-<?php // end if tunnels are configured, else show code below
-} else {
-?>
-<div style="display:block">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="note">
+ <table class="table table-striped table-hover">
+ <thead>
+ <th>Source</th>
+ <th>Destination</th>
+ <th>Description</th>
+ <th>Status</th>
+ </thead>
+ <tbody>
+ <?php foreach ($ipsec_detail_array as $ipsec) : ?>
<tr>
- <td colspan="4">
- <span class="vexpl">
- <span class="red">
- <strong>
- Note: There are no configured IPsec Tunnels<br />
- </strong>
- </span>
- You can configure your IPsec <a href="vpn_ipsec.php">here</a>.
- </span>
+ <td><?php echo htmlspecialchars($ipsec['src']);?></td>
+ <td><?php echo $ipsec['remote-subnet'];?><br />(<?php echo htmlspecialchars($ipsec['dest']);?>)</td>
+ <td><?php echo htmlspecialchars($ipsec['descr']);?></td>
+ <td>
+ <?php if ($ipsec['status'] == "true"): ?>
+ <i class="icon icon-chevron-up"></i>
+ <?php else: ?>
+ <i class="icon icon-chevron-down"></i>
+ <?php endif; ?>
</td>
</tr>
+ <?php endforeach; ?>
+ </tbody>
</table>
-</div>
-<?php
-}
-?>
+
+ <?php if (is_array($mobile['pool'])): ?>
+ <table class="table table-striped table-hover">
+ <thead>
+ <th>User</th>
+ <th>IP</th>
+ <th>Status</th>
+ </thead>
+ <tbody>
+
+ <?php foreach ($mobile['pool'] as $pool):
+ if (!is_array($pool['lease']))
+ continue;
+
+ foreach ($pool['lease'] as $muser) : ?>
+ <tr>
+ <td><?php echo htmlspecialchars($muser['id']);?></td>
+ <td><?php echo htmlspecialchars($muser['host']);?></td>
+ <td><?php echo htmlspecialchars($muser['status']);?></td>
+ </tr>
+ <?php
+ endforeach;
+ endforeach; ?>
+ </tbody>
+ </table>
+ <?php endif;?>
+<?php else: ?>
+ <div class="alert alert-warning">
+ <h3>There are no configured IPsec Tunnels</h3>
+ <p>You can configure your IPsec <a href="vpn_ipsec.php">here</a>.</p>
+ </div>
+<?php endif; ?> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/widgets/load_balancer_status.widget.php b/src/usr/local/www/widgets/widgets/load_balancer_status.widget.php
index f5ddda9..0613713 100644
--- a/src/usr/local/www/widgets/widgets/load_balancer_status.widget.php
+++ b/src/usr/local/www/widgets/widgets/load_balancer_status.widget.php
@@ -66,16 +66,16 @@ if (!$nentries) {
?>
-<table bgcolor="#990000" width="100%" border="0" cellspacing="0" cellpadding="0" summary="load balancer">
+<table class="table">
+<thead>
<tr>
- <td width="10%" class="listhdrr">Server</td>
- <td width="10%" class="listhdrr">Pool</td>
- <td width="30%" class="listhdr">Description</td>
+ <th>Server</th>
+ <th>Pool</th>
+ <th>Description</th>
</tr>
-<?php
-$i = 0;
-foreach ($a_vs as $vsent):
-?>
+</thead>
+<tbody>
+ <?php foreach ($a_vs as $vsent): ?>
<tr>
<?php
switch (trim($rdr_a[$vsent['name']]['status'])) {
@@ -92,13 +92,13 @@ foreach ($a_vs as $vsent):
$rdr_a[$vsent['name']]['status'] = 'Unknown - relayd not running?';
}
?>
- <td class="listlr">
+ <td>
<?=$vsent['name'];?><br />
<span style="background-color: <?=$bgcolor?>; display: block"><i><?=$rdr_a[$vsent['name']]['status']?></i></span>
<?=$vsent['ipaddr'].":".$vsent['port'];?><br />
</td>
- <td class="listr" align="center" >
- <table border="0" cellpadding="0" cellspacing="2" summary="status">
+ <td>
+ <table>
<?php
foreach ($a_pool as $pool) {
if ($pool['name'] == $vsent['poolname']) {
@@ -117,39 +117,40 @@ foreach ($a_vs as $vsent):
}
asort($pool_hosts);
foreach ((array) $pool_hosts as $server) {
- if ($server['ip']['addr']!="") {
- switch ($server['ip']['state']) {
- case 'up':
- $bgcolor = "#90EE90"; // lightgreen
- $checked = "checked";
- break;
- case 'disabled':
- $bgcolor = "#FFFFFF"; // white
- $checked = "";
- break;
- default:
- $bgcolor = "#F08080"; // lightcoral
- $checked = "checked";
- }
- echo "<tr>";
- echo "<td bgcolor=\"{$bgcolor}\">&nbsp;{$server['ip']['addr']}:{$pool['port']}&nbsp;</td><td bgcolor=\"{$bgcolor}\">&nbsp;";
- if ($server['ip']['avail']) {
- echo " ({$server['ip']['avail']}) ";
- }
- echo "&nbsp;</td></tr>";
+ if(empty($server['ip']['addr']))
+ continue;
+
+ switch ($server['ip']['state']) {
+ case 'up':
+ $bgcolor = "#90EE90"; // lightgreen
+ $checked = "checked";
+ break;
+ case 'disabled':
+ $bgcolor = "#FFFFFF"; // white
+ $checked = "";
+ break;
+ default:
+ $bgcolor = "#F08080"; // lightcoral
+ $checked = "checked";
}
+?>
+ <tr style="background-color: <?=$bgcolor?>">
+ <td><?=$server['ip']['addr']?>:<?=$pool['port']?></td>
+ <td>
+ <?php if($server['ip']['avail']): ?>
+ ({$server['ip']['avail']})
+ <?php endif; ?>
+ </td>
+ </tr>
+<?php
}
}
}
- ?>
+?>
</table>
</td>
- <td class="listbg" >
- <font color="#FFFFFF"><?=$vsent['descr'];?></font>
- </td>
+ <td><?=$vsent['descr'];?></td>
</tr>
-<?php
- $i++;
-endforeach;
-?>
-</table>
+ <?php endforeach; ?>
+</tbody>
+</table> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/widgets/log.widget.php b/src/usr/local/www/widgets/widgets/log.widget.php
index 45205a4..00b668a 100644
--- a/src/usr/local/www/widgets/widgets/log.widget.php
+++ b/src/usr/local/www/widgets/widgets/log.widget.php
@@ -77,8 +77,7 @@ if (is_numeric($_POST['filterlogentries'])) {
$nentries = isset($config['widgets']['filterlogentries']) ? $config['widgets']['filterlogentries'] : 5;
//set variables for log
-
-$nentriesacts = isset($config['widgets']['filterlogentriesacts']) ? $config['widgets']['filterlogentriesacts'] : 'All';
+$nentriesacts = isset($config['widgets']['filterlogentriesacts']) ? $config['widgets']['filterlogentriesacts'] : 'All';
$nentriesinterfaces = isset($config['widgets']['filterlogentriesinterfaces']) ? $config['widgets']['filterlogentriesinterfaces'] : 'All';
$filterfieldsarray = array(
@@ -87,143 +86,36 @@ $filterfieldsarray = array(
);
$filter_logfile = "{$g['varlog_path']}/filter.log";
-$filterlog = conv_log_filter($filter_logfile, $nentries, 50, $filterfieldsarray); //Get log entries
/* AJAX related routines */
-handle_ajax($nentries, $nentries + 20);
-
-?>
-
-<script type="text/javascript">
-//<![CDATA[
-lastsawtime = '<?php echo time(); ?>';
-var lines = Array();
-var timer;
-var updateDelay = 30000;
-var isBusy = false;
-var isPaused = false;
-var nentries = <?php echo $nentries; ?>;
-
-<?php
-if (isset($config['syslog']['reverse'])) {
- echo "var isReverse = true;\n";
-} else {
- echo "var isReverse = false;\n";
-}
-?>
-
-/* Called by the AJAX updater */
-function format_log_line(row) {
- var rrText = "<?php echo gettext("Reverse Resolve with DNS"); ?>";
-
- if (row[8] == '6') {
- srcIP = '[' + row[3] + ']';
- dstIP = '[' + row[5] + ']';
- } else {
- srcIP = row[3];
- dstIP = row[5];
- }
-
- if (row[4] == '') {
- srcPort = '';
- } else {
- srcPort = ':' + row[4];
- }
- if (row[6] == '') {
- dstPort = '';
- } else {
- dstPort = ':' + row[6];
- }
-
- var line = '<td class="listMRlr" align="center">' + row[0] + '</td>' +
- '<td class="listMRr ellipsis" title="' + row[1] + '">' + row[1].slice(0,-3) + '</td>' +
- '<td class="listMRr ellipsis" title="' + row[2] + '">' + row[2] + '</td>' +
- '<td class="listMRr ellipsis" title="' + srcIP + srcPort + '"><a href="diag_dns.php?host=' + row[3] + '" title="' + rrText + '">' + srcIP + '</a></td>' +
- '<td class="listMRr ellipsis" title="' + dstIP + dstPort + '"><a href="diag_dns.php?host=' + row[5] + '" title="' + rrText + '">' + dstIP + '</a>' + dstPort + '</td>';
+if (isset($_POST['lastsawtime'])) {
+ $filterlog = conv_log_filter($filter_logfile, $nentries, $nentries + 20);
- var nentriesacts = "<?php echo $nentriesacts; ?>";
- var nentriesinterfaces = "<?php echo $nentriesinterfaces; ?>";
-
- var Action = row[0].match(/alt=.*?(pass|block|reject)/i).join("").match(/pass|block|reject/i).join("");
- var Interface = row[2];
-
- if (!(in_arrayi(Action, nentriesacts.replace (/\s+/g, ',').split(','))) && (nentriesacts != 'All')) {
- return false;
- }
- if (!(in_arrayi(Interface, nentriesinterfaces.replace(/\s+/g, ',').split(','))) && (nentriesinterfaces != 'All')) {
- return false;
+ foreach ($filterlog as $idx => $row) {
+ if (strtotime($log_row['time']) <= $_POST['lastsawtime'])
+ unset($filterlog[$idx]);
}
-
- return line;
}
-//]]>
-</script>
-<script src="/javascript/filter_log.js" type="text/javascript"></script>
-<input type="hidden" id="log-config" name="log-config" value="" />
-
-<div id="log-settings" class="widgetconfigdiv" style="display:none;">
- <form action="/widgets/widgets/log.widget.php" method="post" name="log_widget_iform">
- Number of lines to display:
- <select name="filterlogentries" class="formfld unknown" id="filterlogentries">
- <?php for ($i = 1; $i <= 20; $i++) { ?>
- <option value="<?php echo $i;?>" <?php if ($nentries == $i) echo "selected=\"selected\"";?>><?php echo $i;?></option>
- <?php } ?>
- </select>
-
-<?php
- $Include_Act = explode(" ", $nentriesacts);
- if ($nentriesinterfaces == "All") {
- $nentriesinterfaces = "";
- }
-?>
- <input id="actpass" name="actpass" type="checkbox" value="Pass" <?php if (in_arrayi('Pass', $Include_Act)) echo "checked=\"checked\""; ?> /> Pass
- <input id="actblock" name="actblock" type="checkbox" value="Block" <?php if (in_arrayi('Block', $Include_Act)) echo "checked=\"checked\""; ?> /> Block
- <input id="actreject" name="actreject" type="checkbox" value="Reject" <?php if (in_arrayi('Reject', $Include_Act)) echo "checked=\"checked\""; ?> /> Reject
- <br />
- Interfaces:
- <select id="filterlogentriesinterfaces" name="filterlogentriesinterfaces" class="formselect">
- <option value="All">ALL</option>
-<?php
- $interfaces = get_configured_interface_with_descr();
- foreach ($interfaces as $iface => $ifacename):
+else
+ $filterlog = conv_log_filter($filter_logfile, $nentries, 50, $filterfieldsarray);
?>
- <option value="<?=$iface;?>" <?php if ($nentriesinterfaces == $iface) echo "selected=\"selected\"";?>>
- <?=htmlspecialchars($ifacename);?>
- </option>
-<?php
- endforeach;
- unset($interfaces);
- unset($Include_Act);
-?>
- </select>
-
- <input id="log_widget_submit" name="log_widget_submit" type="submit" class="formbtn" value="Save" />
- </form>
-</div>
+<script>
+ var logWidgetLastRefresh = <?=time()?>;
+</script>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" style="table-layout: fixed;" summary="logs">
- <colgroup>
- <col style='width: 7%;' />
- <col style='width: 23%;' />
- <col style='width: 11%;' />
- <col style='width: 28%;' />
- <col style='width: 31%;' />
- </colgroup>
+<table class="table table-striped table-hover">
<thead>
<tr>
- <td class="listhdrr"><?=gettext("Act");?></td>
- <td class="listhdrr"><?=gettext("Time");?></td>
- <td class="listhdrr"><?=gettext("IF");?></td>
- <td class="listhdrr"><?=gettext("Source");?></td>
- <td class="listhdrr"><?=gettext("Destination");?></td>
+ <th><?=gettext("Act");?></th>
+ <th><?=gettext("Time");?></th>
+ <th><?=gettext("IF");?></th>
+ <th><?=gettext("Source");?></th>
+ <th><?=gettext("Destination");?></th>
</tr>
</thead>
- <tbody id='filter-log-entries'>
- <?php
- $rowIndex = 0;
+ <tbody>
+<?php
foreach ($filterlog as $filterent):
- $evenRowClass = $rowIndex % 2 ? " listMReven" : " listMRodd";
- $rowIndex++;
if ($filterent['version'] == '6') {
$srcIP = "[" . htmlspecialchars($filterent['srcip']) . "]";
$dstIP = "[" . htmlspecialchars($filterent['dstip']) . "]";
@@ -232,38 +124,31 @@ function format_log_line(row) {
$dstIP = htmlspecialchars($filterent['dstip']);
}
- if ($filterent['srcport']) {
- $srcPort = ":" . htmlspecialchars($filterent['srcport']);
- } else {
- $srcPort = "";
- }
+ if ($filterent['act'] == "block")
+ $iconfn = "remove";
+ else if ($filterent['act'] == "reject")
+ $iconfn = "fire";
+ else if ($filterent['act'] == "match")
+ $iconfn = "filter";
+ else
+ $iconfn = "ok";
- if ($filterent['dstport']) {
- $dstPort = ":" . htmlspecialchars($filterent['dstport']);
- } else {
- $dstPort = "";
- }
-
- ?>
- <tr class="<?=$evenRowClass?>">
- <td class="listMRlr nowrap" align="center">
- <a href="#" onclick="javascript:getURL('diag_logs_filter.php?getrulenum=<?php echo "{$filterent['rulenum']},{$filterent['tracker']},{$filterent['act']}"; ?>', outputrule);">
- <img border="0" src="<?php echo find_action_image($filterent['act']);?>" width="11" height="11" alt="<?php echo $filterent['act'];?>" title="<?php echo $filterent['act'];?>" />
- </a>
+ $rule = find_rule_by_number($filterent['rulenum'], $filterent['tracker'], $filterent['act']);
+?>
+ <tr>
+ <td><a role="button" data-toggle="popover" data-trigger="hover"
+ data-title="Rule that triggered this action"
+ data-content="<?=htmlspecialchars($rule)?>"> <i
+ class="icon icon-<?=$iconfn?>"></i>
+ </a></td>
+ <td title="<?=htmlspecialchars($filterent['time'])?>"><?=substr(htmlspecialchars($filterent['time']),0,-3)?></td>
+ <td><?=htmlspecialchars($filterent['interface']);?></td>
+ <td><a href="diag_dns.php?host=<?=$filterent['srcip']?>"
+ title="<?=gettext("Reverse Resolve with DNS")?>"><?=$srcIP?></a>:<?=htmlspecialchars($filterent['srcport'])?>
+ </td>
+ <td><a href="diag_dns.php?host=<?=$filterent['dstip']?>"
+ title="<?=gettext("Reverse Resolve with DNS");?>"><?=$dstIP?></a>:<?=htmlspecialchars($filterent['dstport'])?>
</td>
- <td class="listMRr ellipsis nowrap" title="<?php echo htmlspecialchars($filterent['time']);?>"><?php echo substr(htmlspecialchars($filterent['time']),0,-3);?></td>
- <td class="listMRr ellipsis nowrap" title="<?php echo htmlspecialchars($filterent['interface']);?>"><?php echo htmlspecialchars($filterent['interface']);?></td>
- <td class="listMRr ellipsis nowrap" title="<?php echo $srcIP . $srcPort;?>">
- <a href="diag_dns.php?host=<?php echo "{$filterent['srcip']}"; ?>" title="<?=gettext("Reverse Resolve with DNS");?>">
- <?php echo $srcIP;?></a></td>
- <td class="listMRr ellipsis nowrap" title="<?php echo $dstIP . $dstPort;?>">
- <a href="diag_dns.php?host=<?php echo "{$filterent['dstip']}"; ?>" title="<?=gettext("Reverse Resolve with DNS");?>">
- <?php echo $dstIP;?></a><?php echo $dstPort;?></td>
- <?php
- if ($filterent['proto'] == "TCP") {
- $filterent['proto'] .= ":{$filterent['tcpflags']}";
- }
- ?>
</tr>
<?php
endforeach;
@@ -271,11 +156,79 @@ function format_log_line(row) {
</tbody>
</table>
-<!-- needed to display the widget settings menu -->
-<script type="text/javascript">
-//<![CDATA[
- selectIntLink = "log-configure";
- textlink = document.getElementById(selectIntLink);
- textlink.style.display = "inline";
-//]]>
+<?php
+
+/* for AJAX response, we only need the panel-body */
+if (isset($_GET['lastsawtime']))
+ exit;
+?>
+
+<script>
+function logWidgetUpdateFromServer(){
+ $.ajax({
+ type: 'get',
+ url: '/widgets/widgets/log.widget.php',
+ data: 'lastsawtime='+logWidgetLastRefresh,
+ dataFilter: function(raw){
+ // We reload the entire widget, strip this block of javascript from it
+ return raw.replace(/<script>([\s\S]*)<\/script>/gi, '');
+ },
+ dataType: 'html',
+ success: function(data){
+ $('#widget-log .panel-body').html(data);
+ }
+ });
+}
+
+events.push(function(){
+ setInterval('logWidgetUpdateFromServer()', 60*1000);
+});
</script>
+
+<!-- close the body we're wrapped in and add a configuration-panel -->
+</div>
+<div class="panel-footer collapse">
+
+ <form action="/widgets/widgets/log.widget.php" method="post"
+ class="form-horizontal">
+ <div class="form-group">
+ <label for="filterlogentries" class="col-sm-4 control-label">Number
+ of entries</label>
+ <div class="col-sm-6">
+ <input type="number" name="filterlogentries" value="<?=$nentries?>"
+ min="1" max="20" class="form-control" />
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="col-sm-4 control-label">Filter actions</label>
+ <div class="col-sm-6 checkbox">
+ <?php $include_acts = explode(" ", strtolower($nentriesacts)); ?>
+ <label><input name="actpass" type="checkbox" value="Pass"
+ <?=(in_array('pass', $include_acts) ? 'checked="checked"':'')?> />Pass</label>
+ <label><input name="actblock" type="checkbox" value="Block"
+ <?=(in_array('block', $include_acts) ? 'checked="checked"':'')?> />Block</label>
+ <label><input name="actreject" type="checkbox" value="Reject"
+ <?=(in_array('reject', $include_acts) ? 'checked="checked"':'')?> />Reject</label>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="filterlogentriesinterfaces"
+ class="col-sm-4 control-label">Filter interface</label>
+ <div class="col-sm-6 checkbox">
+ <select name="filterlogentriesinterfaces" class="form-control">
+ <?php foreach (array("All" => "ALL") + get_configured_interface_with_descr() as $iface => $ifacename):?>
+ <option value="<?=$iface?>"
+ <?=($nentriesinterfaces==$iface?'selected="selected"':'')?>><?=htmlspecialchars($ifacename)?></option>
+ <?php endforeach;?>
+ </select>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <div class="col-sm-offset-4 col-sm-6">
+ <button type="submit" class="btn btn-default">Save</button>
+ </div>
+ </div>
+ </form>
diff --git a/src/usr/local/www/widgets/widgets/ntp_status.widget.php b/src/usr/local/www/widgets/widgets/ntp_status.widget.php
index 64522be..48d3755 100644
--- a/src/usr/local/www/widgets/widgets/ntp_status.widget.php
+++ b/src/usr/local/www/widgets/widgets/ntp_status.widget.php
@@ -2,7 +2,7 @@
/*
ntp_status.widget.php
Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
+X
Copyright 2007 Scott Dale
Part of pfSense widgets (https://www.pfsense.org)
originally based on m0n0wall (http://m0n0.ch/wall)
@@ -89,7 +89,7 @@ if ($_REQUEST['updateme']) {
$gps_lon = $gps_lon * (($gps_vars[6] == "E") ? 1 : -1);
$gps_la = $gps_vars[4];
$gps_lo = $gps_vars[6];
- } elseif (substr($tmp, 0, 6) == '$GPGGA') {
+ }elseif (substr($tmp, 0, 6) == '$GPGGA') {
$gps_vars = explode(",", $tmp);
$gps_ok = $gps_vars[6];
$gps_lat_deg = substr($gps_vars[2], 0, 2);
@@ -105,7 +105,7 @@ if ($_REQUEST['updateme']) {
$gps_sat = $gps_vars[7];
$gps_la = $gps_vars[3];
$gps_lo = $gps_vars[5];
- } elseif (substr($tmp, 0, 6) == '$GPGLL') {
+ }elseif (substr($tmp, 0, 6) == '$GPGLL') {
$gps_vars = explode(",", $tmp);
$gps_ok = ($gps_vars[6] == "A");
$gps_lat_deg = substr($gps_vars[1], 0, 2);
@@ -125,9 +125,9 @@ if ($_REQUEST['updateme']) {
if (isset($config['ntpd']['gps']['type']) && ($config['ntpd']['gps']['type'] == 'SureGPS') && (isset($gps_ok))) {
//GSV message is only enabled by init commands in services_ntpd_gps.php for SureGPS board
$gpsport = fopen("/dev/gps0", "r+");
- while ($gpsport) {
+ while($gpsport){
$buffer = fgets($gpsport);
- if (substr($buffer, 0, 6)=='$GPGSV') {
+ if(substr($buffer, 0, 6)=='$GPGSV'){
//echo $buffer."\n";
$gpgsv = explode(',',$buffer);
$gps_satview = $gpgsv[3];
@@ -137,94 +137,78 @@ if ($_REQUEST['updateme']) {
}
?>
-<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="clock">
- <tbody>
+<table class="table" id="ntp_status_widget">
+ <tr>
+ <th>Server Time</th>
+ <td id="ntpStatusClock">
+ <script>var ntpServerTime = new Date('<?=date_format(date_create(), 'c')?>');</script>
+ <!-- display initial value before javascript takes over -->
+ <?=gmdate('D j Y H:i:s \G\M\T O (T)');?>
+ </td>
+ </tr>
+ <tr>
+ <th>Sync Source</th>
+ <td>
+ <?php if ($ntpq_counter == 0): ?>
+ <i>No active peers available</i>
+ <?php else: ?>
+ <?php echo $syncsource; ?>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php if (($gps_ok) && ($gps_lat) && ($gps_lon)): ?>
<tr>
- <td width="40%" class="vncellt">Sync Source</td>
- <td width="60%" class="listr">
- <?php if ($ntpq_counter == 0): ?>
- No active peers available
- <?php else: ?>
- <?php echo $syncsource; ?>
- <?php endif; ?>
+ <th>Clock location</th>
+ <td>
+ <a target="_gmaps" href="http://maps.google.com/?q=<?php echo $gps_lat; ?>,<?php echo $gps_lon; ?>">
+ <?php
+ echo sprintf("%.5f", $gps_lat) . " " . $gps_la . ", " . sprintf("%.5f", $gps_lon) . " " . $gps_lo; ?>
+ </a>
+ <?php if (isset($gps_alt)) {echo " (" . $gps_alt . " " . $gps_alt_unit . " alt.)";} ?>
</td>
</tr>
- <?php if (($gps_ok) && ($gps_lat) && ($gps_lon)): ?>
+ <?php if (isset($gps_sat) || isset($gps_satview)): ?>
<tr>
- <td width="40%" class="vncellt">Clock location</td>
- <td width="60%" class="listr">
- <a target="_gmaps" href="http://maps.google.com/?q=<?php echo $gps_lat; ?>,<?php echo $gps_lon; ?>">
- <?php
- echo sprintf("%.5f", $gps_lat) . " " . $gps_la . ", " . sprintf("%.5f", $gps_lon) . " " . $gps_lo;
- ?>
- </a>
- <?php
- if (isset($gps_alt)) {
- echo " (" . $gps_alt . " " . $gps_alt_unit . " alt.)";
- }
- ?>
+ <th>Satellites</th>
+ <td>
+ <?php
+ if (isset($gps_satview)) {echo 'in view ' . intval($gps_satview);}
+ if (isset($gps_sat) && isset($gps_satview)) {echo ', ';}
+ if (isset($gps_sat)) {echo 'in use ' . $gps_sat;}
+ ?>
</td>
</tr>
- <?php if (isset($gps_sat) || isset($gps_satview)): ?>
- <tr>
- <td width="40%" class="vncellt">Satellites</td>
- <td width="60%" class="listr">
- <?php
- if (isset($gps_satview)) {
- echo 'in view ' . intval($gps_satview);
- }
- if (isset($gps_sat) && isset($gps_satview)) {
- echo ', ';
- }
- if (isset($gps_sat)) {
- echo 'in use ' . $gps_sat;
- }
- ?>
- </td>
- </tr>
- <?php endif; ?>
<?php endif; ?>
- </tbody>
+ <?php endif; ?>
</table>
+
<?php
exit;
}
-
-/*** Clock -- beginning of server-side support code
-by Andrew Shearer, http://www.shearersoftware.com/
-v2.1.2-PHP, 2003-08-07. For updates and explanations, see
-<http://www.shearersoftware.com/software/web-tools/clock/>. ***/
-
-/* Prevent this page from being cached (though some browsers still
- cache the page anyway, which is why we use cookies). This is
- only important if the cookie is deleted while the page is still
- cached (and for ancient browsers that don't know about Cache-Control).
- If that's not an issue, you may be able to get away with
- "Cache-Control: private" instead. */
-
-/* Grab the current server time. */
-$gDate = time();
-/* Are the seconds shown by default? When changing this, also change the
- JavaScript client code's definition of clockShowsSeconds below to match. */
-$gClockShowsSeconds = true;
-
-function getServerDateItems($inDate) {
- return date('Y,n,j,G,',$inDate).intval(date('i',$inDate)).','.intval(date('s',$inDate));
- // year (4-digit),month,day,hours (0-23),minutes,seconds
- // use intval to strip leading zero from minutes and seconds
- // so JavaScript won't try to interpret them in octal
- // (use intval instead of ltrim, which translates '00' to '')
+?>
+<script>
+function ntpWidgetUpdateFromServer(){
+ $.ajax({
+ type: 'get',
+ url: '/widgets/widgets/ntp_status.widget.php',
+ dataFilter: function(raw){
+ // We reload the entire widget, strip this block of javascript from it
+ return raw.replace(/<script>([\s\S]*)<\/script>/gi, '');
+ },
+ dataType: 'html',
+ success: function(data){
+ console.log(data);
+ $('#ntp_status_widget').html(data);
+ }
+ });
}
-function clockDateString($inDate) {
- return date('Y. F j l',$inDate); // eg "Monday, January 1, 2002"
-}
+function ntpWidgetUpdateDisplay(){
+ // Javascript handles overflowing
+ ntpServerTime.setSeconds(ntpServerTime.getSeconds()+1);
-function clockTimeString($inDate, $showSeconds) {
- return date($showSeconds ? 'G:i:s' : 'g:i',$inDate).' ';
+ $('#ntpStatusClock').html(ntpServerTime.toString());
}
-/*** Clock -- end of server-side support code ***/
-?>
<script type="text/javascript">
//<![CDATA[
diff --git a/src/usr/local/www/widgets/widgets/openvpn.widget.php b/src/usr/local/www/widgets/widgets/openvpn.widget.php
index 6f813c5..4dc386c 100644
--- a/src/usr/local/www/widgets/widgets/openvpn.widget.php
+++ b/src/usr/local/www/widgets/widgets/openvpn.widget.php
@@ -54,8 +54,8 @@ function kill_client($port, $remipp) {
//$tcpsrv = "tcp://127.0.0.1:{$port}";
$tcpsrv = "unix://{$g['varetc_path']}/openvpn/{$port}.sock";
- $errval;
- $errstr;
+ $errval = null;
+ $errstr = null;
/* open a tcp connection to the management port of each server */
$fp = @stream_socket_client($tcpsrv, $errval, $errstr, 1);
@@ -125,7 +125,7 @@ $clients = openvpn_get_active_clients();
<?php foreach ($servers as $server): ?>
-<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0">
+<table>
<tr>
<td colspan="6" class="listtopic">
<?=$server['name'];?> Client connections
@@ -133,39 +133,38 @@ $clients = openvpn_get_active_clients();
</tr>
<tr>
<td>
- <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" sortableMultirow="2">
- <tr>
- <td class="listhdrr">Name/Time</td>
- <td class="listhdrr">Real/Virtual IP</td>
- </tr>
- <?php
- $rowIndex = 0;
- foreach ($server['conns'] as $conn):
+ <table>
+ <tr>
+ <th>Name/Time</td>
+ <th>Real/Virtual IP</td>
+ </tr>
+ <?php $rowIndex = 0;
+ foreach ($server['conns'] as $conn):
$evenRowClass = $rowIndex % 2 ? " listMReven" : " listMRodd";
$rowIndex++;
- ?>
- <tr name='<?php echo "r:{$server['mgmt']}:{$conn['remote_host']}"; ?>' class="<?=$evenRowClass?>">
- <td class="listMRlr">
- <?=$conn['common_name'];?>
- </td>
- <td class="listMRr">
- <?=$conn['remote_host'];?>
- </td>
- <td class='listMR' rowspan="2">
- <img src='/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif' height='17' width='17' border='0'
- onclick="killClient('<?php echo $server['mgmt']; ?>', '<?php echo $conn['remote_host']; ?>');" style='cursor:pointer;'
- name='<?php echo "i:{$server['mgmt']}:{$conn['remote_host']}"; ?>'
- title='Kill client connection from <?php echo $conn['remote_host']; ?>' alt='' />
- </td>
- </tr>
- <tr name='<?php echo "r:{$server['mgmt']}:{$conn['remote_host']}"; ?>' class="<?=$evenRowClass?>">
- <td class="listMRlr">
- <?=$conn['connect_time'];?>
- </td>
- <td class="listMRr">
- <?=$conn['virtual_addr'];?>
- </td>
- </tr>
+ ?>
+ <tr name='<?php echo "r:{$server['mgmt']}:{$conn['remote_host']}"; ?>' class="<?=$evenRowClass?>">
+ <td class="listMRlr">
+ <?=$conn['common_name'];?>
+ </td>
+ <td class="listMRr">
+ <?=$conn['remote_host'];?>
+ </td>
+ <td class='listMR' rowspan="2">
+ <img src='/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif' height='17' width='17' border='0'
+ onclick="killClient('<?php echo $server['mgmt']; ?>', '<?php echo $conn['remote_host']; ?>');" style='cursor:pointer;'
+ name='<?php echo "i:{$server['mgmt']}:{$conn['remote_host']}"; ?>'
+ title='Kill client connection from <?php echo $conn['remote_host']; ?>' alt='' />
+ </td>
+ </tr>
+ <tr name='<?php echo "r:{$server['mgmt']}:{$conn['remote_host']}"; ?>' class="<?=$evenRowClass?>">
+ <td class="listMRlr">
+ <?=$conn['connect_time'];?>
+ </td>
+ <td class="listMRr">
+ <?=$conn['virtual_addr'];?>
+ </td>
+ </tr>
<?php endforeach; ?>
<tfoot>
@@ -180,17 +179,17 @@ $clients = openvpn_get_active_clients();
<?php endforeach; ?>
<?php if (!empty($sk_servers)) { ?>
-<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0">
+<table>
<tr>
<td colspan="6" class="listtopic">
Peer to Peer Server Instance Statistics
</td>
</tr>
<tr>
- <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <table>
<tr>
- <td class="listhdrr">Name/Time</td>
- <td class="listhdrr">Remote/Virtual IP</td>
+ <th>Name/Time</td>
+ <th>Remote/Virtual IP</td>
</tr>
<?php foreach ($sk_servers as $sk_server): ?>
@@ -230,18 +229,18 @@ $clients = openvpn_get_active_clients();
<?php
} ?>
<?php if (!empty($clients)) { ?>
-<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0">
+<table>
<tr>
<td colspan="6" class="listtopic">
Client Instance Statistics
</td>
</tr>
<tr>
- <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td class="listhdrr">Name/Time</td>
- <td class="listhdrr">Remote/Virtual IP</td>
- </tr>
+ <table>
+ <tr>
+ <th>Name/Time</td>
+ <th>Remote/Virtual IP</td>
+ </tr>
<?php foreach ($clients as $client): ?>
<tr name='<?php echo "r:{$client['port']}:{$client['remote_host']}"; ?>'>
diff --git a/src/usr/local/www/widgets/widgets/picture.widget.php b/src/usr/local/www/widgets/widgets/picture.widget.php
index 02a002a..6b19ab6 100644
--- a/src/usr/local/www/widgets/widgets/picture.widget.php
+++ b/src/usr/local/www/widgets/widgets/picture.widget.php
@@ -70,27 +70,15 @@ if ($_POST) {
}
?>
+<a href="/widgets/widgets/picture.widget.php?getpic=true" target="_blank">
+ <img width="100%" height="100%" src="/widgets/widgets/picture.widget.php?getpic=true" alt="picture" />
+</a>
-<input type="hidden" id="picture-config" name="picture-config" value="" />
+<!-- close the body we're wrapped in and add a configuration-panel -->
+</div><div class="panel-footer collapse">
-<div id="picture-settings" class="widgetconfigdiv" style="display:none;">
- <form action="/widgets/widgets/picture.widget.php" method="post" name="picture_widget_iform" enctype="multipart/form-data">
- <input name="pictfile" type="file" class="formbtn" id="pictfile" size="20" />
- <input id="picture_widget_submit" name="picture_widget_submit" type="submit" class="formbtn" value="Upload" />
- </form>
-</div>
-
-<div id="picture-widgets" style="padding: 5px">
- <a href='/widgets/widgets/picture.widget.php?getpic=true' target='_blank'>
- <img border="0" width="100%" height="100%" src="/widgets/widgets/picture.widget.php?getpic=true" alt="picture" />
- </a>
-</div>
-
-<!-- needed to show the settings widget icon -->
-<script type="text/javascript">
-//<![CDATA[
- selectIntLink = "picture-configure";
- textlink = document.getElementById(selectIntLink);
- textlink.style.display = "inline";
-//]]>
-</script>
+<form action="/widgets/widgets/picture.widget.php" method="post" enctype="multipart/form-data" class="form-inline">
+ <label for="pictfile">New picture: </label>
+ <input name="pictfile" type="file" class="form-control" />
+ <button type="submit" class="btn btn-default">Upload</button>
+</form>
diff --git a/src/usr/local/www/widgets/widgets/rss.widget.php b/src/usr/local/www/widgets/widgets/rss.widget.php
index 0850039..e84bae2 100644
--- a/src/usr/local/www/widgets/widgets/rss.widget.php
+++ b/src/usr/local/www/widgets/widgets/rss.widget.php
@@ -85,72 +85,7 @@ if ($config['widgets']['rssfeed']) {
}
?>
-
-<input type="hidden" id="rss-config" name="rss-config" value="" />
-
-<div id="rss-settings" class="widgetconfigdiv" style="display:none;">
- <form action="/widgets/widgets/rss.widget.php" method="post" name="rss_widget_iform">
- <textarea name="rssfeed" class="formfld unknown textarea_widget" id="rssfeed" cols="40" rows="3"><?=$textarea_txt;?></textarea>
- <br />
- <table summary="rss widget">
- <tr>
- <td align="right">
- Display number of items:
- </td>
- <td>
- <select name='rssmaxitems' id='rssmaxitems'>
- <option value='<?= $max_items ?>'><?= $max_items ?></option>
- <?php
- for ($x=100; $x<5100; $x=$x+100) {
- echo "<option value='{$x}'>{$x}</option>\n";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td align="right">
- Widget height:
- </td>
- <td>
- <select name='rsswidgetheight' id='rsswidgetheight'>
- <option value='<?= $rsswidgetheight ?>'><?= $rsswidgetheight ?>px</option>
- <?php
- for ($x=100; $x<5100; $x=$x+100) {
- echo "<option value='{$x}'>{$x}px</option>\n";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td align="right">
- Show how many characters from story:
- </td>
- <td>
- <select name='rsswidgettextlength' id='rsswidgettextlength'>
- <option value='<?= $rsswidgettextlength ?>'><?= $rsswidgettextlength ?></option>
- <?php
- for ($x=10; $x<5100; $x=$x+10) {
- echo "<option value='{$x}'>{$x}</option>\n";
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td>
- &nbsp;
- </td>
- <td>
- <input id="rss_widget_submit" name="rss_widget_submit" type="submit" class="formbtn" value="Save" />
- </td>
- </tr>
- </table>
- </form>
-</div>
-
-<div id="rss-widgets" style="padding: 5px; height: <?=$rsswidgetheight?>px; overflow:scroll;">
+<div class="list-group" style="height: <?=$rsswidgetheight?>px; overflow:scroll;">
<?php
if (!is_dir("/tmp/simplepie")) {
mkdir("/tmp/simplepie");
@@ -160,9 +95,8 @@ if ($config['widgets']['rssfeed']) {
exec("chmod a+rw /tmp/simplepie/cache/.");
require_once("simplepie/simplepie.inc");
function textLimit($string, $length, $replacer = '...') {
- if (strlen($string) > $length) {
+ if(strlen($string) > $length)
return (preg_match('/^(.*)\W.*$/', substr($string, 0, $length+1), $matches) ? $matches[1] : substr($string, 0, $length)) . $replacer;
- }
return $string;
}
$feed = new SimplePie();
@@ -171,28 +105,63 @@ if ($config['widgets']['rssfeed']) {
$feed->init();
$feed->handle_content_type();
$counter = 1;
- foreach ($feed->get_items() as $item) {
+ foreach($feed->get_items(0, $max_items) as $item) {
$feed = $item->get_feed();
$feed->strip_htmltags();
- echo "<a target='blank' href='" . $item->get_permalink() . "'>" . $item->get_title() . "</a><br />";
$content = $item->get_content();
$content = strip_tags($content);
- echo textLimit($content, $rsswidgettextlength) . "<br />";
- echo "Source: <a target='_blank' href='" . $item->get_permalink() . "'><img src='" . $feed->get_favicon() . "' alt='" . $feed->get_title() . "' title='" . $feed->get_title() . "' border='0' width='16' height='16' /></a><br />";
- $counter++;
- if ($counter > $max_items) {
- break;
- }
- echo "<hr/>";
+?>
+ <a href="<?=$item->get_permalink()?>" target="_blank" class="list-group-item">
+ <h4 class="list-group-item-heading">
+ <img src="<?=$feed->get_favicon()?>" title="Source: <?=$feed->get_title()?>" width="16" height="16" />
+ <?=$item->get_title()?>
+ </h4>
+ <p class="list-group-item-text">
+ <?=textLimit($content, $rsswidgettextlength)?>
+ <br />
+ </p>
+ </a>
+<?php
}
?>
+
</div>
-<!-- needed to display the widget settings menu -->
-<script type="text/javascript">
-//<![CDATA[
- selectIntLink = "rss-configure";
- textlink = document.getElementById(selectIntLink);
- textlink.style.display = "inline";
-//]]>
-</script>
+<!-- close the body we're wrapped in and add a configuration-panel -->
+</div><div class="panel-footer collapse">
+
+<form action="/widgets/widgets/rss.widget.php" method="post" class="form-horizontal">
+ <div class="form-group">
+ <label for="rssfeed" class="col-sm-3 control-label">Feeds</label>
+ <div class="col-sm-6">
+ <textarea name="rssfeed" class="form-control"><?=$textarea_txt;?></textarea>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="rssmaxitems" class="col-sm-3 control-label"># Stories</label>
+ <div class="col-sm-6">
+ <input type="number" name="rssmaxitems" value="<?=$max_items?>" min="1" max="100" class="form-control" />
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="rsswidgetheight" class="col-sm-3 control-label">Widget height</label>
+ <div class="col-sm-6">
+ <input type="number" name="rsswidgetheight" value="<?=$rsswidgetheight?>" min="100" max="2500" step="100" class="form-control" />
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="rsswidgettextlength" class="col-sm-3 control-label">Content limit</label>
+ <div class="col-sm-6">
+ <input type="number" name="rsswidgettextlength" value="<?=$rsswidgettextlength?>" min="100" max="5000" step="100" class="form-control" />
+ </div>
+ </div>
+
+ <div class="form-group">
+ <div class="col-sm-offset-3 col-sm-6">
+ <button type="submit" class="btn btn-default">Save</button>
+ </div>
+ </div>
+</form> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/widgets/services_status.widget.php b/src/usr/local/www/widgets/widgets/services_status.widget.php
index f4c3542..a0f7e54 100644
--- a/src/usr/local/www/widgets/widgets/services_status.widget.php
+++ b/src/usr/local/www/widgets/widgets/services_status.widget.php
@@ -42,28 +42,26 @@ require_once("/usr/local/www/widgets/include/services_status.inc");
$services = get_services();
-if (isset($_POST['servicestatusfilter'])) {
- $config['widgets']['servicestatusfilter'] = htmlspecialchars($_POST['servicestatusfilter'], ENT_QUOTES | ENT_HTML401);
+if(isset($_POST['servicestatusfilter'])) {
+ $validNames = array();
+ foreach ($services as $service)
+ array_push($validNames, $service['name']);
+
+ $config['widgets']['servicestatusfilter'] = implode(',', array_intersect($validNames, $_POST['servicestatusfilter']));
write_config("Saved Service Status Filter via Dashboard");
- header("Location: ../../index.php");
+ header("Location: /");
}
?>
-<input type="hidden" id="services_status-config" name="services_status-config" value="" />
-<div id="services_status-settings" class="widgetconfigdiv" style="display:none;">
- <form action="/widgets/widgets/services_status.widget.php" method="post" name="services_status_widget_iform">
- Comma separated list of services to NOT display in the widget<br />
- <input type="text" size="30" name="servicestatusfilter" class="formfld unknown" id="servicestatusfilter" value="<?= $config['widgets']['servicestatusfilter'] ?>" />
- <input id="services_status_widget_submit" name="services_status_widget_submit" type="submit" class="formbtn" value="Save" />
- </form>
-</div>
-
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="services">
+<table class="table table-striped table-hover">
+<thead>
<tr>
- <td class="widgetsubheader" align="center"><b>Service</b></td>
- <td class="widgetsubheader" align="center"><b>Description</b></td>
- <td class="widgetsubheader" align="center"><b>Status</b></td>
- <td class="widgetsubheader">&nbsp;</td>
+ <th></th>
+ <th>Service</td>
+ <th>Description</td>
+ <th>Action</td>
</tr>
+</thead>
+<tbody>
<?php
$skipservices = explode(",", $config['widgets']['servicestatusfilter']);
@@ -77,29 +75,40 @@ if (count($services) > 0) {
$service['description'] = get_pkg_descr($service['name']);
}
$service_desc = explode(".",$service['description']);
- echo "<tr><td class=\"listlr\">" . $service['name'] . "</td>\n";
- echo "<td class=\"listr\">" . $service_desc[0] . "</td>\n";
- // if service is running then listr else listbg
- $bgclass = null;
- if (get_service_status($service)) {
- $bgclass = "listr";
- } else {
- $bgclass = "listbg";
- }
- echo "<td class=\"" . $bgclass . "\" align=\"center\">" . get_service_status_icon($service, false, true) . "</td>\n";
- echo "<td valign=\"middle\" class=\"list nowrap\">" . get_service_control_links($service) . "</td></tr>\n";
+?>
+ <tr>
+ <td><i class="icon icon-<?=get_service_status($service)? 'ok' : 'remove'?>-sign"></i></td>
+ <td><?=$service['name']?></td>
+ <td><?=$service_desc[0]?></td>
+ <td><?=get_service_control_links($service)?></td>
+ </tr>
+<?php
}
} else {
echo "<tr><td colspan=\"3\" align=\"center\">" . gettext("No services found") . " . </td></tr>\n";
}
?>
+</tbody>
</table>
-<!-- needed to display the widget settings menu -->
-<script type="text/javascript">
-//<![CDATA[
- selectIntLink = "services_status-configure";
- textlink = document.getElementById(selectIntLink);
- textlink.style.display = "inline";
-//]]>
-</script>
+<!-- close the body we're wrapped in and add a configuration-panel -->
+</div><div class="panel-footer collapse">
+
+<form action="/widgets/widgets/services_status.widget.php" method="post" class="form-horizontal">
+ <div class="form-group">
+ <label for="inputPassword3" class="col-sm-3 control-label">Hidden services</label>
+ <div class="col-sm-6">
+ <select multiple="multiple" name="servicestatusfilter" class="form-control" height="5">
+ <?php foreach ($services as $service): ?>
+ <option <?=(in_array($service['name'], $skipservices)?'selected="selected"':'')?>><?=$service['name']?></option>
+ <?php endforeach; ?>
+ </select>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <div class="col-sm-offset-3 col-sm-6">
+ <button type="submit" class="btn btn-default">Save</button>
+ </div>
+ </div>
+</form> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/widgets/smart_status.widget.php b/src/usr/local/www/widgets/widgets/smart_status.widget.php
index 87f0605..175a185 100644
--- a/src/usr/local/www/widgets/widgets/smart_status.widget.php
+++ b/src/usr/local/www/widgets/widgets/smart_status.widget.php
@@ -34,13 +34,16 @@ require_once("functions.inc");
require_once("/usr/local/www/widgets/include/smart_status.inc");
?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="smart status">
- <tr>
- <td class="widgetsubheader" align="center"><b><?php echo gettext("Drive") ?></b></td>
- <td class="widgetsubheader" align="center"><b><?php echo gettext("Ident") ?></b></td>
- <td class="widgetsubheader" align="center"><b><?php echo gettext("SMART Status") ?></b></td>
- </tr>
-
+<table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th></th>
+ <th><?=gettext("Drive")?></th>
+ <th><?=gettext("Ident")?></th>
+ <th><?=gettext("SMART Status")?></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
$devs = array();
## Get all adX, daX, and adaX (IDE, SCSI, and AHCI) devices currently installed
@@ -66,11 +69,14 @@ if (count($devs) > 0) {
}
?>
<tr>
- <td class="listlr"><?php echo $dev; ?></td>
- <td class="listr" align="center"><?php echo $dev_ident; ?></td>
- <td class="listr" align="center"><span style="background-color:<?php echo $color; ?>">&nbsp;<?php echo $dev_state; ?>&nbsp;</span></td>
+ <td><i class="icon icon-<?=$icon?>-sign"></i></td>
+ <td><?=$dev?></td>
+ <td><?=$dev_ident?></td>
+ <td><?=ucfirst($dev_state)?></td>
</tr>
-<?php }
+<?php
+ }
}
?>
+ </tbody>
</table>
diff --git a/src/usr/local/www/widgets/widgets/system_information.widget.php b/src/usr/local/www/widgets/widgets/system_information.widget.php
index 231f2ee..c9aab04 100644
--- a/src/usr/local/www/widgets/widgets/system_information.widget.php
+++ b/src/usr/local/www/widgets/widgets/system_information.widget.php
@@ -62,25 +62,25 @@ if ($_REQUEST['getupdatestatus']) {
$remote_version = trim(@file_get_contents("/tmp/{$g['product_name']}_version"));
}
- if (empty($remote_version)) {
- echo "<br /><br />Unable to check for updates.";
- } else {
+ if(empty($remote_version))
+ echo "<i>Unable to check for updates</i>";
+ else {
$current_installed_buildtime = trim(file_get_contents("/etc/version.buildtime"));
+ $current_installed_version = trim(file_get_contents("/etc/version"));
- if (!$remote_version) {
- echo "<br /><br />Unable to check for updates.";
- } else {
+ if(!$remote_version) {
+ echo "<i>Unable to check for updates</i>";
+ }
+ else {
$needs_system_upgrade = false;
- if (pfs_version_compare($current_installed_buildtime, $g['product_version'], $remote_version) == -1) {
- echo "<br /><span class=\"red\" id=\"updatealert\"><b>Update available. </b></span><a href=\"/system_firmware_check.php\">Click Here</a> to view update.";
- echo "\n<script type=\"text/javascript\">\n";
- echo "//<![CDATA[\n";
- echo "jQuery('#updatealert').effect('pulsate',{times: 30},10000);\n";
- echo "//]]>\n";
- echo "</script>\n";
- } else {
- echo "<br />You are on the latest version.";
- }
+ if (pfs_version_compare($current_installed_buildtime, $current_installed_version, $remote_version) == -1) {
+?>
+<div class="alert alert-warning" role="alert">
+ Version <?=$remote_version?> is available. <a href="/system_firmware_check.php" class="alert-link">Click Here to view.</a>
+</div>
+<?php
+ } else
+ echo "You are on the latest version.";
}
}
exit;
@@ -89,57 +89,35 @@ if ($_REQUEST['getupdatestatus']) {
$curcfg = $config['system']['firmware'];
$filesystems = get_mounted_filesystems();
-
?>
-<script type="text/javascript">
-//<![CDATA[
- jQuery(function() {
- jQuery("#statePB").progressbar( { value: <?php echo get_pfstate(true); ?> } );
- jQuery("#mbufPB").progressbar( { value: <?php echo get_mbuf(true); ?> } );
- jQuery("#cpuPB").progressbar( { value:false } );
- jQuery("#memUsagePB").progressbar( { value: <?php echo mem_usage(); ?> } );
-<?PHP $d = 0; ?>
-<?PHP foreach ($filesystems as $fs): ?>
- jQuery("#diskUsagePB<?php echo $d++; ?>").progressbar( { value: <?php echo $fs['percent_used']; ?> } );
-<?PHP endforeach; ?>
-
- <?php if ($showswap == true): ?>
- jQuery("#swapUsagePB").progressbar( { value: <?php echo swap_usage(); ?> } );
- <?php endif; ?>
- <?php if (get_temp() != ""): ?>
- jQuery("#tempPB").progressbar( { value: <?php echo get_temp(); ?> } );
- <?php endif; ?>
- });
-//]]>
-</script>
-
-<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="system information">
+<table class="table table-striped table-hover">
<tbody>
<tr>
- <td width="25%" class="vncellt"><?=gettext("Name");?></td>
- <td width="75%" class="listr"><?php echo $config['system']['hostname'] . "." . $config['system']['domain']; ?></td>
+ <th><?=gettext("Name");?></td>
+ <td><?php echo $config['system']['hostname'] . "." . $config['system']['domain']; ?></td>
</tr>
<tr>
- <td width="25%" valign="top" class="vncellt"><?=gettext("Version");?></td>
- <td width="75%" class="listr">
- <strong><?=$g['product_version']?></strong>
+ <th><?=gettext("Version");?></th>
+ <td>
+ <strong><?php readfile("/etc/version"); ?></strong>
(<?php echo php_uname("m"); ?>)
<br />
built on <?php readfile("/etc/version.buildtime"); ?>
- <?php if (!$g['hideuname']): ?>
- <br />
- <div id="uname"><a href="#" onclick='swapuname(); return false;'><?php echo php_uname("s") . " " . php_uname("r"); ?></a></div>
- <?php endif; ?>
- <?php if (!isset($config['system']['firmware']['disablecheck'])): ?>
- <div id='updatestatus'><br /><?php echo gettext("Obtaining update status"); ?> ...</div>
- <?php endif; ?>
+ <?php if(!$g['hideuname']): ?>
+ <br />
+ <span title="<?php echo php_uname("a"); ?>"><?php echo php_uname("s") . " " . php_uname("r"); ?></span>
+ <?php endif; ?>
+ <br/><br/>
+ <?php if(!isset($config['system']['firmware']['disablecheck'])): ?>
+ <div id='updatestatus'><?php echo gettext("Obtaining update status"); ?> ...</div>
+ <?php endif; ?>
</td>
</tr>
<?php if (!$g['hideplatform']): ?>
<tr>
- <td width="25%" class="vncellt"><?=gettext("Platform");?></td>
- <td width="75%" class="listr">
+ <th><?=gettext("Platform");?></td>
+ <td>
<?=htmlspecialchars($g['platform']);?>
<?php if (($g['platform'] == "nanobsd") && (file_exists("/etc/nanosize.txt"))) {
echo " (" . htmlspecialchars(trim(file_get_contents("/etc/nanosize.txt"))) . ")";
@@ -156,9 +134,9 @@ $filesystems = get_mounted_filesystems();
$rw = is_writable("/") ? "(rw)" : "(ro)";
?>
<tr>
- <td width="25%" class="vncellt"><?=gettext("NanoBSD Boot Slice");?></td>
- <td width="75%" class="listr">
- <?=htmlspecialchars(nanobsd_friendly_slice_name($BOOT_DEVICE));?> / <?=htmlspecialchars($BOOTFLASH);?> <?php echo $rw; ?>
+ <th><?=gettext("NanoBSD Boot Slice");?></td>
+ <td>
+ <?=htmlspecialchars(nanobsd_friendly_slice_name($BOOT_DEVICE));?> / <?=htmlspecialchars($BOOTFLASH);?><?php echo $rw; ?>
<?php if ($BOOTFLASH != $ACTIVE_SLICE): ?>
<br /><br />Next Boot:<br />
<?=htmlspecialchars(nanobsd_friendly_slice_name($GLABEL_SLICE));?> / <?=htmlspecialchars($ACTIVE_SLICE);?>
@@ -167,11 +145,8 @@ $filesystems = get_mounted_filesystems();
</tr>
<?php endif; ?>
<tr>
- <td width="25%" class="vncellt"><?=gettext("CPU Type");?></td>
- <td width="75%" class="listr">
- <?php
- echo (htmlspecialchars(get_single_sysctl("hw.model")));
- ?>
+ <th><?=gettext("CPU Type");?></td>
+ <td><?=htmlspecialchars(get_single_sysctl("hw.model"))?>
<div id="cpufreq"><?= get_cpufreq(); ?></div>
<?php
$cpucount = get_cpu_count();
@@ -183,65 +158,69 @@ $filesystems = get_mounted_filesystems();
</tr>
<?php if ($hwcrypto): ?>
<tr>
- <td width="25%" class="vncellt"><?=gettext("Hardware crypto");?></td>
- <td width="75%" class="listr"><?=htmlspecialchars($hwcrypto);?></td>
+ <th><?=gettext("Hardware crypto");?></td>
+ <td><?=htmlspecialchars($hwcrypto);?></td>
</tr>
<?php endif; ?>
<tr>
- <td width="25%" class="vncellt"><?=gettext("Uptime");?></td>
- <td width="75%" class="listr" id="uptime"><?= htmlspecialchars(get_uptime()); ?></td>
+ <th><?=gettext("Uptime");?></td>
+ <td id="uptime"><?= htmlspecialchars(get_uptime()); ?></td>
</tr>
- <tr>
- <td width="25%" class="vncellt"><?=gettext("Current date/time");?></td>
- <td width="75%" class="listr">
- <div id="datetime"><?= date("D M j G:i:s T Y"); ?></div>
- </td>
- </tr>
<tr>
- <td width="30%" class="vncellt"><?=gettext("DNS server(s)");?></td>
- <td width="70%" class="listr">
- <?php
- $dns_servers = get_dns_servers();
- foreach ($dns_servers as $dns) {
- echo "{$dns}<br />";
- }
- ?>
- </td>
+ <th><?=gettext("Current date/time");?></td>
+ <td><div id="datetime"><?= date("D M j G:i:s T Y"); ?></div></td>
+ </tr>
+ <tr>
+ <th><?=gettext("DNS server(s)");?></td>
+ <td>
+ <ul>
+ <?php
+ $dns_servers = get_dns_servers();
+ foreach($dns_servers as $dns) {
+ echo "<li>{$dns}</li>";
+ }
+ ?>
+ </ul>
+ </td>
</tr>
<?php if ($config['revision']): ?>
<tr>
- <td width="25%" class="vncellt"><?=gettext("Last config change");?></td>
- <td width="75%" class="listr"><?= htmlspecialchars(date("D M j G:i:s T Y", intval($config['revision']['time'])));?></td>
+ <th><?=gettext("Last config change");?></td>
+ <td><?= htmlspecialchars(date("D M j G:i:s T Y", intval($config['revision']['time'])));?></td>
</tr>
<?php endif; ?>
<tr>
- <td width="25%" class="vncellt"><?=gettext("State table size");?></td>
- <td width="75%" class="listr">
- <?php
- $pfstatetext = get_pfstate();
+ <th><?=gettext("State table size");?></td>
+ <td>
+ <?php $pfstatetext = get_pfstate();
$pfstateusage = get_pfstate(true);
?>
- <div id="statePB"></div>
- <span id="pfstateusagemeter"><?= $pfstateusage.'%'; ?></span> (<span id="pfstate"><?= htmlspecialchars($pfstatetext); ?></span>)
- <br />
- <a href="diag_dump_states.php"><?=gettext("Show states");?></a>
+ <div class="progress">
+ <div class="progress-bar progress-bar-striped" role="progressbar" aria-valuenow="<?=$pfstateusage?>" aria-valuemin="0" aria-valuemax="100" style="width: <?=$pfstateusage?>%">
+ <span><?=$pfstateusage?>% (<?= htmlspecialchars($pfstatetext)?>)</span>
+ </div>
+ </div>
+ <a href="diag_dump_states.php"><?=gettext("Show states");?></a>
</td>
</tr>
<tr>
- <td width="25%" class="vncellt"><?=gettext("MBUF Usage");?></td>
- <td width="75%" class="listr">
+ <th><?=gettext("MBUF Usage");?></td>
+ <td>
<?php
$mbufstext = get_mbuf();
$mbufusage = get_mbuf(true);
?>
- <div id="mbufPB"></div>
- <span id="mbufusagemeter"><?= $mbufusage.'%'; ?></span> (<span id="mbuf"><?= $mbufstext ?></span>)
+ <div class="progress">
+ <div class="progress-bar progress-bar-striped" role="progressbar" aria-valuenow="<?=$mbufusage?>" aria-valuemin="0" aria-valuemax="100" style="width: <?=$mbufusage?>%">
+ <span><?=$mbufusage?>% (<?= htmlspecialchars($mbufstext)?>)</span>
+ </div>
+ </div>
</td>
</tr>
<?php if (get_temp() != ""): ?>
<tr>
- <td width="25%" class="vncellt"><?=gettext("Temperature");?></td>
- <td width="75%" class="listr">
+ <th><?=gettext("Temperature");?></td>
+ <td>
<?php $TempMeter = $temp = get_temp(); ?>
<div id="tempPB"></div>
<span id="tempmeter"><?= $temp."&#176;C"; ?></span>
@@ -249,74 +228,84 @@ $filesystems = get_mounted_filesystems();
</tr>
<?php endif; ?>
<tr>
- <td width="25%" class="vncellt"><?=gettext("Load average");?></td>
- <td width="75%" class="listr">
+ <th><?=gettext("Load average");?></td>
+ <td>
<div id="load_average" title="Last 1, 5 and 15 minutes"><?= get_load_average(); ?></div>
</td>
</tr>
<tr>
- <td width="25%" class="vncellt"><?=gettext("CPU usage");?></td>
- <td width="75%" class="listr">
+ <th><?=gettext("CPU usage");?></td>
+ <td>
<div id="cpuPB"></div>
<span id="cpumeter">(Updating in 10 seconds)</span>
</td>
</tr>
<tr>
- <td width="25%" class="vncellt"><?=gettext("Memory usage");?></td>
- <td width="75%" class="listr">
+ <th><?=gettext("Memory usage");?></td>
+ <td>
<?php $memUsage = mem_usage(); ?>
- <div id="memUsagePB"></div>
- <span id="memusagemeter"><?= $memUsage.'%'; ?></span> of <?= sprintf("%.0f", get_single_sysctl('hw.physmem') / (1024*1024)) ?> MB
+ <div class="progress">
+ <div class="progress-bar progress-bar-striped" role="progressbar" aria-valuenow="<?=$memUsage?>" aria-valuemin="0" aria-valuemax="100" style="width: <?=$memUsage?>%">
+ <span><?=$memUsage?>% of <?= sprintf("%.0f", get_single_sysctl('hw.physmem') / (1024*1024)) ?> MB</span>
+ </div>
+ </div>
</td>
</tr>
<?php if ($showswap == true): ?>
<tr>
- <td width="25%" class="vncellt"><?=gettext("SWAP usage");?></td>
- <td width="75%" class="listr">
+ <th><?=gettext("SWAP usage");?></td>
+ <td>
<?php $swapusage = swap_usage(); ?>
- <div id="swapUsagePB"></div>
- <span id="swapusagemeter"><?= $swapusage.'%'; ?></span> of <?= sprintf("%.0f", `/usr/sbin/swapinfo -m | /usr/bin/grep -v Device | /usr/bin/awk '{ print $2;}'`) ?> MB
+ <div class="progress">
+ <div class="progress-bar progress-bar-striped" role="progressbar" aria-valuenow="<?=$swapusage?>" aria-valuemin="0" aria-valuemax="100" style="width: <?=$swapusage?>%">
+ <span><?=$swapusage?>% of <?= sprintf("%.0f", `/usr/sbin/swapinfo -m | /usr/bin/grep -v Device | /usr/bin/awk '{ print $2;}'`) ?> MB</span>
+ </div>
+ </div>
</td>
</tr>
<?php endif; ?>
<tr>
- <td width="25%" class="vncellt"><?=gettext("Disk usage");?></td>
- <td width="75%" class="listr">
- <?php $d = 0; ?>
- <?php foreach ($filesystems as $fs): ?>
- <div id="diskUsagePB<?php echo $d; ?>"></div>
- <?php if (substr(basename($fs['device']), 0, 2) == "md") $fs['type'] .= " in RAM"; ?>
- <?php echo "{$fs['mountpoint']} ({$fs['type']})";?>: <span id="diskusagemeter<?php echo $d++ ?>"><?= $fs['percent_used'].'%'; ?></span> of <?PHP echo $fs['total_size'];?>
- <br />
- <?php endforeach; ?>
+ <th><?=gettext("Disk usage");?></td>
+ <td>
+ <table class="table">
+<?PHP foreach ($filesystems as $fs): ?>
+ <tr>
+ <th><?=$fs['mountpoint']?></th>
+ <td><?=$fs['type'] . ("md" == substr(basename($fs['device']), 0, 2) ? " in RAM" : "")?></td>
+ <td><?=$fs['total_size']?></td>
+ <td>
+ <div class="progress">
+ <div class="progress-bar progress-bar-striped" role="progressbar" aria-valuenow="<?=$fs['percent_used']?>" aria-valuemin="0" aria-valuemax="100" style="width: <?=$fs['percent_used']?>%">
+ <span><?=$fs['percent_used']?>%</span>
+ </div>
+ </div>
+ </td>
+ </tr>
+<?PHP endforeach; ?>
+ </table>
</td>
</tr>
</tbody>
</table>
-<script type="text/javascript">
-//<![CDATA[
- function swapuname() {
- jQuery('#uname').html("<?php echo php_uname("a"); ?>");
- }
- <?php if (!isset($config['system']['firmware']['disablecheck'])): ?>
- function getstatus() {
- scroll(0,0);
- var url = "/widgets/widgets/system_information.widget.php";
- var pars = 'getupdatestatus=yes';
- jQuery.ajax(
- url,
- {
- type: 'get',
- data: pars,
- complete: activitycallback
- });
- }
- function activitycallback(transport) {
- // .html() method process all script tags contained in responseText,
- // to avoid this we set the innerHTML property
- jQuery('#updatestatus').prop('innerHTML',transport.responseText);
- }
- setTimeout('getstatus()', 4000);
- <?php endif; ?>
-//]]>
-</script>
+
+<script>
+function systemStatusGetUpdateStatus() {
+ $.ajax({
+ type: 'get',
+ url: '/widgets/widgets/system_information.widget.php',
+ data: 'getupdatestatus=1',
+ dataFilter: function(raw){
+ // We reload the entire widget, strip this block of javascript from it
+ return raw.replace(/<script>([\s\S]*)<\/script>/gi, '');
+ },
+ dataType: 'html',
+ success: function(data){
+ $('#widget-system_information #updatestatus').html(data);
+ }
+ });
+}
+
+events.push(function(){
+ setTimeout('systemStatusGetUpdateStatus()', 4000);
+});
+</script> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/widgets/thermal_sensors.widget.php b/src/usr/local/www/widgets/widgets/thermal_sensors.widget.php
index 0dac0cb..875ccb2 100644
--- a/src/usr/local/www/widgets/widgets/thermal_sensors.widget.php
+++ b/src/usr/local/www/widgets/widgets/thermal_sensors.widget.php
@@ -167,8 +167,8 @@ function getBoolValueFromConfig(&$configArray, $valueKey, $defaultValue) {
<input type="hidden" id="thermal_sensors-config" name="thermal_sensors-config" value="" />
<div id="thermal_sensors-settings" class="widgetconfigdiv" style="display:none;">
- <form action="/widgets/widgets/thermal_sensors.widget.php" method="post" id="thermal_sensors_widget_iform" name="thermal_sensors_widget_iform">
- <table width="100%" border="0" summary="thermal sensors widget">
+ <form action="/widgets/widgets/thermal_sensors.widget.php" method="post" id="iform_thermal_sensors_settings" name="iform_thermal_sensors_settings">
+ <table>
<tr>
<td align="left" colspan="2">
<span style="font-weight: bold" >Thresholds in &deg;C (1 to 100):</span>
diff --git a/src/usr/local/www/widgets/widgets/traffic_graphs.widget.php b/src/usr/local/www/widgets/widgets/traffic_graphs.widget.php
index c5f6286..2689e32 100644
--- a/src/usr/local/www/widgets/widgets/traffic_graphs.widget.php
+++ b/src/usr/local/www/widgets/widgets/traffic_graphs.widget.php
@@ -93,58 +93,13 @@ if (isset($a_config["refreshinterval"])) {
}
if (isset($a_config["scale_type"])) {
- $scale_type = $a_config["scale_type"];
+ $scale_type = $a_config["scale_type"];
} else {
- $scale_type = "up";
+ $scale_type = "up";
}
-?>
-<input type="hidden" id="traffic_graphs-config" name="traffic_graphs-config" value="" />
-
-<div id="traffic_graphs-settings" class="widgetconfigdiv" style="display:none;">
-<form action="/widgets/widgets/traffic_graphs.widget.php" method="post" name="traffic_graphs_widget_iform" id="traffic_graphs_widget_iform">
- <?php foreach ($ifdescrs as $ifname => $ifdescr) { ?>
- <input type="hidden" name="shown[<?= $ifname ?>]" value="<?= $shown[$ifname] ? "show" : "hide" ?>" />
- <?php } ?>
- Default AutoScale:
- <?php
- $scale_type_up="checked=\"checked\"";
- $scale_type_follow="";
- if (isset($config["widgets"]["trafficgraphs"]["scale_type"])) {
- $selected_radio = $config["widgets"]["trafficgraphs"]["scale_type"];
- if ($selected_radio == "up") {
- $scale_type_up = "checked=\"checked\"";
- $scale_type_follow="";
- } else if ($selected_radio == "follow") {
- $scale_type_up="";
- $scale_type_follow = "checked=\"checked\"";
- }
- }
- ?>
- <input name="scale_type" class="radio" type="radio" id="scale_type_up" value="up" <?php echo $scale_type_up; ?> onchange="updateGraphDisplays();" /> <span>up</span>
- <input name="scale_type" class="radio" type="radio" id="scale_type_follow" value="follow" <?php echo $scale_type_follow; ?> onchange="updateGraphDisplays();" /> <span>follow</span><br /><br />
- Refresh Interval:
- <select name="refreshinterval" class="formfld" id="refreshinterval" onchange="updateGraphDisplays();">
- <?php for ($i = 1; $i <= 10; $i += 1) { ?>
- <option value="<?= $i ?>" <?php if ($refreshinterval == $i) echo "selected=\"selected\"";?>><?= $i ?></option>
- <?php } ?>
- </select>&nbsp; Seconds<br />&nbsp; &nbsp; &nbsp; <b>Note:</b> changing this setting will increase CPU utilization<br /><br />
- <input id="traffic_graphs_widget_submit" name="traffic_graphs_widget_submit" type="submit" onclick="return updatePref();" class="formbtn" value="Save Settings" />
-</form>
-</div>
-
-<script type="text/javascript">
-//<![CDATA[
- d = document;
- selectIntLink = "traffic_graphs-configure";
- textlink = d.getElementById(selectIntLink);
- textlink.style.display = "inline";
-//]]>
-</script>
-
-<?php
$graphcounter = 0;
-foreach ($ifdescrs as $ifname => $ifdescr) {
+foreach ($ifdescrs as $ifname => $ifdescr):
$ifinfo = get_interface_info($ifname);
if ($shown[$ifname]) {
$mingraphbutton = "inline";
@@ -158,36 +113,49 @@ foreach ($ifdescrs as $ifname => $ifdescr) {
$graphdisplay = "none";
$interfacevalue = "hide";
}
- if ($ifinfo['status'] != "down") { ?>
- <div id="<?=$ifname;?>trafficdiv" style="padding: 5px">
- <div id="<?=$ifname;?>topic" class="widgetsubheader">
- <div style="float:left;width:49%">
- <span onclick="location.href='/status_graph.php?if=<?=$ifname;?>'" style="cursor:pointer">Current <?=$ifdescr;?> Traffic</span>
- </div>
- <div align="right" style="float:right;width:49%">
- <div id="<?=$ifname;?>graphdiv-min" onclick='return trafficminimizeDiv("<?= $ifname ?>", true);'
- style="display:<?php echo $mingraphbutton;?>; cursor:pointer" ><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_minus.gif" alt="Minimize <?=$ifname;?> traffic graph" /></div>
- <div id="<?=$ifname;?>graphdiv-open" onclick='return trafficshowDiv("<?= $ifname ?>", "<?= rawurlencode($ifdescr); ?>", "<?= $refreshinterval ?>", true);'
- style="display:<?php echo $showgraphbutton;?>; cursor:pointer" ><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_open.gif" alt="Show <?=$ifname;?> traffic graph" /></div>
- </div>
- <div style="clear:both;"></div>
- </div>
- <div id="<?=$ifname;?>graphdiv" style="display:<?php echo $graphdisplay;?>">
-<?php
- // If the graph is already enabled by the config then put the object inside the div now.
- // Otherwise the graph object is inserted by trafficshowDiv JS when the user opens it.
- if ($graphdisplay == "inline") {
-?>
- <object data="graph.php?ifnum=<?=$ifname;?>&amp;ifname=<?=rawurlencode($ifdescr);?>&amp;timeint=<?=$refreshinterval;?>&amp;initdelay=<?=$graphcounter * 2;?>" height="100%" width="100%">
- <param name="id" value="graph" />
- <param name="type" value="image/svg+xml" />
- <param name="pluginspage" value="http://www.adobe.com/svg/viewer/install/auto" />
- </object>
-<?php
- }
+ if ($ifinfo['status'] != "down"):
?>
- </div>
+ <div style="display:<?=$graphdisplay?>">
+ <object data="graph.php?ifnum=<?=$ifname?>&amp;ifname=<?=rawurlencode($ifdescr)?>&amp;timeint=<?=$refreshinterval?>&amp;initdelay=<?=$graphcounter * 2?>">
+ <param name="id" value="graph" />
+ <param name="type" value="image/svg+xml" />
+ <param name="pluginspage" value="http://www.adobe.com/svg/viewer/install/auto" />
+ </object>
+ </div>
+<?php endif; ?>
+<?php endforeach; ?>
+
+<!-- close the body we're wrapped in and add a configuration-panel -->
+</div><div class="panel-footer collapse">
+
+<form action="/widgets/widgets/traffic_graphs.widget.php" method="post" class="form-horizontal">
+ <?php foreach ($ifdescrs as $ifname => $ifdescr): ?>
+ <input type="hidden" name="shown[<?= $ifname?>]" value="<?= $shown[$ifname] ? "show" : "hide"?>" />
+ <?php endforeach; ?>
+ <div class="form-group">
+ <label for="scale_type_up" class="col-sm-3 control-label">Default Autoscale</label>
+ <div class="col-sm-6 checkbox">
+ <label>
+ <input name="scale_type" type="radio" id="scale_type_up" value="up" <?=($config["widgets"]["trafficgraphs"]["scale_type"]=="follow" ? '' : 'checked="checked"')?> />
+ up
+ </label>
+ <label>
+ <input name="scale_type" type="radio" id="scale_type_follow" value="up" <?=($config["widgets"]["trafficgraphs"]["scale_type"]=="follow" ? 'checked="checked"' : '')?> />
+ follow
+ </label>
</div>
- <?php }
-}
-?>
+ </div>
+
+ <div class="form-group">
+ <label for="refreshinterval" class="col-sm-3 control-label">Refresh Interval</label>
+ <div class="col-sm-6">
+ <input type="number" name="refreshinterval" value="<?=$refreshinterval?>" min="1" max="30" class="form-control" />
+ </div>
+ </div>
+
+ <div class="form-group">
+ <div class="col-sm-offset-3 col-sm-6">
+ <button type="submit" class="btn btn-default">Save</button>
+ </div>
+ </div>
+</form> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/widgets/wake_on_lan.widget.php b/src/usr/local/www/widgets/widgets/wake_on_lan.widget.php
index 9cb760a..5715044 100644
--- a/src/usr/local/www/widgets/widgets/wake_on_lan.widget.php
+++ b/src/usr/local/www/widgets/widgets/wake_on_lan.widget.php
@@ -9,11 +9,11 @@
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
+ this list of conditions and the following disclaimer.
2. 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.
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INClUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
@@ -39,7 +39,7 @@ if (is_array($config['wol']['wolentry'])) {
}
?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="wol status">
+<table>
<tr>
<?php
echo '<td class="widgetsubheader" align="center">' . gettext("Computer / Device") . '</td>';
@@ -51,12 +51,12 @@ if (is_array($config['wol']['wolentry'])) {
<?php
if (count($wolcomputers) > 0) {
- foreach ($wolcomputers as $wolent) {
+ foreach($wolcomputers as $wolent) {
echo '<tr><td class="listlr">' . $wolent['descr'] . '<br />' . $wolent['mac'] . '</td>' . "\n";
echo '<td class="listr">' . convert_friendly_interface_to_friendly_descr($wolent['interface']) . '</td>' . "\n";
$is_active = exec("/usr/sbin/arp -an |/usr/bin/grep {$wolent['mac']}| /usr/bin/wc -l|/usr/bin/awk '{print $1;}'");
- if ($is_active == 1) {
+ if($is_active == 1) {
echo '<td class="listr" align="center">' . "\n";
echo "<img src=\"/themes/" . $g["theme"] . "/images/icons/icon_pass.gif\" alt=\"pass\" /> " . gettext("Online") . "</td>\n";
} else {
@@ -64,7 +64,7 @@ if (count($wolcomputers) > 0) {
echo "<img src=\"/themes/" . $g["theme"] . "/images/icons/icon_block.gif\" alt=\"block\" />&nbsp;<font color=\"white\">" . gettext("Offline") . "</font></td>\n";
}
echo '<td valign="middle" class="list nowrap">';
- /*if ($is_active) { */
+ /*if($is_active) { */
/* Will always show wake-up button even if pfsense thinks it is awake */
/* } else { */
echo "<a href='services_wol.php?mac={$wolent['mac']}&amp;if={$wolent['interface']}'> ";
OpenPOWER on IntegriCloud